{
  "_class" : "hudson.matrix.MatrixBuild",
  "actions" : [
    {
      "_class" : "hudson.model.ParametersAction",
      "parameters" : [
        {
          "_class" : "hudson.model.StringParameterValue",
          "name" : "BRANCH",
          "value" : "osmith/wip"
        },
        {
          "_class" : "hudson.model.StringParameterValue",
          "name" : "EMAIL_NOTIFICATIONS",
          "value" : ""
        }
      ]
    },
    {
      "_class" : "hudson.model.CauseAction",
      "causes" : [
        {
          "_class" : "hudson.model.Cause$UserIdCause",
          "shortDescription" : "Started by user Oliver Smith",
          "userId" : "osmith",
          "userName" : "Oliver Smith"
        }
      ]
    },
    {
      "_class" : "jenkins.metrics.impl.TimeInQueueAction",
      "blockedDurationMillis" : 0,
      "blockedTimeMillis" : 0,
      "buildableDurationMillis" : 0,
      "buildableTimeMillis" : 0,
      "buildingDurationMillis" : 839981,
      "executingTimeMillis" : 839981,
      "executorUtilization" : 1.0,
      "subTaskCount" : 0,
      "waitingDurationMillis" : 0,
      "waitingTimeMillis" : 0
    },
    {
      
    },
    {
      "_class" : "hudson.plugins.git.util.BuildData",
      "buildsByBranchName" : {
        "origin/master" : {
          "_class" : "hudson.plugins.git.util.Build",
          "buildNumber" : 1815,
          "buildResult" : None,
          "marked" : {
            "SHA1" : "947154639c9ac57da76fbc6235818df4c93e2ec3",
            "branch" : [
              {
                "SHA1" : "947154639c9ac57da76fbc6235818df4c93e2ec3",
                "name" : "origin/master"
              }
            ]
          },
          "revision" : {
            "SHA1" : "947154639c9ac57da76fbc6235818df4c93e2ec3",
            "branch" : [
              {
                "SHA1" : "947154639c9ac57da76fbc6235818df4c93e2ec3",
                "name" : "origin/master"
              }
            ]
          }
        },
        "refs/remotes/origin/pmaier/ara-m" : {
          "_class" : "hudson.plugins.git.util.Build",
          "buildNumber" : 1320,
          "buildResult" : None,
          "marked" : {
            "SHA1" : "8f289234f74045496c3752bf1bb9397302f3e912",
            "branch" : [
              {
                "SHA1" : "8f289234f74045496c3752bf1bb9397302f3e912",
                "name" : "refs/remotes/origin/pmaier/ara-m"
              }
            ]
          },
          "revision" : {
            "SHA1" : "8f289234f74045496c3752bf1bb9397302f3e912",
            "branch" : [
              {
                "SHA1" : "8f289234f74045496c3752bf1bb9397302f3e912",
                "name" : "refs/remotes/origin/pmaier/ara-m"
              }
            ]
          }
        },
        "refs/remotes/origin/pmaier/keepfiles" : {
          "_class" : "hudson.plugins.git.util.Build",
          "buildNumber" : 1353,
          "buildResult" : None,
          "marked" : {
            "SHA1" : "3d815859830197b9c55e0a49a1bd2532f71285e1",
            "branch" : [
              {
                "SHA1" : "3d815859830197b9c55e0a49a1bd2532f71285e1",
                "name" : "refs/remotes/origin/pmaier/keepfiles"
              }
            ]
          },
          "revision" : {
            "SHA1" : "3d815859830197b9c55e0a49a1bd2532f71285e1",
            "branch" : [
              {
                "SHA1" : "3d815859830197b9c55e0a49a1bd2532f71285e1",
                "name" : "refs/remotes/origin/pmaier/keepfiles"
              }
            ]
          }
        },
        "refs/remotes/origin/pmaier/fixapdu" : {
          "_class" : "hudson.plugins.git.util.Build",
          "buildNumber" : 1421,
          "buildResult" : None,
          "marked" : {
            "SHA1" : "568e8ae9b817ec2473907bfdd30870410890ffb0",
            "branch" : [
              {
                "SHA1" : "568e8ae9b817ec2473907bfdd30870410890ffb0",
                "name" : "refs/remotes/origin/pmaier/fixapdu"
              }
            ]
          },
          "revision" : {
            "SHA1" : "568e8ae9b817ec2473907bfdd30870410890ffb0",
            "branch" : [
              {
                "SHA1" : "568e8ae9b817ec2473907bfdd30870410890ffb0",
                "name" : "refs/remotes/origin/pmaier/fixapdu"
              }
            ]
          }
        },
        "refs/remotes/origin/pmaier/aramtest" : {
          "_class" : "hudson.plugins.git.util.Build",
          "buildNumber" : 1467,
          "buildResult" : None,
          "marked" : {
            "SHA1" : "6a555ac5ccad9ee2cae5e0ba247990f824f8e9b6",
            "branch" : [
              {
                "SHA1" : "6a555ac5ccad9ee2cae5e0ba247990f824f8e9b6",
                "name" : "refs/remotes/origin/pmaier/aramtest"
              }
            ]
          },
          "revision" : {
            "SHA1" : "6a555ac5ccad9ee2cae5e0ba247990f824f8e9b6",
            "branch" : [
              {
                "SHA1" : "6a555ac5ccad9ee2cae5e0ba247990f824f8e9b6",
                "name" : "refs/remotes/origin/pmaier/aramtest"
              }
            ]
          }
        },
        "refs/remotes/origin/osmith/wip" : {
          "_class" : "hudson.plugins.git.util.Build",
          "buildNumber" : 1816,
          "buildResult" : None,
          "marked" : {
            "SHA1" : "e4ea1c997348370ba1d7415bfd926ac873b58c87",
            "branch" : [
              {
                "SHA1" : "e4ea1c997348370ba1d7415bfd926ac873b58c87",
                "name" : "refs/remotes/origin/osmith/wip"
              }
            ]
          },
          "revision" : {
            "SHA1" : "e4ea1c997348370ba1d7415bfd926ac873b58c87",
            "branch" : [
              {
                "SHA1" : "e4ea1c997348370ba1d7415bfd926ac873b58c87",
                "name" : "refs/remotes/origin/osmith/wip"
              }
            ]
          }
        },
        "refs/remotes/origin/master" : {
          "_class" : "hudson.plugins.git.util.Build",
          "buildNumber" : 402,
          "buildResult" : None,
          "marked" : {
            "SHA1" : "4f888a0414101dee4f20aa12579491fcc71707b3",
            "branch" : [
              {
                "SHA1" : "4f888a0414101dee4f20aa12579491fcc71707b3",
                "name" : "refs/remotes/origin/master"
              }
            ]
          },
          "revision" : {
            "SHA1" : "4f888a0414101dee4f20aa12579491fcc71707b3",
            "branch" : [
              {
                "SHA1" : "4f888a0414101dee4f20aa12579491fcc71707b3",
                "name" : "refs/remotes/origin/master"
              }
            ]
          }
        }
      },
      "lastBuiltRevision" : {
        "SHA1" : "e4ea1c997348370ba1d7415bfd926ac873b58c87",
        "branch" : [
          {
            "SHA1" : "e4ea1c997348370ba1d7415bfd926ac873b58c87",
            "name" : "refs/remotes/origin/osmith/wip"
          }
        ]
      },
      "remoteUrls" : [
        "https://gerrit.osmocom.org/pysim"
      ],
      "scmName" : ""
    },
    {
      
    },
    {
      
    },
    {
      "_class" : "org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction"
    }
  ],
  "artifacts" : [
    
  ],
  "building" : False,
  "description" : None,
  "displayName" : "#1816",
  "duration" : 839981,
  "estimatedDuration" : 832457,
  "executor" : None,
  "fullDisplayName" : "master-pysim #1816",
  "id" : "1816",
  "inProgress" : False,
  "keepLog" : False,
  "number" : 1816,
  "queueId" : 2007314,
  "result" : "SUCCESS",
  "timestamp" : 1759388746413,
  "url" : "https://jenkins.osmocom.org/jenkins/job/master-pysim/1816/",
  "builtOn" : "",
  "changeSet" : {
    "_class" : "hudson.plugins.git.GitChangeSetList",
    "items" : [
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_102_222.py",
          "docs/shell.rst",
          "pySim/commands.py"
        ],
        "commitId" : "0707b80ad3b8781958da7fd0bef3f0ef38562d12",
        "timestamp" : 1678355380000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "ts_102_222: Implement support for RESIZE FILE for an EF\u000a\u000aThis adds pySim-shell support for the RESIZE FILE command in order\u000ato change the size of linear fixed or transparent EF.\u000a\u000aChange-Id: I03fbb683e26231c75f345330ac5f914ac88bbe7a\u000a",
        "date" : "2023-03-09 09:49:40 +0000",
        "id" : "0707b80ad3b8781958da7fd0bef3f0ef38562d12",
        "msg" : "ts_102_222: Implement support for RESIZE FILE for an EF",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "docs/shell.rst"
          },
          {
            "editType" : "edit",
            "file" : "pySim/commands.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_102_222.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "docs/Makefile"
        ],
        "commitId" : "308d7cdf7814860670950c59965db7c7d9263680",
        "timestamp" : 1679311686000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/osmith",
          "fullName" : "Oliver Smith"
        },
        "authorEmail" : "osmith@sysmocom.de",
        "comment" : "docs/Makefile: don't forward shrink to sphinx\u000a\u000aAdjust the catch-all target at the end of the Makefile that is supposed\u000ato route all unknown targets to sphinx, so it doesn't do this for the\u000ashrink target. The shrink target has recently been added to\u000aMakefile.common.inc in osmo-gsm-manuals, which gets included right above\u000athe catch-all target. So it isn't an unknown target, but for some reason\u000athe sphinx catch-all runs in addition to the shrink target (runs\u000ashrink-pdfs.sh, see output below) and fails. As I did not add the\u000acatch-all logic, preserve it but add an exception for the shrink rule.\u000a\u000aFix for:\u000a  + make -C docs publish publish-html\u000a  make: Entering directory '/build/docs'\u000a  /opt/osmo-gsm-manuals/build/shrink-pdfs.sh _build/latex/osmopysim-usermanual.pdf\u000a  * _build/latex/osmopysim-usermanual.pdf: 272K (shrunk from 336K)\u000a  Running Sphinx v5.3.0\u000a\u000a  Sphinx error:\u000a  Builder name shrink not registered or available through entry point\u000a\u000aRelated: SYS#6380\u000aChange-Id: If2802bb93909aba90debe5e03f3047cec73e2f54\u000a",
        "date" : "2023-03-20 12:28:06 +0100",
        "id" : "308d7cdf7814860670950c59965db7c7d9263680",
        "msg" : "docs/Makefile: don't forward shrink to sphinx",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "docs/Makefile"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          ".gitignore"
        ],
        "commitId" : "41fbf12dba06450b60d05fa363ad1a8fdb395153",
        "timestamp" : 1679315438000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/osmith",
          "fullName" : "Oliver Smith"
        },
        "authorEmail" : "osmith@sysmocom.de",
        "comment" : "gitignore: add manuals related files\u000a\u000aChange-Id: I93a63b33032f93f381b8ef451aecc97d3011ce8c\u000a",
        "date" : "2023-03-20 13:30:38 +0100",
        "id" : "41fbf12dba06450b60d05fa363ad1a8fdb395153",
        "msg" : "gitignore: add manuals related files",
        "paths" : [
          {
            "editType" : "edit",
            "file" : ".gitignore"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/commands.py"
        ],
        "commitId" : "1dd5cb540da0b7346482a16698ef8f5d74487fdb",
        "timestamp" : 1679479052000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "fix SimCardCommands.run_gsm(): always use CLA=0xa0\u000a\u000aDepending on the card type (SIM or USIM/ISUM), self.cla_byte may\u000abe either 0xa0 or 0x00.  Sending RUN GSM ALGORITHM with CLA=0x00\u000afails with SW=6985 (Command not allowed), so let's make sure\u000athat we always use CLA=0xa0 regardless of the card type.\u000a\u000aChange-Id: Ia0abba136dbd4cdea8dbbc3c4d6abe12c2863680\u000a",
        "date" : "2023-03-22 09:57:32 +0000",
        "id" : "1dd5cb540da0b7346482a16698ef8f5d74487fdb",
        "msg" : "fix SimCardCommands.run_gsm(): always use CLA=0xa0",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/commands.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/commands.py"
        ],
        "commitId" : "9970f59f4fd0a51da2b2e3a8194e6d6af0468581",
        "timestamp" : 1679479052000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "SimCardCommands.run_gsm(): use send_apdu_checksw()\u000a\u000aChange-Id: Ib713cf8154a3aba72bc5776a8d99ec47631ade28\u000a",
        "date" : "2023-03-22 09:57:32 +0000",
        "id" : "9970f59f4fd0a51da2b2e3a8194e6d6af0468581",
        "msg" : "SimCardCommands.run_gsm(): use send_apdu_checksw()",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/commands.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_51_011.py"
        ],
        "commitId" : "61ef1571f998efa42490c6cfdf0e6bb2e606115f",
        "timestamp" : 1679479052000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-shell.py: add a command for RUN GSM ALGORITHM\u000a\u000aChange-Id: Id7876d83d018aca79253784411d3a9d54a249a0a\u000a",
        "date" : "2023-03-22 09:57:32 +0000",
        "id" : "61ef1571f998efa42490c6cfdf0e6bb2e606115f",
        "msg" : "pySim-shell.py: add a command for RUN GSM ALGORITHM",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_51_011.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-shell.py"
        ],
        "commitId" : "7b9e24482d5615b0ae87c77fd90989314f4acbe7",
        "timestamp" : 1679906248000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "pySim-shell: add cardinfo command\u000a\u000aIt may sometimes be helpful to get a bit of general information about\u000athe card. To sort out problems it sometimes helps to get an idea what\u000acard type and ICCID pySim-shell has in memory.\u000a\u000aChange-Id: If31ed17102dc0108e27a5eb0344aabaaf19b19f9\u000a",
        "date" : "2023-03-27 10:37:28 +0200",
        "id" : "7b9e24482d5615b0ae87c77fd90989314f4acbe7",
        "msg" : "pySim-shell: add cardinfo command",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-prog.py"
        ],
        "commitId" : "0d80fa9150f014c5cb1db57462a06d14f1ea0338",
        "timestamp" : 1681405879000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/fixeria",
          "fullName" : "Vadim Yanitskiy"
        },
        "authorEmail" : "vyanitskiy@sysmocom.de",
        "comment" : "pySim-prog.py: fix SyntaxWarning: using is with a literal\u000a\u000aChange-Id: If9460bf827242a1dfc518213e3faa9137a21869a\u000a",
        "date" : "2023-04-14 00:11:19 +0700",
        "id" : "0d80fa9150f014c5cb1db57462a06d14f1ea0338",
        "msg" : "pySim-prog.py: fix SyntaxWarning: using is with a literal",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-prog.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_51_011.py"
        ],
        "commitId" : "b34f23448ce2efb2dc79e6c07819c10fe4947953",
        "timestamp" : 1681767394000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/fixeria",
          "fullName" : "Vadim Yanitskiy"
        },
        "authorEmail" : "vyanitskiy@sysmocom.de",
        "comment" : "filesystem: define more convenient codec for EF.ACC\u000a\u000aThis patch improves the output of the 'read_binary_decoded' command:\u000a\u000apySIM-shell (MF/DF.GSM/EF.ACC)> read_binary_decoded\u000a{\u000a    \"ACC0\": false,\u000a    \"ACC1\": false,\u000a    \"ACC2\": false,\u000a    \"ACC3\": false,\u000a    \"ACC4\": false,\u000a    \"ACC5\": false,\u000a    \"ACC6\": false,\u000a    \"ACC7\": false,\u000a    \"ACC8\": false,\u000a    \"ACC9\": false,\u000a    \"ACC10\": false,\u000a    \"ACC11\": false,\u000a    \"ACC12\": false,\u000a    \"ACC13\": false,\u000a    \"ACC14\": false,\u000a    \"ACC15\": true\u000a}\u000a\u000aAnd allows to set/unset individual ACCs using 'update_binary_decoded':\u000a\u000apySIM-shell (MF/DF.GSM/EF.ACC)> update_binary_decoded --json-path 'ACC15' 0\u000a\"0000\"\u000apySIM-shell (MF/DF.GSM/EF.ACC)> update_binary_decoded --json-path 'ACC8' 1\u000a\"0100\"\u000apySIM-shell (MF/DF.GSM/EF.ACC)> update_binary_decoded --json-path 'ACC0' 1\u000a\"0101\"\u000a\u000aChange-Id: I805b3277410745815d3fdc44b9c0f8c5be8d7a10\u000aRelated: SYS#6425\u000a",
        "date" : "2023-04-18 04:36:34 +0700",
        "id" : "b34f23448ce2efb2dc79e6c07819c10fe4947953",
        "msg" : "filesystem: define more convenient codec for EF.ACC",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_51_011.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "setup.py"
        ],
        "commitId" : "e63cb2cc4da2ee3730408e372395e80e4751277c",
        "timestamp" : 1683274337000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/fixeria",
          "fullName" : "Vadim Yanitskiy"
        },
        "authorEmail" : "vyanitskiy@sysmocom.de",
        "comment" : "setup.py: add missing pySim-trace.py' to scripts[]\u000a\u000aChange-Id: I44dfcf48ae22182bd7aaa908559f3d1e1e31acce\u000a",
        "date" : "2023-05-05 15:12:17 +0700",
        "id" : "e63cb2cc4da2ee3730408e372395e80e4751277c",
        "msg" : "setup.py: add missing pySim-trace.py' to scripts[]",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "setup.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_51_011.py"
        ],
        "commitId" : "6b19d802294159589ff0fe44fb74b9c03b92d638",
        "timestamp" : 1683677653000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "ts_51_011: fix EF_ServiceTable: use self for static method\u000a\u000aEven though _bit_byte_offset_for_service() is a @staticmethod, it's\u000astill available via self, just like any non-static method.\u000a\u000aChange-Id: I3590dda341d534deb1b7f4743ea31ab16dbd6912\u000a",
        "date" : "2023-05-10 00:14:13 +0000",
        "id" : "6b19d802294159589ff0fe44fb74b9c03b92d638",
        "msg" : "ts_51_011: fix EF_ServiceTable: use self for static method",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_51_011.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/cdma_ruim.py",
          "pySim-shell.py",
          "pySim/profile.py",
          "pySim/ts_51_011.py"
        ],
        "commitId" : "87dd020d5fbcfadb994d5c808868ee6a0d178fe6",
        "timestamp" : 1683677653000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "Add very basic profile for R-UIM (CDMA) cards\u000a\u000aR-UIM (CDMA) cards are pretty much like the normal GSM SIM cards and\u000a\"speak\" the same 2G APDU protocol, except that they have their own file\u000ahierarchy under MF(3f00)/DF.CDMA(7f25).  They also have DF.TELECOM(7f10)\u000aand even DF.GSM(7f20) with a limited subset of active EFs.  The content\u000aof DF.CDMA is specified in 3GPP2 C.S0023-D.\u000a\u000aThis patch adds a very limited card profile for R-UIM, including auto-\u000adetecion and a few EF definitions under DF.CDMA.  This may be useful\u000afor people willing to explore or backup their R-UIMs.  To me this was\u000auseful for playing with an R-UIM card from Skylink [1] - a Russian\u000aMNO, which provided 450 MHz CDMA coverage until 2016.\u000a\u000a[1] https://en.wikipedia.org/wiki/Sky_Link_(Russia)\u000a\u000aChange-Id: Iacdebdbc514d1cd1910d173d81edd28578ec436a\u000a",
        "date" : "2023-05-10 00:14:13 +0000",
        "id" : "87dd020d5fbcfadb994d5c808868ee6a0d178fe6",
        "msg" : "Add very basic profile for R-UIM (CDMA) cards",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          },
          {
            "editType" : "add",
            "file" : "pySim/cdma_ruim.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/profile.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_51_011.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "setup.py",
          "requirements.txt",
          "pySim-shell.py",
          "README.md"
        ],
        "commitId" : "93aac3abe6b536984f369bc4d07087801fb97807",
        "timestamp" : 1684337449000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "pySim-shell: fix compatibility problem with cmd2 >= 2.0.0 (Settable)\u000a\u000aIn cmd2 relase 2.0.0 the constructor of Settable adds a settable_object\u000aparameter, which apparantly was optional at first, but then became\u000amandatory. Older versions must not have the settable_object parameter\u000abut versions from 2.0.0 on require it. Let's add a version check so that\u000awe stay compatible to cmd2 versions below and above 2.0.0.\u000a\u000aSee also: https://github.com/python-cmd2/cmd2\u000a\u000aCommit 486734e85988d0d0160147b0b44a37759c833e8a\u000aAuthor: Eric Lin <anselor@gmail.com>\u000aDate:   2020-08-19 20:01:50\u000a\u000aand\u000a\u000aCommit 8f981f37eddcccc919329245b85fd44d5975a6a7\u000aAuthor: Eric Lin <anselor@gmail.com>\u000aDate: 2021-03-16 17:25:34\u000a\u000aThis commit is based on pySim gerrit change:\u000aIfce40410587c85ae932774144b9548b154ee8ad0\u000a\u000aChange-Id: I38efe4702277ee092a5542d7d659df08cb0adeff\u000a",
        "date" : "2023-05-17 17:30:49 +0200",
        "id" : "93aac3abe6b536984f369bc4d07087801fb97807",
        "msg" : "pySim-shell: fix compatibility problem with cmd2 >= 2.0.0 (Settable)",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          },
          {
            "editType" : "edit",
            "file" : "setup.py"
          },
          {
            "editType" : "edit",
            "file" : "requirements.txt"
          },
          {
            "editType" : "edit",
            "file" : "README.md"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-shell.py"
        ],
        "commitId" : "c85d4067fdbf641f6ca63be862023c0aca726c29",
        "timestamp" : 1684337449000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "pySim-shell: fix compatibility problem with cmd2 >= 2.0.0 (include_ipy)\u000a\u000aIn version 2.0.0, the use_ipython parameter in the Cmd constructor is\u000arenamed to include_ipy. There are still plenty of older cmd2\u000ainstallations around, so let's work around this using a version check.\u000a\u000aSee also: https://github.com/python-cmd2/cmd2\u000a\u000aCommit: 2397280cad072a27a51f5ec1cc64908039d14bd1\u000aAuthor: Kevin Van Brunt <kmvanbrunt@gmail.com>\u000aDate: 2021-03-26 18:56:33\u000a\u000aThis commit is based on pySim gerrit changes:\u000aIfce40410587c85ae932774144b9548b154ee8ad0\u000aI19d28276e73e7024f64ed693c3b5e37c1344c687\u000a\u000aChange-Id: Ibc0e18b002a03ed17933be4d0b4f4e86ad99c26e\u000a",
        "date" : "2023-05-17 17:30:49 +0200",
        "id" : "c85d4067fdbf641f6ca63be862023c0aca726c29",
        "msg" : "pySim-shell: fix compatibility problem with cmd2 >= 2.0.0 (include_ipy)",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-shell.py"
        ],
        "commitId" : "961b803ec4b04e83fdec54b03c9d3345de17c3d0",
        "timestamp" : 1684337449000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "pySim-shell: fix compatibility problem with cmd2 >= 2.3.0 (bg)\u000a\u000acmd2.fg and cmd2.bg have been deprecated in cmd2 2.3.0 and removed\u000ain cmd2 2.4.0. Let's work around this by a version check.\u000a\u000aRelated upstream commits:\u000a(See also: https://github.com/python-cmd2/cmd2)\u000a\u000aCommit f57b08672af97f9d973148b6c30d74fe4e712d14\u000aAuthor: Kevin Van Brunt <kmvanbrunt@gmail.com>\u000aDate:   Mon Oct 11 15:20:46 2021 -0400\u000a\u000aand\u000a\u000aCommit f217861feae45a0a1abb56436e68c5dd859d64c0\u000aAuthor: Kevin Van Brunt <kmvanbrunt@gmail.com>\u000aDate:   Wed Feb 16 13:34:13 2022 -0500\u000a\u000aChange-Id: I9fd32c0fd8f6d40e00a318602af97c288605e8e5\u000a",
        "date" : "2023-05-17 17:30:49 +0200",
        "id" : "961b803ec4b04e83fdec54b03c9d3345de17c3d0",
        "msg" : "pySim-shell: fix compatibility problem with cmd2 >= 2.3.0 (bg)",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "setup.py",
          "requirements.txt",
          "README.md"
        ],
        "commitId" : "f8a3d2b3db86a9644e0585c954d36bd87c454494",
        "timestamp" : 1684337449000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "requirements.txt: allow cmd2 versions greater than 1.5\u000a\u000aSince we now have fixed the compatibility issues with recent cmd2\u000aversions, we may allow also versions greater than 1.5 in the\u000arequirements.txt\u000a\u000aChange-Id: I87702c5250a3660c84458939167bffdca9c06059\u000a",
        "date" : "2023-05-17 17:30:49 +0200",
        "id" : "f8a3d2b3db86a9644e0585c954d36bd87c454494",
        "msg" : "requirements.txt: allow cmd2 versions greater than 1.5",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "README.md"
          },
          {
            "editType" : "edit",
            "file" : "requirements.txt"
          },
          {
            "editType" : "edit",
            "file" : "setup.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "setup.py"
        ],
        "commitId" : "2b15e315e2d2b573787d9bd99f84c61086683547",
        "timestamp" : 1684337449000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "setup: add missing pyyaml to setup.py and README.md\u000a\u000aChange-Id: I1d35f38b17a315dd58e8dd91a27bfa6c2c85905d\u000a",
        "date" : "2023-05-17 17:30:49 +0200",
        "id" : "2b15e315e2d2b573787d9bd99f84c61086683547",
        "msg" : "setup: add missing pyyaml to setup.py and README.md",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "setup.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "README.md"
        ],
        "commitId" : "3bcc22f73dfa7d1823d6f405ce6cffb6bebeeb0b",
        "timestamp" : 1684337449000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "README.md: add missing pycryptodome to dependency list\u000a\u000aChange-Id: Ib3cf13a1ad38749ac82d1b36fa32d9c5aba29e1a\u000a",
        "date" : "2023-05-17 17:30:49 +0200",
        "id" : "3bcc22f73dfa7d1823d6f405ce6cffb6bebeeb0b",
        "msg" : "README.md: add missing pycryptodome to dependency list",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "README.md"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-shell.py"
        ],
        "commitId" : "e47ea5f2e574491e69d9eb8ab9ee6fe13c7d78d5",
        "timestamp" : 1684840353000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/osmith",
          "fullName" : "Oliver Smith"
        },
        "authorEmail" : "osmith@sysmocom.de",
        "comment" : "Fix pylint errors\u000a\u000aIn a previous patch the dependency on cmd2 was changed from cmd2==1.5 to\u000acmd2>=1.5. After this was merged, this lead to the docker images getting\u000arebuilt and now having a higher cmd2 version that gets used in the CI\u000achecks. So while the patch was in review, pylint was actually running\u000awith a lower cmd2 version and was taking different code paths.\u000a\u000aFix for:\u000apySim-shell.py:30:4: E0611: No name 'fg' in module 'cmd2' (no-name-in-module)\u000apySim-shell.py:30:4: E0611: No name 'bg' in module 'cmd2' (no-name-in-module)\u000apySim-shell.py:154:8: E1123: Unexpected keyword argument 'use_ipython' in method call (unexpected-keyword-arg)\u000apySim-shell.py:171:30: E1120: No value for argument 'settable_object' in constructor call (no-value-for-parameter)\u000apySim-shell.py:173:30: E1120: No value for argument 'settable_object' in constructor call (no-value-for-parameter)\u000apySim-shell.py:175:30: E1120: No value for argument 'settable_object' in constructor call (no-value-for-parameter)\u000apySim-shell.py:176:30: E1120: No value for argument 'settable_object' in constructor call (no-value-for-parameter)\u000a\u000aFixes: f8a3d2b3 (\"requirements.txt: allow cmd2 versions greater than 1.5\")\u000aFixes: OS#6034\u000aChange-Id: I182d3a2b87e70ed551a70c88d3d531a36bf53f53\u000a",
        "date" : "2023-05-23 13:12:33 +0200",
        "id" : "e47ea5f2e574491e69d9eb8ab9ee6fe13c7d78d5",
        "msg" : "Fix pylint errors",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "contrib/jenkins.sh"
        ],
        "commitId" : "a793552b4fb9caefdcc345f629390481d557431c",
        "timestamp" : 1684840361000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/osmith",
          "fullName" : "Oliver Smith"
        },
        "authorEmail" : "osmith@sysmocom.de",
        "comment" : "contrib/jenkins.sh: print pylint version before running it\u000a\u000aChange-Id: Icc96ff16af482581dc97a387bcff1374fbb620f3\u000aRelated: OS#6034\u000a",
        "date" : "2023-05-23 13:12:41 +0200",
        "id" : "a793552b4fb9caefdcc345f629390481d557431c",
        "msg" : "contrib/jenkins.sh: print pylint version before running it",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "contrib/jenkins.sh"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "setup.py"
        ],
        "commitId" : "ade366d2a9bc319d5f353f648b9e7f390de80715",
        "timestamp" : 1684918981000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/fixeria",
          "fullName" : "Vadim Yanitskiy"
        },
        "authorEmail" : "vyanitskiy@sysmocom.de",
        "comment" : "setup.py: add missing packages for pySim-trace.py\u000a\u000apySim-trace.py is broken if pySim is installed using setup.py:\u000a\u000a  fixeria@DELL:~$ pySim-trace.py\u000a  Traceback (most recent call last):\u000a    File \"/usr/bin/pySim-trace.py\", line 8, in <module>\u000a      from pySim.apdu import *\u000a  ModuleNotFoundError: No module named 'pySim.apdu'\u000a\u000aChange-Id: I371143cb4009db46275ec7a020497b909dcc3b4e\u000a",
        "date" : "2023-05-24 09:03:01 +0000",
        "id" : "ade366d2a9bc319d5f353f648b9e7f390de80715",
        "msg" : "setup.py: add missing packages for pySim-trace.py",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "setup.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_51_011.py",
          "docs/shell.rst"
        ],
        "commitId" : "c224b3b5f1449661ba85e4970c749c1a16167b47",
        "timestamp" : 1685001344000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "ts_51_011: Add sst_service_[de]{activate,allocate} shell commands\u000a\u000aJust like the existing commands for UST/IST: Allow the user to\u000aactivate/deactivate individual services.  As EF.SST also contains\u000ainformation about \"allocation\" of a service, let's have commands for\u000aallocation and activation.\u000a\u000aChange-Id: If959d06248cb1a9d2c0a21cdd40d438726cbc5f0\u000a",
        "date" : "2023-05-25 07:55:44 +0000",
        "id" : "c224b3b5f1449661ba85e4970c749c1a16167b47",
        "msg" : "ts_51_011: Add sst_service_[de]{activate,allocate} shell commands",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_51_011.py"
          },
          {
            "editType" : "edit",
            "file" : "docs/shell.rst"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_31_102.py"
        ],
        "commitId" : "fc67de22192f8aa67c80dd0c8943ceb5b5cd13fe",
        "timestamp" : 1685001344000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "ts_31_102: Extend from Rel16 to Rel17\u000a\u000aThis adds definitions for a variety of files which were added in Release\u000a17 of 3GPP TS 31.102.\u000a\u000aChange-Id: I61badc1988b006a1065bdfdcc8a93b758e31f79b\u000a",
        "date" : "2023-05-25 07:55:44 +0000",
        "id" : "fc67de22192f8aa67c80dd0c8943ceb5b5cd13fe",
        "msg" : "ts_31_102: Extend from Rel16 to Rel17",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_102.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_51_011.py"
        ],
        "commitId" : "10a1a0a22e5d2998172bccc30cdb893c8e773ddf",
        "timestamp" : 1685001344000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "ts_51_011: Fix FID of EF.BCCH\u000a\u000aIt's 6F74, not 6F7F! (see TS 51.011 Section 10.3.14)\u000a\u000aChange-Id: I9d90fa05a0f926f99a5d4832341cc8a9449df7ae\u000a",
        "date" : "2023-05-25 07:55:44 +0000",
        "id" : "10a1a0a22e5d2998172bccc30cdb893c8e773ddf",
        "msg" : "ts_51_011: Fix FID of EF.BCCH",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_51_011.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_51_011.py"
        ],
        "commitId" : "33eef850c006bce946c026007b0bf907af5d7225",
        "timestamp" : 1685001344000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "ts_51_011: Fix EF.Phase FID (it's 6FAE, not 6FA3)\u000a\u000aChange-Id: I11df83b17b8d6eaab309908cbee646c888abab0d\u000a",
        "date" : "2023-05-25 07:55:44 +0000",
        "id" : "33eef850c006bce946c026007b0bf907af5d7225",
        "msg" : "ts_51_011: Fix EF.Phase FID (it's 6FAE, not 6FA3)",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_51_011.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_31_102.py"
        ],
        "commitId" : "04bd5140fddd9eee4440122d7882663414885094",
        "timestamp" : 1685001344000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "ts_31_102: Fix EF.NIA FID\u000a\u000aThe FID in ADF.USIM is different from the FID in DF.GSM.  So while\u000awe can re-use the ts_51_011 EF_NIA class definition, we must pass in\u000aa different fid to the constructor.\u000a\u000aChange-Id: Ib414d5b476666e276824266e33b341175a2ee05a\u000a",
        "date" : "2023-05-25 07:55:44 +0000",
        "id" : "04bd5140fddd9eee4440122d7882663414885094",
        "msg" : "ts_31_102: Fix EF.NIA FID",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_102.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_31_102.py"
        ],
        "commitId" : "5206429c0c3d0bd777ba0abb5f652b6b4685bb8e",
        "timestamp" : 1685001344000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "ts_31_102: Fix FID of EF.OPL5G (it's 4F08 instead of 6F08)\u000a\u000aChange-Id: I68c7ad93dabd768d80ae629498aee29d7bab5542\u000a",
        "date" : "2023-05-25 07:55:44 +0000",
        "id" : "5206429c0c3d0bd777ba0abb5f652b6b4685bb8e",
        "msg" : "ts_31_102: Fix FID of EF.OPL5G (it's 4F08 instead of 6F08)",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_102.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_31_102.py"
        ],
        "commitId" : "24e77a775815e90cb9f04ae9157ddc2fcee87eff",
        "timestamp" : 1685001344000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "ts_31_102: Fix FID + SFI of EF.MCHPPLMN\u000a\u000aChange-Id: I7e24c904e47cc6f90e90b8634cbed478bd14231f\u000a",
        "date" : "2023-05-25 07:55:44 +0000",
        "id" : "24e77a775815e90cb9f04ae9157ddc2fcee87eff",
        "msg" : "ts_31_102: Fix FID + SFI of EF.MCHPPLMN",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_102.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_31_102.py"
        ],
        "commitId" : "2bee70cbac8c2fbff4c8809e125dc4833884e4a3",
        "timestamp" : 1685001514000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "ts_31_102: Add DF.SAIP support\u000a\u000aDF.SAIP (SIMalliance Interoperable Profile) is not part of 31.102,\u000abut something from the eSIM/eUICC universe of TCA (formerly known as\u000aSIMalliance).  However, as 3GPP does not specify how/where the card\u000astores the information required for SUCI calculation, the\u000aTCA/SIMalliance standard is the only standard there is.  Some CardOS\u000astart to use this standard even for non-eSIM/eUICC use cases.\u000a\u000aChange-Id: Iffb65af335dfdbd7791fca9a0a6ad4b79814a57c\u000a",
        "date" : "2023-05-25 09:58:34 +0200",
        "id" : "2bee70cbac8c2fbff4c8809e125dc4833884e4a3",
        "msg" : "ts_31_102: Add DF.SAIP support",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_102.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/cards.py",
          "pySim/sysmocom_sja2.py"
        ],
        "commitId" : "0489ae67cfb62f15d70ea12ccd6fc93603fa7793",
        "timestamp" : 1685046187000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "cards.py: support ATR-based detection of sysmoISIM-SJA5\u000a\u000aThe cards are 99% software-compatible to the SJA2, so let's just\u000aderive the SJA5 class from the SJA2\u000a\u000aChange-Id: I706631baaf447c49904277886bc9a3f6ba3f5532\u000a",
        "date" : "2023-05-25 22:23:07 +0200",
        "id" : "0489ae67cfb62f15d70ea12ccd6fc93603fa7793",
        "msg" : "cards.py: support ATR-based detection of sysmoISIM-SJA5",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/cards.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/sysmocom_sja2.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "docs/suci-tutorial.rst",
          "docs/shell.rst",
          "docs/conf.py"
        ],
        "commitId" : "69b69d4d845d6276ed28c148b96280e02798751c",
        "timestamp" : 1685183832000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "docs: add SUPI/SUCI usage example\u000a\u000aChange-Id: I2908ea9df7e78c596554731085902e2ab7278328\u000a",
        "date" : "2023-05-27 12:37:12 +0200",
        "id" : "69b69d4d845d6276ed28c148b96280e02798751c",
        "msg" : "docs: add SUPI/SUCI usage example",
        "paths" : [
          {
            "editType" : "add",
            "file" : "docs/suci-tutorial.rst"
          },
          {
            "editType" : "edit",
            "file" : "docs/shell.rst"
          },
          {
            "editType" : "edit",
            "file" : "docs/conf.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/cards.py"
        ],
        "commitId" : "c296cb593e9bc27ab6d482b88b007db51d5eaa3f",
        "timestamp" : 1685183836000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "cards: Add support for Gialer SIM cards\u000a\u000aChange-Id: Icd2021aec630ac018f66ab565e03112047389e17\u000a",
        "date" : "2023-05-27 12:37:16 +0200",
        "id" : "c296cb593e9bc27ab6d482b88b007db51d5eaa3f",
        "msg" : "cards: Add support for Gialer SIM cards",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/cards.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "setup.py"
        ],
        "commitId" : "bca01523dfe0105c3af7e7b1602fcfd2e45fd492",
        "timestamp" : 1685268801000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/fixeria",
          "fullName" : "Vadim Yanitskiy"
        },
        "authorEmail" : "vyanitskiy@sysmocom.de",
        "comment" : "setup.py: fix syntax errors (missing commas)\u000a\u000aChange-Id: Ia53a659ad9652d582e2bf4a039a3e18631435072\u000aFixes: 2b15e315 \"setup: add missing pyyaml to setup.py and README.md\"\u000aFixes: 93aac3ab \"pySim-shell: fix compatibility problem with cmd2 >= 2.0.0 (Settable)\"\u000a",
        "date" : "2023-05-28 17:13:21 +0700",
        "id" : "bca01523dfe0105c3af7e7b1602fcfd2e45fd492",
        "msg" : "setup.py: fix syntax errors (missing commas)",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "setup.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/transport/modem_atcmd.py",
          "pySim/filesystem.py"
        ],
        "commitId" : "d70ac226186de5503b2adc9de117d2818d307867",
        "timestamp" : 1685720143000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "modem_atcmd: raise ProtocolError instead of ReaderError on CME ERROR\u000a\u000aAlso accept ProtocolError in addition to SwMatchError in filesystem.py\u000awhen probing for applications\u000a\u000aChange-Id: I82b50408328f8eaaee5c9e311c4620d20f930642\u000a",
        "date" : "2023-06-02 15:35:43 +0000",
        "id" : "d70ac226186de5503b2adc9de117d2818d307867",
        "msg" : "modem_atcmd: raise ProtocolError instead of ReaderError on CME ERROR",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/filesystem.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/modem_atcmd.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "docs/suci-tutorial.rst",
          "pySim/ts_31_102.py"
        ],
        "commitId" : "455611c9a33099673b1807d74769597d8c1805d1",
        "timestamp" : 1685796335000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "ts_31_102: Add decoder/encoder for DF.5GS/EF.Routing_Indicator\u000a\u000aThis file is rather important for 5G SA operation, so we should have\u000aa proper encoder/decoder in place.\u000a\u000aChange-Id: I1b37fdfc2807976880b2cafb61951f08eebeb344\u000a",
        "date" : "2023-06-03 12:45:35 +0000",
        "id" : "455611c9a33099673b1807d74769597d8c1805d1",
        "msg" : "ts_31_102: Add decoder/encoder for DF.5GS/EF.Routing_Indicator",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_102.py"
          },
          {
            "editType" : "edit",
            "file" : "docs/suci-tutorial.rst"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_31_102.py"
        ],
        "commitId" : "ba6d6ab64f8f7322adc251ec9ed9814f62e6c18d",
        "timestamp" : 1685796335000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "ts_31_102: EF_SUPI_NAI: Decode/Encode GLI+GCI as UTF-8 strings\u000a\u000aAccording to TS 23.003 Section 28.15 and 28.16 both GLI and GCI\u000aare NAI as defined in IETF RFC 7542, which in turn specifies they\u000aare encoded in UTF-8.\u000a\u000aChange-Id: I0a82bd0d0a2badd7bc4a1f8de2c3e3c144ee5b12\u000a",
        "date" : "2023-06-03 12:45:35 +0000",
        "id" : "ba6d6ab64f8f7322adc251ec9ed9814f62e6c18d",
        "msg" : "ts_31_102: EF_SUPI_NAI: Decode/Encode GLI+GCI as UTF-8 strings",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_102.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/construct.py",
          "pySim/sysmocom_sja2.py"
        ],
        "commitId" : "954ce95a1648c7d81eac5c693532ea3554e5f489",
        "timestamp" : 1685796335000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "SJA2: Implement DF.SYSTEM/EF.0348_KEY using construct\u000a\u000aThis implicitly adds support for JSON->binary encoding, not just\u000adecoding (previous code predating construct support).\u000a\u000aChange-Id: I0994d9f66a504dd3c60b43ed5cf6645515dcbc6a\u000a",
        "date" : "2023-06-03 12:45:35 +0000",
        "id" : "954ce95a1648c7d81eac5c693532ea3554e5f489",
        "msg" : "SJA2: Implement DF.SYSTEM/EF.0348_KEY using construct",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/construct.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/sysmocom_sja2.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/sysmocom_sja2.py"
        ],
        "commitId" : "557c13685e2587c80a07b4e88323d8036f7f0df8",
        "timestamp" : 1685796335000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "SJA5: Add TUAK + XOR-2G algorithm definitions for EF_[U]SIM_AUTH_KEY\u000a\u000aChange-Id: I62a7255d991fa1ed09a7c9bcf8be4b68acfa61a7\u000a",
        "date" : "2023-06-03 12:45:35 +0000",
        "id" : "557c13685e2587c80a07b4e88323d8036f7f0df8",
        "msg" : "SJA5: Add TUAK + XOR-2G algorithm definitions for EF_[U]SIM_AUTH_KEY",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/sysmocom_sja2.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/sysmocom_sja2.py"
        ],
        "commitId" : "03650582e0cda9564e48bebd86049349d928d0be",
        "timestamp" : 1685796335000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "SJA5: Proper encode/decode of TUAK data in EF.USIM_AUTH_KEY\u000a\u000aUnfortunately, TUAK requires a number of additional (and\u000adifferently-sized) parameters, so the format of EF.USIM_AUTH_KEY\u000adiffers significantly depending on TUAK or non-TUAK case.\u000a\u000aChange-Id: I0dcfe05777510fb34973dc2259b137133d8e199d\u000a",
        "date" : "2023-06-03 12:45:35 +0000",
        "id" : "03650582e0cda9564e48bebd86049349d928d0be",
        "msg" : "SJA5: Proper encode/decode of TUAK data in EF.USIM_AUTH_KEY",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/sysmocom_sja2.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ota.py"
        ],
        "commitId" : "219a5f369c82c5ba266e1e828bd0116fca6f714b",
        "timestamp" : 1685796335000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "OTA: Fix padding of AES CMAC\u000a\u000aWhen using AES CMAC for authentication of OTA messages, we must not pad\u000athe user data before calling the CMAC function. This is unlike the DES\u000aMAC, where padding to the DES block size is mandatory.\u000a\u000aThis bug was discovered when trying to talk OTA with AES to a\u000asysmoISIM-SJA5.  This patch makes the OTA AES interoperate with the\u000acard.  Also, with this patch the cryptographic results of pySim/ota.py\u000aare identical to those of the java code\u000aorg.opentelecoms.gsm0348.impl.crypto.CipheringManager\u000a\u000aChange-Id: I4b40b5857f95ccb21c35795abe7a1995e368bac3\u000a",
        "date" : "2023-06-03 12:45:35 +0000",
        "id" : "219a5f369c82c5ba266e1e828bd0116fca6f714b",
        "msg" : "OTA: Fix padding of AES CMAC",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ota.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "setup.py",
          "requirements.txt",
          "pySim/ota.py",
          "pySim/utils.py",
          "README.md"
        ],
        "commitId" : "d75fa3f7c90541db51127ddff97ccf6c3f03734e",
        "timestamp" : 1685991491000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "Switch from pycryptodome to pycryptodomex\u000a\u000aSo for some weird historical reasons, the same python module is\u000aavailable as pycryptodome (Crypto.* namespace) and pycryptodomex\u000a(Cryptodome.* namespace).  See the following information on the project\u000ahomepage: https://www.pycryptodome.org/src/installation\u000a\u000aTo make things extra-weird, Debian choose to package pycryptodomex as\u000apython3-pycryptodome\u000a(https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=886291).\u000a\u000aSo in order to support both Debian-packaged and differently-installed\u000apackages, let's switch to pycryotodomex on all platforms/installers.\u000a\u000aChange-Id: I04daed01f51f9702595ef9f9e0d7fcdf1e4adb62\u000a",
        "date" : "2023-06-05 20:58:11 +0200",
        "id" : "d75fa3f7c90541db51127ddff97ccf6c3f03734e",
        "msg" : "Switch from pycryptodome to pycryptodomex",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/utils.py"
          },
          {
            "editType" : "edit",
            "file" : "README.md"
          },
          {
            "editType" : "edit",
            "file" : "requirements.txt"
          },
          {
            "editType" : "edit",
            "file" : "setup.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ota.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_31_104.py",
          "pySim-shell.py"
        ],
        "commitId" : "e619105249167d8f14e90f2a72ec77ea7aeb1140",
        "timestamp" : 1686065799000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "HPSIM application support\u000a\u000aSupport HPSIM as specified in 3GPP TS 31.104\u000a\u000aChange-Id: I2729fd2b88cd13c36d7128753ad8d3e3d08a9b52\u000a",
        "date" : "2023-06-06 17:36:39 +0200",
        "id" : "e619105249167d8f14e90f2a72ec77ea7aeb1140",
        "msg" : "HPSIM application support",
        "paths" : [
          {
            "editType" : "add",
            "file" : "pySim/ts_31_104.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-shell.py"
        ],
        "commitId" : "892526ffd0f9e8f410e54b98f40b3522ccc4af52",
        "timestamp" : 1686065799000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-shell: Unregister TS 102 222 commands during 'equip'\u000a\u000aThis avoids error messages about re-registering the same TS 102 222\u000acommands during executing the 'equip' command.\u000a\u000aChange-Id: I3567247fe84e928e3ef404c07eff8250ef04dfe9\u000a",
        "date" : "2023-06-06 17:36:39 +0200",
        "id" : "892526ffd0f9e8f410e54b98f40b3522ccc4af52",
        "msg" : "pySim-shell: Unregister TS 102 222 commands during 'equip'",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/commands.py"
        ],
        "commitId" : "c85ae4188fe868dbb29cfd29baa3e96221ce6c81",
        "timestamp" : 1686065799000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "Fix result parsing of \"suspend_uicc\"\u000a\u000aprior to this patch, the suspend_uicc command would always cause a\u000apython exception as a list of integers was returned by decode_duration rather than a single integer (that can be used with %u format string).\u000a\u000aChange-Id: I981e9d46607193176b28cb574564e6da546501ba\u000a",
        "date" : "2023-06-06 17:36:39 +0200",
        "id" : "c85ae4188fe868dbb29cfd29baa3e96221ce6c81",
        "msg" : "Fix result parsing of \"suspend_uicc\"",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/commands.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_31_102.py"
        ],
        "commitId" : "4e5aa304fc626879ce76deb216e53bd92ba77dc5",
        "timestamp" : 1686072269000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "ts_31_102: fix typo\u000a\u000aChange-Id: Ic8f93a55b974984472356f48518da91c6a521409\u000a",
        "date" : "2023-06-06 19:24:29 +0200",
        "id" : "4e5aa304fc626879ce76deb216e53bd92ba77dc5",
        "msg" : "ts_31_102: fix typo",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_102.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_102_221.py",
          "docs/shell.rst",
          "pySim-shell.py"
        ],
        "commitId" : "659781cbe1a4b43cf15d9d4971ffec3946514fa8",
        "timestamp" : 1686129033000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "Move \"suspend_uicc\" command from pySim-shell to ts_102_221.py\u000a\u000aThe SUSPEND UICC command is a TS 102 221 (UICC) command, so move\u000ait to the UICC Card Profile.\u000a\u000aAlso, make sure that any shell command sets specified in the\u000aCardProfile are actually installed during equip().\u000a\u000aChange-Id: I574348951f06b749aeff986589186110580328bc\u000a",
        "date" : "2023-06-07 11:10:33 +0200",
        "id" : "659781cbe1a4b43cf15d9d4971ffec3946514fa8",
        "msg" : "Move \"suspend_uicc\" command from pySim-shell to ts_102_221.py",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          },
          {
            "editType" : "edit",
            "file" : "docs/shell.rst"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_102_221.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_102_221.py",
          "docs/shell.rst",
          "pySim/commands.py"
        ],
        "commitId" : "b0e0dce80adb61aa45221a6ac45ba0e258fc4275",
        "timestamp" : 1686129214000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "ts_102221: Add \"resume_uicc\" command\u000a\u000aWe've had a \"suspend_uicc\" command since commit\u000aec95053249bc7f9308ca1f659d8ef6ac97a6e393 in 2021, but didn't yet\u000ahave the corresponding \"resume\" pair.\u000a\u000aNote that you cannot really execute this in a reasonable way from\u000awithin pySim, as it is required to power-cycle the card\u000abetween SUSPEND and RESUME, see TS 102 221 Section 11.1.22.3.2\u000a\u000aChange-Id: I3322fde74f680e77954e1d3e18a32ef5662759f2\u000a",
        "date" : "2023-06-07 11:13:34 +0200",
        "id" : "b0e0dce80adb61aa45221a6ac45ba0e258fc4275",
        "msg" : "ts_102221: Add \"resume_uicc\" command",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_102_221.py"
          },
          {
            "editType" : "edit",
            "file" : "docs/shell.rst"
          },
          {
            "editType" : "edit",
            "file" : "pySim/commands.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/apdu/ts_31_102.py"
        ],
        "commitId" : "1de62c41d7f98186deb346332ae08f56679bf6b8",
        "timestamp" : 1686129247000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim/apdu/ts_31_102.py: Add Rel17 5G NSWO context for GET IDENTITY\u000a\u000aChange-Id: I6ce5848ca4cf04430be7767e9cb2d18f4c5a5531\u000a",
        "date" : "2023-06-07 11:14:07 +0200",
        "id" : "1de62c41d7f98186deb346332ae08f56679bf6b8",
        "msg" : "pySim/apdu/ts_31_102.py: Add Rel17 5G NSWO context for GET IDENTITY",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/apdu/ts_31_102.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pysim-testdata/Fairwaves-SIM.ok",
          "pysim-testdata/sysmoISIM-SJA2.ok",
          "pysim-testdata/Wavemobile-SIM.ok",
          "pySim/cards.py",
          "pysim-testdata/sysmoUSIM-SJS1.ok",
          "pySim-prog.py",
          "pySim-read.py"
        ],
        "commitId" : "777ee9e54d9e26fe1ab507d328409e35509057f3",
        "timestamp" : 1686132007000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "Add FPLMN read and program\u000a\u000aChange-Id: I9ce8c1af691c28ea9ed69e7b5f03f0c02d1f029b\u000a",
        "date" : "2023-06-07 10:00:07 +0000",
        "id" : "777ee9e54d9e26fe1ab507d328409e35509057f3",
        "msg" : "Add FPLMN read and program",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pysim-testdata/sysmoUSIM-SJS1.ok"
          },
          {
            "editType" : "edit",
            "file" : "pysim-testdata/sysmoISIM-SJA2.ok"
          },
          {
            "editType" : "edit",
            "file" : "pysim-testdata/Fairwaves-SIM.ok"
          },
          {
            "editType" : "edit",
            "file" : "pySim-prog.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/cards.py"
          },
          {
            "editType" : "edit",
            "file" : "pysim-testdata/Wavemobile-SIM.ok"
          },
          {
            "editType" : "edit",
            "file" : "pySim-read.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pysim-testdata/sysmoUSIM-SJS1.ok",
          "pysim-testdata/sysmoISIM-SJA2.ok",
          "pySim/utils.py"
        ],
        "commitId" : "60951b0c17c5c04e75824d671fe415f84d6b3bb8",
        "timestamp" : 1686132007000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "utils: Remove format_xplmn leading zeros in MNC\u000a\u000aChange-Id: I803edafbd892c2b32b884d0b39fed61967a3d68b\u000a",
        "date" : "2023-06-07 10:00:07 +0000",
        "id" : "60951b0c17c5c04e75824d671fe415f84d6b3bb8",
        "msg" : "utils: Remove format_xplmn leading zeros in MNC",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pysim-testdata/sysmoISIM-SJA2.ok"
          },
          {
            "editType" : "edit",
            "file" : "pySim/utils.py"
          },
          {
            "editType" : "edit",
            "file" : "pysim-testdata/sysmoUSIM-SJS1.ok"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/transport/serial.py"
        ],
        "commitId" : "621f78c9437b315264a532eeb6d2cc0e9b50c441",
        "timestamp" : 1686132052000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "serial: return a return code in reset_card()\u000a\u000aThe method reset_card does not return a return code, while the\u000acoresponding pcsc implementation does return 1 on success.\u000a\u000aChange-Id: I658dd6857580652696b4a77e7d6cfe5778f09eff\u000a",
        "date" : "2023-06-07 10:00:52 +0000",
        "id" : "621f78c9437b315264a532eeb6d2cc0e9b50c441",
        "msg" : "serial: return a return code in reset_card()",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/transport/serial.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_31_102.py",
          "docs/shell.rst",
          "pySim/commands.py"
        ],
        "commitId" : "7ec822373ee6f14165c59fe6c997ad31d4bbf3e8",
        "timestamp" : 1686153257000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "ts_31_102: Add shell command for GET IDENTITY\u000a\u000aGET IDENTITY is used in the \"SUCI computation on USIM\" feature.\u000a\u000aChange-Id: I619d397900dbd6565f8f46acdabcee511903830c\u000a",
        "date" : "2023-06-07 15:54:17 +0000",
        "id" : "7ec822373ee6f14165c59fe6c997ad31d4bbf3e8",
        "msg" : "ts_31_102: Add shell command for GET IDENTITY",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_102.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/commands.py"
          },
          {
            "editType" : "edit",
            "file" : "docs/shell.rst"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/sysmocom_sja2.py"
        ],
        "commitId" : "19b4a971e9405d047324922a160d0a976115c5ea",
        "timestamp" : 1686238120000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "SJA5: EF.USIM_AUTH_KEY: Display / enforce proper length TUAK K\u000a\u000aThe K value in case of TUAK can be 16 or 32 bytes long.  We used to\u000apermit/parse/display 32 bytes even if only 16 bytes was configured.\u000a\u000aLet's enforce the correct length of \"K\".\u000a\u000aFixes: OS#6053\u000aChange-Id: Ia0f9a2138f16dce72f3118001e95baa1c80f23ce\u000a",
        "date" : "2023-06-08 17:28:40 +0200",
        "id" : "19b4a971e9405d047324922a160d0a976115c5ea",
        "msg" : "SJA5: EF.USIM_AUTH_KEY: Display / enforce proper length TUAK K",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/sysmocom_sja2.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tests/test_ota.py"
        ],
        "commitId" : "75e31c5d5b5b20a669772f5c44e4416bfc79b5aa",
        "timestamp" : 1686238186000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "test_ota: Add one first OTA SMS AES128 unit test\u000a\u000aChange-Id: Id4a66bbfaec2d8610e8a7a2c72c0dfd08332edcd\u000a",
        "date" : "2023-06-08 17:29:46 +0200",
        "id" : "75e31c5d5b5b20a669772f5c44e4416bfc79b5aa",
        "msg" : "test_ota: Add one first OTA SMS AES128 unit test",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "tests/test_ota.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "README.md"
        ],
        "commitId" : "555cf6f6db797d62e2b5254c74c2c6016cfc0ca2",
        "timestamp" : 1686253584000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "README: rephrase initial section; add HPSIM; programmable vs. standard\u000a\u000aChange-Id: Ied7bce9fc4ebc9a71093ac41d9c1b8e67fe04d7e\u000a",
        "date" : "2023-06-08 21:46:24 +0200",
        "id" : "555cf6f6db797d62e2b5254c74c2c6016cfc0ca2",
        "msg" : "README: rephrase initial section; add HPSIM; programmable vs. standard",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "README.md"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "README.md"
        ],
        "commitId" : "1dce498a67bf7730c98f27e712c3323caf3ff9fe",
        "timestamp" : 1686253584000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "README: remove redundancy 'Manual' and 'Documentation\u000a\u000aAlso, re-order sections oriented more towards the user (Docs first)\u000a\u000aChange-Id: I4fc76222a1c22685131cb6926721ce24f0373046\u000a",
        "date" : "2023-06-08 21:46:24 +0200",
        "id" : "1dce498a67bf7730c98f27e712c3323caf3ff9fe",
        "msg" : "README: remove redundancy 'Manual' and 'Documentation",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "README.md"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_31_102.py",
          "pySim/construct.py"
        ],
        "commitId" : "f9a5ba5e0f107458d7dfd68ce96a1b6c0d6096ea",
        "timestamp" : 1686295193000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "31.102: Fix EF.Routing_Indicator for odd number of digits\u000a\u000aThe routing indicator is BCD-encoded but has an arbitrary length of\u000a1, 2, 3 or 4 digits.\u000a\u000aIn order to support the odd lengths of 1 or 3, we must not pad on the\u000abyte level, but on the nibble level. This requires a slight extension of\u000athe Rpad() Adapter.\u000a\u000aChange-Id: I6c26dccdd570de7b7a4cd48338068e230340ec7c\u000aFixes: OS#6054\u000a",
        "date" : "2023-06-09 09:19:53 +0200",
        "id" : "f9a5ba5e0f107458d7dfd68ce96a1b6c0d6096ea",
        "msg" : "31.102: Fix EF.Routing_Indicator for odd number of digits",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/construct.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_102.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-shell.py",
          "docs/legacy.rst",
          "pySim-read.py",
          "docs/shell.rst"
        ],
        "commitId" : "f422eb18861906fbc544371496d38b4c95dde09f",
        "timestamp" : 1686304218000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "Add \".py\" suffix to sphinx-argparse generated docs\u000a\u000aThis is important to produce the right command syntax when generating\u000acommand line reference in the user manual.  However, we shouldn't add\u000athis kludge to the individual programs, but only to the documentation\u000ausing the :prog: syntax.\u000a\u000aChange-Id: I2ec7ab00c63d5d386f187e54755c71ffc2dce429\u000a",
        "date" : "2023-06-09 11:50:18 +0200",
        "id" : "f422eb18861906fbc544371496d38b4c95dde09f",
        "msg" : "Add \".py\" suffix to sphinx-argparse generated docs",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim-read.py"
          },
          {
            "editType" : "edit",
            "file" : "docs/shell.rst"
          },
          {
            "editType" : "edit",
            "file" : "docs/legacy.rst"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-shell.py"
        ],
        "commitId" : "e345e1126d9cdd248592ac0d9e4ed83500b3ca01",
        "timestamp" : 1686510697000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-shell: fix reset command\u000a\u000aThe API of the lchan object has changed. It no longer features the reset\u000amethod used by the pySim-shell reset command. Let's fix this by using\u000athe reset method of the card object.\u000a\u000aChange-Id: I55511d1edb97e8fa014724598ec173dd47fe25c1\u000a",
        "date" : "2023-06-11 19:11:37 +0000",
        "id" : "e345e1126d9cdd248592ac0d9e4ed83500b3ca01",
        "msg" : "pySim-shell: fix reset command",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "docs/index.rst",
          "pySim-trace.py",
          "docs/trace.rst"
        ],
        "commitId" : "7e55569f3ac20565164439c2c43c1438f29a4c3f",
        "timestamp" : 1686669025000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "docs: Add section on pySim-trace to user manual\u000a\u000aChange-Id: I5edb222818f00e36ed5b067e0f8d5786f39ae887\u000a",
        "date" : "2023-06-13 15:10:25 +0000",
        "id" : "7e55569f3ac20565164439c2c43c1438f29a4c3f",
        "msg" : "docs: Add section on pySim-trace to user manual",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "docs/index.rst"
          },
          {
            "editType" : "edit",
            "file" : "pySim-trace.py"
          },
          {
            "editType" : "add",
            "file" : "docs/trace.rst"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "setup.py",
          "requirements.txt",
          "tests/test_sms.py",
          "pySim/sms.py"
        ],
        "commitId" : "0b32725f805606ff902825ea635fa1717ee28bc0",
        "timestamp" : 1687077983000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "Add support for encoding/decoding SMS in TPDU and SMPP format\u000a\u000aThis is important when talking OTA with a SIM.\u000a\u000aChange-Id: I0d95e62c1e7183a7851d1fe38df0f5133830cb1f\u000a",
        "date" : "2023-06-18 10:46:23 +0200",
        "id" : "0b32725f805606ff902825ea635fa1717ee28bc0",
        "msg" : "Add support for encoding/decoding SMS in TPDU and SMPP format",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/sms.py"
          },
          {
            "editType" : "edit",
            "file" : "requirements.txt"
          },
          {
            "editType" : "add",
            "file" : "tests/test_sms.py"
          },
          {
            "editType" : "edit",
            "file" : "setup.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tests/test_ota.py"
        ],
        "commitId" : "721ba9b31f341c6d9219bc3cfe4de73da63beacd",
        "timestamp" : 1687078250000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "tests: Add new, data-driven OTA tests\u000a\u000aRather than writing one test class with associated method for each\u000aOTA algorithm / test, let's do this in a data-driven way, where new\u000atest cases just have to provide test data, while the code iterates over\u000ait.\u000a\u000aChange-Id: I8789a21fa5a4793bdabd468adc9fee3b6e633c25\u000a",
        "date" : "2023-06-18 10:50:50 +0200",
        "id" : "721ba9b31f341c6d9219bc3cfe4de73da63beacd",
        "msg" : "tests: Add new, data-driven OTA tests",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "tests/test_ota.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-shell.py",
          "pySim/filesystem.py"
        ],
        "commitId" : "e126872a29b5f4919c33ee5080f461ec83bc1c47",
        "timestamp" : 1687674176000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "Fix run-editor bug with cmd2 >= 2.0.0 compatibility\u000a\u000aIn cmd2, the upstream authors decided to rename a method in 2.0.0\u000awithout providing a backwards compatibility wrapper.  Let's add that\u000alocally.\u000a\u000aChange-Id: Iaa17b93db13ba330551799cce5f0388c78217224\u000aCloses: OS#6071\u000a",
        "date" : "2023-06-25 08:22:56 +0200",
        "id" : "e126872a29b5f4919c33ee5080f461ec83bc1c47",
        "msg" : "Fix run-editor bug with cmd2 >= 2.0.0 compatibility",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/filesystem.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/sms.py"
        ],
        "commitId" : "985ff31efa340ec390f00a772433635ddb341c90",
        "timestamp" : 1687850788000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "work-around what appears to be a pylint bug\u000a\u000asmpp.pdu.pdu_types.DataCodingScheme.GSM_MESSAGE_CLASS very much exists,\u000aand I can prove that manually in the python shell.  So let's assume this\u000ais a pylint bug and work around it\u000a\u000apySim/sms.py:72:21: E1101: Instance of 'DataCodingScheme' has no 'GSM_MESSAGE_CLASS' member (no-member)\u000a\u000aChange-Id: Iab34bae06940fecf681af9f45b8657e9be8cbc7b\u000a",
        "date" : "2023-06-27 09:26:28 +0200",
        "id" : "985ff31efa340ec390f00a772433635ddb341c90",
        "msg" : "work-around what appears to be a pylint bug",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/sms.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-shell.py"
        ],
        "commitId" : "0ec01504ab894bce8dd0e2a882f21b0b253f1ee6",
        "timestamp" : 1687850965000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "cosmetic: Implement cmd2.Settable backwards-compat via wrapper class\u000a\u000aLet's avoid too many open-coded if-clauses and simply wrap it in\u000aa compatibility class.\u000a\u000aChange-Id: Id234f3fa56fe7eff8e1153d71b9be8a2e88dd112\u000a",
        "date" : "2023-06-27 09:29:25 +0200",
        "id" : "0ec01504ab894bce8dd0e2a882f21b0b253f1ee6",
        "msg" : "cosmetic: Implement cmd2.Settable backwards-compat via wrapper class",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/tlv.py"
        ],
        "commitId" : "579ac3ec0eb122c83260d7509bc4e6d0cb2fe3b3",
        "timestamp" : 1687850977000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "tlv: Fix IE.from_dict() method\u000a\u000aThe existing IE.from_dict() method *supposedly* accepts a dict as\u000ainput value, but it actually expects the raw decoded value, unless it is\u000aa nested IE.  This is inconsistent in various ways, and results in a bug\u000avisible at a higher layer, such as files like EF.{DOMAIN,IMPI,IMPU},\u000awhich are transparent files containing a single BER-TLV IE.\u000a\u000aDecoding such files worked, but re-encoding them did not, due to the\u000afact that we'd pass a dict to the from_dict method, which then gets\u000aassigned to self.decoded and further passed along to any later actual\u000aencoder function like to_bytes or to_tlv.  In that instance, the dict\u000amight be handed to a self._construct which has no idea how to process\u000athe dict, as it expects the raw decoded value.\u000a\u000aChange-Id: I3dd5204510e5c32ef1c4a999258d87cb3f1df8c8\u000aCloses: OS#6073\u000aRelated: OS#6072\u000a",
        "date" : "2023-06-27 09:29:37 +0200",
        "id" : "579ac3ec0eb122c83260d7509bc4e6d0cb2fe3b3",
        "msg" : "tlv: Fix IE.from_dict() method",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/tlv.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_31_103.py"
        ],
        "commitId" : "fa9f348180ee3bb98edee38ec0209d3989ebe42e",
        "timestamp" : 1687850977000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "ts_31_103: enable encode tests for files containing single TLV IE\u000a\u000aNow that we have fixed OS#6073 in the previous commit, we can enable\u000athe so-far disabled encoder tests for EF.{DOMAIN,IMPU,IMPI} and\u000aremove associated FIXMEs.\u000a\u000aChange-Id: I79bfc5b77122907d6cc2f75605f9331b5e650286\u000a",
        "date" : "2023-06-27 09:29:37 +0200",
        "id" : "fa9f348180ee3bb98edee38ec0209d3989ebe42e",
        "msg" : "ts_31_103: enable encode tests for files containing single TLV IE",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_103.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-shell.py"
        ],
        "commitId" : "f4a01472bf1a5cad38c7db1fd46666a8adfa0b96",
        "timestamp" : 1688498239000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-shell: Support USIM specific methods/commands on unknown UICC\u000a\u000aSo far, if no known programmable card (like sysmoISIM) has been found,\u000awe were using the SimCard base class.  However, once we detect an UICC,\u000awe should have switched to the UsimCard class, as otherwise the various\u000amethods called by USIM/ISIM specific commands don't exist and we get\u000aweird 'SimCard' object has no attribute 'update_ust' execptions.\u000a\u000aThe entire auto-detection and the legacy SimCard / UsimCard classes\u000aare showing the legacy of the code base and should probably be\u000are-architected.  However, let's fix the apparent bug for now.\u000a\u000aChange-Id: I5a863198084250458693f060ca10b268a58550a1\u000aCloses: OS#6055\u000a",
        "date" : "2023-07-04 21:17:19 +0200",
        "id" : "f4a01472bf1a5cad38c7db1fd46666a8adfa0b96",
        "msg" : "pySim-shell: Support USIM specific methods/commands on unknown UICC",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-shell.py"
        ],
        "commitId" : "f818acd5eb669b7d28cb770434ce2b99d3b00169",
        "timestamp" : 1688890348000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-shell: Unregister profile commands during equip\u000a\u000aThis avoids error messages about re-registering 'AddlShellCommands' commandsets during 'equip()' in the bulk_script command.\u000a\u000aChange-Id: I893bb5ae95f5c6e4c2be2d133754e427bc92a33d\u000a",
        "date" : "2023-07-09 08:12:28 +0000",
        "id" : "f818acd5eb669b7d28cb770434ce2b99d3b00169",
        "msg" : "pySim-shell: Unregister profile commands during equip",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/global_platform.py",
          "pySim/tlv.py",
          "pySim/ara_m.py"
        ],
        "commitId" : "30de9fd8abc9d7c2c541fea7fa4b97c4ca1a54eb",
        "timestamp" : 1689057732000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "TLV_IE_Collection: use snake-style names during from_dict()\u000a\u000aThe TLV_IE_Collection, just like the individual TLV classes, do\u000ause their snake-style names when converting from binary to dict\u000ausing the to_dict() method.  It is inconsistent (and a bug) to\u000aexpect the CamelCase names during encoding (from_dict).  After all,\u000awe want the output of to_dict() to be used as input to from_dict().\u000a\u000aChange-Id: Iabd1ad98c3878659d123eef919c22ca824886f8a\u000a",
        "date" : "2023-07-11 08:42:12 +0200",
        "id" : "30de9fd8abc9d7c2c541fea7fa4b97c4ca1a54eb",
        "msg" : "TLV_IE_Collection: use snake-style names during from_dict()",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/tlv.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ara_m.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/global_platform.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/tlv.py"
        ],
        "commitId" : "ba955b650ed49e1ea9516afdc4f97cfe1442272c",
        "timestamp" : 1689057732000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim/tlv.py: Don't create an exception from within raise\u000a\u000aAn invalid variable used in a raise ValueError() would cause a further\u000aexception, depriving the user of a meaningful error message.\u000a\u000aChange-Id: I6eb31b91bd69c311f07ff259a424edc58b57529a\u000a",
        "date" : "2023-07-11 08:42:12 +0200",
        "id" : "ba955b650ed49e1ea9516afdc4f97cfe1442272c",
        "msg" : "pySim/tlv.py: Don't create an exception from within raise",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/tlv.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/tlv.py"
        ],
        "commitId" : "2352f2dcdd4782d11a7dac308d29d77864592f39",
        "timestamp" : 1689057732000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim/tlv.py: Fix TLV_IE_Collection from_dict with nested collections\u000a\u000aThis is all quite complicated.  In general, the TLV_IE.to_dict() method\u000aobviously is expected to return a dict (with key equal to the snake-case\u000aname of the class, value to the decode IE value).  This single-entry\u000adict can then be passed back to the from_dict() method to build the\u000abinary representation.\u000a\u000aHowever, with a TLV_IE_Collection, any TLV_IE can occur any number of\u000atimes, so we need an array to represent it (dict would need unique key,\u000awhich doesn't exist in multiple instances of same TLV IE).  Hence, the\u000aTLV_IE_Collection.to_dict() method actually returns a list of dicts,\u000arather than a dict itself.  Each dict in the list represents one TLV_IE.\u000a\u000aWhen encoding such a TLV_IE_Collection back from the list-of-dicts, we\u000aso far didn't handle this special case and tried to de-serialize with\u000aa class-name-keyed dict, which doesn't work.\u000a\u000aThis patch fixes a regression in the aram_store_ref_ar_do pySim-shell\u000acommand which got introduced in Change-Id I3dd5204510e5c32ef1c4a999258d87cb3f1df8c8\u000a\u000aWhile we're fixing it, add some additional comments to why things are\u000ahow they are.\u000a\u000aChange-Id: Ibdd30cf1652c864f167b1b655b49a87941e15fd5\u000a",
        "date" : "2023-07-11 08:42:12 +0200",
        "id" : "2352f2dcdd4782d11a7dac308d29d77864592f39",
        "msg" : "pySim/tlv.py: Fix TLV_IE_Collection from_dict with nested collections",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/tlv.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/utils.py"
        ],
        "commitId" : "f5e26ae95430a04db4749b6b2fb63d8e555aa6ba",
        "timestamp" : 1689057732000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim/utils: define 'Hexstr' using NewType\u000a\u000aThis means Hexstr is no longer an alias for 'str', but a distinct\u000anew type, a sub-class of 'str'.\u000a\u000aChange-Id: Ifb787670ed0e149ae6fcd0e6c0626ddc68880068\u000a",
        "date" : "2023-07-11 08:42:12 +0200",
        "id" : "f5e26ae95430a04db4749b6b2fb63d8e555aa6ba",
        "msg" : "pySim/utils: define 'Hexstr' using NewType",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/utils.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/transport/__init__.py",
          "pySim/transport/pcsc.py",
          "pySim/transport/calypso.py",
          "pySim/transport/serial.py",
          "pySim/utils.py",
          "pySim/transport/modem_atcmd.py"
        ],
        "commitId" : "ab6897c4cd7f5e0c019f69b2e10ce552bde12127",
        "timestamp" : 1689057732000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim/transport: More type annotations\u000a\u000aChange-Id: I62e081271e3a579851a588a4ed7282017e56f852\u000a",
        "date" : "2023-07-11 08:42:12 +0200",
        "id" : "ab6897c4cd7f5e0c019f69b2e10ce552bde12127",
        "msg" : "pySim/transport: More type annotations",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/transport/pcsc.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/serial.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/utils.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/modem_atcmd.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/__init__.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/calypso.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/utils.py",
          "pySim/commands.py"
        ],
        "commitId" : "fdb187d7fffd3d2301f3a1b2a9ab4a0dad0e5d73",
        "timestamp" : 1689057732000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim/commands.py: Better type annotations\u000a\u000aChange-Id: I68081b5472188f80a964ca48d5ec1f03adc70c4a\u000a",
        "date" : "2023-07-11 08:42:12 +0200",
        "id" : "fdb187d7fffd3d2301f3a1b2a9ab4a0dad0e5d73",
        "msg" : "pySim/commands.py: Better type annotations",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/commands.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/utils.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/transport/__init__.py",
          "pySim/transport/pcsc.py",
          "pySim/transport/calypso.py",
          "pySim/transport/serial.py",
          "pySim/transport/modem_atcmd.py"
        ],
        "commitId" : "f9f8d7a2942bf6561f813acdc50b6f87bb262f69",
        "timestamp" : 1689057732000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim/transport: Use newly-defined ResTuple type\u000a\u000aLet's use the newly-added ResTuple type annotation rather than\u000aopen-coding it everywhere.\u000a\u000aChange-Id: I122589e8aec4bf66dc2e86d7602ebecb771dcb93\u000a",
        "date" : "2023-07-11 08:42:12 +0200",
        "id" : "f9f8d7a2942bf6561f813acdc50b6f87bb262f69",
        "msg" : "pySim/transport: Use newly-defined ResTuple type",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/transport/__init__.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/pcsc.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/serial.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/calypso.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/modem_atcmd.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_102_222.py"
        ],
        "commitId" : "a1561fe9aeb96110432440f43d95a48606848481",
        "timestamp" : 1689057732000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "ts_102_222: Remove unneeded imports\u000a\u000aChange-Id: I0fc54a042f03ecf707fde81a859c7dd65a7009cc\u000a",
        "date" : "2023-07-11 08:42:12 +0200",
        "id" : "a1561fe9aeb96110432440f43d95a48606848481",
        "msg" : "ts_102_222: Remove unneeded imports",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_102_222.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/global_platform.py",
          "docs/shell.rst"
        ],
        "commitId" : "fdcf3c570248a43fd9f773a7189dfbb450a4fe7a",
        "timestamp" : 1689058444000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "GlobalPlatform ADF.SD: Add command line reference + error message\u000a\u000aThe get_data shell command didn't have any interactive help / syntax,\u000aand no meaningful error message in case an unknown data object name\u000awas specified by the user.  Let's fix that.\u000a\u000aChange-Id: I09faaf5d45118635cf832c8c513033aede1427e5\u000a",
        "date" : "2023-07-11 08:54:04 +0200",
        "id" : "fdcf3c570248a43fd9f773a7189dfbb450a4fe7a",
        "msg" : "GlobalPlatform ADF.SD: Add command line reference + error message",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/global_platform.py"
          },
          {
            "editType" : "edit",
            "file" : "docs/shell.rst"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-prog.py"
        ],
        "commitId" : "284efda086ee1f590c488310f307ad9d8314e3a4",
        "timestamp" : 1689066540000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-prog: Also accept 18-digit ICCIDs\u000a\u000aThere are cards with 18-digit ICCIDs, so let's be a bit more tolerant.\u000a\u000aChange-Id: I5395daeb2e96987335f6f9bf540c28d516001394\u000a",
        "date" : "2023-07-11 11:09:00 +0200",
        "id" : "284efda086ee1f590c488310f307ad9d8314e3a4",
        "msg" : "pySim-prog: Also accept 18-digit ICCIDs",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-prog.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/filesystem.py"
        ],
        "commitId" : "02a7f7441fb1455c0d143ec6bd4a54fff9fe65bc",
        "timestamp" : 1689090648000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "filesystem: Support selecting MF from MF\u000a\u000aThis was currently not handled in build_select_path_to(), resulting in\u000aweird exceptions like 'Cannot determine path from MF(3f00) to MF(3f00)'\u000a\u000aChange-Id: I41b9f047ee5dc6b91b487f370f011af994aaca04\u000a",
        "date" : "2023-07-11 17:50:48 +0200",
        "id" : "02a7f7441fb1455c0d143ec6bd4a54fff9fe65bc",
        "msg" : "filesystem: Support selecting MF from MF",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/filesystem.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/cards.py",
          "pysim-testdata/fakemagicsim.ok",
          "pysim-testdata/sysmosim-gr1.ok"
        ],
        "commitId" : "263fb0871c0c8b6b3cb58eaa1ca1779ce1adf6c4",
        "timestamp" : 1689190517000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim/cards: Split legacy classes away from core SIM + UICC\u000a\u000aThis introduces an internal split between\u000a* the code that is shared between pySim-shell and legacy tools, which is\u000a  now in the new class hierarchy {Card,SimCard,UiccCard}Base\u000a* the code that is only used by legacy tools,\u000a  which is using the old class names inherited from the *Base above\u000a\u000aAll users still go through the legacy {Sim,Usim,Isim}Card classes, they\u000awill be adjusted in subsequent patches.\u000a\u000aChange-Id: Id36140675def5fc44eedce81fc7b09e0adc527e1\u000a",
        "date" : "2023-07-12 21:35:17 +0200",
        "id" : "263fb0871c0c8b6b3cb58eaa1ca1779ce1adf6c4",
        "msg" : "pySim/cards: Split legacy classes away from core SIM + UICC",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pysim-testdata/fakemagicsim.ok"
          },
          {
            "editType" : "edit",
            "file" : "pySim/cards.py"
          },
          {
            "editType" : "edit",
            "file" : "pysim-testdata/sysmosim-gr1.ok"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/legacy/cards.py",
          "pySim/legacy/utils.py",
          "pySim-shell.py",
          "pySim/cards.py",
          "tests/test_utils.py",
          "pySim/utils.py",
          "pySim/legacy/__init__.py",
          "setup.py",
          "pySim-prog.py",
          "pySim-trace.py",
          "pySim-read.py"
        ],
        "commitId" : "f8d2e2ba089221d39c52593908aa15df4b6e73d5",
        "timestamp" : 1689192239000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "split pySim/legacy/{cards,utils} from pySim/{cards,utils}\u000a\u000aThere are some functions / classes which are only needed by the legacy\u000atools pySim-{read,prog}, bypassing our modern per-file transcoder\u000aclasses.  Let's move this code to the pySim/legacy sub-directory,\u000arendering pySim.legacy.* module names.\u000a\u000aThe long-term goal is to get rid of those and have all code use the\u000amodern pySim/filesystem classes for reading/decoding/encoding/writing\u000aany kind of data on cards.\u000a\u000aChange-Id: Ia8cf831929730c48f90679a83d69049475cc5077\u000a",
        "date" : "2023-07-12 22:03:59 +0200",
        "id" : "f8d2e2ba089221d39c52593908aa15df4b6e73d5",
        "msg" : "split pySim/legacy/{cards,utils} from pySim/{cards,utils}",
        "paths" : [
          {
            "editType" : "add",
            "file" : "pySim/legacy/cards.py"
          },
          {
            "editType" : "edit",
            "file" : "setup.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/cards.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim-prog.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim-trace.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim-read.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          },
          {
            "editType" : "add",
            "file" : "pySim/legacy/__init__.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/utils.py"
          },
          {
            "editType" : "add",
            "file" : "pySim/legacy/utils.py"
          },
          {
            "editType" : "edit",
            "file" : "tests/test_utils.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/cards.py"
        ],
        "commitId" : "a3961298efeba7d65d861280be1ea642fbe47fc3",
        "timestamp" : 1689192314000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim/cards: Add type annotations\u000a\u000aChange-Id: Id5752a64b59097584301c860ebf74d858ed3d240\u000a",
        "date" : "2023-07-12 22:05:14 +0200",
        "id" : "a3961298efeba7d65d861280be1ea642fbe47fc3",
        "msg" : "pySim/cards: Add type annotations",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/cards.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/legacy/ts_51_011.py",
          "pySim/legacy/cards.py",
          "pySim-prog.py",
          "pySim/ts_51_011.py",
          "pySim-read.py"
        ],
        "commitId" : "57ad38e661453dcc89648039c54dcfad7cf4c8ea",
        "timestamp" : 1689192314000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "create pySim.legacy.ts_51_011.py and move legacy code there\u000a\u000aThose old flat dicts indicating FID to string-name mapping have long\u000abeen obsoleted by the pySim.filsystem based classes.\u000a\u000aChange-Id: I20ceea3fdb02ee70d8c8889c078b2e5a0f17c83b\u000a",
        "date" : "2023-07-12 22:05:14 +0200",
        "id" : "57ad38e661453dcc89648039c54dcfad7cf4c8ea",
        "msg" : "create pySim.legacy.ts_51_011.py and move legacy code there",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_51_011.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim-prog.py"
          },
          {
            "editType" : "add",
            "file" : "pySim/legacy/ts_51_011.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim-read.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/legacy/cards.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_31_103.py",
          "pySim/legacy/cards.py",
          "pySim/ts_31_102.py",
          "pySim-read.py",
          "pySim/legacy/ts_31_102.py",
          "pySim/legacy/ts_31_103.py"
        ],
        "commitId" : "b314b9be3480fa0b226ef2601e005840ac4e68b4",
        "timestamp" : 1689192314000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "ts_31_102, ts_31_103: Move legacy-only code to pySim.legacy\u000a\u000aChange-Id: Ifebfbbc00ef0d01cafd6f058a32d243d3696e97e\u000a",
        "date" : "2023-07-12 22:05:14 +0200",
        "id" : "b314b9be3480fa0b226ef2601e005840ac4e68b4",
        "msg" : "ts_31_102, ts_31_103: Move legacy-only code to pySim.legacy",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/legacy/cards.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_102.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_103.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim-read.py"
          },
          {
            "editType" : "add",
            "file" : "pySim/legacy/ts_31_102.py"
          },
          {
            "editType" : "add",
            "file" : "pySim/legacy/ts_31_103.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/cards.py",
          "pySim/legacy/cards.py"
        ],
        "commitId" : "172c28eba812f62cfff5c168f438a7cfd45308c0",
        "timestamp" : 1689192314000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "cards: All derived of SimCardBase use CLA=A0; all UiccCardBase use CLA=00\u000a\u000aChange-Id: Id61b549f68410631529349ee62b08a102f609405\u000a",
        "date" : "2023-07-12 22:05:14 +0200",
        "id" : "172c28eba812f62cfff5c168f438a7cfd45308c0",
        "msg" : "cards: All derived of SimCardBase use CLA=A0; all UiccCardBase use",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/legacy/cards.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/cards.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/cards.py"
        ],
        "commitId" : "775ab01a2b20fd797460b4358347fd90252785bd",
        "timestamp" : 1689192314000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "cards: cosmetic rename, argument name should be scc, not ssc\u000a\u000assc = SimCardCommands\u000a\u000aChange-Id: I9d690a0a5b9b49ea342728a29b7d4ed10ac31e4e\u000a",
        "date" : "2023-07-12 22:05:14 +0200",
        "id" : "775ab01a2b20fd797460b4358347fd90252785bd",
        "msg" : "cards: cosmetic rename, argument name should be scc, not ssc",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/cards.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/cards.py",
          "pySim/legacy/cards.py"
        ],
        "commitId" : "659d7c11caddb827cdfb8b41ee630a3b3fce8f84",
        "timestamp" : 1689192314000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "cards: all UICC should use sel_ctrl=\"0400\" and SIM \"0000\"\u000a\u000aHence move this from the derived classes into the respective base\u000aclasses SimCardBase and UiccCardBase\u000a\u000aChange-Id: Iad197c2b560c5ea05c54a122144361de5742aafd\u000a",
        "date" : "2023-07-12 22:05:14 +0200",
        "id" : "659d7c11caddb827cdfb8b41ee630a3b3fce8f84",
        "msg" : "cards: all UICC should use sel_ctrl=\"0400\" and SIM \"0000\"",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/legacy/cards.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/cards.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/cdma_ruim.py",
          "tests/test_files.py"
        ],
        "commitId" : "f9e2df129605033c5ae3e365d87daed547b5b336",
        "timestamp" : 1689192314000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "cdma_ruim: Fix unit tests and actually enable them\u000a\u000aAs pySim.cdma_ruim was not imported by test_files.py, the unit tests\u000awere apparently never executed and hence didn't pass.  Let's fix both\u000aof those problems.\u000a\u000aChange-Id: Icdf4621eb68d05a4948ae9efeb81a007d48e1bb7\u000a",
        "date" : "2023-07-12 22:05:14 +0200",
        "id" : "f9e2df129605033c5ae3e365d87daed547b5b336",
        "msg" : "cdma_ruim: Fix unit tests and actually enable them",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/cdma_ruim.py"
          },
          {
            "editType" : "edit",
            "file" : "tests/test_files.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/cdma_ruim.py",
          "pySim/gsm_r.py",
          "pySim-shell.py",
          "pySim/filesystem.py",
          "pySim/ts_102_221.py",
          "pySim/profile.py",
          "pySim/ts_51_011.py",
          "pySim-trace.py"
        ],
        "commitId" : "323a35043f360080f7e100dbb9f16929f685371d",
        "timestamp" : 1689192314000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "Introduce concept of CardProfileAddon\u000a\u000aWe have a strict \"one CardProfile per card\" rule.  For a modern UICC\u000awithout legacy SIM support, that works great, as all applications\u000ahave AID and ADF and can hence be enumerated/detected that way.\u000a\u000aHowever, in reality there are mostly UICC that have legacy SIM, GSM-R\u000aor even CDMA support, all of which are not proper UICC applications\u000afor historical reasons.\u000a\u000aSo instead of having hard-coded hacks in various places, let's introduce\u000athe new concept of a CardProfileAddon.  Every profile can have any\u000anumber of those.  When building up the RuntimeState, we iterate over the\u000aCardProfile addons, and probe which of those are actually on the card.\u000aFor those discovered, we add their files to the filesystem hierarchy.\u000a\u000aChange-Id: I5866590b6d48f85eb889c9b1b8ab27936d2378b9\u000a",
        "date" : "2023-07-12 22:05:14 +0200",
        "id" : "323a35043f360080f7e100dbb9f16929f685371d",
        "msg" : "Introduce concept of CardProfileAddon",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_102_221.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/cdma_ruim.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/gsm_r.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/filesystem.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/profile.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_51_011.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim-trace.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_102_221.py"
        ],
        "commitId" : "2d5959bf47d82e8f394a0ccb54a1e1d8e89456fa",
        "timestamp" : 1689192314000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "ts_102_221: Remove CardProfileUICCSIM\u000a\u000aThis profile has always been a hack/work-around for the situation that\u000aa classic GSM SIM is not a UICC, and we didn't yet have the concept of\u000aCardProfileAddons yet, so there was no way to probe and add something\u000ato an UICC which was not an application with its own AID/ADF.\u000a\u000aSince now we have CardProfileAddons (including one for GSM SIM),\u000aand pySim-trace (the other user of CardProfileUICCSIM) has also switched\u000aover to using CardProfileUICC + addons, we can remove this work-around.\u000a\u000aChange-Id: I45cec68d72f2003123da4c3f86ed6a5a90988bd8\u000a",
        "date" : "2023-07-12 22:05:14 +0200",
        "id" : "2d5959bf47d82e8f394a0ccb54a1e1d8e89456fa",
        "msg" : "ts_102_221: Remove CardProfileUICCSIM",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_102_221.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-shell.py"
        ],
        "commitId" : "6ad9a247ef54245b12cc8695a9f8298cb25bb8d4",
        "timestamp" : 1689192314000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-shell: Iterate over CardApplication sub-classes\u000a\u000aRather than having to know and explicitly list every CardApplication,\u000alet's iterate over the __subclasses__ of the CardApplication base class.\u000a\u000aChange-Id: Ia6918e49d73d80acfaf09506e604d4929d37f1b6\u000a",
        "date" : "2023-07-12 22:05:14 +0200",
        "id" : "6ad9a247ef54245b12cc8695a9f8298cb25bb8d4",
        "msg" : "pySim-shell: Iterate over CardApplication sub-classes",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/filesystem.py"
        ],
        "commitId" : "b77063b9b724235ceae06a0ac2d1d022ca11dbf2",
        "timestamp" : 1689192314000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim/filesystem.py: remove unused class FileData\u000a\u000aChange-Id: I62eb446e4995a532227a45c8cc521f5f80535d93\u000a",
        "date" : "2023-07-12 22:05:14 +0200",
        "id" : "b77063b9b724235ceae06a0ac2d1d022ca11dbf2",
        "msg" : "pySim/filesystem.py: remove unused class FileData",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/filesystem.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-shell.py",
          "pySim/runtime.py",
          "pySim/filesystem.py",
          "pySim/apdu/ts_102_221.py",
          "pySim/apdu/__init__.py",
          "pySim-trace.py",
          "pySim/sysmocom_sja2.py"
        ],
        "commitId" : "531894d386af1ba05aa5a98449727a897404936e",
        "timestamp" : 1689192314000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "move Runtime{State,Lchan} from pySim.filesystem to new pySim.runtime\u000a\u000aThose two are really separate concepts, so let's keep them in separate\u000asource code files.\u000a\u000aChange-Id: I9ec54304dd8f4a4cba9487054a8eb8d265c2d340\u000a",
        "date" : "2023-07-12 22:05:14 +0200",
        "id" : "531894d386af1ba05aa5a98449727a897404936e",
        "msg" : "move Runtime{State,Lchan} from pySim.filesystem to new pySim.runtime",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-trace.py"
          },
          {
            "editType" : "add",
            "file" : "pySim/runtime.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/filesystem.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/sysmocom_sja2.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/apdu/__init__.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/apdu/ts_102_221.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-shell.py"
        ],
        "commitId" : "38306dfc047c5dabcd4995ce82f1c15099c830de",
        "timestamp" : 1689192314000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-shell: Add a mode where a pySim-shell cmd can be passed by shell\u000a\u000aThis adds a new operation mode for pySim-shell, where a single command\u000acan be passed to pySim-shell, which then is executed before pySim-shell\u000aterminates.\u000a\u000aExample: ./pySim-shell.py -p0 export --json\u000a\u000aChange-Id: I0ed379b23a4b1126006fd8f9e7ba2ba07fb01ada\u000aCloses: OS#6088\u000a",
        "date" : "2023-07-12 22:05:14 +0200",
        "id" : "38306dfc047c5dabcd4995ce82f1c15099c830de",
        "msg" : "pySim-shell: Add a mode where a pySim-shell cmd can be passed by shell",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/cards.py"
        ],
        "commitId" : "3175d61eb2746cb7c23f08cc3a6b3031bf5d2413",
        "timestamp" : 1689867364000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "cards: fix swapped PIN mapping number\u000a\u000aThe constant for _adm_chv_num is swapped. It should be 0x0A, rather than\u000a0xA0\u000a\u000aChange-Id: I5680d2deee855ef316a98058e8c8ff8cf4edbbb2\u000a",
        "date" : "2023-07-20 17:36:04 +0200",
        "id" : "3175d61eb2746cb7c23f08cc3a6b3031bf5d2413",
        "msg" : "cards: fix swapped PIN mapping number",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/cards.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-shell.py"
        ],
        "commitId" : "cfb665bb3f958a7cb219dbb06ecdbef4b060ee99",
        "timestamp" : 1689867368000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "pySim-shell: fix verify_adm command\u000a\u000aThe comman verify_adm does no longer work since the verify_adm method is\u000ano longer available in the card base classes (cards.py). Let's use the\u000averify_chv method from SimCardCommands instead.\u000a\u000aChange-Id: Ic87e1bff221b10d33d36da32b589e2737f6ca9cd\u000a",
        "date" : "2023-07-20 17:36:08 +0200",
        "id" : "cfb665bb3f958a7cb219dbb06ecdbef4b060ee99",
        "msg" : "pySim-shell: fix verify_adm command",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/apdu/ts_102_221.py"
        ],
        "commitId" : "7d86fe1d8aed6f4aafb0b450b8e28b2e7cc3949e",
        "timestamp" : 1689868216000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "apdu/ts_102_221: extract channel number from dict before calling del_lchan\u000a\u000aWhen the method del_lchan is called, closed_channel_nr still contains a dict\u000athat contains the channel number under the key 'logical_channel_number'.\u000aThis will lead to an exception. We must extact the channel number from\u000athe dict before we can use it with del_lchan. (See also\u000acreated_channel_nr)\u000a\u000aRelated: OS#6094\u000aChange-Id: I399856bc227f17b66cdb4158a69a35d50ba222a7\u000a",
        "date" : "2023-07-20 15:50:16 +0000",
        "id" : "7d86fe1d8aed6f4aafb0b450b8e28b2e7cc3949e",
        "msg" : "apdu/ts_102_221: extract channel number from dict before calling",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/apdu/ts_102_221.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/runtime.py"
        ],
        "commitId" : "92b9356ed2639068dfb552ea25f79a8e50037393",
        "timestamp" : 1689933130000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "runtime: fix lchan deletion in method reset\u000a\u000aWhen we perform a reset while multiple channels are open (this is in\u000aparticular the case when parsing real world traces with pySim-trace). To\u000adelete those channels during the reset we iterate over the dictionary\u000ausing the keys and delete the channels one by one. However, this must\u000anot be done using the keys as index directly. Python will then throw an\u000aexception: \"RuntimeError: dictionary changed size during iteration\".\u000a\u000aInstead using the keys directly we should cast them into a list and then\u000ausing that list for the iteration.\u000a\u000aRelated: OS#6094\u000aChange-Id: I430ef216cf847ffbde2809f492ee9ed9030343b6\u000a",
        "date" : "2023-07-21 11:52:10 +0200",
        "id" : "92b9356ed2639068dfb552ea25f79a8e50037393",
        "msg" : "runtime: fix lchan deletion in method reset",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/runtime.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/utils.py"
        ],
        "commitId" : "fec721fcb192dc18d85b618a48bc62e4f4c1d31c",
        "timestamp" : 1689937789000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "Fixed `mnc` encoding\u000a\u000aAccording to 3GPP TS 24.008 section 10.5.5.36 PLMN identity of the CN operator\u000a\u000aChange-Id: I400435abfa8b67da886fc39c801e1abba39725bf\u000a",
        "date" : "2023-07-21 11:09:49 +0000",
        "id" : "fec721fcb192dc18d85b618a48bc62e4f4c1d31c",
        "msg" : "Fixed `mnc` encoding",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/utils.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_31_103.py",
          "pySim/ts_31_102.py",
          "pySim/construct.py"
        ],
        "commitId" : "791f80a44f8110f478a632cd2bcde5944ad4bd96",
        "timestamp" : 1690384434000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "construct: add adapter Utf8Adapter to safely interpret utf8 text\u000a\u000aUninitialized Files, File records or fields in a File record or File\u000ausually contain a string of 0xff bytes. This becomes a problem when the\u000acontent is normally encoded/decoded as utf8 since by the construct\u000aparser. The parser will throw an expection when it tries to decode the\u000a0xff string as utf8. This is especially a serious problem in pySim-trace\u000awhere an execption stops the parser.\u000a\u000aLet's fix this by interpreting a string of 0xff as an empty string.\u000a\u000aRelated: OS#6094\u000aChange-Id: Id114096ccb8b7ff8fcc91e1ef3002526afa09cb7\u000a",
        "date" : "2023-07-26 17:13:54 +0200",
        "id" : "791f80a44f8110f478a632cd2bcde5944ad4bd96",
        "msg" : "construct: add adapter Utf8Adapter to safely interpret utf8 text",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_103.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/construct.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_102.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-trace.py"
        ],
        "commitId" : "407c95520fd37d5e969eb34edc1f6272509138cd",
        "timestamp" : 1690531655000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "pySim-trace: add commandline option --show-raw-apdu\u000a\u000aThe trace log currently only shows the parsed APDU. However, depending\u000aon the problem to investigate it may be required to see the raw APDU\u000astring as well. Let's add an option for this.\u000a\u000aRelated: OS#6094\u000aChange-Id: I1a3bc54c459e45ed3154479759ceecdc26db9d37\u000a",
        "date" : "2023-07-28 10:07:35 +0200",
        "id" : "407c95520fd37d5e969eb34edc1f6272509138cd",
        "msg" : "pySim-trace: add commandline option --show-raw-apdu",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-trace.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-trace.py"
        ],
        "commitId" : "784b947b117e8c21ed97f8fe4edc55e77cf72fc6",
        "timestamp" : 1690532059000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "pySim-trace: remove stray debug print\u000a\u000aRelated: OS#6094\u000aChange-Id: I5f030a8552a84f721bd12ab4751933fc6eeae256\u000a",
        "date" : "2023-07-28 10:14:19 +0200",
        "id" : "784b947b117e8c21ed97f8fe4edc55e77cf72fc6",
        "msg" : "pySim-trace: remove stray debug print",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-trace.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/utils.py"
        ],
        "commitId" : "1f46f07e3c1d793ca334520786fad4ec90e83916",
        "timestamp" : 1690532059000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "utils: tolerate uninitialized fields in dec_addr_tlv\u000a\u000aTLV fields holding an address may still be uninitialized and hence\u000afilled with 0xff bytes. Lets interpret those fields in the same way as\u000awe interpret empty fields.\u000a\u000aRelated: OS#6094\u000aChange-Id: Idc0a92ea88756266381c8da2ad62de061a8ea7a1\u000a",
        "date" : "2023-07-28 10:14:19 +0200",
        "id" : "1f46f07e3c1d793ca334520786fad4ec90e83916",
        "msg" : "utils: tolerate uninitialized fields in dec_addr_tlv",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/utils.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/apdu_source/pyshark_rspro.py",
          "pySim/apdu_source/pyshark_gsmtap.py",
          "pySim/apdu_source/gsmtap.py",
          "pySim/apdu/__init__.py",
          "pySim-trace.py"
        ],
        "commitId" : "162ba3af3e08ae4396880629b0686b4e7bc3aa55",
        "timestamp" : 1690532059000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "pySim-trace: mark card reset in the trace\u000a\u000aThe trace log currently does not contain any information about card\u000aresets. This makes the trace difficult to follow. Let's use the\u000aCardReset object to display the ATR in the trace.\u000a\u000aRelated: OS#6094\u000aChange-Id: Ia550a8bd2f45d2ad622cb2ac2a2905397db76bce\u000a",
        "date" : "2023-07-28 10:14:19 +0200",
        "id" : "162ba3af3e08ae4396880629b0686b4e7bc3aa55",
        "msg" : "pySim-trace: mark card reset in the trace",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-trace.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/apdu_source/pyshark_gsmtap.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/apdu/__init__.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/apdu_source/pyshark_rspro.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/apdu_source/gsmtap.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-trace.py"
        ],
        "commitId" : "8dc2ca2d376f56a16df589a5ddc6ead82bfdfb58",
        "timestamp" : 1690533412000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "pySim-trace: catch StopIteration exception on trace file end\u000a\u000aWhen the trace file end is reaced, pyShark raises a StopIteration\u000aexception. Let's catch this exception and exit gracefully.\u000a\u000aRelated: OS#6094\u000aChange-Id: I6ab5689b909333531d08bf46e5dfea59b161a79e\u000a",
        "date" : "2023-07-28 10:36:52 +0200",
        "id" : "8dc2ca2d376f56a16df589a5ddc6ead82bfdfb58",
        "msg" : "pySim-trace: catch StopIteration exception on trace file end",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-trace.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_31_102_telecom.py",
          "pySim/ts_31_102.py"
        ],
        "commitId" : "6c5c3f8b2b49a56b6204be83ded918bec0c5826f",
        "timestamp" : 1690558480000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "Reimplement ust_service_activate and ust_service_deactivate for USIM/EF.UST\u000a\u000aFixes: f8d2e2ba0892 (\"split pySim/legacy/{cards,utils} from pySim/{cards,utils}\")\u000aChange-Id: I7a6a77b872a6f5d8c478ca75dcff8ea067b8203e\u000a",
        "date" : "2023-07-28 15:34:40 +0000",
        "id" : "6c5c3f8b2b49a56b6204be83ded918bec0c5826f",
        "msg" : "Reimplement ust_service_activate and ust_service_deactivate for",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_102_telecom.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_102.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/utils.py"
        ],
        "commitId" : "760e421be5e1b40457c07e4c6e21439bf813b3b5",
        "timestamp" : 1690611714000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "utils.py: remove superfluous import from itself\u000a\u000ab2h() is already available.\u000a\u000aChange-Id: Ied513a08cc8b5091dd467106250f1e6b5067c3a8\u000a",
        "date" : "2023-07-29 06:21:54 +0000",
        "id" : "760e421be5e1b40457c07e4c6e21439bf813b3b5",
        "msg" : "utils.py: remove superfluous import from itself",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/utils.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ara_m.py"
        ],
        "commitId" : "2dd59edd7412aed313e4b2c29cab4faf8d1bbfbc",
        "timestamp" : 1690611795000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "ARA-M: fix encoding of the PkgRefDO when using aram_store_ref_ar_do\u000a\u000aThe command wasn't used the correct dict to allow the encoders to work.\u000a\u000aRelated: OS#6121\u000aChange-Id: Ic2bc179b413a6b139e07e3e55b93ff921cb020a9\u000a",
        "date" : "2023-07-29 06:23:15 +0000",
        "id" : "2dd59edd7412aed313e4b2c29cab4faf8d1bbfbc",
        "msg" : "ARA-M: fix encoding of the PkgRefDO when using aram_store_ref_ar_do",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ara_m.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_31_103.py",
          "pySim/ts_31_102.py"
        ],
        "commitId" : "c8facea845607073376c9c385943fcc360fae317",
        "timestamp" : 1690611795000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "Fix the remaining functions using the broken Card.update_ust() call\u000a\u000aCard.update_ust() got replaced by the file operation ust_update().\u000aIn addition to Change-Id I7a6a77b872a6f5d8c478ca75dcff8ea067b8203e\u000a\u000aFixes: f8d2e2ba0892 (\"split pySim/legacy/{cards,utils} from pySim/{cards,utils}\")\u000aChange-Id: Ie6405cae37493a2101e5089a8d11766fbfed4518\u000a",
        "date" : "2023-07-29 06:23:15 +0000",
        "id" : "c8facea845607073376c9c385943fcc360fae317",
        "msg" : "Fix the remaining functions using the broken Card.update_ust() call",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_103.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_102.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "contrib/jenkins.sh",
          "tests/pySim-trace_test.sh",
          "pysim-testdata/pySim-trace_test_gsmtap.pcapng"
        ],
        "commitId" : "ec9cdb73e7584a7936b17963a0acc30fe384855a",
        "timestamp" : 1690620967000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "tests: add test script for pySim-trace\u000a\u000apySim-trace has no test coverage yet. Let's use a script to run a\u000aGSAMTAP pcacp through it and check that no exceptions are raised.\u000a\u000aRelated: OS#6094\u000aChange-Id: Icfabfa7c59968021eef0399991bd05b92467d8d2\u000a",
        "date" : "2023-07-29 08:56:07 +0000",
        "id" : "ec9cdb73e7584a7936b17963a0acc30fe384855a",
        "msg" : "tests: add test script for pySim-trace",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "contrib/jenkins.sh"
          },
          {
            "editType" : "add",
            "file" : "pysim-testdata/pySim-trace_test_gsmtap.pcapng"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-trace_test.sh"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "contrib/jenkins.sh",
          "tests/pysim-test.sh",
          "tests/pySim-prog_test.sh"
        ],
        "commitId" : "1cdcbe4f57ac13e3f5f271fea363c160f78ab985",
        "timestamp" : 1690620967000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pysim-test: rename pysim-test.sh to pySim-prog_test.sh\u000a\u000aWe now have pySim-shell and pySim-trace. Let's give pysim-test.sh a more\u000adistinctive name so that it is clear to which program it refers.\u000a\u000aRelated: OS#6094\u000aChange-Id: I438f63f9580ebd3c7cc78cc5dab13c9937ac6e3a\u000a",
        "date" : "2023-07-29 08:56:07 +0000",
        "id" : "1cdcbe4f57ac13e3f5f271fea363c160f78ab985",
        "msg" : "pysim-test: rename pysim-test.sh to pySim-prog_test.sh",
        "paths" : [
          {
            "editType" : "delete",
            "file" : "tests/pysim-test.sh"
          },
          {
            "editType" : "edit",
            "file" : "contrib/jenkins.sh"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-prog_test.sh"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "README.md"
        ],
        "commitId" : "600e284a7b05e0ff322a86b8043662323aa58d7a",
        "timestamp" : 1690620967000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "README.md: Add note about pySim-trace.py dependencies\u000a\u000aRelated: OS#6094\u000aChange-Id: I2e03f9c827bd6ee73891bba34bd2f2efe3ded7e6\u000a",
        "date" : "2023-07-29 08:56:07 +0000",
        "id" : "600e284a7b05e0ff322a86b8043662323aa58d7a",
        "msg" : "README.md: Add note about pySim-trace.py dependencies",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "README.md"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/runtime.py"
        ],
        "commitId" : "d62182ca437b5434f765e89c31c0bd1bfc68a6b6",
        "timestamp" : 1690897647000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "runtime: make sure applications are always listed in the same order\u000a\u000aWhen we print the profile applications. which are not registered in\u000aEF.DIR, we use python sets to subtract the applications which were part\u000aof EF.DIR and hence already listed. Since we use sets the order may be\u000aarbitrary. This is so far not a problem, since the output is meant to be\u000aread by humans, but as soon as we try to use the output for unit-test\u000averifications we need a consistent order (sorted)\u000a\u000aRelated: OS#6094\u000aChange-Id: Ie75613910aaba14c27420c52b6596ab080588273\u000a",
        "date" : "2023-08-01 15:47:27 +0200",
        "id" : "d62182ca437b5434f765e89c31c0bd1bfc68a6b6",
        "msg" : "runtime: make sure applications are always listed in the same order",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/runtime.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tests/pySim-trace_test.sh"
        ],
        "commitId" : "7124ad103106fc822bab1174e396a3c4e9c2f3e2",
        "timestamp" : 1690898507000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "pySim-trace_test: fix shebang line\u000a\u000aRelated: OS#6094\u000aChange-Id: Ib2d3a4659f5db9772ddcd9a4ae73c04fec1070fc\u000a",
        "date" : "2023-08-01 16:01:47 +0200",
        "id" : "7124ad103106fc822bab1174e396a3c4e9c2f3e2",
        "msg" : "pySim-trace_test: fix shebang line",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "tests/pySim-trace_test.sh"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tests/pySim-trace_test.sh",
          "pysim-testdata/pySim-trace_test_gsmtap.pcapng.ok"
        ],
        "commitId" : "a380e4efbea2701da677dc6a31065dda9bcb208f",
        "timestamp" : 1690899014000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "pySim-trace_test: verify output of pySim-trace.py\u000a\u000aAt the moment we only verify that no exceptions occurred but the output\u000ais not yet verfied.\u000a\u000aRelated: OS#6094\u000aChange-Id: I3aaa779b5bd8f30936c284a80dbdcb2b0e06985c\u000a",
        "date" : "2023-08-01 16:10:14 +0200",
        "id" : "a380e4efbea2701da677dc6a31065dda9bcb208f",
        "msg" : "pySim-trace_test: verify output of pySim-trace.py",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "tests/pySim-trace_test.sh"
          },
          {
            "editType" : "add",
            "file" : "pysim-testdata/pySim-trace_test_gsmtap.pcapng.ok"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tests/pySim-prog_test.sh"
        ],
        "commitId" : "63e8a188832e490176972de9bea41e8a6abddeb7",
        "timestamp" : 1690899014000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "pySim-prog_test: fix typo\u000a\u000aRelated: OS#6094\u000aChange-Id: I6432ee3ee948fea697067fb3857cb9b83b1f8422\u000a",
        "date" : "2023-08-01 16:10:14 +0200",
        "id" : "63e8a188832e490176972de9bea41e8a6abddeb7",
        "msg" : "pySim-prog_test: fix typo",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "tests/pySim-prog_test.sh"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-shell.py"
        ],
        "commitId" : "e6cba76a36237064086d746dbb822e2c42855758",
        "timestamp" : 1691746111000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "pySim-shell: check presence of runtime state before accessing it\u000a\u000aWhen the command equip (do_equip) is executed, it accesses\u000aself.rs.profile to see if there are any commands that need to be\u000aunregistered before moving on with the card initialization.\u000a\u000aHowever, it may be the case that no runtime state exists at this point.\u000aThis is in particular the case when the card is completely empty and\u000ahence no profile is picked and no runtime state exists.\u000a\u000aChange-Id: I0a8be66a69b630f1f2898b62dc752a8eb5275301\u000a",
        "date" : "2023-08-11 11:28:31 +0200",
        "id" : "e6cba76a36237064086d746dbb822e2c42855758",
        "msg" : "pySim-shell: check presence of runtime state before accessing it",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "setup.py"
        ],
        "commitId" : "83222abf2e03f7bc36cb950e736aa34541f46143",
        "timestamp" : 1691921416000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/flokli",
          "fullName" : "flokli"
        },
        "authorEmail" : "flokli@flokli.de",
        "comment" : "setup.py: fix package name\u000a\u000aThe package providing the serial python module seems to be called\u000apyserial, which also matches what's written in requirements.txt.\u000a\u000aChange-Id: I71ef6a19a487101e552219f10f2fa6215b966abd\u000a",
        "date" : "2023-08-13 12:10:16 +0200",
        "id" : "83222abf2e03f7bc36cb950e736aa34541f46143",
        "msg" : "setup.py: fix package name",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "setup.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "README.md"
        ],
        "commitId" : "09ff0e2b433b7143d5b40b4494744569b805e554",
        "timestamp" : 1691921776000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/flokli",
          "fullName" : "flokli"
        },
        "authorEmail" : "flokli@flokli.de",
        "comment" : "README.md: sort dependencies, document smpp.pdu\u000a\u000aThis dependency is currently only mentioned in requirements.txt, it\u000amakes sense to also document it here.\u000a\u000aChange-Id: I89760dd4008829c91fafbd442483d076c92a7ed4\u000a",
        "date" : "2023-08-13 12:16:16 +0200",
        "id" : "09ff0e2b433b7143d5b40b4494744569b805e554",
        "msg" : "README.md: sort dependencies, document smpp.pdu",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "README.md"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/cards.py",
          "pySim/legacy/cards.py",
          "pySim-shell.py"
        ],
        "commitId" : "a42ee6f99d1cb1e8b3f4c58379291224c0ce4309",
        "timestamp" : 1692642970000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "cards: get rid of method read_iccid\u000a\u000aThe method read_iccid in class CardBase should be put back to\u000alegacy/cards.py. The reason for this is that it falls in the same\u000acategory like read_imsi, read_ki, etc. We should not use those old\u000amethods in future programs since we have a more modern infrastructure\u000a(lchan) now.\u000a\u000aAlso pySim-shell.py is the only caller of this method now. It is not\u000aused in any other place.\u000a\u000aRelated: RT#67094\u000aChange-Id: Ied3ae6fd107992abcc1b5ea3edb0eb4bdcd2f892\u000a",
        "date" : "2023-08-21 18:36:10 +0000",
        "id" : "a42ee6f99d1cb1e8b3f4c58379291224c0ce4309",
        "msg" : "cards: get rid of method read_iccid",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/cards.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/legacy/cards.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "contrib/sim-rest-server.py"
        ],
        "commitId" : "71a3fb8b3a38cd70946468a072e9fe9895d73927",
        "timestamp" : 1692642970000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "sim-rest-server: do not select ADF.USIM in connect_to_card\u000a\u000aWhen the function connect_to_card is done, it selects ADF.USIM. This\u000amight be contraproductive in case someone needs to access files on MF\u000alevel in one of the REST methods. Instead fo ADF.USIM, let's use MF as a\u000acommon ground to start from.\u000a\u000aAt the moment the only existing REST (info, auth) immediately select\u000aADF.USIM after calling connect_to_card already, so there are no further\u000amodifications necessary.\u000a\u000aRelated: RT#67094\u000aChange-Id: I16e7f3c991c83f81989ecc4e4764bb6cc799c01d\u000a",
        "date" : "2023-08-21 18:36:10 +0000",
        "id" : "71a3fb8b3a38cd70946468a072e9fe9895d73927",
        "msg" : "sim-rest-server: do not select ADF.USIM in connect_to_card",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "contrib/sim-rest-server.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "contrib/sim-rest-server.py"
        ],
        "commitId" : "91b379a039b97fe105ced17ffc7dd1770ae58641",
        "timestamp" : 1692642970000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "sim-rest-server: use UiccCardBase instead of UsimCard\u000a\u000aThe class UsimCard is deprecated and only still used in very old\u000alegacy applications. let's use the more modern UiccCardBase class\u000ainstead.\u000a\u000aRelated: RT#67094\u000aChange-Id: I3676f033833665751c0d953176eafe175b20c14a\u000a",
        "date" : "2023-08-21 18:36:10 +0000",
        "id" : "91b379a039b97fe105ced17ffc7dd1770ae58641",
        "msg" : "sim-rest-server: use UiccCardBase instead of UsimCard",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "contrib/sim-rest-server.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "contrib/sim-rest-server.py"
        ],
        "commitId" : "7d13845285ccdd2f8a310c19bdbeb685fd1a205e",
        "timestamp" : 1692949968000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "sim-rest-server: fix REST method info\u000a\u000aThe REST megthd info uses deprecated methods to read the ICCID and the\u000aIMSI from the card. However, we can replace those methods by selecting\u000athe files we are interested in manually and then reading them.\u000a\u000aRelated: RT#67094\u000aChange-Id: Ib0178823abb18187404249cfed71cfb3123d1d74\u000a",
        "date" : "2023-08-25 09:52:48 +0200",
        "id" : "7d13845285ccdd2f8a310c19bdbeb685fd1a205e",
        "msg" : "sim-rest-server: fix REST method info",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "contrib/sim-rest-server.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "contrib/sim-rest-server.py"
        ],
        "commitId" : "3a37ad015c3fab6d2e34a08e16a1d6197f8bdfba",
        "timestamp" : 1693997964000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "sim-reset-server: fix error printing sw_match_error\u000a\u000aIn the last line of the if,elif,else branch, when we print the ApiError\u000aobject, we pass the variable sw to str() instead passing it to\u000aApiError() like we do it in the lines above. This is not correct and\u000acauses strange exceptions.\u000a\u000aRelated: OS#67094\u000aChange-Id: I5a1d19abeb00c2c9dc26517abc44a5c916f2d658\u000a",
        "date" : "2023-09-06 12:59:24 +0200",
        "id" : "3a37ad015c3fab6d2e34a08e16a1d6197f8bdfba",
        "msg" : "sim-reset-server: fix error printing sw_match_error",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "contrib/sim-rest-server.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-shell.py"
        ],
        "commitId" : "4840d4dc8f887a7193fbd71cea4619b06a02f91c",
        "timestamp" : 1694005075000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "pySim-shell: fix commandline option -a (verify_adm)\u000a\u000aThe commandline option -a, which does an ADM verification on startup,\u000adoes no longer work since the verify_adm method is no longer available\u000ain the card base classes (cards.py). Let's use the verify_chv method\u000afrom SimCardCommands instead.\u000a\u000aRelated: RT#68294\u000aChange-Id: Ic1e54d0e9e722d64b3fbeb044134044d47946f7c\u000a",
        "date" : "2023-09-06 14:57:55 +0200",
        "id" : "4840d4dc8f887a7193fbd71cea4619b06a02f91c",
        "msg" : "pySim-shell: fix commandline option -a (verify_adm)",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/commands.py"
        ],
        "commitId" : "0ac4d3c7dcaa4f1fdfa632c93e6af2bafbd7501d",
        "timestamp" : 1694085788000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "commands: make method verify_binary and verify_record private\u000a\u000aThe methods verify_binary and verify_record are only used internally\u000ain class SimCardCommands, they can be both private methods. Also lets\u000amove them above the method that uses them.\u000a\u000aRelated: OS#5714\u000aChange-Id: I57c9af3d6ff45caa4378c400643b4ae1fa42ecac\u000a",
        "date" : "2023-09-07 13:23:08 +0200",
        "id" : "0ac4d3c7dcaa4f1fdfa632c93e6af2bafbd7501d",
        "msg" : "commands: make method verify_binary and verify_record private",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/commands.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_51_011.py",
          "pySim/runtime.py",
          "pySim/commands.py",
          "pySim/filesystem.py"
        ],
        "commitId" : "37e57e0c45320fe3b855e3ec57ab52145c8b2987",
        "timestamp" : 1694089166000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "filesystem: add attribute \"leftpad\" to class LinFixedEF\u000a\u000aIn some cases, the specs do not specify an absolute record length.\u000aInstead there may be only a minimum record length specified. The card\u000avendor may then chose to use larger record length at will. This usually\u000ais no problem since the data is usually written from the left and the\u000aremaining bytes are padded at the end (right side) of the data. However\u000ain some rare cases (EF.MSISDN, see also 3GPP TS 51.011, section 10.5.5)\u000athe data must be written right-aligned towards the physical record\u000alength. This means that the data is padded from the left in this case.\u000a\u000aTo fix this: Let's add a \"leftpad\" flag to LinFixedEF, which we set to\u000atrue in those corner cases. The code that updates the record in\u000acommands.py must then check this flag and padd the data accordingly.\u000a\u000aChange-Id: I241d9fd656f9064a3ebb4e8e01a52b6b030f9923\u000aRelated: OS#5714\u000a",
        "date" : "2023-09-07 14:19:26 +0200",
        "id" : "37e57e0c45320fe3b855e3ec57ab52145c8b2987",
        "msg" : "filesystem: add attribute \"leftpad\" to class LinFixedEF",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/runtime.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/commands.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_51_011.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/filesystem.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-prog.py",
          "pySim-shell.py"
        ],
        "commitId" : "91c971bf82648ef5073589aa50fac9d9cec9aa82",
        "timestamp" : 1696847867000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "pySim-prog, pySim-shell do not use global variables\u000a\u000aWhen __main__ runs different variables get assigned. In particular opts,\u000ascc, sl and ch. Those variables are available in any scope and\u000atechnically it is possible to access them. However, lets not do this\u000asince it leads to confusion. Also, pylint will complain about those code\u000alocations.\u000a\u000aIn pySim-shell.py\u000a- Let's use the proper locations (sl and ch are stored in PysimApp.\u000a- Scc can be assigned in init_card.\u000a- In method walk, the use of the variable opts to call ection_df is wrong,\u000a  lets use **kwargs (see also usage of action_ef).\u000a- The constructor of Cmd2ApduTracer has a parameter cmd2_app, but usese\u000a  the global variable app. Let's use cmd2_app instead.\u000a\u000aIn pySim-prog.py\u000a- Do not use opts.num in find_row_in_csv_file, use num instead.\u000a- Pass scc to process_card as parameter so that it won't access scc\u000a  in the global scope.\u000a\u000aChange-Id: I7f09e9a6a6bfc658de75e86f7383ce73726f6666\u000aRelated: OS#6210\u000a",
        "date" : "2023-10-09 12:37:47 +0200",
        "id" : "91c971bf82648ef5073589aa50fac9d9cec9aa82",
        "msg" : "pySim-prog, pySim-shell do not use global variables",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-prog.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-shell.py"
        ],
        "commitId" : "8e03f2f2ed83497bc06443b6bd065547bd2f8209",
        "timestamp" : 1696930016000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "pySim-shell: do not pass failed card object to PysimApp\u000a\u000aWhen the try block in which we also call init_card() fails, there may be\u000ano card object, so we must not pass the card object to PysimApp in the\u000aexcept block. This is also no problem, PysimApp will run without the\u000acard object until the user executes do_equip for a second attempt.\u000a\u000aRelated: OS#6210\u000aChange-Id: I28195f442ce007f05f7610c882bbc4a6520a8ce6\u000a",
        "date" : "2023-10-10 11:26:56 +0200",
        "id" : "8e03f2f2ed83497bc06443b6bd065547bd2f8209",
        "msg" : "pySim-shell: do not pass failed card object to PysimApp",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/transport/__init__.py",
          "pySim-shell.py",
          "pySim/transport/pcsc.py",
          "pySim/transport/serial.py",
          "pySim/transport/modem_atcmd.py",
          "pySim/transport/calypso.py",
          "pySim-trace.py"
        ],
        "commitId" : "6bfa8a853335e5bd75fb1f40b3ad3df95583f316",
        "timestamp" : 1696931468000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "pySim-shell: print device info in case an exception occurs\u000a\u000aWhen an exception occurs while initializing or handling the card we\u000aprint a traceback, but we do not print any info that allows us to\u000aidentify the device that was involved when the exception occurred. Let's\u000ainclude the device path or number in the error message before we print\u000athe traceback.\u000a\u000aIn order to make it easier to print the device information, let's add a\u000a__str__() method to all of our devices. This method shall return the\u000adevice number or path.\u000a\u000aRelated: OS#6210\u000aChange-Id: I200463e692245da40ea6d5b609bfc0ca02d15bdb\u000a",
        "date" : "2023-10-10 11:51:08 +0200",
        "id" : "6bfa8a853335e5bd75fb1f40b3ad3df95583f316",
        "msg" : "pySim-shell: print device info in case an exception occurs",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/transport/calypso.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/serial.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/__init__.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/modem_atcmd.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim-trace.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/pcsc.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/transport/__init__.py",
          "pySim/transport/pcsc.py",
          "pySim/transport/calypso.py",
          "pySim/transport/serial.py",
          "pySim/transport/modem_atcmd.py"
        ],
        "commitId" : "58e89eb15a9260104c03d4285920c1d190fc9b80",
        "timestamp" : 1696932417000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "transport: add return type annotation to method __str__\u000a\u000aThe abstract class LinkBase has no return type annotation on its\u000a__str__ method.\u000a\u000aRelated: OS#6210\u000aChange-Id: I26d3d2714708dbe957704b60d17ba2afa325b2c4\u000a",
        "date" : "2023-10-10 12:06:57 +0200",
        "id" : "58e89eb15a9260104c03d4285920c1d190fc9b80",
        "msg" : "transport: add return type annotation to method __str__",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/transport/serial.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/calypso.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/modem_atcmd.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/pcsc.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/transport/__init__.py",
          "pySim-prog.py",
          "pySim-shell.py",
          "pySim-read.py"
        ],
        "commitId" : "af4e5bb18cdf498af481e07c6aff2d65ef60630e",
        "timestamp" : 1697459762000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "transport: do not catch exceptions in init_reader\u000a\u000aWe currently catch any exceptions that may occur when the card reader is\u000ainitialized. Then we print the exception string or the exception type\u000awhen no string is available. However, a failure during the reader\u000ainitialization is usually a severe problem, so a traceback would provde\u000aa lot of helpful information to debug the issue. So lets not catch any\u000aexceptions at this level so that we get the full backtrace.\u000a\u000aRelated: OS#6210\u000aChange-Id: I4c4807576fe63cf71a7d33b243a3f8fea0b7ff23\u000a",
        "date" : "2023-10-16 14:36:02 +0200",
        "id" : "af4e5bb18cdf498af481e07c6aff2d65ef60630e",
        "msg" : "transport: do not catch exceptions in init_reader",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-prog.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/__init__.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim-read.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_31_102.py"
        ],
        "commitId" : "28accc88c3fe8f110e31cadd895bb7fc71e0e226",
        "timestamp" : 1697664106000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "ts_31_102: Fix initialization of file size\u000a\u000aWe were using positional arguments when instantiating instances\u000aof classes like EF_5GS3GPPLOCI with non-default names/fids/...\u000a\u000aHowever, we got the argument order wrong and were passing the\u000adescription string in the position of the file size, which causes\u000aexceptions like the following from pySim-trace:\u000a\u000aTraceback (most recent call last):\u000a  File \"/home/laforge/projects/git/pysim/./pySim-trace.py\", line 198, in <module>\u000a    tracer.main()\u000a  File \"/home/laforge/projects/git/pysim/./pySim-trace.py\", line 125, in main\u000a    inst.process(self.rs)\u000a  File \"/home/laforge/projects/git/pysim/pySim/apdu/__init__.py\", line 259, in process\u000a    self.processed = method(self.lchan)\u000a  File \"/home/laforge/projects/git/pysim/pySim/apdu/ts_102_221.py\", line 152, in process_on_lchan\u000a    if self.cmd_dict['offset'] != 0 or self.lr < self.file.size[0]:\u000aTypeError: '<' not supported between instances of 'int' and 'str'\u000a\u000aLet's use named initializers for any arguments after the usual \"fid, sfid, name\"\u000ainitial arguments.\u000a\u000aChange-Id: I7f32c9fd01094620b68b0e54536ecc6cdbe67903\u000a",
        "date" : "2023-10-18 23:21:46 +0200",
        "id" : "28accc88c3fe8f110e31cadd895bb7fc71e0e226",
        "msg" : "ts_31_102: Fix initialization of file size",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_102.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_51_011.py",
          "pySim/ts_31_102.py"
        ],
        "commitId" : "509ecf84fa4d9e7d6806ad200bbfac9d12a01555",
        "timestamp" : 1697664777000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "Use keyword argument for file description argument\u000a\u000aWhile our base classes (TransparentEF / LinFixedEF) always have the\u000adsecription as 4th argument after \"fid, sfid, name\", most of the derived\u000afile-specific classes do not share that same argument order.\u000a\u000aAs seen in the bug fixed by previous Change-Id I7f32c9fd01094620b68b0e54536ecc6cdbe67903\u000athis can have serious consequences.  Let's avoid using unnamed\u000a(positional) arguments for the description text altogether.\u000a\u000aChange-Id: Icfb3fd1bae038c54fa14a91aa9f75219d839968c\u000a",
        "date" : "2023-10-18 23:32:57 +0200",
        "id" : "509ecf84fa4d9e7d6806ad200bbfac9d12a01555",
        "msg" : "Use keyword argument for file description argument",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_51_011.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_102.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-shell.py"
        ],
        "commitId" : "7c0cd0a93b87e1ee52ce6bccdb3a2a7ff3ee7be0",
        "timestamp" : 1697835084000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-shell: do not fail when EF.ICCID does not exist\u000a\u000aAn eUICC that has no active eSIM profile does not have an ICCID. (The\u000areason for this is that EF.ICCID is part of the eSIM profile).\u000aUnfortunately pySim-shell insists on reading the ICCID from EF.ICCID on\u000astartup in order to use it as a lookup key for verify_adm later.\u000a\u000aTo solve the problem, let's add a try/except block around the section\u000awhere EF.ICCID is read. In case of failure we set the ICCID to None,\u000a\u000aRelated: OS#5636\u000aChange-Id: I8d18c5073946c5a6bb1f93be0ce692a599f46f8c\u000a",
        "date" : "2023-10-20 20:51:24 +0000",
        "id" : "7c0cd0a93b87e1ee52ce6bccdb3a2a7ff3ee7be0",
        "msg" : "pySim-shell: do not fail when EF.ICCID does not exist",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/cards.py"
        ],
        "commitId" : "79972522677a31258bfe91935a1cd52713edebea",
        "timestamp" : 1697917624000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "cards.py: Fix type annotation\u000a\u000aThe CardBaes 'scc' member refers to a SimCardCommands instance,\u000anot to a LinkBase.\u000a\u000aChange-Id: If4c0dfbd8c9a03d1a0bc4129bb3c5d5fa492d4cb\u000a",
        "date" : "2023-10-21 21:47:04 +0200",
        "id" : "79972522677a31258bfe91935a1cd52713edebea",
        "msg" : "cards.py: Fix type annotation",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/cards.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-shell.py"
        ],
        "commitId" : "bdf595756ec344cad9db619bff578466c338b855",
        "timestamp" : 1697917624000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-shell: Create/delete RuntimeLchan objects on open/close of channel\u000a\u000aWe already have the open channel and close_channel commands in\u000apySim-shell. They are sent to the card and acknowledged, respectively.\u000a\u000aWe also already do have code that can track multiple different logical\u000achannels (the rs.lchan array).  However, this is currently only used by\u000apySim-trace, and not by pySim-shell.  Let's change that.\u000a\u000aChange-Id: Idacee2dc57e8afe85c79bc85b259064e7f5b83a2\u000aRelated: OS#6230\u000a",
        "date" : "2023-10-21 21:47:04 +0200",
        "id" : "bdf595756ec344cad9db619bff578466c338b855",
        "msg" : "pySim-shell: Create/delete RuntimeLchan objects on open/close of channel",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/runtime.py"
        ],
        "commitId" : "49acc06327b5462674ab05c65d7b42980dc0aedd",
        "timestamp" : 1697917624000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "RuntimeState: Add type annotation for 'card' argument\u000a\u000aChange-Id: I3c5138a918f7e45aabe3972883714d05ee704877\u000a",
        "date" : "2023-10-21 21:47:04 +0200",
        "id" : "49acc06327b5462674ab05c65d7b42980dc0aedd",
        "msg" : "RuntimeState: Add type annotation for 'card' argument",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/runtime.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "docs/shell.rst"
        ],
        "commitId" : "91eeecfbf31d407b46874faf44cd96f4562581fd",
        "timestamp" : 1698093031000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "docs: Fix command reference for 'apdu' command\u000a\u000aThis fixes the below error during build of the documentation:\u000a\u000apysim/docs/shell.rst:349: ERROR: \"<class 'pySim-shell.PySimCommands'>\" has no attribute \"apdu_cmd_parser\"\u000a\u000aChange-Id: If89b66a45ea18b5a3fc56bf77b05e679463da5a8\u000a",
        "date" : "2023-10-23 22:30:31 +0200",
        "id" : "91eeecfbf31d407b46874faf44cd96f4562581fd",
        "msg" : "docs: Fix command reference for 'apdu' command",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "docs/shell.rst"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/commands.py"
        ],
        "commitId" : "3dfab9dede002769c1c7a3f04e3a28c653bd8c72",
        "timestamp" : 1698153001000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "commands.py: Add support for multiple logical channels.\u000a\u000aHistorically we always only had one instance of SimCardCommands, but\u000awith this patch we can now have multiple instances, one for each lchan.\u000a\u000aThe SimCardCommands class is aware of the logical channel it runs on\u000aand will patch the CLA byte accordingly.\u000a\u000aChange-Id: Ibe5650dedc0f7681acf82018a86f83377ba81d30\u000aRelated: OS#6230\u000a",
        "date" : "2023-10-24 15:10:01 +0200",
        "id" : "3dfab9dede002769c1c7a3f04e3a28c653bd8c72",
        "msg" : "commands.py: Add support for multiple logical channels.",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/commands.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_31_102.py",
          "pySim-shell.py",
          "pySim/global_platform.py",
          "pySim/commands.py",
          "pySim/runtime.py",
          "pySim/ara_m.py",
          "pySim/ts_51_011.py",
          "pySim/ts_102_222.py"
        ],
        "commitId" : "46255121e0fc5a6cffddc24c992e0dd6b24da425",
        "timestamp" : 1698153001000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-shell: Create + use per-RuntimeLchan SimCardCommands\u000a\u000aThis new approach will \"fork\" separate SimCardCommands instances\u000afor each RuntimeLchan.  Higher-layer code should now always use the\u000aRuntimeLchan.scc rather than the RuntimeState.card._scc in order to\u000amake sure commands use the correct logical channel.\u000a\u000aChange-Id: I13e2e871f2afc2460d9fd1cd566de42267c7d389\u000aRelated: OS#6230\u000a",
        "date" : "2023-10-24 15:10:01 +0200",
        "id" : "46255121e0fc5a6cffddc24c992e0dd6b24da425",
        "msg" : "pySim-shell: Create + use per-RuntimeLchan SimCardCommands",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/commands.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/runtime.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ara_m.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_102.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_51_011.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_102_222.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/global_platform.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/cards.py",
          "pySim/runtime.py"
        ],
        "commitId" : "6dd6f3e12ca1109bcc0de60aa273594dda7c7510",
        "timestamp" : 1698153001000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "prevent SimCardCommands.select_adf_by_aid bypassing lchan\u000a\u000aNow that pySim-shell is aware of logical channels and issues almost\u000aall of its APDUs on the currently selected channel, we must also make\u000asure that ADF selection by AID (implemented by the CardBase class)\u000aissues the SELECT on the respective logical channel.\u000a\u000aBefore this patch, SELECT ADF by AID would always be issued on the\u000aprimary logical channel (0), irrespective of the currently active\u000aRuntimeLchan.\u000a\u000aChange-Id: Idf05c297e6a2e24ca539408b8912e348c0782bb4\u000aRelated: OS#6230\u000a",
        "date" : "2023-10-24 15:10:01 +0200",
        "id" : "6dd6f3e12ca1109bcc0de60aa273594dda7c7510",
        "msg" : "prevent SimCardCommands.select_adf_by_aid bypassing lchan",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/runtime.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/cards.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "docs/shell.rst",
          "pySim-shell.py"
        ],
        "commitId" : "20650997e8f7652957b83116c16df7f3b180f3b4",
        "timestamp" : 1698153001000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-shell: Add 'switch_channel' command\u000a\u000aWe've already had the 'open_channel' and 'close_channel' commands,\u000awhich were sent to (and acknowledged by) the card.  However,\u000athose commands didn't affect the pySim-shell state, i.e. all\u000acommunication would still happen through the default channel '0'.\u000a\u000aWith this patch we introduce a 'switch_channel' command, using which\u000athe user can determine which of the (previously opened) logical channels\u000ashall be used by pySim-shell.\u000a\u000aChange-Id: Ia76eb45c4925882ae6866e50b64d9610bd4d546d\u000aCloses: OS#6230\u000a",
        "date" : "2023-10-24 15:10:01 +0200",
        "id" : "20650997e8f7652957b83116c16df7f3b180f3b4",
        "msg" : "pySim-shell: Add 'switch_channel' command",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "docs/shell.rst"
          },
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "docs/suci-tutorial.rst",
          "docs/shell.rst",
          "pySim-shell.py"
        ],
        "commitId" : "237ddb5bb39eef5acfc80bda35875e7ce270f243",
        "timestamp" : 1698153001000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-shell: Include current logical channel in prompt\u000a\u000aNow that pySim-shell can switch between logical channels, let's state\u000athe currently used logical channel in the prompt.\u000a\u000aChange-Id: I45781a6fba205eeb4ac7f58d5cb642b7131bdd88\u000aRelated: OS#6230\u000a",
        "date" : "2023-10-24 15:10:01 +0200",
        "id" : "237ddb5bb39eef5acfc80bda35875e7ce270f243",
        "msg" : "pySim-shell: Include current logical channel in prompt",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "docs/shell.rst"
          },
          {
            "editType" : "edit",
            "file" : "docs/suci-tutorial.rst"
          },
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/utils.py"
        ],
        "commitId" : "10669f2ddf40d4f8293018677535b5626af2720b",
        "timestamp" : 1698153001000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "utils: Fix bertlv_encode_tag() for multi-byte tags\u000a\u000aWe used to support only single-byte tags in bertlv_encode_tag,\u000alet's fix that.  The easy option is to simply call bertlv_parse_tag,\u000aas that already supported multi-byte tags.\u000a\u000aChange-Id: If0bd9137883c4c8b01c4dfcbb53cabeee5c1ce2b\u000a",
        "date" : "2023-10-24 15:10:01 +0200",
        "id" : "10669f2ddf40d4f8293018677535b5626af2720b",
        "msg" : "utils: Fix bertlv_encode_tag() for multi-byte tags",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/utils.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/transport/__init__.py",
          "pySim/transport/pcsc.py",
          "pySim/transport/calypso.py",
          "pySim/transport/modem_atcmd.py",
          "pySim/transport/serial.py"
        ],
        "commitId" : "307734373937f10305a5c10688a77889730f3b54",
        "timestamp" : 1698175714000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "transport: move init message into concrete classes\u000a\u000aIn in the module __init__.py we print an init message (which type of\u000aLinkBase class is providing the SimLink). However in __init__.py we tend\u000ato have only platform independed code but the message string can already\u000abe categorized as platform depened. Let's put the init message into the\u000aconstructor of the concrete classes of LinkBase.\u000a\u000aRelated: OS#6210\u000aChange-Id: I0a6dd7deb79a5f3e42b29094a1cf2535075fa430\u000a",
        "date" : "2023-10-24 19:28:34 +0000",
        "id" : "307734373937f10305a5c10688a77889730f3b54",
        "msg" : "transport: move init message into concrete classes",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/transport/calypso.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/modem_atcmd.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/serial.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/__init__.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/pcsc.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/transport/__init__.py",
          "pySim/transport/pcsc.py",
          "pySim/transport/calypso.py",
          "pySim/transport/serial.py",
          "pySim/transport/modem_atcmd.py"
        ],
        "commitId" : "8c82378bfd74187ece4f4cddb565a9dad3c746ed",
        "timestamp" : 1698175714000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "transport: move argument parser setup into concrete classes\u000a\u000aThe argument parser is set up globally for all LinkBase objects in\u000a__init__.py. Since we tend to have only platform independed code in\u000a__init__.py, we should move the argument parser setup into the\u000aspecific LinkBase classes.\u000a\u000aRelated: OS#6210\u000aChange-Id: I22c32aa81ca0588e3314c3ff4546f6e5092c11df\u000a",
        "date" : "2023-10-24 19:28:34 +0000",
        "id" : "8c82378bfd74187ece4f4cddb565a9dad3c746ed",
        "msg" : "transport: move argument parser setup into concrete classes",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/transport/calypso.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/serial.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/pcsc.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/modem_atcmd.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/euicc.py",
          "pySim-shell.py",
          "pySim/global_platform.py",
          "docs/shell.rst"
        ],
        "commitId" : "268a2025db0e53dc81af7df32f4ed96524d44411",
        "timestamp" : 1698333390000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "Initial support for eUICC\u000a\u000aThis just adds basic support for the ISD-R application and its\u000aassociated STORE DATA command which is used for the ES10x interfaces\u000abetween off-card entities and the on-card ISD-R.\u000a\u000aChange-Id: Ieab37b083e25d3f36c20f6e9ed3e4bdfdd14a42a\u000aCloses: OS#5637\u000a",
        "date" : "2023-10-26 15:16:30 +0000",
        "id" : "268a2025db0e53dc81af7df32f4ed96524d44411",
        "msg" : "Initial support for eUICC",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          },
          {
            "editType" : "edit",
            "file" : "docs/shell.rst"
          },
          {
            "editType" : "add",
            "file" : "pySim/euicc.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/global_platform.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/euicc.py",
          "docs/shell.rst"
        ],
        "commitId" : "884eb551afd356c31220bb1cab86c4995231720d",
        "timestamp" : 1698333390000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "euicc: Add get_profiles_info command\u000a\u000aExample output:\u000a\u000apySIM-shell (02:MF/ADF.ISD-R)> get_profiles_info\u000a{\u000a    \"profile_info_seq\": {\u000a        \"profile_info\": {\u000a            \"iccid\": \"98940462222222222222\",\u000a            \"isdp_aid\": \"a0000005591010ffffffff8900001200\",\u000a            \"profile_state\": \"enabled\",\u000a            \"service_provider_name\": \"foobar\",\u000a            \"profile_name\": \"foobar\",\u000a            \"profile_class\": \"provisioning\"\u000a        }\u000a    }\u000a}\u000a\u000aChange-Id: I52d136f99dc0eb29905e7ca0cd0865486d3cf65b\u000a",
        "date" : "2023-10-26 15:16:30 +0000",
        "id" : "884eb551afd356c31220bb1cab86c4995231720d",
        "msg" : "euicc: Add get_profiles_info command",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "docs/shell.rst"
          },
          {
            "editType" : "edit",
            "file" : "pySim/euicc.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/euicc.py",
          "docs/shell.rst"
        ],
        "commitId" : "cbc0bdfaa9a97c313b43c4bc03b8b041df924579",
        "timestamp" : 1698333390000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "euicc: add some first IoT eUICC commands (GSMA SGP.32)\u000a\u000athis is far from being complete, just some basic first commands\u000ato get the certificates and eIM configuration.\u000a\u000aChange-Id: Ie05108e635ed9c6de10f0ba431cb1b13893f6be8\u000a",
        "date" : "2023-10-26 15:16:30 +0000",
        "id" : "cbc0bdfaa9a97c313b43c4bc03b8b041df924579",
        "msg" : "euicc: add some first IoT eUICC commands (GSMA SGP.32)",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/euicc.py"
          },
          {
            "editType" : "edit",
            "file" : "docs/shell.rst"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tests/pySim-trace_test.sh",
          "pySim/transport/pcsc.py",
          "pySim/transport/calypso.py",
          "tests/pySim-prog_test.sh",
          "pySim/transport/serial.py",
          "pySim/transport/modem_atcmd.py"
        ],
        "commitId" : "4af63dc760d212b0aab4c628f5083ab9025e0693",
        "timestamp" : 1698333427000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "transport: print reader device/number on init\u000a\u000aWhen we initialize the reader, we currently tell only which type of\u000ainterface we are using, but we do not print the reader number or the\u000adevice path.\u000a\u000aLet's extend the messages so that the path is printed. To prevent\u000aproblems with integration-tests, let's also add an environment variable\u000athat we can use to detect when pySim runs inside a integration-test.\u000a\u000aRelated: OS#6210\u000aChange-Id: Ibe296d51885b1ef5f9c9ecaf1d28da52014dcc4b\u000a",
        "date" : "2023-10-26 15:17:07 +0000",
        "id" : "4af63dc760d212b0aab4c628f5083ab9025e0693",
        "msg" : "transport: print reader device/number on init",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "tests/pySim-prog_test.sh"
          },
          {
            "editType" : "edit",
            "file" : "tests/pySim-trace_test.sh"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/pcsc.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/serial.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/modem_atcmd.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/calypso.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/runtime.py"
        ],
        "commitId" : "1da8636c0fa1eb4e152e7ac935021e0853b83b7c",
        "timestamp" : 1698769551000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "runtime: cosmetic: fix formatting of comment\u000a\u000aChange-Id: I4e949a08c1bfab413b82e958a64404390e58148f\u000a",
        "date" : "2023-10-31 17:25:51 +0100",
        "id" : "1da8636c0fa1eb4e152e7ac935021e0853b83b7c",
        "msg" : "runtime: cosmetic: fix formatting of comment",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/runtime.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/filesystem.py"
        ],
        "commitId" : "a24755e066021905268d4b9a9bc6e7406b3464d2",
        "timestamp" : 1698769555000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "filesystem: fix method build_select_path_to\u000a\u000aThe method build_select_path_to chops off the first element of the\u000acurrent path. This is done to prevent re-selection of the first file in\u000athe current path.\u000a\u000aUnfortunately chopping off the first element in the current path does\u000anot work properly in a situation when the current path points to the MF.\u000aThis would chop off the first and last element in the list and the for\u000aloop below would run 0 times.\u000a\u000aTo fix this, let's keep the first element and chop it off from the\u000aresulting path.\u000a\u000aRelated: OS#5418\u000aChange-Id: Ia521a7ac4c25fd3a2bc8edffdc45ec89ba4b16eb\u000a",
        "date" : "2023-10-31 17:25:55 +0100",
        "id" : "a24755e066021905268d4b9a9bc6e7406b3464d2",
        "msg" : "filesystem: fix method build_select_path_to",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/filesystem.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "docs/shell.rst"
        ],
        "commitId" : "47bb33f937c371877e958183549c65a6c7d1a60d",
        "timestamp" : 1698855995000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "docs: shell: Clarify various different card support\u000a\u000aChange-Id: Ibf8e3538aa3c954df72c11ec0a2f885031b54b0e\u000a",
        "date" : "2023-11-01 17:26:35 +0100",
        "id" : "47bb33f937c371877e958183549c65a6c7d1a60d",
        "msg" : "docs: shell: Clarify various different card support",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "docs/shell.rst"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "docs/shell.rst"
        ],
        "commitId" : "0f2faa59fb13edaa9e4d06b0429924e73731a428",
        "timestamp" : 1698855995000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "docs: shell: By now we have encoders/decoders for most files\u000a\u000aChange-Id: Ia771f9969ae7eb0094d1768af3f7f54cc9d0d581\u000a",
        "date" : "2023-11-01 17:26:35 +0100",
        "id" : "0f2faa59fb13edaa9e4d06b0429924e73731a428",
        "msg" : "docs: shell: By now we have encoders/decoders for most files",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "docs/shell.rst"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "docs/shell.rst"
        ],
        "commitId" : "350cfd822b02e8cfd295a012952bb04b3d80cdc3",
        "timestamp" : 1698961486000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "docs: shell: link to cmd2 documentation\u000a\u000aChange-Id: I532cb33781f95fe847db7fae7a5264b5d9c416de\u000a",
        "date" : "2023-11-02 21:44:46 +0000",
        "id" : "350cfd822b02e8cfd295a012952bb04b3d80cdc3",
        "msg" : "docs: shell: link to cmd2 documentation",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "docs/shell.rst"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "docs/shell.rst"
        ],
        "commitId" : "0c25e922be25acd92fd89d83478baf29b922e4dc",
        "timestamp" : 1698961548000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "docs: shell: Re-order the command sections/classes\u000a\u000athe generic pysim command should precede those from specs like ISO7816\u000a\u000aChange-Id: I11e66757f10cc28fda547244ae09d51dacd70824\u000a",
        "date" : "2023-11-02 21:45:48 +0000",
        "id" : "0c25e922be25acd92fd89d83478baf29b922e4dc",
        "msg" : "docs: shell: Re-order the command sections/classes",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "docs/shell.rst"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/tlv.py"
        ],
        "commitId" : "6663218ab8d6a9bbefd4f175ce0183823a8c098c",
        "timestamp" : 1698961554000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "docs: Fix docstring syntax to avoid warnings\u000a\u000apySim/tlv.py:docstring of pySim.tlv.IE.from_bytes:1: ERROR: Unknown target name: \"part\".\u000apySim/tlv.py:docstring of pySim.tlv.IE.to_bytes:1: ERROR: Unknown target name: \"part\".\u000a\u000aChange-Id: I170176910c4519005b9276dbe5854aaaecb58efb\u000a",
        "date" : "2023-11-02 21:45:54 +0000",
        "id" : "6663218ab8d6a9bbefd4f175ce0183823a8c098c",
        "msg" : "docs: Fix docstring syntax to avoid warnings",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/tlv.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "docs/shell.rst"
        ],
        "commitId" : "aa07ebcdac721971054098a0388520b957b693b4",
        "timestamp" : 1698961561000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "docs: shell: update output in examples\u000a\u000apySim-shell output has changed over time, so some examples were\u000ashowing outdated content.  Let's update those.\u000a\u000aChange-Id: I4058719c32b61689522e90eba37253e8accb8ba5\u000a",
        "date" : "2023-11-02 21:46:01 +0000",
        "id" : "aa07ebcdac721971054098a0388520b957b693b4",
        "msg" : "docs: shell: update output in examples",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "docs/shell.rst"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "docs/shell.rst"
        ],
        "commitId" : "3d16fdd8daaaa8e9fb677481857d0f9f37b83be7",
        "timestamp" : 1698961568000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "docs: shell: Various documentation updates/extensions\u000a\u000a* examples for export, verify_adm, reset, apdu\u000a* explain CSV option for verify_adm\u000a* fix 'tree' example (--help shouldn't be there)\u000a\u000aChange-Id: I6ed8d8c5cf268ad3534e988eff9501f388b8d80f\u000a",
        "date" : "2023-11-02 21:46:08 +0000",
        "id" : "3d16fdd8daaaa8e9fb677481857d0f9f37b83be7",
        "msg" : "docs: shell: Various documentation updates/extensions",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "docs/shell.rst"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "docs/shell.rst",
          "pySim-shell.py"
        ],
        "commitId" : "0ba3fd996aa4c72118bc670f067596930d9d173c",
        "timestamp" : 1698961573000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-shell: Add copyright statement and link to online manual to banner\u000a\u000aThis way the users are reminded where they can go to read the manual.\u000a\u000aChange-Id: Ie86822e73bccb3c585cecc818d4462d4ca6e43c2\u000a",
        "date" : "2023-11-02 21:46:13 +0000",
        "id" : "0ba3fd996aa4c72118bc670f067596930d9d173c",
        "msg" : "pySim-shell: Add copyright statement and link to online manual to banner",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          },
          {
            "editType" : "edit",
            "file" : "docs/shell.rst"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "docs/shell.rst",
          "pySim-shell.py"
        ],
        "commitId" : "469db9393f18dee986cd0635fc969c050288df36",
        "timestamp" : 1698961598000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-shell: Use argparser for verify_adm to support --help\u000a\u000aLet's add a proper argparser instance for the 'verify_adm' command,\u000aavoiding situations where the user types 'verif_adm --help' and then\u000a--help is interpreted as the PIN value, removing one more attempt from\u000athe failed ADM1 counter.\u000a\u000aLet's use that opportunity to improve the documentation of the command.\u000a\u000aChange-Id: I3321fae66a11efd00c53b66c7890fce84796e658\u000a",
        "date" : "2023-11-02 21:46:38 +0000",
        "id" : "469db9393f18dee986cd0635fc969c050288df36",
        "msg" : "pySim-shell: Use argparser for verify_adm to support --help",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "docs/shell.rst"
          },
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/utils.py",
          "pySim-shell.py"
        ],
        "commitId" : "f9ea63ea51ef4a7bdf6a7ef531a3da9d2d53468e",
        "timestamp" : 1698968597000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-shell: Improved argument validation for verify_adm argument\u000a\u000aLet's make sure we don't even bother to ask the card to verify\u000aanything as ADM1 pin which is not either a sequence of decimal digits\u000aor an even number of hex digits (even number of bytes).\u000a\u000aChange-Id: I4a193a3cf63462fad73d145ab1481070ddf767ca\u000a",
        "date" : "2023-11-03 00:43:17 +0100",
        "id" : "f9ea63ea51ef4a7bdf6a7ef531a3da9d2d53468e",
        "msg" : "pySim-shell: Improved argument validation for verify_adm argument",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/utils.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/utils.py",
          "pySim-shell.py"
        ],
        "commitId" : "4e59d89a5dec1df4700bf732c1802cf6bfcec38b",
        "timestamp" : 1698968597000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-shell: Validate that argument to 'apdu' command is proper hexstr\u000a\u000aLet's not even send anything to the card if it's not an even number\u000aof hexadecimal digits\u000a\u000aChange-Id: I58465244101cc1a976e5a17af2aceea1cf9f9b54\u000a",
        "date" : "2023-11-03 00:43:17 +0100",
        "id" : "4e59d89a5dec1df4700bf732c1802cf6bfcec38b",
        "msg" : "pySim-shell: Validate that argument to 'apdu' command is proper hexstr",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/utils.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-shell.py"
        ],
        "commitId" : "977c5925a174c53568c79ad0084e2afc3da0960b",
        "timestamp" : 1698968597000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-shell: permit string with spaces for 'echo' command\u000a\u000abefore this patch:\u000a\u000apySIM-shell (00:MF)> echo foo bar baz\u000ausage: echo [-h] string\u000aecho: error: unrecognized arguments: bar baz\u000a\u000aafter this patch:\u000a\u000apySIM-shell (00:MF)> echo foo bar baz\u000afoo bar baz\u000a\u000aChange-Id: I1369bc3aa975865e3a8a574c132e469813a9f6b9\u000a",
        "date" : "2023-11-03 00:43:17 +0100",
        "id" : "977c5925a174c53568c79ad0084e2afc3da0960b",
        "msg" : "pySim-shell: permit string with spaces for 'echo' command",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/utils.py",
          "pySim-shell.py"
        ],
        "commitId" : "1c849f8bc2aaa9954861703bc6753c8620c2f786",
        "timestamp" : 1698968597000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-shell: Reject any non-decimal PIN values\u000a\u000aDon't even send any non-decimal PIN values to the card, but reject\u000athem when parsing the command arguments.\u000a\u000aChange-Id: Icec1698851471af7f76f20201dcdcfcd48ddf365\u000a",
        "date" : "2023-11-03 00:43:17 +0100",
        "id" : "1c849f8bc2aaa9954861703bc6753c8620c2f786",
        "msg" : "pySim-shell: Reject any non-decimal PIN values",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/utils.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/sysmocom_sja2.py"
        ],
        "commitId" : "7be68b29804dcae6f295a08a117f8d13cb8f5639",
        "timestamp" : 1698968597000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "sysmocom_sja2: Add some de/encode test vectors\u000a\u000aThis increases test coverage and also shows where we so far only\u000ahave decoders but no encoders yet\u000a\u000aChange-Id: I7932bab7c81a2314c1b9477f50b82a46f24d074e\u000a",
        "date" : "2023-11-03 00:43:17 +0100",
        "id" : "7be68b29804dcae6f295a08a117f8d13cb8f5639",
        "msg" : "sysmocom_sja2: Add some de/encode test vectors",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/sysmocom_sja2.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_31_102.py",
          "pySim/sysmocom_sja2.py"
        ],
        "commitId" : "45477a767b455cb2695c9ff540278ae38835478b",
        "timestamp" : 1699112924000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "Use construct 'Flag' instead of 'Bit' for type descriptions\u000a\u000aIt's better for the human reader (and more obvious that it's a boolean\u000avalue) if we decode single Bits as True/False instead of 1/0.\u000a\u000aChange-Id: Ib025f9c4551af7cf57090a0678ab0f66a6684fa4\u000a",
        "date" : "2023-11-04 15:48:44 +0000",
        "id" : "45477a767b455cb2695c9ff540278ae38835478b",
        "msg" : "Use construct 'Flag' instead of 'Bit' for type descriptions",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/sysmocom_sja2.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_102.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/transport/__init__.py"
        ],
        "commitId" : "2d44f03af21dcc0473b2754ccd32109c489a179a",
        "timestamp" : 1699112935000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "transport: Log it explicitly if user doesn't specify a reader\u000a\u000aChange-Id: I37e9d62fabf237ece7e49d8f2253c606999d3d02\u000a",
        "date" : "2023-11-04 15:48:55 +0000",
        "id" : "2d44f03af21dcc0473b2754ccd32109c489a179a",
        "msg" : "transport: Log it explicitly if user doesn't specify a reader",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/transport/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/app.py",
          "pySim-shell.py"
        ],
        "commitId" : "8fab463e67dc3b41cef6f6ef69f3cc0d42016d5c",
        "timestamp" : 1699533407000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-shell: Move init_card() function to new pySim.app module\u000a\u000aThe point of this is to move generic code out of pySim-shell.py,\u000apaving the way for more/other executables using the full power of\u000aour class model without having to reinvent the wheel.\u000a\u000aChange-Id: Icf557ed3064ef613ed693ce28bd3514a97a938bd\u000a",
        "date" : "2023-11-09 12:36:47 +0000",
        "id" : "8fab463e67dc3b41cef6f6ef69f3cc0d42016d5c",
        "msg" : "pySim-shell: Move init_card() function to new pySim.app module",
        "paths" : [
          {
            "editType" : "add",
            "file" : "pySim/app.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/runtime.py"
        ],
        "commitId" : "578cf12e734cbec2daf16b390bedf9bfae002431",
        "timestamp" : 1699540988000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "runtime: fix tracking of selected_adf\u000a\u000aThe class property selected_adf is not updated in all locations where an\u000aADF is selected, this means that we may loose track of the currently\u000aselected ADF in some locations\u000a\u000aChange-Id: I4cc0c58ff887422b4f3954d35c8380ddc00baa1d\u000aRelated: OS#5418\u000a",
        "date" : "2023-11-09 14:43:08 +0000",
        "id" : "578cf12e734cbec2daf16b390bedf9bfae002431",
        "msg" : "runtime: fix tracking of selected_adf",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/runtime.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_31_102.py"
        ],
        "commitId" : "40ef226030e670ce6f8c23e5399af07177f06d1a",
        "timestamp" : 1699967916000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/osmocom",
          "fullName" : "icecream"
        },
        "authorEmail" : "osmocom@heychris.eu",
        "comment" : "ts_31_102: correct name of EF_ePDGId\u000a\u000aIn 31.102 v17.10, file 6ff3 is called \"EF_ePDGId\". Adjust the spelling to match.\u000a\u000aChange-Id: I2c27a7f325f75274e2110eb312b623cf9e7dab47\u000a",
        "date" : "2023-11-14 13:18:36 +0000",
        "id" : "40ef226030e670ce6f8c23e5399af07177f06d1a",
        "msg" : "ts_31_102: correct name of EF_ePDGId",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_102.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/app.py"
        ],
        "commitId" : "f1e1e729c4757931e28773ef034e0c614d8d7b82",
        "timestamp" : 1700826078000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "app: do not catch exceptions in init_card\u000a\u000aThe function init_card catches all exceptions and then returns None\u000aobjects for card or rs in case of an error. This does not fit in the\u000astyle we pursue in pySim. This is in particular true for library\u000afunctions. We want those functions to raise exceptions when something is\u000awrong, so that we can catch the exception at top level. Let's fix this\u000afor init_card now.\u000a\u000aRelated: OS#6271\u000aChange-Id: I581125d8273ef024f6dbf3a5db6116be15c5c95d\u000a",
        "date" : "2023-11-24 12:41:18 +0100",
        "id" : "f1e1e729c4757931e28773ef034e0c614d8d7b82",
        "msg" : "app: do not catch exceptions in init_card",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/app.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-shell.py"
        ],
        "commitId" : "eb3b0dd3797ffa00afb1d500dd0ad5f8b5d6a146",
        "timestamp" : 1700826078000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "pySim-shell: refuse to execute a startup script on initialization errors\u000a\u000aWhen there is an error on initialization (e.g. card not present), we\u000ashould not continue to execute a startup script that was passed with the\u000apySim-shell commandline. Instead we should print a message that the\u000astartup script was ignored due to errors.\u000a\u000aRelated: OS#6271\u000aChange-Id: I61329988e0e9021b5b0ef8e0819fb8e23cabf38b\u000a",
        "date" : "2023-11-24 12:41:18 +0100",
        "id" : "eb3b0dd3797ffa00afb1d500dd0ad5f8b5d6a146",
        "msg" : "pySim-shell: refuse to execute a startup script on initialization errors",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-shell.py"
        ],
        "commitId" : "1c207a24994a9125f80c015e78239f2cf63707ec",
        "timestamp" : 1701267850000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "pySim-shell: Do not use self.lchan.scc when sending raw APDUs.\u000a\u000aWhen sending raw APDUs, we access the scc (SimCardCommands) object via\u000athe scc member in the lchan object. Unfortunately self.lchan will not be\u000apopulated when the rs (RuntimeState) object is missing. This is in\u000aparticular the case when no profile could be detected for the card,\u000awhich is a common situation when we boostrap an unprovisioned card.\u000a\u000aSo let's access the scc object through the card object. This is also\u000amore logical since when we send raw APDUs we work below the level of\u000alogical channels.\u000a\u000aChange-Id: I6bbaebe7d7a2013f0ce558ca2da7d58f5e6d991a\u000aRelated: OS#6278\u000a",
        "date" : "2023-11-29 15:24:10 +0100",
        "id" : "1c207a24994a9125f80c015e78239f2cf63707ec",
        "msg" : "pySim-shell: Do not use self.lchan.scc when sending raw APDUs.",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/transport/__init__.py"
        ],
        "commitId" : "4e02436dba52266c30ba6015c5725721fa831d2c",
        "timestamp" : 1701722330000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "perform multiple GET RESPONSE cycles if more data is available\u000a\u000aSo far we implemented only one round of \"Send the APDU, get SW=61xx,\u000acall GET RESPONSE\".  This permitted us to receive only data up to 256\u000abytes.\u000a\u000aLet's extend that to doing multiple rounds, concatenating the result.\u000aThis allows us to obtain arbitrary-length data from the card.\u000a\u000aSee Annex C.1 of ETSI TS 102 221 for examples showing multiple 61xx\u000aiterations.\u000a\u000aChange-Id: Ib17da655aa0b0eb203c29dc92690c81bd1300778\u000aCloses: OS#6287\u000a",
        "date" : "2023-12-04 21:38:50 +0100",
        "id" : "4e02436dba52266c30ba6015c5725721fa831d2c",
        "msg" : "perform multiple GET RESPONSE cycles if more data is available",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/transport/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_31_103.py",
          "pySim/ts_31_104.py",
          "pySim/ts_31_102.py",
          "pySim/filesystem.py"
        ],
        "commitId" : "a1850aeccca3c6b62d883612d122e4d022bb4b05",
        "timestamp" : 1701797856000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "filesystem: add flag to tell whether an ADF supports an FS or not\u000a\u000aAn ADF may or may not support a file system. For example ADF.ARA-M does\u000anot have any filesystem support, which means the SELECT we may use from\u000athis ADF is limited and an can only select a different application. To\u000aknow about this in advance let's add a flag that we set when we\u000ainstantiate an ADF.\u000a\u000aChange-Id: Ifd0f7c34164685ea18d8a746394e55416fa0aa66\u000aRelated: OS#5418\u000a",
        "date" : "2023-12-05 17:37:36 +0000",
        "id" : "a1850aeccca3c6b62d883612d122e4d022bb4b05",
        "msg" : "filesystem: add flag to tell whether an ADF supports an FS or not",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_103.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/filesystem.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_104.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_102.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ara_m.py"
        ],
        "commitId" : "9c3871177303e950600040463d1664758a555d2f",
        "timestamp" : 1701824855000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/neels",
          "fullName" : "Neels Hofmeyr"
        },
        "authorEmail" : "nhofmeyr@sysmocom.de",
        "comment" : "ara_m: Fix encoding of DeviceInterfaceVersionDO\u000a\u000aEver since commit 30de9fd8abc9d7c2c541fea7fa4b97c4ca1a54eb in July\u000awe are (properly) using snake_case names in the from_dict (to become\u000abijective with to_dict).   This code was not updated by accident,\u000acreating an exception when using the `aram_get_config`\u000a\u000aChange-Id: If216b56b38ab17d13896074aa726278b9ba16923\u000aRelated: OS#6119\u000a",
        "date" : "2023-12-06 01:07:35 +0000",
        "id" : "9c3871177303e950600040463d1664758a555d2f",
        "msg" : "ara_m: Fix encoding of DeviceInterfaceVersionDO",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ara_m.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/tlv.py"
        ],
        "commitId" : "880db3735689b7cc0b7bb0b826b8acd4bf02dcc2",
        "timestamp" : 1701849758000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "flatten_dict_lists(): Don't flatten lists with duplicate keys\u000a\u000aIf we have a list of dicts, and we flatten that into a dict: Only\u000ado that if there are no dicts with duplocate key values in the list,\u000aas otherwise we will loose information during the transformation.\u000a\u000aChange-Id: I7f6d03bf323a153f3172853a3ef171cbec8aece7\u000aCloses: OS#6288\u000a",
        "date" : "2023-12-06 09:02:38 +0100",
        "id" : "880db3735689b7cc0b7bb0b826b8acd4bf02dcc2",
        "msg" : "flatten_dict_lists(): Don't flatten lists with duplicate keys",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/tlv.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/runtime.py"
        ],
        "commitId" : "b8b61bf8af925b3c476ed526dc2693c0204aafb8",
        "timestamp" : 1701948519000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "runtime: do not use the _scc object of the card object to select MF\u000a\u000aThe constructor of the RuntimeState object selects the MF befor it does\u000asome other steps. However it does this through the _scc object of the\u000acard object. This method is before we had lchan abstraction, so we\u000ashould now use the lchan object like in all other places.\u000a\u000aRelated: OS#5418\u000aChange-Id: I9a751c0228c77077e3fabb50a9a68e4489e7151c\u000a",
        "date" : "2023-12-07 12:28:39 +0100",
        "id" : "b8b61bf8af925b3c476ed526dc2693c0204aafb8",
        "msg" : "runtime: do not use the _scc object of the card object to select MF",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/runtime.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/runtime.py"
        ],
        "commitId" : "e30456b07a8ac6e69df7a277549e70178198f7c9",
        "timestamp" : 1701948537000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "runtime: explain why we may access the card object directly\u000a\u000aWhen we are in the constructor of RuntimeState, we may/must access the\u000acard object directly. Let's explain why, since it may not be immediately\u000aobvious.\u000a\u000aChange-Id: I01f74d5f021d46679d1c9fa83fb8753382b0f88f\u000aRelated: OS#5418\u000a",
        "date" : "2023-12-07 12:28:57 +0100",
        "id" : "e30456b07a8ac6e69df7a277549e70178198f7c9",
        "msg" : "runtime: explain why we may access the card object directly",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/runtime.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/runtime.py"
        ],
        "commitId" : "c038cccdd8149b28c2f3589cd5ec58daeaa993d5",
        "timestamp" : 1701948557000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "runtime: cosmetic: prnounce file reference data\u000a\u000aOne of the most important properties of the RuntimeLchan are the\u000aselected_file/adf properties. Let's reformat the code so that those\u000aproperties are more pronounced.\u000a\u000aChange-Id: I4aa028f66879b7d6c2a1cd102cda8d8ca5ff48b1\u000aRelated: OS#5418\u000a",
        "date" : "2023-12-07 12:29:17 +0100",
        "id" : "c038cccdd8149b28c2f3589cd5ec58daeaa993d5",
        "msg" : "runtime: cosmetic: prnounce file reference data",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/runtime.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/tlv.py"
        ],
        "commitId" : "0f7d48ed692c834e3d40e16bec0403cf6f6a8755",
        "timestamp" : 1701955192000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "tlv: Fix encoding of zero-valued TLVs\u000a\u000aIf a TLV was elementary (no nested IEs), and it had only a single\u000ainteger content whose value is 0, we erroneously encoded that as\u000azero-length TLV (len=0, no value part):\u000a\u000a>>> rf = pySim.euicc.RefreshFlag(decoded=0);\u000a>>> rf.to_bytes()\u000ab''\u000a>>> rf.to_tlv()\u000ab'\\x81\\x00'\u000a\u000aAfter this change it is correct:\u000a\u000a>>> rf = pySim.euicc.RefreshFlag(decoded=0);\u000a>>> rf.to_bytes()\u000ab'\\x00'\u000a>>> rf.to_tlv()\u000ab'\\x81\\x01\\x00'\u000a\u000aChange-Id: I5f4c0555cff7df9ccfc4a56da12766d1bf89122f\u000a",
        "date" : "2023-12-07 13:19:52 +0000",
        "id" : "0f7d48ed692c834e3d40e16bec0403cf6f6a8755",
        "msg" : "tlv: Fix encoding of zero-valued TLVs",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/tlv.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/euicc.py"
        ],
        "commitId" : "008cdf4664802bc322d1f5bc60b3b5fe5bd4745f",
        "timestamp" : 1701955192000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "euicc: Fix encoding of {enable,disable,delete}_profile\u000a\u000aThe encoding was missing a \"CHOICE\" container and missed the\u000afact that the refreshFlag presence is mandatory for enable+disable.\u000a\u000aChange-Id: I12e2b16b2c1b4b01dfad0d1fb485399827f25ddc\u000a",
        "date" : "2023-12-07 13:19:52 +0000",
        "id" : "008cdf4664802bc322d1f5bc60b3b5fe5bd4745f",
        "msg" : "euicc: Fix encoding of {enable,disable,delete}_profile",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/euicc.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-shell.py"
        ],
        "commitId" : "5482737f31bdad8ab9688c35d6cda2cc17de6d96",
        "timestamp" : 1701955267000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-shell: don't get trapped in applications without file system\u000a\u000aWhen we traverse the file system, we may also end up selecting\u000aapplications (ADF), which do not support an USIM/ISIM like file system.\u000aThis will leave us without the ability to select the MF (or any other\u000afile) again. The only way out is to select the ISIM or USIM application\u000aagain to get the access to the file system again.\u000a\u000aChange-Id: Ia2fdd65f430c07acb1afdaf265d24c6928b654e0\u000aRelated: OS#5418\u000a",
        "date" : "2023-12-07 13:21:07 +0000",
        "id" : "5482737f31bdad8ab9688c35d6cda2cc17de6d96",
        "msg" : "pySim-shell: don't get trapped in applications without file system",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/euicc.py"
        ],
        "commitId" : "2b6deddcdc4eaafa70538e6fe17b49786d3cd21c",
        "timestamp" : 1701955303000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "euicc: the ICCID TLV object uses bcd-swapped-nibble encoding\u000a\u000aChange-Id: I050f9e0fb128f3e1d472e2330b136a753794a5a1\u000a",
        "date" : "2023-12-07 14:21:43 +0100",
        "id" : "2b6deddcdc4eaafa70538e6fe17b49786d3cd21c",
        "msg" : "euicc: the ICCID TLV object uses bcd-swapped-nibble encoding",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/euicc.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/euicc.py"
        ],
        "commitId" : "c20d442695dbdd8b46dfe9bbf87bd8c37cd813ae",
        "timestamp" : 1701985600000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "euicc: Fix encoding of Lc value in STORE DATA\u000a\u000aThe length value \"of course\" is a hex value, don't use %02u but %02x\u000a\u000aThis fixes any eUICC command with a Lc > 10 bytes.\u000a\u000aChange-Id: I1e1efbfb9916fc43699602cc889cf4b3d42736f2\u000a",
        "date" : "2023-12-07 22:46:40 +0100",
        "id" : "c20d442695dbdd8b46dfe9bbf87bd8c37cd813ae",
        "msg" : "euicc: Fix encoding of Lc value in STORE DATA",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/euicc.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/euicc.py"
        ],
        "commitId" : "b582c3c7ea1cb46deb074979e48b20d3e7100732",
        "timestamp" : 1701988151000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "euicc: Fix TLV IE definitions for SetNickname{Req,Resp}\u000a\u000aThe metaclass uese the 'nested' attribute, while the existing code\u000aaccidentially used the 'children' attribute.  The latter is used\u000aby instances for actual child classes, while the Class/nested\u000aattribute is for the list of classes whose instancse could be potential\u000achildren.\u000a\u000aChange-Id: I968bd84d074dcdcec37d99be5d3d4edac9c35a0c\u000a",
        "date" : "2023-12-07 23:29:11 +0100",
        "id" : "b582c3c7ea1cb46deb074979e48b20d3e7100732",
        "msg" : "euicc: Fix TLV IE definitions for SetNickname{Req,Resp}",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/euicc.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/runtime.py"
        ],
        "commitId" : "174fd32f17b7147724933cc3d8e33ebbb9541831",
        "timestamp" : 1702458150000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "runtime: explain how file probing works\u000a\u000aWe use a trick to probe a file (that does not exist in the local file\u000amodel yet). Let's explain further how that works, in particular why we\u000ado not have to upate any state if probing fails.\u000a\u000aChange-Id: I2a8af73654251d105af8de1c17da53dfa10dc669\u000aRelated: OS#5418\u000a",
        "date" : "2023-12-13 09:02:30 +0000",
        "id" : "174fd32f17b7147724933cc3d8e33ebbb9541831",
        "msg" : "runtime: explain how file probing works",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/runtime.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/filesystem.py"
        ],
        "commitId" : "14bf003dadef313635599dfb98edf8295d7f6237",
        "timestamp" : 1702467946000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "filesystem: use sort path when selecting an application\u000a\u000aThe method build_select_path_to uses the internal file system tree model\u000ato find the path to a given file. This works the same for applications\u000a(ADF) as it works for normal files (EF/DF). However, an application can\u000abe selected anytime from any location in the filesystem tree. There is\u000ano need to select a specific path leading to that application first.\u000aThis means that if there is an ADF somewhere in the resulting\u000ainter_path, we may clip everything before that ADF.\u000a\u000aRelated: OS#5418\u000aChange-Id: I838a99bb47afc73b4274baecb04fff31abf7b2e2\u000a",
        "date" : "2023-12-13 12:45:46 +0100",
        "id" : "14bf003dadef313635599dfb98edf8295d7f6237",
        "msg" : "filesystem: use sort path when selecting an application",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/filesystem.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/runtime.py"
        ],
        "commitId" : "82cc7cc11a9287444564940d86be7fea53c8089f",
        "timestamp" : 1702468056000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "runtime: refactor file selection methods select and select_file\u000a\u000aThe implementation of the methods select and select_file of class\u000aRuntimeLchan is a bit complex. We access the card directly in several\u000aplaces which makes it difficult to track the state changes. We should\u000aclean this up so that we call self.rs.card.select_adf_by_aid/\u000aself.scc.select_file from a single place only.\u000a\u000aThis means that the method select uses the method select_file. This\u000aresults in a much cleaner implementation. We also should take care\u000athat the important states that we track (selected_file, selected_adf,\u000aetc.) are updated by a single private method. Since the update always\u000amust happen after a select _select_post is a good place to do this.\u000a\u000aRelated: OS#5418\u000aChange-Id: I9ae213f3b078983f3e6d4c11db38fdbe504c84f2\u000a",
        "date" : "2023-12-13 12:47:36 +0100",
        "id" : "82cc7cc11a9287444564940d86be7fea53c8089f",
        "msg" : "runtime: refactor file selection methods select and select_file",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/runtime.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/filesystem.py"
        ],
        "commitId" : "a5707c7dfba189ff83c8b6a91d8d715aab7d2dc2",
        "timestamp" : 1702468056000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "filesystem: fix typo\u000a\u000aChange-Id: I721875d302ab69340d56b33102297b56c070465f\u000a",
        "date" : "2023-12-13 12:47:36 +0100",
        "id" : "a5707c7dfba189ff83c8b6a91d8d715aab7d2dc2",
        "msg" : "filesystem: fix typo",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/filesystem.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_31_102.py"
        ],
        "commitId" : "5277b5cf2ce4da529db92ccc63389208a773af46",
        "timestamp" : 1702809991000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "USIM: add support for EG.ePDGIdEm (Emergency ePDG)\u000a\u000aChange-Id: I71cb7a4b9323f57b96db2d9f12f1567eda63f742\u000a",
        "date" : "2023-12-17 10:46:31 +0000",
        "id" : "5277b5cf2ce4da529db92ccc63389208a773af46",
        "msg" : "USIM: add support for EG.ePDGIdEm (Emergency ePDG)",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_102.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_31_102.py"
        ],
        "commitId" : "cdfe1c24af8975cb29f354085533305053d4ec2c",
        "timestamp" : 1702809991000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "usim: Add EF.ePDGSelection + EF.ePDGSelectionEm support\u000a\u000aChange-Id: I760a394ae1eac5f1175dc9b86c11b4a60671582e\u000a",
        "date" : "2023-12-17 10:46:31 +0000",
        "id" : "cdfe1c24af8975cb29f354085533305053d4ec2c",
        "msg" : "usim: Add EF.ePDGSelection + EF.ePDGSelectionEm support",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_102.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_31_102.py"
        ],
        "commitId" : "478b5fe8e39dfb20874ad922ffbbedc4d4ed0f8c",
        "timestamp" : 1702809991000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "usim: ePDGId + ePDGSelection: Fix encoder/decoder + add test cases\u000a\u000aChange-Id: Idca19b6fdabae6cc708e92c7714fa0903ea5a1ee\u000a",
        "date" : "2023-12-17 10:46:31 +0000",
        "id" : "478b5fe8e39dfb20874ad922ffbbedc4d4ed0f8c",
        "msg" : "usim: ePDGId + ePDGSelection: Fix encoder/decoder + add test cases",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_102.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_31_102.py",
          "pySim/construct.py"
        ],
        "commitId" : "6e9ae8a5847dd725671898290ba5147aeebde906",
        "timestamp" : 1702809991000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "usim: Properly decode/encode IPv4 + IPv6 addresses\u000a\u000ause normal textual representation for IPv4 and IPv6 addresses\u000a\u000aChange-Id: I2c6c377f4502af37639e555826c85d5dcf602f9b\u000a",
        "date" : "2023-12-17 10:46:31 +0000",
        "id" : "6e9ae8a5847dd725671898290ba5147aeebde906",
        "msg" : "usim: Properly decode/encode IPv4 + IPv6 addresses",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_102.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/construct.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/utils.py"
        ],
        "commitId" : "b3c46135bb87893d504750ceadfb32df2b17cff2",
        "timestamp" : 1702809991000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "bertlv_parse_len: Fix input data is smaller than num length octets\u000a\u000aThis can happen if there's a file with invalid encoding on the card,\u000asuch as a tag followed by all-ff.  Let's gracefully ignore it and\u000areturn zero bytes as response.\u000a\u000aChange-Id: Ic44557368a6034dbf4bb021ab23a57927c22def0\u000a",
        "date" : "2023-12-17 10:46:31 +0000",
        "id" : "b3c46135bb87893d504750ceadfb32df2b17cff2",
        "msg" : "bertlv_parse_len: Fix input data is smaller than num length octets",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/utils.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_31_103.py",
          "pysim-testdata/pySim-trace_test_gsmtap.pcapng.ok"
        ],
        "commitId" : "301d6ed14a25b828a458654c9a1d8147cfd91a9c",
        "timestamp" : 1702809991000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "isim: Replace legacy imperative address TLV encoder/decoder with construct\u000a\u000aWe've recently introduced IPv{4,6}Adapter construct classes and can\u000aswitch to this instead of using the old imperative encoder/decoder\u000afunctions {enc,dec}_addr_tlv().\u000a\u000aAside from code cleanup, this also means we now support the IPv6 address\u000atype in EF.PCSCF.\u000a\u000aChange-Id: I4d01ccfe473a8a80fbee33fdcbd8a19b39da85ac\u000a",
        "date" : "2023-12-17 10:46:31 +0000",
        "id" : "301d6ed14a25b828a458654c9a1d8147cfd91a9c",
        "msg" : "isim: Replace legacy imperative address TLV encoder/decoder with",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_103.py"
          },
          {
            "editType" : "edit",
            "file" : "pysim-testdata/pySim-trace_test_gsmtap.pcapng.ok"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/legacy/cards.py",
          "pySim/legacy/utils.py",
          "pySim/utils.py"
        ],
        "commitId" : "c1085950415f40134b6bc6b4370ce497e7aa63bc",
        "timestamp" : 1702809991000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "move {enc,dec}_addr_tlv functions from pySim.util to pySim.legacy.util\u000a\u000aIn the previous commit we've stopped using those functions from modern\u000apySim-shell code.  Hence, the only remaining user is the legacy tools,\u000aso we can move the code to the legacy module.\u000a\u000aChange-Id: I6f18ccb36fc33bc204c01f9ece135676510e67ec\u000a",
        "date" : "2023-12-17 10:46:31 +0000",
        "id" : "c1085950415f40134b6bc6b4370ce497e7aa63bc",
        "msg" : "move {enc,dec}_addr_tlv functions from pySim.util to pySim.legacy.util",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/legacy/utils.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/utils.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/legacy/cards.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/transport/__init__.py",
          "pySim/transport/pcsc.py",
          "pySim/transport/calypso.py",
          "pySim/transport/modem_atcmd.py",
          "pySim/transport/serial.py",
          "contrib/sim-rest-server.py"
        ],
        "commitId" : "0f177c1d290202d808c94eb084f45ae6b383da26",
        "timestamp" : 1703158317000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "transport: Pass argparse.Namespace directly into transport classes\u000a\u000aIt's odd that the individual transport driver specifies their argparse\u000aoptions but then the core transport part evaluates them individually.\u000aThis means we cannot add new options within a transport.\u000a\u000aLet's pass the Namespace instance into the constructor of the\u000aspecific transport to improve this.\u000a\u000aChange-Id: Ib977007dd605ec9a9c09a3d143d2c2308991a12c\u000a",
        "date" : "2023-12-21 11:31:57 +0000",
        "id" : "0f177c1d290202d808c94eb084f45ae6b383da26",
        "msg" : "transport: Pass argparse.Namespace directly into transport classes",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/transport/pcsc.py"
          },
          {
            "editType" : "edit",
            "file" : "contrib/sim-rest-server.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/calypso.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/__init__.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/modem_atcmd.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/serial.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/transport/pcsc.py",
          "pySim/transport/__init__.py"
        ],
        "commitId" : "ad002797e2bffb8b6a39a839429ba0f8e62b9b79",
        "timestamp" : 1703158392000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "transport/pcsc: Allow opening PC/SC readers by a regex of their name\u000a\u000aOpening PC/SC readers by index/number is very error-prone as the order\u000ais never deterministic in any system with multiple (hot-plugged, USB)\u000areaders.  Instead, let's offer the alternative of specifying a regular\u000aexpression to match the reader name (similar to remsim-bankd).\u000a\u000aChange-Id: I983f19c6741904c1adf27749c9801b44a03a5d78\u000a",
        "date" : "2023-12-21 12:33:12 +0100",
        "id" : "ad002797e2bffb8b6a39a839429ba0f8e62b9b79",
        "msg" : "transport/pcsc: Allow opening PC/SC readers by a regex of their name",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/transport/__init__.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/pcsc.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/transport/__init__.py",
          "pySim/transport/pcsc.py",
          "pySim/transport/calypso.py",
          "pySim/transport/serial.py",
          "pySim/transport/modem_atcmd.py"
        ],
        "commitId" : "baec4e9c81d42a42799062ac7595bc74f0b2b5f5",
        "timestamp" : 1703158392000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "transport: Move printing of reader number/name to generic code\u000a\u000aLet's avoid copy+pasting print statements everywhere.  The instances\u000ado already have a __str__ method for the purpose of printing their name in a\u000ageneric way.\u000a\u000aChange-Id: I663a9ea69bf7e7aaa6502896b6a71ef692f8d844\u000a",
        "date" : "2023-12-21 12:33:12 +0100",
        "id" : "baec4e9c81d42a42799062ac7595bc74f0b2b5f5",
        "msg" : "transport: Move printing of reader number/name to generic code",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/transport/calypso.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/__init__.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/pcsc.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/serial.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/modem_atcmd.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/transport/pcsc.py",
          "pySim/transport/calypso.py",
          "pySim/transport/modem_atcmd.py",
          "pySim/transport/serial.py"
        ],
        "commitId" : "0ecbf63a02ce625f8ad4254d3f26ad4c2994ed69",
        "timestamp" : 1703158392000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "transport: Extend the documentation for each transport driver\u000a\u000aThis driver description we add to the code is automatically added to the\u000arespective user manual sections.\u000a\u000aChange-Id: I8807bfb11f43b167f1321d556e09ec5234fff629\u000a",
        "date" : "2023-12-21 12:33:12 +0100",
        "id" : "0ecbf63a02ce625f8ad4254d3f26ad4c2994ed69",
        "msg" : "transport: Extend the documentation for each transport driver",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/transport/modem_atcmd.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/calypso.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/pcsc.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/serial.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tests/test_files.py"
        ],
        "commitId" : "2822dca9ec68ea14fac98e1a47a17735dde56ea4",
        "timestamp" : 1703232790000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "tests: use case-insensitive compare of hex strings\u000a\u000aChange-Id: I080f6e173fec40c27dd3ebbf252eaddf5a0e15ba\u000a",
        "date" : "2023-12-22 09:13:10 +0100",
        "id" : "2822dca9ec68ea14fac98e1a47a17735dde56ea4",
        "msg" : "tests: use case-insensitive compare of hex strings",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "tests/test_files.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tests/test_files.py"
        ],
        "commitId" : "e45168ef29a3226ab16497c4c07da4575ab1601a",
        "timestamp" : 1703232790000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "test/test_files: set maxDiff attribute\u000a\u000aWithout this the diff between expected and actual output is truncated\u000aand one instead reads the following output:\u000a\u000a\u0009Diff is 844 characters long. Set self.maxDiff to None to see it.\u000a\u000aWe actually want to see the full diff to see what's not matching.\u000a\u000aChange-Id: I6e89705061454191b6db1255de7fe549ad720800\u000a",
        "date" : "2023-12-22 09:13:10 +0100",
        "id" : "e45168ef29a3226ab16497c4c07da4575ab1601a",
        "msg" : "test/test_files: set maxDiff attribute",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "tests/test_files.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pysim-testdata/Fairwaves-SIM.ok",
          "pysim-testdata/sysmoISIM-SJA2.ok",
          "pysim-testdata/Wavemobile-SIM.ok",
          "tests/test_utils.py",
          "pySim/utils.py",
          "pysim-testdata/pySim-trace_test_gsmtap.pcapng.ok",
          "pysim-testdata/sysmoUSIM-SJS1.ok",
          "pySim/ts_51_011.py"
        ],
        "commitId" : "542dbf67716f5486dba612ab94da07b6a812599f",
        "timestamp" : 1703316042000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "fix encode/decode of xPLMNwAcT\u000a\u000aThere are some pretty intricate rules about how GSM and E-UTRAN are\u000aencoded, let's make sure we fully  support both as per 3GPP TS 31.102\u000aRelease 17.  As part of this, switch to a sorted list of access technologies,\u000ain order to have a defined order.  This makes comparing in unit tests\u000amuch easier.  However, it also means that we need to sort the set\u000awhen printing the list of AcT in pySim-read to generate deterministic\u000aoutput.\u000a\u000aChange-Id: I398ac2a2527bd11e9c652e49fa46d6ca8d334b88\u000a",
        "date" : "2023-12-23 08:20:42 +0100",
        "id" : "542dbf67716f5486dba612ab94da07b6a812599f",
        "msg" : "fix encode/decode of xPLMNwAcT",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/utils.py"
          },
          {
            "editType" : "edit",
            "file" : "pysim-testdata/Fairwaves-SIM.ok"
          },
          {
            "editType" : "edit",
            "file" : "pysim-testdata/sysmoISIM-SJA2.ok"
          },
          {
            "editType" : "edit",
            "file" : "pysim-testdata/Wavemobile-SIM.ok"
          },
          {
            "editType" : "edit",
            "file" : "pysim-testdata/sysmoUSIM-SJS1.ok"
          },
          {
            "editType" : "edit",
            "file" : "pysim-testdata/pySim-trace_test_gsmtap.pcapng.ok"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_51_011.py"
          },
          {
            "editType" : "edit",
            "file" : "tests/test_utils.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_51_011.py",
          "pySim/ts_31_102.py"
        ],
        "commitId" : "537625199379d10c63c5b8d8b42599f5d4c76db8",
        "timestamp" : 1703316042000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "31.102 + 51.011: Fix encode/decode of EF.CFIS\u000a\u000aThe EF.CFIS definition is not identical to EF.ADN, so we cannot recycle\u000athe EF.ADN class to decode EF.CFIS.\u000a\u000aChange-Id: Idcab35cbe28332e3c8612bcb90226335b48ea973\u000a",
        "date" : "2023-12-23 08:20:42 +0100",
        "id" : "537625199379d10c63c5b8d8b42599f5d4c76db8",
        "msg" : "31.102 + 51.011: Fix encode/decode of EF.CFIS",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_102.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_51_011.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_31_103.py",
          "pySim/ts_31_102.py",
          "pySim/ts_51_011.py",
          "pySim/ts_102_221.py"
        ],
        "commitId" : "324175f8bd1b76a475f51a785d94c1b43aa60800",
        "timestamp" : 1703316042000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "additional encode/decode test data for various files\u000a\u000aChange-Id: Ib563a2204922d2013b5f7c5abde0773051e17938\u000a",
        "date" : "2023-12-23 08:20:42 +0100",
        "id" : "324175f8bd1b76a475f51a785d94c1b43aa60800",
        "msg" : "additional encode/decode test data for various files",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_51_011.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_102_221.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_103.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_102.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "docs/shell.rst"
        ],
        "commitId" : "188869568a73660dcfa4a22d05471125f79578f4",
        "timestamp" : 1703322899000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "docs/shell: extend the introduction part; link to video presentation\u000a\u000aChange-Id: I77c30921f2b8c002c9dda244656c348c96b41f06\u000a",
        "date" : "2023-12-23 09:14:59 +0000",
        "id" : "188869568a73660dcfa4a22d05471125f79578f4",
        "msg" : "docs/shell: extend the introduction part; link to video presentation",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "docs/shell.rst"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/construct.py",
          "pySim/tlv.py"
        ],
        "commitId" : "caef0df6638277e1b8ff01b314146944e2b5a61e",
        "timestamp" : 1703322947000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "construct/tlv: Pass optional 'context' into construct decoder/encoder\u000a\u000aThe context is some opaque dictionary that can be used by the\u000aconstructs; let's allow the caller of parse_construct,  from_bytes,\u000afrom_tlv to specify it.\u000a\u000aAlso, when decoding a TLV_IE_Collection, pass the decode results of\u000aexisting siblings via the construct.\u000a\u000aChange-Id: I021016aaa09cddf9d36521c1a54b468ec49ff54d\u000a",
        "date" : "2023-12-23 09:15:47 +0000",
        "id" : "caef0df6638277e1b8ff01b314146944e2b5a61e",
        "msg" : "construct/tlv: Pass optional 'context' into construct decoder/encoder",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/construct.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/tlv.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tests/pySim-trace_test.sh"
        ],
        "commitId" : "a4b9bdf23851cc9213b556113fc1727c869467bf",
        "timestamp" : 1703324301000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-trace_test.sh: Force termcolor to suppress color generation\u000a\u000aon some systems, the output would otherwise contain colored status\u000awords, which in turn mean the test otuput no longer matches the expected\u000aoutput.\u000a\u000aChange-Id: Icb700f6e85a285748e00367a398975aa5e75dec5\u000a",
        "date" : "2023-12-23 10:38:21 +0100",
        "id" : "a4b9bdf23851cc9213b556113fc1727c869467bf",
        "msg" : "pySim-trace_test.sh: Force termcolor to suppress color generation",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "tests/pySim-trace_test.sh"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/sysmocom_sja2.py",
          "pySim/filesystem.py"
        ],
        "commitId" : "a5eb924f9efdfe2bd74f406a7172fd526877a394",
        "timestamp" : 1703350141000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "filesystem: use pySim.utils.build_construct()\u000a\u000aWe recently introduced a pySim.utils.build_construct() wrapper around\u000athe raw call of the construct.build() method.  So far, this wrapper\u000awas only used from pySim.tlv, but let's also use it from\u000apySim.filesystem.\u000a\u000aBasically, whenever we use parse_construct(), we should use\u000abuild_construct() as the inverse operation.\u000a\u000aChange-Id: Ibfd61cd87edc72882aa66d6ff17861a3e918affb\u000a",
        "date" : "2023-12-23 17:49:01 +0100",
        "id" : "a5eb924f9efdfe2bd74f406a7172fd526877a394",
        "msg" : "filesystem: use pySim.utils.build_construct()",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/sysmocom_sja2.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/filesystem.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/tlv.py"
        ],
        "commitId" : "a9b21bdb1f24e3eabcee82950e4a3efdb90b2fa9",
        "timestamp" : 1703690088000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "tlv: Fix from_dict() symmetry\u000a\u000athe to_dict() method generates a {class_name: value} dictionary,\u000afor both the nested and non-nested case.  However, before this patch,\u000athe from_dict() method expects a plain list of child IE dicts\u000ain the nested case.  This is illogical.\u000a\u000aLet's make sure from_dict always expectes a {class_name: value} dict\u000afor both nested and non-nested situations.\u000a\u000aChange-Id: I07e4feb3800b420d8be7aae8911f828f1da9dab8\u000a",
        "date" : "2023-12-27 15:14:48 +0000",
        "id" : "a9b21bdb1f24e3eabcee82950e4a3efdb90b2fa9",
        "msg" : "tlv: Fix from_dict() symmetry",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/tlv.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tests/test_tlvs.py"
        ],
        "commitId" : "2a36c1b9213aa01159557d119e46be88466a2964",
        "timestamp" : 1703690117000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "data-driven TLV unit data test support\u000a\u000aWhile we do have the _test_de_encode data driven tests for file\u000adefinitions, we don't yet have something similar for derived classes of\u000aBER_TLV_IE. This means that TLVs used outside of the filesystem context\u000a(for example, decoding the SELECT/STATUS response, but also eUICC and\u000aother stuff) do not yet have test coverage.\u000a\u000aThis commit just adds the related test code, but no test data yet.\u000a\u000aRelated: OS#6317\u000aChange-Id: Ied85f292bb57fde11dc188be84e3384dc3ff1601\u000a",
        "date" : "2023-12-27 15:15:17 +0000",
        "id" : "2a36c1b9213aa01159557d119e46be88466a2964",
        "msg" : "data-driven TLV unit data test support",
        "paths" : [
          {
            "editType" : "add",
            "file" : "tests/test_tlvs.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_102_221.py"
        ],
        "commitId" : "ee6a95177496dfae9c890136745d00b809803a62",
        "timestamp" : 1703690124000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "Add TLV decoder test data\u000a\u000aThis adds some first test data for the new unitdata driven test cases\u000afor the TLV encoder/decoder.\u000a\u000aIt also fixes a bug in the ts_102_221.FileDescriptor decoder for BER-TLV\u000astructured files which was found and fixed while introducing the test\u000adata.\u000a\u000aRelated: OS#6317\u000aChange-Id: Ief156b7e466a772c78fb632b2fa00cba2eb1eba5\u000a",
        "date" : "2023-12-27 15:15:24 +0000",
        "id" : "ee6a95177496dfae9c890136745d00b809803a62",
        "msg" : "Add TLV decoder test data",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_102_221.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/global_platform.py"
        ],
        "commitId" : "2538dd7621d4aac9956735b3187487520c4f7827",
        "timestamp" : 1703690154000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "global_platform: Correctly decode Key Information Data\u000a\u000aThe list contains tuples of (key_type, key_length). Let's fix that.\u000a\u000aChange-Id: Icf367827d62ed67afa27ee3d0ba9d5cd5bc65c99\u000a",
        "date" : "2023-12-27 15:15:54 +0000",
        "id" : "2538dd7621d4aac9956735b3187487520c4f7827",
        "msg" : "global_platform: Correctly decode Key Information Data",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/global_platform.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/global_platform.py",
          "tests/test_tlvs.py"
        ],
        "commitId" : "45626271cf4a28dbb0010aa35a28fa671c0c9f9c",
        "timestamp" : 1703690158000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "global_platform: Add TLV test data for Key Information Data\u000a\u000aChange-Id: Ib7b73cb28abea98986a66264a0779263873d7fb2\u000a",
        "date" : "2023-12-27 15:15:58 +0000",
        "id" : "45626271cf4a28dbb0010aa35a28fa671c0c9f9c",
        "msg" : "global_platform: Add TLV test data for Key Information Data",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/global_platform.py"
          },
          {
            "editType" : "edit",
            "file" : "tests/test_tlvs.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/global_platform.py"
        ],
        "commitId" : "722c11a7e9d509700d781140392110b36887269e",
        "timestamp" : 1703690163000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "global_platform: Add support for key types of v2.3.1 (including AES)\u000a\u000aChange-Id: Iae30f18435c2b0a349bfd9240b9c7cca06674534\u000a",
        "date" : "2023-12-27 15:16:03 +0000",
        "id" : "722c11a7e9d509700d781140392110b36887269e",
        "msg" : "global_platform: Add support for key types of v2.3.1 (including AES)",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/global_platform.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/app.py",
          "pySim/global_platform.py"
        ],
        "commitId" : "dffe7af5789d9a59d6e12c43a449eaf2955f8443",
        "timestamp" : 1703711858000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "Fix enumeration of GlobbalPlatformISDR during card_init()\u000a\u000aWe used __subclasses__(), but this only returns the immediate\u000asubclasses and not all further/nested subclasses.  Instead, we must\u000ause the pySim.utils.all_subclasses() function to really get all of them.\u000a\u000aThe hack to use the method signature of the constructor to determine if\u000ait's an intermediate class didn't work, as even GlobbalPlatformISDR\u000ahas a optional argument for non-default AIDs.  So let's introduce an\u000aexplicit class attribute for that purpose.\u000a\u000aChange-Id: I7fb1637f8f7a149b536c4d77dac92736c526aa6c\u000a",
        "date" : "2023-12-27 22:17:38 +0100",
        "id" : "dffe7af5789d9a59d6e12c43a449eaf2955f8443",
        "msg" : "Fix enumeration of GlobbalPlatformISDR during card_init()",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/app.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/global_platform.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/cat.py",
          "pySim/gsm_r.py",
          "pySim/ts_31_102.py",
          "pySim/construct.py",
          "pySim/ts_51_011.py",
          "pysim-testdata/pySim-trace_test_gsmtap.pcapng.ok"
        ],
        "commitId" : "842fbdb15d50588bc427e9ed75ad720e578efb38",
        "timestamp" : 1703747334000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "add PlmnAdapter for decoding PLMN bcd-strings like 262f01 to 262-01\u000a\u000aThe human representation of a PLMN is usually MCC-MNC like 262-01\u000aor 262-001.  Let's add a PlmnAdapter for use within construct, so we\u000acan properly decode that.\u000a\u000aChange-Id: I96f276e6dcdb54a5a3d2bcde5ee6dbaf981ed789\u000a",
        "date" : "2023-12-28 08:08:54 +0100",
        "id" : "842fbdb15d50588bc427e9ed75ad720e578efb38",
        "msg" : "add PlmnAdapter for decoding PLMN bcd-strings like 262f01 to 262-01",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/construct.py"
          },
          {
            "editType" : "edit",
            "file" : "pysim-testdata/pySim-trace_test_gsmtap.pcapng.ok"
          },
          {
            "editType" : "edit",
            "file" : "pySim/gsm_r.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_51_011.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_102.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/cat.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tests/test_construct.py",
          "pySim/construct.py"
        ],
        "commitId" : "f6fceb8684c6aaccdf2d0661663866a52bb0cc66",
        "timestamp" : 1703872281000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "Implement convoluted encoding of UCS-2 as per TS 102 221 Annex A\u000a\u000aTS 102 221 Annex A defines three variants of encoding UCS-2 characters\u000ainto byte streams in files on UICC cards: One rather simplistic one, and\u000atwo variants for optimizing memory utilization on the card.\u000a\u000aLet's impelement a construct \"Ucs2Adapter\" class for this.\u000a\u000aChange-Id: Ic8bc8f71079faec1bf0e538dc0dfa21403869c6d\u000a",
        "date" : "2023-12-29 18:51:21 +0100",
        "id" : "f6fceb8684c6aaccdf2d0661663866a52bb0cc66",
        "msg" : "Implement convoluted encoding of UCS-2 as per TS 102 221 Annex A",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "tests/test_construct.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/construct.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_51_011.py",
          "pySim/ts_31_102.py",
          "pySim/construct.py"
        ],
        "commitId" : "6e6caa8b4ad42980e312910d39800b6b618091ea",
        "timestamp" : 1703872285000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "support UCS-2 characters in EF.MMSUP, EF.ADN, EF.SPN, EF.PNN, EF.ECC\u000a\u000aNow that we have support for the UCS-2 encoding as per TS 102 221 Annex A,\u000awe can start to make use of it from various file constructs.\u000a\u000aAs some specs say \"Either 7-bit GSM or UCS-2\" we also introduce\u000aa related automatic GsmOrUcs2Adapter and GsmOrUcs2String class.\u000a\u000aChange-Id: I4eb8aea0a13260a143e2c60fca73c3c4312fd3b2\u000a",
        "date" : "2023-12-29 18:51:25 +0100",
        "id" : "6e6caa8b4ad42980e312910d39800b6b618091ea",
        "msg" : "support UCS-2 characters in EF.MMSUP, EF.ADN, EF.SPN, EF.PNN, EF.ECC",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_51_011.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_102.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/construct.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_31_102.py"
        ],
        "commitId" : "a77f7e1eb958a638ccc0f5cf3f1adf74656d5987",
        "timestamp" : 1703872285000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "ts_31_102: Implement decoders/encoders for EFs below DF.HNB\u000a\u000aThese files are mostly related to CSG (Closed Subscriber Group)\u000ain the context of HomeNodeB (HNB), aka femtocells.\u000a\u000aChange-Id: Ie57963381e928e2c1da408ad46549a780056242a\u000a",
        "date" : "2023-12-29 18:51:25 +0100",
        "id" : "a77f7e1eb958a638ccc0f5cf3f1adf74656d5987",
        "msg" : "ts_31_102: Implement decoders/encoders for EFs below DF.HNB",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_102.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/tlv.py"
        ],
        "commitId" : "69bdcf50228a947a39cbf0c9b25ec1f21eaaf276",
        "timestamp" : 1703872285000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "Fix TLV_IE_Collection.from_tlv in certain situations\u000a\u000aThe existing code used to produce an empty output in situations where a\u000aTLV_IE_Collection would be parsed from a single TLV only with some\u000aadditional trailing padding:\u000a\u000a>>> from pySim.utils import h2b\u000a>>> from pySim.ts_31_102 import EF_CSGT\u000a>>> t = EF_CSGT.Csgt_TLV_Collection()\u000a>>> t.from_tlv(h2b('8906810300666f6fff'))\u000a[TextCsgType(foo)]\u000a>>> t.to_dict()\u000a[]\u000a\u000aThis was caused by an early return (actually returning the decoded\u000aresult) but *without updating self.children*.\u000a\u000aChange-Id: I1c84ccf698c6ff7e7f14242f9aaf7d15ac2239f4\u000a",
        "date" : "2023-12-29 18:51:25 +0100",
        "id" : "69bdcf50228a947a39cbf0c9b25ec1f21eaaf276",
        "msg" : "Fix TLV_IE_Collection.from_tlv in certain situations",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/tlv.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tests/test_files.py"
        ],
        "commitId" : "bcd261583cc8e292aab33e7607188b6b55109fbd",
        "timestamp" : 1703872285000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "tests_files.py: Reduce code duplication\u000a\u000aChange-Id: Ib84a0ae35262a19fce3e688afe8e1678a4c59eba\u000a",
        "date" : "2023-12-29 18:51:25 +0100",
        "id" : "bcd261583cc8e292aab33e7607188b6b55109fbd",
        "msg" : "tests_files.py: Reduce code duplication",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "tests/test_files.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/cdma_ruim.py",
          "tests/test_files.py",
          "pySim/ts_31_102.py",
          "pySim/ts_102_221.py",
          "pySim/ts_51_011.py"
        ],
        "commitId" : "ce01f48b0084e067abd7718e207a6f2b85a5471e",
        "timestamp" : 1703872285000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "test_files: Test decoder also with ff-padded input\u000a\u000aIt's customary in the SIM card universe to right-pad data with ff bytes.\u000aSo far we only test decoders without such padding, which is unrealistic.\u000aLet's also tests the decoders with extra 'ff' padding present.\u000a\u000aFor some files this doesn't make sense, so we add a _test_no_pad class\u000aattribute that can be spcified to prevent this new \"test with ff-padding\"\u000afrom being executed for the test data of the class.\u000a\u000aChange-Id: I7f5cbb4a6f91040fe9adef9da0a1f30f9f156dae\u000a",
        "date" : "2023-12-29 18:51:25 +0100",
        "id" : "ce01f48b0084e067abd7718e207a6f2b85a5471e",
        "msg" : "test_files: Test decoder also with ff-padded input",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/cdma_ruim.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_102.py"
          },
          {
            "editType" : "edit",
            "file" : "tests/test_files.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_102_221.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_51_011.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/sysmocom_sja2.py"
        ],
        "commitId" : "db1684df044c9d7ac2ae3802df8e6d7109000b27",
        "timestamp" : 1703872285000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "sysmocom_sja2: Implement EF_CHV files using construct\u000a\u000athis has the advantage of getting the encoder for free (so far we only\u000ahad the decoder).  While at it, also add some tests data for the unit\u000atests.\u000a\u000aChange-Id: Ifb8caf5cd96706d7fb6b452d6552b115c0828797\u000a",
        "date" : "2023-12-29 18:51:25 +0100",
        "id" : "db1684df044c9d7ac2ae3802df8e6d7109000b27",
        "msg" : "sysmocom_sja2: Implement EF_CHV files using construct",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/sysmocom_sja2.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/commands.py"
        ],
        "commitId" : "1c0a2491317d8ea82d3d1f3e0314befe46513282",
        "timestamp" : 1703872285000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "commands: Ignore exceptions during READ while UPDATE\u000a\u000aIf we are reading a file to check if we can skip the write to conserve\u000awrites, don't treat exceptions as fatal.  The file may well have the\u000aaccess mode in a way that permits us to UPDATE but not to READ.  Simply\u000afall-back to unconditional UPDATE in this case.\u000a\u000aChange-Id: I7bffdaa7596e63c8f0ab04a3cb3ebe12f137d3a8\u000a",
        "date" : "2023-12-29 18:51:25 +0100",
        "id" : "1c0a2491317d8ea82d3d1f3e0314befe46513282",
        "msg" : "commands: Ignore exceptions during READ while UPDATE",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/commands.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/global_platform.py"
        ],
        "commitId" : "9d607978fa290e0d80863d70f9fa462366631496",
        "timestamp" : 1703872285000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "global_platform: Add support for more GET DATA TLVs\u000a\u000aExample:\u000a\u000apySIM-shell (00:MF/ADF.ISD)> get_data extended_card_resources_info\u000a{\u000a    \"extended_card_resources_info\": [\u000a        {\u000a            \"number_of_installed_app\": 8\u000a        },\u000a        {\u000a            \"free_non_volatile_memory\": 354504\u000a        },\u000a        {\u000a            \"free_volatile_memory\": 10760\u000a        }\u000a    ]\u000a}\u000a\u000aChange-Id: I129e43c377b62dae1b9a88a0a2dc9663ac2a97da\u000a",
        "date" : "2023-12-29 18:51:25 +0100",
        "id" : "9d607978fa290e0d80863d70f9fa462366631496",
        "msg" : "global_platform: Add support for more GET DATA TLVs",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/global_platform.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_31_102.py"
        ],
        "commitId" : "19d2b93d7e4ab4ee9f4a2b6c8b55c25e3f73fba0",
        "timestamp" : 1703872285000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "move SUCI sub-classes to EF_SUCI_CalcInfo\u000a\u000aChange-Id: Iea6b176327881ff9414f4fe624e94811f9782927\u000a",
        "date" : "2023-12-29 18:51:25 +0100",
        "id" : "19d2b93d7e4ab4ee9f4a2b6c8b55c25e3f73fba0",
        "msg" : "move SUCI sub-classes to EF_SUCI_CalcInfo",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_102.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/tlv.py",
          "pySim/filesystem.py"
        ],
        "commitId" : "9a48aea263af1f9777b418c3fda154c29253f5e8",
        "timestamp" : 1704226410000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "fileystem/tlv: remove unused imports\u000a\u000aChange-Id: I519c7792c7fbe18be63ddc77d211f0d034afcd1f\u000a",
        "date" : "2024-01-02 21:13:30 +0100",
        "id" : "9a48aea263af1f9777b418c3fda154c29253f5e8",
        "msg" : "fileystem/tlv: remove unused imports",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/tlv.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/filesystem.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tests/test_utils.py",
          "pySim/ts_31_102.py"
        ],
        "commitId" : "e13403b2065f53c648929861132b7b77fef6e6e7",
        "timestamp" : 1704395586000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "ts_31_102: Start to use construct for EF.SUCI_Calc_Info\u000a\u000aWe cannot fully switch to construct for all of it easily due to\u000athe priority value and the ordering/sorting by priority implemented\u000ain the hand-coded version.  But we can at least migrate the\u000aencode/decode of the hnet_pubkey_list via construct.\u000a\u000aChange-Id: I4ad5ea57bab37c2dc218e7752d538aa4cdc36ee3\u000a",
        "date" : "2024-01-04 20:13:06 +0100",
        "id" : "e13403b2065f53c648929861132b7b77fef6e6e7",
        "msg" : "ts_31_102: Start to use construct for EF.SUCI_Calc_Info",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_102.py"
          },
          {
            "editType" : "edit",
            "file" : "tests/test_utils.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/construct.py"
        ],
        "commitId" : "b0c9ccba66ebe861a7ff8b18e2f778a0d365670b",
        "timestamp" : 1704399619000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "construct: avoid StreamError exceptions due to files containing all-ff\u000a\u000aIn smart cards, files/records containing all-ff means they are simply\u000anot used/initialized.  Let's avoid raising exceptions when interpreting\u000a0xff as length value and reading less bytes as value.\u000a\u000aChange-Id: I09c3cb82063fc094eb047749996a6eceff757ea2\u000a",
        "date" : "2024-01-04 21:20:19 +0100",
        "id" : "b0c9ccba66ebe861a7ff8b18e2f778a0d365670b",
        "msg" : "construct: avoid StreamError exceptions due to files containing all-ff",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/construct.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_31_103.py",
          "pysim-testdata/pySim-trace_test_gsmtap.pcapng.ok"
        ],
        "commitId" : "4fe7de85682de0a1277325df8372e0c8a8f07dcc",
        "timestamp" : 1704400059000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "ts_31_103: Add construct for EF.GBABP and EF.GBANL\u000a\u000aChange-Id: Ife06f54c2443f3e048bd36f706f309843703403a\u000a",
        "date" : "2024-01-04 21:27:39 +0100",
        "id" : "4fe7de85682de0a1277325df8372e0c8a8f07dcc",
        "msg" : "ts_31_103: Add construct for EF.GBABP and EF.GBANL",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_103.py"
          },
          {
            "editType" : "edit",
            "file" : "pysim-testdata/pySim-trace_test_gsmtap.pcapng.ok"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_31_103.py"
        ],
        "commitId" : "62e570b6209bc809e754fe309dac6920aec20630",
        "timestamp" : 1704400059000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "ts_31_103: Add TLV + construct for EF_NAFKCA\u000a\u000aChange-Id: I124064994eb695790e9a3aff40be8139b3a2f2cf\u000a",
        "date" : "2024-01-04 21:27:39 +0100",
        "id" : "62e570b6209bc809e754fe309dac6920aec20630",
        "msg" : "ts_31_103: Add TLV + construct for EF_NAFKCA",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_103.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_102_310.py"
        ],
        "commitId" : "5b623a124701cd170ea6c25f7769261a346914c2",
        "timestamp" : 1704401438000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "ts_102_310: Add file definitions resembling ETSI TS 102 310 (EAP)\u000a\u000aThe definitions are not used yet, as one would have to add that\u000adynamically based on which EF.DIR entries contain the 0x73 discretionary\u000atemplate.  As I don't have any cards implementing this so far, I'll skip\u000athat part.\u000a\u000aChange-Id: I532ff2c94021ab1b4520fe2b6988c8960319d208\u000a",
        "date" : "2024-01-04 21:50:38 +0100",
        "id" : "5b623a124701cd170ea6c25f7769261a346914c2",
        "msg" : "ts_102_310: Add file definitions resembling ETSI TS 102 310 (EAP)",
        "paths" : [
          {
            "editType" : "add",
            "file" : "pySim/ts_102_310.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/__init__.py",
          "tests/test_esim_bsp.py",
          "requirements.txt",
          "pySim/esim/bsp.py"
        ],
        "commitId" : "242197b53dbbe81a8838244af62739f841fd0766",
        "timestamp" : 1704619324000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "Add pySim.esim.bsp module implementing BSP (BPP Protection Protocol)\u000a\u000aThis is the protocol used for the ES8+ interface between SM-DP+ and the\u000aeUICC in the GSMA eSIM system.\u000a\u000aChange-Id: Ic461936f2e68e1e6f7faab33d06acf3063e261e7\u000a",
        "date" : "2024-01-07 10:22:04 +0100",
        "id" : "242197b53dbbe81a8838244af62739f841fd0766",
        "msg" : "Add pySim.esim.bsp module implementing BSP (BPP Protection Protocol)",
        "paths" : [
          {
            "editType" : "add",
            "file" : "tests/test_esim_bsp.py"
          },
          {
            "editType" : "add",
            "file" : "pySim/esim/__init__.py"
          },
          {
            "editType" : "edit",
            "file" : "requirements.txt"
          },
          {
            "editType" : "add",
            "file" : "pySim/esim/bsp.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "contrib/unber.py"
        ],
        "commitId" : "d657708df25fb8d29f7091f35bb5809668ff3b91",
        "timestamp" : 1704712729000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "add contrib/unber.py utility\u000a\u000aThis tool is a replacement for asn1c 'unber' program with a much more\u000auseful/readable output:\u000a* contains hexadecimal raw tag values\u000a* contains hexdump of value, rather than HTML entities in pseudo-XML\u000a\u000aChange-Id: I22c1a461ccba04c2c8caaab7ca29ea6ae76e2ea3\u000a",
        "date" : "2024-01-08 11:18:49 +0000",
        "id" : "d657708df25fb8d29f7091f35bb5809668ff3b91",
        "msg" : "add contrib/unber.py utility",
        "paths" : [
          {
            "editType" : "add",
            "file" : "contrib/unber.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/apdu/ts_102_221.py",
          "pySim/apdu_source/pyshark_rspro.py",
          "pySim-trace.py"
        ],
        "commitId" : "cfa62cb95b2d0894db40d184ebc4ffeb8c453444",
        "timestamp" : 1704715811000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "Allow logger to do lazy evaluation of format strings\u000a\u000aChange-Id: I39d26cdd5b85a61a06fd8c7a9d0a046e398819bd\u000a",
        "date" : "2024-01-08 12:10:11 +0000",
        "id" : "cfa62cb95b2d0894db40d184ebc4ffeb8c453444",
        "msg" : "Allow logger to do lazy evaluation of format strings",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/apdu/ts_102_221.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/apdu_source/pyshark_rspro.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim-trace.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/euicc.py"
        ],
        "commitId" : "0002789a88c42d223b715cd8b091cfea54d6b5d8",
        "timestamp" : 1704715817000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "euicc: Fix delete_profile command\u000a\u000aContrary to {enable,disable}_profile, the delete_profile does not use\u000athe ProfileIdentifier TLV, but directly the Iccid / IsdpAid.\u000a\u000aChange-Id: I43e298524048703264e16cbdd0b76d82ba976985\u000a",
        "date" : "2024-01-08 12:10:17 +0000",
        "id" : "0002789a88c42d223b715cd8b091cfea54d6b5d8",
        "msg" : "euicc: Fix delete_profile command",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/euicc.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/euicc.py"
        ],
        "commitId" : "c499dc79a84a3bc31bb65f44684363f2b910d09f",
        "timestamp" : 1704715822000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "euicc: Fix eUICC list_notifications command\u000a\u000aPrior to this patch, the command would always raise exceptions.\u000a\u000aChange-Id: I75a7840c3f4b68bfc164a43908b100dd6e41e575\u000a",
        "date" : "2024-01-08 12:10:22 +0000",
        "id" : "c499dc79a84a3bc31bb65f44684363f2b910d09f",
        "msg" : "euicc: Fix eUICC list_notifications command",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/euicc.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "docs/shell.rst"
        ],
        "commitId" : "e76fae9c4c339408f85be5b59ece941664e75ad8",
        "timestamp" : 1704747392000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-shell: Update manual with examples for using with eUICC ISD-R\u000a\u000aChange-Id: I4a0acdad5c7478ee76f92c7610c0e2a5331dea46\u000a",
        "date" : "2024-01-08 20:56:32 +0000",
        "id" : "e76fae9c4c339408f85be5b59ece941664e75ad8",
        "msg" : "pySim-shell: Update manual with examples for using with eUICC ISD-R",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "docs/shell.rst"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "smdpp-data/certs/DPtls/CERT_S_SM_DP2_TLS.csr.cnf",
          "docs/osmo-smdpp.rst",
          "smdpp-data/certs/DPpb/CERT_S_SM_DPpb_ECDSA_BRP.der",
          "smdpp-data/certs/DPtls/CERT_S_SM_DP_TLS_NIST.der",
          "smdpp-data/certs/DPtls/CERT_S_SM_DP4_TLS.csr.cnf",
          "smdpp-data/certs/DPpb/SK_S_SM_DP2pb_ECDSA_BRP.pem",
          "smdpp-data/certs/CertificateIssuer/CERT_CI_ECDSA_BRP.der",
          "smdpp-data/certs/DPtls/Old_TLS_Validity/Expired 2022/CERT_S_SM_DP_TLS_BRP.der",
          "smdpp-data/certs/DPpb/SK_S_SM_DPpb_ECDSA_BRP.pem",
          "smdpp-data/certs/DPauth/SK_S_SM_DP2auth_ECDSA_NIST.pem",
          "smdpp-data/upp/TS48 V2 eSIM_GTP_SAIP2.1_NoBERTLV.rename2der",
          "osmo-smdpp.py",
          "smdpp-data/certs/DPtls/CERT_S_SM_DP8_TLS.der",
          "smdpp-data/certs/DPtls/SK_S_SM_DP_TLS_NIST.pem",
          "pySim/esim/es8p.py",
          "smdpp-data/certs/DPtls/CERT_S_SM_DP8_TLS.csr.cnf",
          "pySim/esim/rsp.py",
          "pySim/esim/__init__.py",
          "tests/test_esim_bsp.py",
          "smdpp-data/certs/DPtls/PK_S_SM_DP8_TLS.pem",
          "smdpp-data/certs/DPpb/PK_S_SM_DP2pb_ECDSA_NIST.pem",
          "smdpp-data/certs/DPtls/PK_S_SM_DP4_TLS.pem",
          "smdpp-data/certs/CertificateIssuer/CI-csr.cnf",
          "tests/test_esim.py",
          "smdpp-data/certs/DPauth/CERT_S_SM_DP2auth_ECDSA_BRP.der",
          "smdpp-data/certs/DPpb/PK_S_SM_DPpb_ECDSA_NIST.pem",
          "smdpp-data/certs/DPtls/Old_TLS_Validity/Expired 2021/CERT_S_SM_DP8_TLS.der",
          "pySim/esim/asn1/rsp/PKIX1Explicit88.asn",
          "smdpp-data/certs/DPtls/Old_TLS_Validity/Expired 2021/CERT_S_SM_DP2_TLS.der",
          "smdpp-data/certs/DPpb/PK_S_SM_DPpb_ECDSA_BRP.pem",
          "smdpp-data/certs/DPtls/PK_S_SM_DP2_TLS_NIST.pem",
          "smdpp-data/certs/DPpb/CERT_S_SM_DP2pb_ECDSA_BRP.der",
          "smdpp-data/certs/DPtls/PK_S_SM_DP_TLS_NIST.pem",
          "smdpp-data/certs/DPtls/Old_TLS_Validity/Expired 2021/CERT_S_SM_DP4_TLS.der",
          "smdpp-data/certs/DPpb/PK_S_SM_DP2pb_ECDSA_BRP.pem",
          "pySim/esim/asn1/rsp/rsp.asn",
          "docs/index.rst",
          "smdpp-data/certs/DPtls/CERT_S_SM_DP_TLS_BRP.der",
          "smdpp-data/certs/DPtls/Old_TLS_Validity/Expired 2023/CERT_S_SM_DP_TLS_BRP.der",
          "smdpp-data/certs/DPauth/SK_S_SM_DP2auth_ECDSA_BRP.pem",
          "smdpp-data/certs/DPtls/Old_TLS_Validity/Expired 2022/CERT_S_SM_DP8_TLS.der",
          "smdpp-data/certs/DPauth/data_sig.der",
          ".checkpatch.conf",
          "requirements.txt",
          "smdpp-data/certs/DPauth/SK_S_SM_DPauth_ECDSA_BRP.pem",
          "smdpp-data/certs/DPauth/PK_S_SM_DPauth_ECDSA_NIST.pem",
          "smdpp-data/certs/DPtls/CERT_S_SM_DP2_TLS.ext.cnf",
          "smdpp-data/certs/DPpb/CERT_S_SM_DP2pb_ECDSA_NIST.der",
          "smdpp-data/certs/DPtls/Old_TLS_Validity/Expired 2021/CERT_S_SM_DP_TLS_NIST.der",
          "smdpp-data/certs/DPauth/PK_S_SM_DPauth_ECDSA_BRP.pem",
          "smdpp-data/certs/DPauth/PK_S_SM_DP2auth_ECDSA_BRP.pem",
          "smdpp-data/certs/DPpb/SK_S_SM_DP2pb_ECDSA_NIST.pem",
          "smdpp-data/certs/DPtls/Old_TLS_Validity/Expired 2021/CERT_S_SM_DP_TLS_BRP.der",
          "smdpp-data/certs/DPtls/Old_TLS_Validity/Expired 2022/CERT_S_SM_DP4_TLS.der",
          "smdpp-data/certs/DPtls/Old_TLS_Validity/Expired 2023/CERT_S_SM_DP8_TLS.der",
          "smdpp-data/certs/DPauth/SK_S_SM_DPauth_ECDSA_NIST.pem",
          "pySim/esim/asn1/rsp/PKIX1Implicit88.asn",
          "smdpp-data/certs/DPpb/CERT_S_SM_DPpb_ECDSA_NIST.der",
          "smdpp-data/certs/DPtls/CERT_S_SM_DP4_TLS.ext.cnf",
          "smdpp-data/certs/DPtls/Old_TLS_Validity/Expired 2023/CERT_S_SM_DP2_TLS.der",
          "smdpp-data/certs/DPtls/CERT_S_SM_DP_TLS.csr.cnf",
          "smdpp-data/certs/DPtls/SK_S_SM_DP_TLS_BRP.pem",
          "smdpp-data/certs/DPtls/SK_S_SM_DP8_TLS.pem",
          "smdpp-data/certs/CertificateIssuer/CERT_CI_ECDSA_NIST.pem",
          "smdpp-data/certs/DPauth/PK_S_SM_DP2auth_ECDSA_NIST.pem",
          "smdpp-data/certs/DPtls/Old_TLS_Validity/Expired 2023/CERT_S_SM_DP4_TLS.der",
          "smdpp-data/certs/DPtls/Old_TLS_Validity/Expired 2022/CERT_S_SM_DP_TLS_NIST.der",
          "smdpp-data/certs/DPtls/SK_S_SM_DP2_TLS_NIST.pem",
          "smdpp-data/certs/CertificateIssuer/CERT_CI_ECDSA_BRP.pem",
          "smdpp-data/certs/DPauth/CERT_S_SM_DP2auth_ECDSA_NIST.der",
          "smdpp-data/certs/DPtls/CERT_S_SM_DP8_TLS.ext.cnf",
          "smdpp-data/upp/TS48 V2 eSIM_GTP_SAIP2.3_NoBERTLV.rename2der",
          "smdpp-data/certs/DPtls/Old_TLS_Validity/Expired 2022/CERT_S_SM_DP2_TLS.der",
          "smdpp-data/certs/README",
          "smdpp-data/certs/DPtls/CERT_S_SM_DP2_TLS.der",
          "smdpp-data/certs/DPtls/CERT_S_SM_DP_TLS.ext.cnf",
          "smdpp-data/certs/DPauth/CERT_S_SM_DPauth_ECDSA_BRP.der",
          "smdpp-data/certs/DPtls/PK_S_SM_DP_TLS_BRP.pem",
          "smdpp-data/certs/DPtls/CERT_S_SM_DP4_TLS.der",
          "smdpp-data/certs/DPpb/SK_S_SM_DPpb_ECDSA_NIST.pem",
          "smdpp-data/certs/DPtls/Old_TLS_Validity/Expired 2023/CERT_S_SM_DP_TLS_NIST.der",
          "smdpp-data/certs/DPauth/CERT_S_SM_DPauth_ECDSA_NIST.der",
          "smdpp-data/certs/DPtls/SK_S_SM_DP4_TLS.pem",
          "smdpp-data/certs/CertificateIssuer/CERT_CI_ECDSA_NIST.der"
        ],
        "commitId" : "5bbb144a319393e0b2bdd06f403905f28528e459",
        "timestamp" : 1704836232000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "Initial proof-of-concept SM-DP+ for GSMA consumer eSIM RSP\u000a\u000aThis commit introduces\u000a\u000a* the osmo-smdpp.py program implementing the main procedures and the\u000a  HTTP/REST based ES9+\u000a* python modules for ES8+ and non-volatile RSP Session State storage\u000a* the ASN.1 source files required to parse/encode RSP\u000a* 3GPP test certificates from SGP.26\u000a* an unsigned profile package (UPP) of a SAIP v2.3 TS48 test profile\u000a\u000aAs I couldn't get the 'Klein' tls support to work, the SM-DP+ code\u000acurrently does not support HTTPS/TLS but plan HTTP, so you either have\u000ato modify your LPA to use HTTP instead of HTTPS, or put a TLS proxy in\u000afront.\u000a\u000aI have successfully installed an eSIM profile on a test eUICC that\u000acontains certificate/key data within the test CI defined in GSMA SGP.26\u000a\u000aChange-Id: I6232847432dc6920cd2bd08c84d7099c29ca1c11\u000a",
        "date" : "2024-01-09 21:37:12 +0000",
        "id" : "5bbb144a319393e0b2bdd06f403905f28528e459",
        "msg" : "Initial proof-of-concept SM-DP+ for GSMA consumer eSIM RSP",
        "paths" : [
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPpb/CERT_S_SM_DP2pb_ECDSA_NIST.der"
          },
          {
            "editType" : "add",
            "file" : "pySim/esim/rsp.py"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPtls/CERT_S_SM_DP_TLS_BRP.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPtls/SK_S_SM_DP_TLS_BRP.pem"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/README"
          },
          {
            "editType" : "edit",
            "file" : "tests/test_esim_bsp.py"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPtls/PK_S_SM_DP_TLS_NIST.pem"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPtls/PK_S_SM_DP2_TLS_NIST.pem"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPtls/SK_S_SM_DP8_TLS.pem"
          },
          {
            "editType" : "edit",
            "file" : "pySim/esim/__init__.py"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPauth/CERT_S_SM_DP2auth_ECDSA_NIST.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPtls/CERT_S_SM_DP4_TLS.ext.cnf"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPpb/CERT_S_SM_DP2pb_ECDSA_BRP.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPtls/CERT_S_SM_DP2_TLS.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPauth/data_sig.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPtls/PK_S_SM_DP_TLS_BRP.pem"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPtls/SK_S_SM_DP4_TLS.pem"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPauth/CERT_S_SM_DP2auth_ECDSA_BRP.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPpb/PK_S_SM_DPpb_ECDSA_NIST.pem"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPtls/Old_TLS_Validity/Expired 2023/CERT_S_SM_DP4_TLS.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/upp/TS48 V2 eSIM_GTP_SAIP2.3_NoBERTLV.rename2der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPtls/Old_TLS_Validity/Expired 2021/CERT_S_SM_DP_TLS_NIST.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPtls/Old_TLS_Validity/Expired 2022/CERT_S_SM_DP2_TLS.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPtls/SK_S_SM_DP_TLS_NIST.pem"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPpb/PK_S_SM_DP2pb_ECDSA_BRP.pem"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPtls/Old_TLS_Validity/Expired 2021/CERT_S_SM_DP8_TLS.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPpb/PK_S_SM_DP2pb_ECDSA_NIST.pem"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPtls/Old_TLS_Validity/Expired 2022/CERT_S_SM_DP_TLS_BRP.der"
          },
          {
            "editType" : "add",
            "file" : "pySim/esim/asn1/rsp/PKIX1Explicit88.asn"
          },
          {
            "editType" : "add",
            "file" : ".checkpatch.conf"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPtls/CERT_S_SM_DP_TLS.ext.cnf"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/CertificateIssuer/CERT_CI_ECDSA_NIST.pem"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPtls/CERT_S_SM_DP4_TLS.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPpb/SK_S_SM_DPpb_ECDSA_NIST.pem"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPpb/SK_S_SM_DP2pb_ECDSA_NIST.pem"
          },
          {
            "editType" : "add",
            "file" : "osmo-smdpp.py"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPtls/CERT_S_SM_DP2_TLS.ext.cnf"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPpb/CERT_S_SM_DPpb_ECDSA_NIST.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPtls/CERT_S_SM_DP_TLS_NIST.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPpb/CERT_S_SM_DPpb_ECDSA_BRP.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPpb/SK_S_SM_DPpb_ECDSA_BRP.pem"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPtls/Old_TLS_Validity/Expired 2022/CERT_S_SM_DP8_TLS.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPauth/SK_S_SM_DP2auth_ECDSA_NIST.pem"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPtls/SK_S_SM_DP2_TLS_NIST.pem"
          },
          {
            "editType" : "add",
            "file" : "pySim/esim/asn1/rsp/rsp.asn"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPtls/Old_TLS_Validity/Expired 2021/CERT_S_SM_DP2_TLS.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPtls/CERT_S_SM_DP4_TLS.csr.cnf"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPtls/CERT_S_SM_DP8_TLS.csr.cnf"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPtls/CERT_S_SM_DP2_TLS.csr.cnf"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPtls/Old_TLS_Validity/Expired 2023/CERT_S_SM_DP2_TLS.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPtls/Old_TLS_Validity/Expired 2023/CERT_S_SM_DP_TLS_BRP.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPauth/PK_S_SM_DP2auth_ECDSA_BRP.pem"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPauth/PK_S_SM_DPauth_ECDSA_BRP.pem"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/CertificateIssuer/CI-csr.cnf"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPtls/Old_TLS_Validity/Expired 2023/CERT_S_SM_DP8_TLS.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/CertificateIssuer/CERT_CI_ECDSA_NIST.der"
          },
          {
            "editType" : "edit",
            "file" : "requirements.txt"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPauth/SK_S_SM_DPauth_ECDSA_BRP.pem"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPauth/PK_S_SM_DPauth_ECDSA_NIST.pem"
          },
          {
            "editType" : "add",
            "file" : "pySim/esim/es8p.py"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPtls/CERT_S_SM_DP_TLS.csr.cnf"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPtls/PK_S_SM_DP4_TLS.pem"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPtls/Old_TLS_Validity/Expired 2021/CERT_S_SM_DP4_TLS.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPauth/SK_S_SM_DP2auth_ECDSA_BRP.pem"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPtls/Old_TLS_Validity/Expired 2022/CERT_S_SM_DP_TLS_NIST.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPtls/PK_S_SM_DP8_TLS.pem"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPtls/CERT_S_SM_DP8_TLS.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPauth/SK_S_SM_DPauth_ECDSA_NIST.pem"
          },
          {
            "editType" : "edit",
            "file" : "docs/index.rst"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPpb/PK_S_SM_DPpb_ECDSA_BRP.pem"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPtls/Old_TLS_Validity/Expired 2021/CERT_S_SM_DP_TLS_BRP.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPauth/CERT_S_SM_DPauth_ECDSA_BRP.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPtls/Old_TLS_Validity/Expired 2023/CERT_S_SM_DP_TLS_NIST.der"
          },
          {
            "editType" : "add",
            "file" : "docs/osmo-smdpp.rst"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPauth/PK_S_SM_DP2auth_ECDSA_NIST.pem"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/CertificateIssuer/CERT_CI_ECDSA_BRP.pem"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPtls/CERT_S_SM_DP8_TLS.ext.cnf"
          },
          {
            "editType" : "add",
            "file" : "tests/test_esim.py"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPauth/CERT_S_SM_DPauth_ECDSA_NIST.der"
          },
          {
            "editType" : "add",
            "file" : "pySim/esim/asn1/rsp/PKIX1Implicit88.asn"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/CertificateIssuer/CERT_CI_ECDSA_BRP.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPpb/SK_S_SM_DP2pb_ECDSA_BRP.pem"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPtls/Old_TLS_Validity/Expired 2022/CERT_S_SM_DP4_TLS.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/upp/TS48 V2 eSIM_GTP_SAIP2.1_NoBERTLV.rename2der"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/validation.py",
          "pySim/esim/asn1/saip/PE_Definitions-3.3.1.asn",
          "tests/test_esim_saip.py",
          "pySim/esim/saip/personalization.py",
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "f2bcb44ccc5fb342aef4ae22fdd809ed43458efd",
        "timestamp" : 1704836232000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.saip.*: Support for parsing / operating on eSIM profiles\u000a\u000aThis commit introduces the capability to parse and encode\u000aSimAlliance/TCA \"Interoperable Profiles\" and apply personalization\u000aoperations on them.\u000a\u000aChange-Id: I71c252a214a634e1bd6f73472107efe2688ee6d2\u000a",
        "date" : "2024-01-09 21:37:12 +0000",
        "id" : "f2bcb44ccc5fb342aef4ae22fdd809ed43458efd",
        "msg" : "pySim.saip.*: Support for parsing / operating on eSIM profiles",
        "paths" : [
          {
            "editType" : "add",
            "file" : "pySim/esim/asn1/saip/PE_Definitions-3.3.1.asn"
          },
          {
            "editType" : "add",
            "file" : "tests/test_esim_saip.py"
          },
          {
            "editType" : "add",
            "file" : "pySim/esim/saip/personalization.py"
          },
          {
            "editType" : "add",
            "file" : "pySim/esim/saip/__init__.py"
          },
          {
            "editType" : "add",
            "file" : "pySim/esim/saip/validation.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/euicc.py"
        ],
        "commitId" : "d1cc8d0c1d02bb87c9073d621e6ffc63fb08dfd8",
        "timestamp" : 1704839710000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "euicc: Fix decoding of SubjectKeyIdentifier.\u000a\u000aThere's actually no additional TLV structure inside the Tag 0x04.\u000a\u000aChange-Id: Ic922355308747a888083c5b26765d272b6b20bd0\u000a",
        "date" : "2024-01-09 23:35:10 +0100",
        "id" : "d1cc8d0c1d02bb87c9073d621e6ffc63fb08dfd8",
        "msg" : "euicc: Fix decoding of SubjectKeyIdentifier.",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/euicc.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_31_102.py",
          "pySim/ts_51_011.py",
          "pySim/ts_102_222.py",
          "pySim/filesystem.py"
        ],
        "commitId" : "91842b471db50de2d704119cf93b79467654b971",
        "timestamp" : 1705050174000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "Constrain user input to hex-string in argparse\u000a\u000aWe do have an is_hexstr function which we should use anywhere\u000awhere we expect the user to input a string of hex digits.  This way\u000awe validate the input before running in some random exception.\u000a\u000aChange-Id: I6426ea864bec82be60554dd125961a48d7751904\u000a",
        "date" : "2024-01-12 10:02:54 +0100",
        "id" : "91842b471db50de2d704119cf93b79467654b971",
        "msg" : "Constrain user input to hex-string in argparse",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_51_011.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_102.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/filesystem.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_102_222.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/euicc.py"
        ],
        "commitId" : "7ba09f9392c8023842a7b5576936cb21ff85c6c0",
        "timestamp" : 1705050174000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "euicc: Migrate ECASD + ISD-R over to global_platform.CardApplicationSD\u000a\u000aActually, the GSMA eUICC is a kind of derivative of a GlobalPlatform\u000acard, and the ECASD and ISD-R are security domains.  As such, we\u000ashould make them derived classes of global_platform.CardApplicationSD\u000awhich means they inherit some of the shared shell_commands etc.\u000a\u000aChange-Id: I660e874d9bcbb8c28a64e4ef82dc53bee97aacfc\u000a",
        "date" : "2024-01-12 10:02:54 +0100",
        "id" : "7ba09f9392c8023842a7b5576936cb21ff85c6c0",
        "msg" : "euicc: Migrate ECASD + ISD-R over to global_platform.CardApplicationSD",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/euicc.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/global_platform.py"
        ],
        "commitId" : "d5be46ae7e84c10445e00d8b4d30799a2a1b1884",
        "timestamp" : 1705249973000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "global_platform: Implement generic store_data command\u000a\u000aChange-Id: If30c5d31b4e7dd60d3a5cfb1d1cbdcf61741a50e\u000a",
        "date" : "2024-01-14 17:32:53 +0100",
        "id" : "d5be46ae7e84c10445e00d8b4d30799a2a1b1884",
        "msg" : "global_platform: Implement generic store_data command",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/global_platform.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tests/test_utils.py",
          "pySim/utils.py",
          "pySim/tlv.py"
        ],
        "commitId" : "1f7a9bd5b40da67d2d8fbccb190d86c50db241d5",
        "timestamp" : 1705250521000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "TLV: Add DGI encoding of \"GP Scripting Language Annex B\"\u000a\u000aThe DGI encoding is specified in Annex B of the\u000a\"GlobalPlatform Systems Scripting Language Specification v1.1.0\"\u000a\u000awhich is an \"archived\" specification that is no longer published\u000aby GlobalPlatform, despite it being referenced from the GlobalPlatform\u000aCard Specification v2.3, which is the basis of the GSMA eSIM\u000aspecifications.\u000a\u000aFor some reason it was the belief of the specification authors that\u000ayet another format of TLV encoding is needed, in addition to the BER-TLV\u000aand COMPREHENSION-TLV used by the very same specifications.\u000a\u000aThe encoding of the tag is not really specified anywhere, but I've only\u000aseen 16-bit examples.  The encoding of the length is specified and\u000aimplemented here accordingly.\u000a\u000aChange-Id: Ie29ab7eb39f3165f3d695fcc1f02051338095697\u000a",
        "date" : "2024-01-14 17:42:01 +0100",
        "id" : "1f7a9bd5b40da67d2d8fbccb190d86c50db241d5",
        "msg" : "TLV: Add DGI encoding of \"GP Scripting Language Annex B\"",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/tlv.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/utils.py"
          },
          {
            "editType" : "edit",
            "file" : "tests/test_utils.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/global_platform.py"
        ],
        "commitId" : "ecfb09037e4dbad54b06bacaa43aa6015f769593",
        "timestamp" : 1705252917000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "global_platform: More definitions to support key loading\u000a\u000aWith the definitions from this commit, we can build key loading\u000aTLVs, which is used to load ECC keys into eUICCs.\u000a\u000aChange-Id: I853c94d37939ef3dd795f893232b0276a5a4af81\u000a",
        "date" : "2024-01-14 18:21:57 +0100",
        "id" : "ecfb09037e4dbad54b06bacaa43aa6015f769593",
        "msg" : "global_platform: More definitions to support key loading",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/global_platform.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_102_221.py",
          "docs/shell.rst",
          "pySim-shell.py"
        ],
        "commitId" : "cd18ed0a82403bc8d4d36649d56bc5e5ee5676d4",
        "timestamp" : 1705428250000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "ts_102_221: Better explain 'selected file invalidated'\u000a\u000aSome specs call it 'invalidated', others call it 'deactivated'.  If the\u000auser is unfamiliar with this, the error message about \"invalidated\"\u000amight not be obvious enough; let's also mention 'deactivated' in the\u000amessage and explicitly mention that it needs to be activated before use.\u000a\u000aChange-Id: I91488b0e7dc25a8970022b09e575485a4165eefa\u000a",
        "date" : "2024-01-16 19:04:10 +0100",
        "id" : "cd18ed0a82403bc8d4d36649d56bc5e5ee5676d4",
        "msg" : "ts_102_221: Better explain 'selected file invalidated'",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_102_221.py"
          },
          {
            "editType" : "edit",
            "file" : "docs/shell.rst"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/euicc.py",
          "tests/test_euicc.py"
        ],
        "commitId" : "4f3d11b378b6b37f7e39b523652b0eaea052c955",
        "timestamp" : 1705428259000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "euicc: Implement EID checksum verification + computation\u000a\u000aChange-Id: I2cb342783137ee7e4b1be3b14e9c3747316f1995\u000a",
        "date" : "2024-01-16 19:04:19 +0100",
        "id" : "4f3d11b378b6b37f7e39b523652b0eaea052c955",
        "msg" : "euicc: Implement EID checksum verification + computation",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/euicc.py"
          },
          {
            "editType" : "add",
            "file" : "tests/test_euicc.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-shell.py"
        ],
        "commitId" : "66b337079a17aea5105b64cc381103157dcc9a9d",
        "timestamp" : 1705430932000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-shell: Permit 'reset' command also in unqeuipped stage\u000a\u000aIf we are not 'equipped' as we could not detect any known applications\u000aon the card, we used to only permit the 'apdu' command. However, we\u000ashould also permit the 'reset' command, as it also is something that's\u000apossible with ever card, even of unknown types.\u000a\u000aChange-Id: I23199da727973d7095ac18031f49e1e8423aa287\u000a",
        "date" : "2024-01-16 18:48:52 +0000",
        "id" : "66b337079a17aea5105b64cc381103157dcc9a9d",
        "msg" : "pySim-shell: Permit 'reset' command also in unqeuipped stage",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/filesystem.py"
        ],
        "commitId" : "0311c92e961b61b5c4b383558cd8d15408be90d9",
        "timestamp" : 1705593528000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "Fix encoding of decoded/json data in update_{record_binary}_decoded\u000a\u000aThe patch introducing the is_hexstr type into the argparser was\u000aaccidentially also introduce in two locations where we actually don't\u000aexpect a hex-string.\u000a\u000aThis is a partial revert of I6426ea864bec82be60554dd125961a48d7751904\u000a\u000aChange-Id: I3c3d2a2753aa7a2566a3b1add7ba70c86499d293\u000aCloses: #6331\u000a",
        "date" : "2024-01-18 16:58:48 +0100",
        "id" : "0311c92e961b61b5c4b383558cd8d15408be90d9",
        "msg" : "Fix encoding of decoded/json data in update_{record_binary}_decoded",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/filesystem.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "osmo-smdpp.py"
        ],
        "commitId" : "ebb6f7f938a612bd03331921337b67c9388c19a8",
        "timestamp" : 1705593528000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "osmo-smdpp: Actually dump Rx/Tx JSON in JSON format and not as python dict\u000a\u000aChange-Id: Ieea3fd2d0f0239acfa6a5c4cfdbfd558d1a3e0ea\u000a",
        "date" : "2024-01-18 16:58:48 +0100",
        "id" : "ebb6f7f938a612bd03331921337b67c9388c19a8",
        "msg" : "osmo-smdpp: Actually dump Rx/Tx JSON in JSON format and not as python",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "osmo-smdpp.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/utils.py"
        ],
        "commitId" : "667d589f20ec1e2c2602020addf313622eb353b3",
        "timestamp" : 1705593528000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.utils: Support datetime.datetime in JsonEncoder\u000a\u000aChange-Id: I6223475cec8eb45c6fc4278109ad9dd1cb557800\u000a",
        "date" : "2024-01-18 16:58:48 +0100",
        "id" : "667d589f20ec1e2c2602020addf313622eb353b3",
        "msg" : "pySim.utils: Support datetime.datetime in JsonEncoder",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/utils.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/x509_cert.py"
        ],
        "commitId" : "c83a963877215db3161b2ab70b545204ea8143d5",
        "timestamp" : 1705942675000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "New pySim.esim.x509_cert module for X.509 certificate handling\u000a\u000aChange-Id: Ia8cc2dac02fcd96624dc6d9348f103373eeeb614\u000a",
        "date" : "2024-01-22 17:57:55 +0100",
        "id" : "c83a963877215db3161b2ab70b545204ea8143d5",
        "msg" : "New pySim.esim.x509_cert module for X.509 certificate handling",
        "paths" : [
          {
            "editType" : "add",
            "file" : "pySim/esim/x509_cert.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/x509_cert.py",
          "osmo-smdpp.py"
        ],
        "commitId" : "45b7dc9466e1cd450af684d2c7076da4d0d05802",
        "timestamp" : 1705942675000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "Move X.509 related code from osmo-smdpp to pySim.esim.x509_cert\u000a\u000aChange-Id: I230ba0537b702b0bf6e9da9a430908ed2a21ca61\u000a",
        "date" : "2024-01-22 17:57:55 +0100",
        "id" : "45b7dc9466e1cd450af684d2c7076da4d0d05802",
        "msg" : "Move X.509 related code from osmo-smdpp to pySim.esim.x509_cert",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "osmo-smdpp.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/esim/x509_cert.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/rsp.py",
          "osmo-smdpp.py"
        ],
        "commitId" : "af87cd544f784e51a41cea303cb57001d9954d9c",
        "timestamp" : 1705946889000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "osmo-smdpp: Implement eUICC + EUM certificate signature chain validation\u000a\u000aChange-Id: I961827c50ed5e34c6507bfdf853952ece5b0d121\u000a",
        "date" : "2024-01-22 19:08:09 +0100",
        "id" : "af87cd544f784e51a41cea303cb57001d9954d9c",
        "msg" : "osmo-smdpp: Implement eUICC + EUM certificate signature chain validation",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "osmo-smdpp.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/esim/rsp.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "docs/osmo-smdpp.rst"
        ],
        "commitId" : "6dadb6c215055949927977e77d960d905802b507",
        "timestamp" : 1706206617000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "docs: Update osmo-smdpp with pointer to sysmoEUICC1-C2T and SGP.26\u000a\u000aChange-Id: Id031ca48549a3c2ac21c93a169262570843d8e2d\u000a",
        "date" : "2024-01-25 19:16:57 +0100",
        "id" : "6dadb6c215055949927977e77d960d905802b507",
        "msg" : "docs: Update osmo-smdpp with pointer to sysmoEUICC1-C2T and SGP.26",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "docs/osmo-smdpp.rst"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "contrib/eidtool.py"
        ],
        "commitId" : "e6124b0abad0a8ff786cc1950e3e0223a7af411c",
        "timestamp" : 1706206617000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "add contrib/eidtool.py: Tool for checking + computing EID checksum\u000a\u000aChange-Id: If6c560a2de51718948fb99b816e080f2aff4d0ed\u000a",
        "date" : "2024-01-25 19:16:57 +0100",
        "id" : "e6124b0abad0a8ff786cc1950e3e0223a7af411c",
        "msg" : "add contrib/eidtool.py: Tool for checking + computing EID checksum",
        "paths" : [
          {
            "editType" : "add",
            "file" : "contrib/eidtool.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "docs/shell.rst"
        ],
        "commitId" : "280a9a340856641593c0570e262d68bda072fad1",
        "timestamp" : 1706206617000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "docs: Add missing global_platform store_data command docs\u000a\u000aIn If30c5d31b4e7dd60d3a5cfb1d1cbdcf61741a50e we introduced a store_data\u000acomamnd, but forgot to add it to the pySim-shell manual.\u000a\u000aChange-Id: I6039818c2c0c5373b4a4ef1e33e152de7fbbd01a\u000a",
        "date" : "2024-01-25 19:16:57 +0100",
        "id" : "280a9a340856641593c0570e262d68bda072fad1",
        "msg" : "docs: Add missing global_platform store_data command docs",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "docs/shell.rst"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/global_platform.py",
          "docs/shell.rst"
        ],
        "commitId" : "18d0a7de96a1f2437d69ce140b8f727fc187ad8e",
        "timestamp" : 1706206617000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "global_platform: Add shell command for PUT KEY\u000a\u000aThis command is used for installation of GlobalPlatform keys.  We only\u000aimplement the command without secure messaging at this point, as it is\u000aused during card personalization.  Authentication will later be handled\u000aby generic implementations of SCP02 and/or SCP03.\u000a\u000aChange-Id: Icffe9e7743266d7262fbf440dd361b21eed7c5cf\u000a",
        "date" : "2024-01-25 19:16:57 +0100",
        "id" : "18d0a7de96a1f2437d69ce140b8f727fc187ad8e",
        "msg" : "global_platform: Add shell command for PUT KEY",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "docs/shell.rst"
          },
          {
            "editType" : "edit",
            "file" : "pySim/global_platform.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "osmo-smdpp.py"
        ],
        "commitId" : "9fd4bbe42e9659012784530365cd52a0510faaf0",
        "timestamp" : 1706206617000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "osmo-smdpp: Constrain selection of CI certificate\u000a\u000aWe can only choose a CI certificate which is supported both by the eUICC\u000aas well as which has signed our own SM-DP+ certificates.\u000a\u000aChange-Id: I0b9130f06d501ca7d484063d56d606cfdd2544f4\u000a",
        "date" : "2024-01-25 19:16:57 +0100",
        "id" : "9fd4bbe42e9659012784530365cd52a0510faaf0",
        "msg" : "osmo-smdpp: Constrain selection of CI certificate",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "osmo-smdpp.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ara_m.py"
        ],
        "commitId" : "5e0439f881a8f94671742181dea8012a33f6c1d1",
        "timestamp" : 1706388433000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "ara_m: Permit encoding of empty AID (--aid '') in ARA-M rules\u000a\u000aEncoding an empty AID-REF-DO (4F) is neccessary to achieve the meaning\u000adescribed in \"Secure Element Access Control - Public Release v1.0\"\u000aTable 6-1: \"Empty: Indicates that the rules to be stored or retrieved\u000aare associated with all SE applications not covered by a specific rule\".\u000a\u000aChange-Id: Iac6c3d78bc9ce36bac47589e5f7a0cc78e2efc38\u000a",
        "date" : "2024-01-27 21:47:13 +0100",
        "id" : "5e0439f881a8f94671742181dea8012a33f6c1d1",
        "msg" : "ara_m: Permit encoding of empty AID (--aid '') in ARA-M rules",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ara_m.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ara_m.py"
        ],
        "commitId" : "9b1a9d9b2ebaa4038a49f7b60302becf74a100ce",
        "timestamp" : 1706388433000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "ara_m: Use GlobalPlatform SELECT decoding\u000a\u000aAs the ARA-M applet is a GlobalPlatform applet, its SELECT response\u000adecoding should be used, not the ETSI EUICC TS 102 221 fall-back.\u000a\u000aChange-Id: I1a30b88a385f6de663aa837483dd32c0d104856f\u000a",
        "date" : "2024-01-27 21:47:13 +0100",
        "id" : "9b1a9d9b2ebaa4038a49f7b60302becf74a100ce",
        "msg" : "ara_m: Use GlobalPlatform SELECT decoding",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ara_m.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/runtime.py"
        ],
        "commitId" : "7f2263b4a005f8ee50507068ee1192c618e23bc4",
        "timestamp" : 1706388433000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "runtime: Reset selected_file_fcp[_hex] if SELECT returns no data\u000a\u000aIn case SELECT doesn't return any response data, we must reset\u000athe lchan.selected_file_fcp* members to None to prevent pySim-shell\u000apreventing stale data from the previously selected file.\u000a\u000aChange-Id: Ia04b8634e328e604e8df7e8d59b7fd532242d2ca\u000a",
        "date" : "2024-01-27 21:47:13 +0100",
        "id" : "7f2263b4a005f8ee50507068ee1192c618e23bc4",
        "msg" : "runtime: Reset selected_file_fcp[_hex] if SELECT returns no data",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/runtime.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ara_m.py"
        ],
        "commitId" : "3d6df6ce13e2c328f1b3eb87f24506a8f7d82d46",
        "timestamp" : 1706388612000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "[cosmetic] ara_m: Give a spec reference for the PERM-AR-DO\u000a\u000aPERM-AR-DO actually originates in a different spec than all other parts\u000aof the ara_m.py, so let's explicitly mention that.\u000a\u000aChange-Id: I6e0014c323f605860d0f70cd0c04d7e461e8a9de\u000a",
        "date" : "2024-01-27 20:50:12 +0000",
        "id" : "3d6df6ce13e2c328f1b3eb87f24506a8f7d82d46",
        "msg" : "[cosmetic] ara_m: Give a spec reference for the PERM-AR-DO",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ara_m.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/personalization.py"
        ],
        "commitId" : "0bce94996f40af915ee1265abd480473d64c2999",
        "timestamp" : 1706475791000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "saip.personalization: Also drop any fillFileOffset\u000a\u000aWhen replacing a file's contents, we must not just remove any\u000afillFileContent tuples, but also the fillFileOffset.\u000a\u000aChange-Id: I3e4d97ae9de8a78f7bc0165ece5954481568b800\u000a",
        "date" : "2024-01-28 22:03:11 +0100",
        "id" : "0bce94996f40af915ee1265abd480473d64c2999",
        "msg" : "saip.personalization: Also drop any fillFileOffset",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/personalization.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/personalization.py"
        ],
        "commitId" : "488427993ddab041e70452f8e749dddf1d0d57a4",
        "timestamp" : 1706475791000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "saip.personalization: Fix ICCID fillFileContent replacement\u000a\u000aChange-Id: Ic267fdde3b648b376ea6814783df1e90ea9bb9ad\u000a",
        "date" : "2024-01-28 22:03:11 +0100",
        "id" : "488427993ddab041e70452f8e749dddf1d0d57a4",
        "msg" : "saip.personalization: Fix ICCID fillFileContent replacement",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/personalization.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/oid.py",
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "9f55da998f986ada16907436f98d0345fc34a0c4",
        "timestamp" : 1706511972000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "esim.saip: Move OID to separate sub-module\u000a\u000aThis helps us to prevent circular imports in follow-up code.\u000a\u000aChange-Id: I94f85f2257d4702376f4ba5eb995a544a2e53fd3\u000a",
        "date" : "2024-01-29 08:06:12 +0100",
        "id" : "9f55da998f986ada16907436f98d0345fc34a0c4",
        "msg" : "esim.saip: Move OID to separate sub-module",
        "paths" : [
          {
            "editType" : "add",
            "file" : "pySim/esim/saip/oid.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "e815e79db95444911f7bb89ed4600b0e98a7957f",
        "timestamp" : 1706516513000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "esim.saip: More type annotations\u000a\u000aChange-Id: Ib549817ee137bab610aea9c89a5ab86c2a7592ea\u000a",
        "date" : "2024-01-29 09:21:53 +0100",
        "id" : "e815e79db95444911f7bb89ed4600b0e98a7957f",
        "msg" : "esim.saip: More type annotations",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "requirements.txt"
        ],
        "commitId" : "263e3094ba445acf2ad5ee50d31dbca6a7c3ddc5",
        "timestamp" : 1706516517000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "requirements.txt: Switch to osmocom fork of asn1tools\u000a\u000aThis is sadly required as the Interoperable Profile format must process\u000aelements of an ASN.1 sequence in order, which doesn't work if the parser\u000aputs the elements in a python dict.\u000a\u000aThe osmocom fork of asn1tools hence uses OrderedDict to work around\u000athis problem.\u000a\u000aChange-Id: Id28fcf060f491bb3d76aa6d8026aa76058edb675\u000a",
        "date" : "2024-01-29 09:21:57 +0100",
        "id" : "263e3094ba445acf2ad5ee50d31dbca6a7c3ddc5",
        "msg" : "requirements.txt: Switch to osmocom fork of asn1tools",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "requirements.txt"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/oid.py",
          "pySim/esim/saip/templates.py"
        ],
        "commitId" : "3f3fd1a84153c7fa59b7cf75a02aee167dd67a94",
        "timestamp" : 1706516616000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "add SAIP template handling + v3.1 definitions\u000a\u000aThis adds classes for describing profile templates as well\u000aas derived classes defining the profile templates of the\u000a\"Profile Interoperability Technical Specification\", specifically\u000ait's \"ANNEX A (Normative): File Structure Templates Definition\"\u000a\u000aWe need a machine-readable definition of those templates, so\u000awe can fully interpret an unprotected profile package (UPP),\u000aas the UPP usually only contains the increment/difference to\u000aa given teplate.\u000a\u000aChange-Id: I79bc0a480450ca2de4b687ba6f11d0a4ea4f14c8\u000a",
        "date" : "2024-01-29 09:23:36 +0100",
        "id" : "3f3fd1a84153c7fa59b7cf75a02aee167dd67a94",
        "msg" : "add SAIP template handling + v3.1 definitions",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/oid.py"
          },
          {
            "editType" : "add",
            "file" : "pySim/esim/saip/templates.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "smdpp-data/upp/TS48v2_SAIP2.1_NoBERTLV.der",
          "smdpp-data/upp/TS48 V2 eSIM_GTP_SAIP2.1_NoBERTLV.rename2der",
          "docs/osmo-smdpp.rst",
          "tests/test_esim_saip.py",
          "smdpp-data/upp/TS48v2_SAIP2.3_NoBERTLV.der",
          "osmo-smdpp.py",
          "smdpp-data/upp/TS48 V2 eSIM_GTP_SAIP2.3_NoBERTLV.rename2der"
        ],
        "commitId" : "8a39d00cc329b53cfd8b781fbffd79907c63559a",
        "timestamp" : 1706646821000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "osmo-smdpp: Support multiple different profiles\u000a\u000aLet's simply use the matchingId for filesystem lookup of the UPP file.\u000a\u000aThis way we can have any number of profiles by simply creating the\u000arespeective files.\u000a\u000aChange-Id: I0bc3a14b9fdfcc6322917dd0c69d8295de486950\u000a",
        "date" : "2024-01-30 21:33:41 +0100",
        "id" : "8a39d00cc329b53cfd8b781fbffd79907c63559a",
        "msg" : "osmo-smdpp: Support multiple different profiles",
        "paths" : [
          {
            "editType" : "delete",
            "file" : "smdpp-data/upp/TS48 V2 eSIM_GTP_SAIP2.3_NoBERTLV.rename2der"
          },
          {
            "editType" : "edit",
            "file" : "tests/test_esim_saip.py"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/upp/TS48v2_SAIP2.1_NoBERTLV.der"
          },
          {
            "editType" : "delete",
            "file" : "smdpp-data/upp/TS48 V2 eSIM_GTP_SAIP2.1_NoBERTLV.rename2der"
          },
          {
            "editType" : "edit",
            "file" : "docs/osmo-smdpp.rst"
          },
          {
            "editType" : "edit",
            "file" : "osmo-smdpp.py"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/upp/TS48v2_SAIP2.3_NoBERTLV.der"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "smdpp-data/upp/TS48v3_SAIP2.3_NoBERTLV.der",
          "smdpp-data/upp/TS48v5_SAIP2.1B_NoBERTLV.der",
          "smdpp-data/upp/TS48v2_SAIP2.3_BERTLV.der",
          "smdpp-data/upp/TS48v3_SAIP2.1_BERTLV.der",
          "smdpp-data/upp/TS48v2_SAIP2.1_BERTLV.der",
          "smdpp-data/upp/TS48v4_SAIP2.3_BERTLV.der",
          "smdpp-data/upp/TS48v3_SAIP2.1_NoBERTLV.der",
          "smdpp-data/upp/TS48v3_SAIP2.3_BERTLV.der",
          "smdpp-data/upp/TS48v4_SAIP2.3_NoBERTLV.der",
          "smdpp-data/upp/TS48v5_SAIP2.3_NoBERTLV.der",
          "smdpp-data/upp/TS48v1_B.der",
          "smdpp-data/upp/TS48v5_SAIP2.3_BERTLV_SUCI.der",
          "smdpp-data/upp/TS48v4_SAIP2.1A_NoBERTLV.der",
          "smdpp-data/upp/TS48v4_SAIP2.1B_NoBERTLV.der",
          "smdpp-data/upp/TS48v1_A.der",
          "smdpp-data/upp/TS48v5_SAIP2.1A_NoBERTLV.der"
        ],
        "commitId" : "d7715043a31275fd0ed86407b84d78c240b2fbe4",
        "timestamp" : 1706646821000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "osmo-smdpp: Add more GSMA TS.48 test profiles\u000a\u000aWe now have all v1, v2, v3, v4 and v5 profiles from\u000ahttps://github.com/GSMATerminals/Generic-eUICC-Test-Profile-for-Device-Testing-Public\u000a\u000aChange-Id: Ia204c055b9d04552ae664130ff8ae4fc4163b88c\u000a",
        "date" : "2024-01-30 21:33:41 +0100",
        "id" : "d7715043a31275fd0ed86407b84d78c240b2fbe4",
        "msg" : "osmo-smdpp: Add more GSMA TS.48 test profiles",
        "paths" : [
          {
            "editType" : "add",
            "file" : "smdpp-data/upp/TS48v3_SAIP2.3_BERTLV.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/upp/TS48v4_SAIP2.1A_NoBERTLV.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/upp/TS48v3_SAIP2.1_BERTLV.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/upp/TS48v5_SAIP2.1B_NoBERTLV.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/upp/TS48v4_SAIP2.3_BERTLV.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/upp/TS48v2_SAIP2.3_BERTLV.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/upp/TS48v1_B.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/upp/TS48v1_A.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/upp/TS48v4_SAIP2.3_NoBERTLV.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/upp/TS48v2_SAIP2.1_BERTLV.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/upp/TS48v3_SAIP2.1_NoBERTLV.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/upp/TS48v5_SAIP2.3_NoBERTLV.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/upp/TS48v4_SAIP2.1B_NoBERTLV.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/upp/TS48v5_SAIP2.3_BERTLV_SUCI.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/upp/TS48v3_SAIP2.3_NoBERTLV.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/upp/TS48v5_SAIP2.1A_NoBERTLV.der"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tests/test_esim.py",
          "pySim/esim/__init__.py"
        ],
        "commitId" : "93bdf00967951a8e25665d0f9774bd9fe263892b",
        "timestamp" : 1706646821000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.esim: Add class for parsing/encoding eSIM activation codes\u000a\u000aChange-Id: I2256722c04b56e8d9c16a65e3cd94f6a46f4ed85\u000a",
        "date" : "2024-01-30 21:33:41 +0100",
        "id" : "93bdf00967951a8e25665d0f9774bd9fe263892b",
        "msg" : "pySim.esim: Add class for parsing/encoding eSIM activation codes",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "tests/test_esim.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/esim/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/global_platform.py",
          "docs/shell.rst"
        ],
        "commitId" : "5918345c780cb7561643e0c86ca03cf3edf49068",
        "timestamp" : 1706736282000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "global_platform: implement GET STATUS command\u000a\u000aThe GlobalPlatform GET STATUS command is used to display information\u000aabout ISD / Applications / ExecutabLoad Files / Modules on the card.\u000a\u000aChange-Id: Ic92f96c1c6a569aebc93a906c62a43b86fe3b811\u000a",
        "date" : "2024-01-31 22:24:42 +0100",
        "id" : "5918345c780cb7561643e0c86ca03cf3edf49068",
        "msg" : "global_platform: implement GET STATUS command",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "docs/shell.rst"
          },
          {
            "editType" : "edit",
            "file" : "pySim/global_platform.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/euicc.py",
          "pySim/legacy/cards.py",
          "pySim/transport/__init__.py",
          "pySim-shell.py",
          "pySim/global_platform.py",
          "pySim/commands.py"
        ],
        "commitId" : "eecef54eee90b2cffc3c73d76648673c4aa3c727",
        "timestamp" : 1706785567000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "commands.py: Wrap the transport send_apdu* methods\u000a\u000aLet's not have higher level code directly call the transports send_apdu*\u000amethods.  We do this as a precursor to introducing secure channel\u000asupport, where the secure channel driver would add MAC and/or encrypt\u000aAPDUs before they are sent to the transport.\u000a\u000aChange-Id: I1b870140959aa8241cda2246e74576390123cb2d\u000a",
        "date" : "2024-02-01 12:06:07 +0100",
        "id" : "eecef54eee90b2cffc3c73d76648673c4aa3c727",
        "msg" : "commands.py: Wrap the transport send_apdu* methods",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/global_platform.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/__init__.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/legacy/cards.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/commands.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/euicc.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/global_platform.py",
          "pySim/global_platform/__init__.py"
        ],
        "commitId" : "a2f16540511e13927c4a334408bf8aa15112a70a",
        "timestamp" : 1706785567000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "move global_platform.py to global_platform/__init__.py\u000a\u000aThis will allow us to have multiple different modules for different\u000aaspects of global_platform.\u000a\u000aChange-Id: Ieca0b20c26a2e41eb11455941164474b76eb3c7a\u000a",
        "date" : "2024-02-01 12:06:07 +0100",
        "id" : "a2f16540511e13927c4a334408bf8aa15112a70a",
        "msg" : "move global_platform.py to global_platform/__init__.py",
        "paths" : [
          {
            "editType" : "delete",
            "file" : "pySim/global_platform.py"
          },
          {
            "editType" : "add",
            "file" : "pySim/global_platform/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/global_platform/__init__.py",
          "pySim/utils.py"
        ],
        "commitId" : "762a72b3084bfd1cac6cedbe7db0ff4b9420fc7f",
        "timestamp" : 1706963561000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "global_platform 'put_key': constrain ranges of KVN + KID in argparse\u000a\u000aThe earlier we catch errors in user input, the better.\u000a\u000aChange-Id: Icee656f1373a993b6883ffaab441fe178c0fe8cb\u000a",
        "date" : "2024-02-03 13:32:41 +0100",
        "id" : "762a72b3084bfd1cac6cedbe7db0ff4b9420fc7f",
        "msg" : "global_platform 'put_key': constrain ranges of KVN + KID in argparse",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/global_platform/__init__.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/utils.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tests/test_globalplatform.py",
          "pySim/global_platform/scp02.py",
          "pySim/global_platform/__init__.py",
          "pySim-shell.py",
          "pySim/secure_channel.py",
          "pySim/commands.py",
          "docs/shell.rst"
        ],
        "commitId" : "41a7379a4f5995e0ba5e127776e0cb0b189306a5",
        "timestamp" : 1707064950000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "Introduce GlobalPlatform SCP02 implementation\u000a\u000aThis implementation of GlobalPlatform SCP02 currently only supports\u000aC-MAC and C-ENC, but no R-MAC or R-ENC yet.\u000a\u000aThe patch also introduces the notion of having a SCP instance associated\u000awith a SimCardCommands instance.  It also adds the establish_scp0w and\u000arelease_scp shell commands to all GlobalPlatform Security Domains.\u000a\u000aChange-Id: I56020382b9dfe8ba0f7c1c9f71eb1a9746bc5a27\u000a",
        "date" : "2024-02-04 17:42:30 +0100",
        "id" : "41a7379a4f5995e0ba5e127776e0cb0b189306a5",
        "msg" : "Introduce GlobalPlatform SCP02 implementation",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/global_platform/__init__.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/commands.py"
          },
          {
            "editType" : "add",
            "file" : "pySim/secure_channel.py"
          },
          {
            "editType" : "edit",
            "file" : "docs/shell.rst"
          },
          {
            "editType" : "add",
            "file" : "pySim/global_platform/scp02.py"
          },
          {
            "editType" : "add",
            "file" : "tests/test_globalplatform.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-shell.py"
        ],
        "commitId" : "321973ad202a897faa61f7b35f62f3d9237b928e",
        "timestamp" : 1707064991000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-shell: Make 'apdu' command use logical (and secure) channel\u000a\u000aThe 'apdu' command so far bypassed the logical channel and also\u000athe recently-introduced support for secure channels.  Let's change\u000athat, at least by default.  If somebody wants a raw APDU without\u000asecure / logical channel processing, they may use the --raw option.\u000a\u000aChange-Id: Id0c364f772c31e11e8dfa21624d8685d253220d0\u000a",
        "date" : "2024-02-04 17:43:11 +0100",
        "id" : "321973ad202a897faa61f7b35f62f3d9237b928e",
        "msg" : "pySim-shell: Make 'apdu' command use logical (and secure) channel",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "docs/shell.rst",
          "pySim/global_platform/__init__.py"
        ],
        "commitId" : "4d5fd25f31d5c50fb22fd7bd3b40d91ac5d74f55",
        "timestamp" : 1707065819000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "global_platform: Add install_for_personalization command\u000a\u000aThis allows us to perform STORE DATA on applications like ARA-M/ARA-D\u000aafter establishing SCP02 to the related security domain.\u000a\u000aChange-Id: I2ce766b97bba42c64c4d4492b505be66c24f471e\u000a",
        "date" : "2024-02-04 17:56:59 +0100",
        "id" : "4d5fd25f31d5c50fb22fd7bd3b40d91ac5d74f55",
        "msg" : "global_platform: Add install_for_personalization command",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "docs/shell.rst"
          },
          {
            "editType" : "edit",
            "file" : "pySim/global_platform/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/global_platform/__init__.py",
          "docs/shell.rst"
        ],
        "commitId" : "a7eaefc8d9a43b28eda248e13abd560191571561",
        "timestamp" : 1707065819000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "global_platform: add set_status command\u000a\u000aUsing this command, one can change the life cycle status of on-card\u000aapplications, specifically one can LOCK (disable) them and re-enable\u000athem as needed.\u000a\u000aChange-Id: Ie14297a119d01cad1284f315a2508aa92cb4633b\u000a",
        "date" : "2024-02-04 17:56:59 +0100",
        "id" : "a7eaefc8d9a43b28eda248e13abd560191571561",
        "msg" : "global_platform: add set_status command",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/global_platform/__init__.py"
          },
          {
            "editType" : "edit",
            "file" : "docs/shell.rst"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "docs/shell.rst",
          "pySim/global_platform/__init__.py"
        ],
        "commitId" : "bdf8419966e2e8e826eed09d35e7a8246300a623",
        "timestamp" : 1707065819000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "global_platform: add delete_key and delete_card_content\u000a\u000aThis GlobalPlatform command is used to delete applications/load-files\u000aor keys.\u000a\u000aChange-Id: Ib5d18e983d0e918633d7c090c54fb9a3384a22e5\u000a",
        "date" : "2024-02-04 17:56:59 +0100",
        "id" : "bdf8419966e2e8e826eed09d35e7a8246300a623",
        "msg" : "global_platform: add delete_key and delete_card_content",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "docs/shell.rst"
          },
          {
            "editType" : "edit",
            "file" : "pySim/global_platform/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/global_platform/__init__.py"
        ],
        "commitId" : "a30ee172466a56d638766c4f2a701a13610e2c20",
        "timestamp" : 1707065819000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "global_platform: Fix --key-id argument\u000a\u000aThe key-id is actually a 7-bit integer and on the wire the 8th bit\u000ahas a special meaning which can be derived automatically.\u000a\u000aLet's unburden the user from explicitly encoding that 8th bit and\u000ainstead set it automatically.\u000a\u000aChange-Id: I8da37aa8fd064e6d35ed29a70f5d7a0e9060be3a\u000a",
        "date" : "2024-02-04 17:56:59 +0100",
        "id" : "a30ee172466a56d638766c4f2a701a13610e2c20",
        "msg" : "global_platform: Fix --key-id argument",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/global_platform/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_102_222.py",
          "pySim/utils.py",
          "pySim/filesystem.py"
        ],
        "commitId" : "afd89ca36de806efdbc4b62c61fcfe8783a784db",
        "timestamp" : 1707065819000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "Contstrain argparse integers to permitted range\u000a\u000aIn many casese we used type=int permitting any integer value, positive\u000aor negative without a constratint in size.  However, in reality often\u000awe're constrained to unsigned 8 or 16 bit ranges.  Let's use the\u000aauto_uint{8,16} functions to enforce this within argparse before\u000awe even try to encode something that won't work.\u000a\u000aChange-Id: I35c81230bc18e2174ec1930aa81463f03bcd69c8\u000a",
        "date" : "2024-02-04 17:56:59 +0100",
        "id" : "afd89ca36de806efdbc4b62c61fcfe8783a784db",
        "msg" : "Contstrain argparse integers to permitted range",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_102_222.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/filesystem.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/utils.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tests/test_globalplatform.py",
          "pySim/global_platform/scp02.py",
          "pySim/global_platform/scp.py",
          "pySim/global_platform/__init__.py"
        ],
        "commitId" : "13a1723c2e2e902f08c347f1340fb052fa6d8950",
        "timestamp" : 1707065819000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "rename global_platform.scp02 to global_platform.scp\u000a\u000aThis is in preparation of extending it to cover SCP03 in a follow-up\u000apatch.\u000a\u000aChange-Id: Idc0afac6e95f89ddaf277a89f9c95607e70a471c\u000a",
        "date" : "2024-02-04 17:56:59 +0100",
        "id" : "13a1723c2e2e902f08c347f1340fb052fa6d8950",
        "msg" : "rename global_platform.scp02 to global_platform.scp",
        "paths" : [
          {
            "editType" : "delete",
            "file" : "pySim/global_platform/scp02.py"
          },
          {
            "editType" : "add",
            "file" : "pySim/global_platform/scp.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/global_platform/__init__.py"
          },
          {
            "editType" : "edit",
            "file" : "tests/test_globalplatform.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tests/test_globalplatform.py",
          "pySim/global_platform/scp.py",
          "pySim/global_platform/__init__.py",
          "docs/shell.rst"
        ],
        "commitId" : "af8826a02bc85b47e6568b6c7ba42629cf1ef005",
        "timestamp" : 1707065819000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "Implement Global Platform SCP03\u000a\u000aThis adds an implementation of the GlobalPlatform SCP03 protocol. It has\u000abeen tested in S8 mode for C-MAC, C-ENC, R-MAC and R-ENC with AES using\u000a128, 192 and 256 bit key lengh.  Test vectors generated while talking to\u000aa sysmoEUICC1-C2T are included as unit tests.\u000a\u000aChange-Id: Ibc35af5474923aed2e3bcb29c8d713b4127a160d\u000a",
        "date" : "2024-02-04 17:56:59 +0100",
        "id" : "af8826a02bc85b47e6568b6c7ba42629cf1ef005",
        "msg" : "Implement Global Platform SCP03",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "docs/shell.rst"
          },
          {
            "editType" : "edit",
            "file" : "pySim/global_platform/scp.py"
          },
          {
            "editType" : "edit",
            "file" : "tests/test_globalplatform.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/global_platform/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tests/test_globalplatform.py",
          "tests/test_tlv.py"
        ],
        "commitId" : "57f73f8de79cc872d8cc5abbb82b54b68ab6efbf",
        "timestamp" : 1707078420000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "make our tests pass pylint\u000a\u000aChange-Id: If3a9f178c3f915123178efe00269fce74f6e585d\u000a",
        "date" : "2024-02-04 21:27:00 +0100",
        "id" : "57f73f8de79cc872d8cc5abbb82b54b68ab6efbf",
        "msg" : "make our tests pass pylint",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "tests/test_globalplatform.py"
          },
          {
            "editType" : "edit",
            "file" : "tests/test_tlv.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "contrib/jenkins.sh"
        ],
        "commitId" : "bc8e2e16640a0bc1084d6fca1981460722452118",
        "timestamp" : 1707078420000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "contrib/jenkins.sh: include tests/*.py in pylint\u000a\u000aChange-Id: I9c8113acf5341b198d91040710b6b10cb2b6ef38\u000a",
        "date" : "2024-02-04 21:27:00 +0100",
        "id" : "bc8e2e16640a0bc1084d6fca1981460722452118",
        "msg" : "contrib/jenkins.sh: include tests/*.py in pylint",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "contrib/jenkins.sh"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_31_103.py",
          "pySim/apdu/ts_102_221.py",
          "pySim/global_platform/__init__.py",
          "pySim/tlv.py",
          "pySim/construct.py"
        ],
        "commitId" : "e55fcf66bf9d5f92dd74858555090767a433e8f8",
        "timestamp" : 1707078420000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "Be more conservative in our imports\u000a\u000aTry to avoid '*' from anything into various modules, polluting the\u000anamespace.\u000a\u000aChange-Id: Iba749d18e1863ded88ba2d2183e2e8d718b2d612\u000a",
        "date" : "2024-02-04 21:27:00 +0100",
        "id" : "e55fcf66bf9d5f92dd74858555090767a433e8f8",
        "msg" : "Be more conservative in our imports",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_103.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/apdu/ts_102_221.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/global_platform/__init__.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/tlv.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/construct.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tests/test_globalplatform.py",
          "pySim/global_platform/__init__.py"
        ],
        "commitId" : "cd8e16fdfec03b4124e5087930b4dc7cdb668826",
        "timestamp" : 1707078420000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "global_platform: KCV support for PUT KEY\u000a\u000aGlobalPlatform requires the use of the KCV for DES + AES keys. Let's\u000aimplement that.\u000a\u000a(11.8.2.3.3: \"For all key types described in section B.6, the Key Check\u000aValue shall be present.\")\u000a\u000aChange-Id: Ief168a66dee58b56f4126db12829b3a98906c8db\u000a",
        "date" : "2024-02-04 21:27:00 +0100",
        "id" : "cd8e16fdfec03b4124e5087930b4dc7cdb668826",
        "msg" : "global_platform: KCV support for PUT KEY",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "tests/test_globalplatform.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/global_platform/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tests/test_construct.py",
          "pySim/global_platform/__init__.py",
          "pySim/construct.py"
        ],
        "commitId" : "7156a40187325259a023312747d4c55ec530747e",
        "timestamp" : 1707093579000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "construct: Add StripTrailerAdapter\u000a\u000aIn smart cards, we every so often encounter data types that contain a\u000abit-mask whose length depends on whether or not there are any of the\u000aleast-significant bits are set.  So far we worked around this with\u000asome kind of Struct('byte1', 'byte2'/COptional, 'byte3'/COptional)\u000aapproach.\u000a\u000aLet's do thisin a generic way using the new StripTrailerAdapter.\u000a\u000aChange-Id: I659aa7247c57c680895b0bf8412f9e477fc3587d\u000a",
        "date" : "2024-02-05 01:39:39 +0100",
        "id" : "7156a40187325259a023312747d4c55ec530747e",
        "msg" : "construct: Add StripTrailerAdapter",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "tests/test_construct.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/construct.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/global_platform/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "docs/shell.rst",
          "pySim/global_platform/__init__.py"
        ],
        "commitId" : "2bb2ff4aebf3d5ccfa375768c5190c7a306de2f2",
        "timestamp" : 1707093709000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "global_platform: INSTALL [for install] support\u000a\u000aChange-Id: I4c1da90f1aa8ad9609602272f374078d1e1faa11\u000a",
        "date" : "2024-02-05 01:41:49 +0100",
        "id" : "2bb2ff4aebf3d5ccfa375768c5190c7a306de2f2",
        "msg" : "global_platform: INSTALL [for install] support",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "docs/shell.rst"
          },
          {
            "editType" : "edit",
            "file" : "pySim/global_platform/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/global_platform/scp.py",
          "pySim/global_platform/__init__.py"
        ],
        "commitId" : "62bd7d3df231022f8f8889f021ff7c1be27a3427",
        "timestamp" : 1707093902000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "global_platform: Add DEK (key) encryption support\u000a\u000aChange-Id: I940cc2e16a1d3e3cdef4ebcf3f15fc2c8de21284\u000a",
        "date" : "2024-02-05 01:45:02 +0100",
        "id" : "62bd7d3df231022f8f8889f021ff7c1be27a3427",
        "msg" : "global_platform: Add DEK (key) encryption support",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/global_platform/__init__.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/global_platform/scp.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/card_handler.py",
          "pySim/jsonpath.py",
          "pySim/iso7816_4.py",
          "pySim/card_key_provider.py"
        ],
        "commitId" : "0f2ac70397bba762c134e53e8c893f6796af607a",
        "timestamp" : 1707122658000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pylint: card_key_provider.py, card_handler.py, iso7816_4.py, jsonpath.py\u000a\u000apySim/card_key_provider.py:57:0: C0325: Unnecessary parens after 'if' keyword (superfluous-parens)\u000apySim/card_key_provider.py:61:0: C0325: Unnecessary parens after 'if' keyword (superfluous-parens)\u000a\u000apySim/card_handler.py:100:0: C0325: Unnecessary parens after '=' keyword (superfluous-parens)\u000apySim/card_handler.py:100:24: C0121: Comparison 'self.cmds.get('verbose') == True' should be 'self.cmds.get('verbose') is True' if checking for the singleton value True, or 'bool(self.cmds.get('verbose'))' if testing for truthiness (singleton-comparison)\u000apySim/card_handler.py:29:0: C0411: standard import \"import subprocess\" should be placed before \"from pySim.transport import LinkBase\" (wrong-import-order)\u000apySim/card_handler.py:30:0: C0411: standard import \"import sys\" should be placed before \"from pySim.transport import LinkBase\" (wrong-import-order)\u000apySim/card_handler.py:31:0: C0411: third party import \"import yaml\" should be placed before \"from pySim.transport import LinkBase\" (wrong-import-order)\u000a\u000apySim/iso7816_4.py:20:0: W0401: Wildcard import construct (wildcard-import)\u000a\u000apySim/jsonpath.py:1:0: C0114: Missing module docstring (missing-module-docstring)\u000apySim/jsonpath.py:6:0: W0105: String statement has no effect (pointless-string-statement)\u000apySim/jsonpath.py:2:0: W0611: Unused import json (unused-import)\u000apySim/jsonpath.py:3:0: W0611: Unused import pprint (unused-import)\u000a\u000aChange-Id: I780595d69000f727ad0fbaff4b89918b91b3122e\u000a",
        "date" : "2024-02-05 09:44:18 +0100",
        "id" : "0f2ac70397bba762c134e53e8c893f6796af607a",
        "msg" : "pylint: card_key_provider.py, card_handler.py, iso7816_4.py, jsonpath.py",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/jsonpath.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/card_key_provider.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/iso7816_4.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/card_handler.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/gsmtap.py"
        ],
        "commitId" : "f57912ea15f16d1b24d51b616871555f81234c1e",
        "timestamp" : 1707122693000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pylint: gsmtap.py\u000a\u000apySim/gsmtap.py:28:0: W0401: Wildcard import construct (wildcard-import)\u000apySim/gsmtap.py:26:0: W0611: Unused List imported from typing (unused-import)\u000apySim/gsmtap.py:26:0: W0611: Unused Dict imported from typing (unused-import)\u000apySim/gsmtap.py:26:0: W0611: Unused Optional imported from typing (unused-import)\u000a\u000aChange-Id: I53739874edef0a9ae25a8599e7cc7eee9dedb703\u000a",
        "date" : "2024-02-05 09:44:53 +0100",
        "id" : "f57912ea15f16d1b24d51b616871555f81234c1e",
        "msg" : "pylint: gsmtap.py",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/gsmtap.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/cards.py"
        ],
        "commitId" : "c5c97281273c02a24464fe152915266d47de2920",
        "timestamp" : 1707122693000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pylint: cards.py\u000a\u000apySim/cards.py:30:0: W0401: Wildcard import pySim.utils (wildcard-import)\u000apySim/cards.py:41:8: R1705: Unnecessary \"else\" after \"return\", remove the \"else\" and de-indent the code inside it (no-else-return)\u000apySim/cards.py:55:4: R1711: Useless return at end of function or method (useless-return)\u000apySim/cards.py:78:8: R1725: Consider using Python 3 style super() without arguments (super-with-arguments)\u000apySim/cards.py:91:8: R1725: Consider using Python 3 style super() without arguments (super-with-arguments)\u000apySim/cards.py:159:12: R1705: Unnecessary \"else\" after \"return\", remove the \"else\" and de-indent the code inside it (no-else-return)\u000apySim/cards.py:28:0: C0411: standard import \"import abc\" should be placed before \"from pySim.ts_102_221 import EF_DIR\" (wrong-import-order)\u000apySim/cards.py:25:0: W0611: Unused Dict imported from typing (unused-import)\u000apySim/cards.py:28:0: W0611: Unused import abc (unused-import)\u000a\u000aChange-Id: I708da28caffb417ed2f8413f9611526b18b29cd4\u000a",
        "date" : "2024-02-05 09:44:53 +0100",
        "id" : "c5c97281273c02a24464fe152915266d47de2920",
        "msg" : "pylint: cards.py",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/cards.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/exceptions.py"
        ],
        "commitId" : "cb4c0cf1e8e8e4cf989bf2d50eccab55683f1211",
        "timestamp" : 1707122693000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pylint: exceptions.py\u000a\u000apySim/exceptions.py:27:4: W0107: Unnecessary pass statement (unnecessary-pass)\u000apySim/exceptions.py:32:4: W0107: Unnecessary pass statement (unnecessary-pass)\u000apySim/exceptions.py:37:4: W0107: Unnecessary pass statement (unnecessary-pass)\u000a\u000aChange-Id: Ibd0725ceb5fdcdc0995c39a4449ada2fd6088552\u000a",
        "date" : "2024-02-05 09:44:53 +0100",
        "id" : "cb4c0cf1e8e8e4cf989bf2d50eccab55683f1211",
        "msg" : "pylint: exceptions.py",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/exceptions.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ota.py"
        ],
        "commitId" : "8e7d28cad725fd393ff4a16d5c80f684502dea0e",
        "timestamp" : 1707122693000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pylint: ota.py\u000a\u000apySim/ota.py:21:0: W0401: Wildcard import construct (wildcard-import)\u000apySim/ota.py:129:8: R1705: Unnecessary \"elif\" after \"return\", remove the leading \"el\" from \"elif\" (no-else-return)\u000apySim/ota.py:150:8: W0107: Unnecessary pass statement (unnecessary-pass)\u000apySim/ota.py:192:8: W0612: Unused variable 'padded_data' (unused-variable)\u000apySim/ota.py:202:8: W0107: Unnecessary pass statement (unnecessary-pass)\u000apySim/ota.py:207:8: W0107: Unnecessary pass statement (unnecessary-pass)\u000apySim/ota.py:210:4: C0103: Method name \"fromKeyset\" doesn't conform to snake_case naming style (invalid-name)\u000apySim/ota.py:239:8: W0107: Unnecessary pass statement (unnecessary-pass)\u000apySim/ota.py:242:4: C0103: Method name \"fromKeyset\" doesn't conform to snake_case naming style (invalid-name)\u000apySim/ota.py:328:4: W0221: Number of parameters was 4 in 'OtaDialect.encode_cmd' and is now 5 in overriding 'OtaDialectSms.encode_cmd' method (arguments-differ)\u000apySim/ota.py:392:4: W0221: Number of parameters was 3 in 'OtaDialect.decode_resp' and is now 4 in overriding 'OtaDialectSms.decode_resp' method (arguments-differ)\u000a\u000aChange-Id: Icb8d690e541dbaf1406085a8446a0c67641fefff\u000a",
        "date" : "2024-02-05 09:44:53 +0100",
        "id" : "8e7d28cad725fd393ff4a16d5c80f684502dea0e",
        "msg" : "pylint: ota.py",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ota.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tests/test_ota.py",
          "tests/test_sms.py",
          "pySim/ota.py",
          "pySim/sms.py"
        ],
        "commitId" : "e8439d96394ca1d2b4273182968f23d652a6497e",
        "timestamp" : 1707123047000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pylint: sms.py\u000a\u000apySim/sms.py:23:0: W0404: Reimport 'Flag' (imported line 23) (reimported)\u000apySim/sms.py:54:4: C0103: Method name \"fromBytes\" doesn't conform to snake_case naming style (invalid-name)\u000apySim/sms.py:60:4: C0103: Method name \"toBytes\" doesn't conform to snake_case naming style (invalid-name)\u000apySim/sms.py:120:4: C0103: Method name \"fromBytes\" doesn't conform to snake_case naming style (invalid-name)\u000apySim/sms.py:132:4: C0103: Method name \"fromSmpp\" doesn't conform to snake_case naming style (invalid-name)\u000apySim/sms.py:137:4: C0103: Method name \"toSmpp\" doesn't conform to snake_case naming style (invalid-name)\u000apySim/sms.py:141:4: C0103: Method name \"toBytes\" doesn't conform to snake_case naming style (invalid-name)\u000apySim/sms.py:188:4: C0103: Method name \"fromBytes\" doesn't conform to snake_case naming style (invalid-name)\u000apySim/sms.py:192:8: W0612: Unused variable 'flags' (unused-variable)\u000apySim/sms.py:209:4: C0103: Method name \"toBytes\" doesn't conform to snake_case naming style (invalid-name)\u000apySim/sms.py:228:4: C0103: Method name \"fromSmpp\" doesn't conform to snake_case naming style (invalid-name)\u000apySim/sms.py:236:4: C0103: Method name \"fromSmppSubmit\" doesn't conform to snake_case naming style (invalid-name)\u000apySim/sms.py:279:4: C0103: Method name \"fromBytes\" doesn't conform to snake_case naming style (invalid-name)\u000apySim/sms.py:306:12: W0107: Unnecessary pass statement (unnecessary-pass)\u000apySim/sms.py:311:12: W0107: Unnecessary pass statement (unnecessary-pass)\u000apySim/sms.py:319:4: C0103: Method name \"toBytes\" doesn't conform to snake_case naming style (invalid-name)\u000apySim/sms.py:339:4: C0103: Method name \"fromSmpp\" doesn't conform to snake_case naming style (invalid-name)\u000apySim/sms.py:347:4: C0103: Method name \"fromSmppSubmit\" doesn't conform to snake_case naming style (invalid-name)\u000apySim/sms.py:373:4: C0103: Method name \"toSmpp\" doesn't conform to snake_case naming style (invalid-nam\u000a\u000aChange-Id: I8082a01443ef568eebda696239572f0af7b56f1b\u000a",
        "date" : "2024-02-05 09:50:47 +0100",
        "id" : "e8439d96394ca1d2b4273182968f23d652a6497e",
        "msg" : "pylint: sms.py",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "tests/test_sms.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ota.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/sms.py"
          },
          {
            "editType" : "edit",
            "file" : "tests/test_ota.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/profile.py"
        ],
        "commitId" : "33cd964c1aed01f3856e4bccf48478963289c559",
        "timestamp" : 1707123054000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pylint: profile.py\u000a\u000apySim/profile.py:169:0: C0325: Unnecessary parens after 'assert' keyword (superfluous-parens)\u000apySim/profile.py:189:8: W0107: Unnecessary pass statement (unnecessary-pass)\u000apySim/profile.py:197:8: W0107: Unnecessary pass statement (unnecessary-pass)\u000apySim/profile.py:27:0: C0411: standard import \"import abc\" should be placed before \"from pySim.commands import SimCardCommands\" (wrong-import-order)\u000apySim/profile.py:28:0: C0411: standard import \"import operator\" should be placed before \"from pySim.commands import SimCardCommands\" (wrong-import-order)\u000apySim/profile.py:29:0: C0411: standard import \"from typing import List\" should be placed before \"from pySim.commands import SimCardCommands\" (wrong-import-order)\u000a\u000aChange-Id: Ifd55e8ab5ab04da06c8d11e50bc15740580b2900\u000a",
        "date" : "2024-02-05 09:50:54 +0100",
        "id" : "33cd964c1aed01f3856e4bccf48478963289c559",
        "msg" : "pylint: profile.py",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/profile.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_31_102_telecom.py"
        ],
        "commitId" : "eb18ed08b075797618fb74d5c748b1d12ead9028",
        "timestamp" : 1707123060000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pylint: ts_31_102_telecom.py\u000a\u000apySim/ts_31_102_telecom.py:45:0: C0325: Unnecessary parens after '=' keyword (superfluous-parens)\u000apySim/ts_31_102_telecom.py:33:0: W0401: Wildcard import construct (wildcard-import)\u000apySim/ts_31_102_telecom.py:76:15: C0121: Comparison 'in_json[srv]['activated'] == True' should be 'in_json[srv]['activated'] is True' if checking for the singleton value True, or 'in_json[srv]['activated']' if testing for truthiness (singleton-comparison)\u000apySim/ts_31_102_telecom.py:85:23: W0612: Unused variable 'sw' (unused-variable)\u000apySim/ts_31_102_telecom.py:124:22: W0612: Unused variable 'sw' (unused-variable)\u000apySim/ts_31_102_telecom.py:32:0: C0411: third party import \"from construct import Optional as COptional\" should be placed before \"from pySim.tlv import *\" (wrong-import-order)\u000apySim/ts_31_102_telecom.py:33:0: C0411: third party import \"from construct import *\" should be placed before \"from pySim.tlv import *\" (wrong-import-order)\u000a\u000aChange-Id: I4ee0d0e1b5b418b8527b4674141cbaef896a64a2\u000a",
        "date" : "2024-02-05 09:51:00 +0100",
        "id" : "eb18ed08b075797618fb74d5c748b1d12ead9028",
        "msg" : "pylint: ts_31_102_telecom.py",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_102_telecom.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/app.py"
        ],
        "commitId" : "6088b554ef12a0bba28f1f43adcc961c53435851",
        "timestamp" : 1707123119000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pylint: app.py\u000a\u000apySim/app.py:113:0: C0305: Trailing newlines (trailing-newlines)\u000apySim/app.py:23:0: W0611: Unused NoCardError imported from pySim.exceptions (unused-import)\u000a\u000aChange-Id: I3cac6892f4d3da66f116cecd49f751da227528a4\u000a",
        "date" : "2024-02-05 09:51:59 +0100",
        "id" : "6088b554ef12a0bba28f1f43adcc961c53435851",
        "msg" : "pylint: app.py",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/app.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/cat.py"
        ],
        "commitId" : "fd9188d306365e9063bf83a2ff21c06873fe3a31",
        "timestamp" : 1707123127000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pylint: cat.py\u000a\u000apySim/cat.py:586:4: W0237: Parameter 'do' has been renamed to 'x' in overriding 'PlmnWactList._from_bytes' method (arguments-renamed)\u000apySim/cat.py:981:8: W0120: Else clause on loop without a break statement, remove the else and de-indent all the code inside it (useless-else-on-loop)\u000apySim/cat.py:1000:4: W0221: Number of parameters was 3 in 'TLV_IE_Collection.from_bytes' and is now 2 in overriding 'ProactiveCommand.from_bytes' method (arguments-differ)\u000apySim/cat.py:1010:12: W0612: Unused variable 'dec' (unused-variable)\u000apySim/cat.py:1010:17: W0612: Unused variable 'remainder' (unused-variable)\u000apySim/cat.py:1022:4: W0221: Number of parameters was 2 in 'TLV_IE_Collection.to_bytes' and is now 1 in overriding 'ProactiveCommand.to_bytes' method (arguments-differ)\u000apySim/cat.py:22:0: C0411: standard import \"from typing import List\" should be placed before \"from bidict import bidict\" (wrong-import-order)\u000apySim/cat.py:26:0: C0411: third party import \"from construct import Int8ub, Int16ub, Byte, Bytes, Bit, Flag, BitsInteger\" should be placed before \"from pySim.utils import b2h, h2b, dec_xplmn_w_act\" (wrong-import-order)\u000apySim/cat.py:27:0: C0411: third party import \"from construct import Struct, Enum, Tell, BitStruct, this, Padding, RepeatUntil\" should be placed before \"from pySim.utils import b2h, h2b, dec_xplmn_w_act\" (wrong-import-order)\u000apySim/cat.py:28:0: C0411: third party import \"from construct import GreedyBytes, Switch, GreedyRange, FlagsEnum\" should be placed before \"from pySim.utils import b2h, h2b, dec_xplmn_w_act\" (wrong-import-order)\u000apySim/cat.py:23:0: W0611: Unused h2b imported from pySim.utils (unused-import)\u000apySim/cat.py:26:0: W0611: Unused Bit imported from construct (unused-import)\u000apySim/cat.py:26:0: W0611: Unused Flag imported from construct (unused-import)\u000apySim/cat.py:27:0: W0611: Unused Tell imported from construct (unused-import)\u000apySim/cat.py:27:0: W0611: Unused Padding imported from construct (unused-import)\u000apySim/cat.py:27:0: W0611: Unused RepeatUntil imported from construct (unused-import)\u000a\u000aChange-Id: I0c6327a7a8045736e8678b7286a7ed685c96fb71\u000a",
        "date" : "2024-02-05 09:52:07 +0100",
        "id" : "fd9188d306365e9063bf83a2ff21c06873fe3a31",
        "msg" : "pylint: cat.py",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/cat.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/gsm_r.py"
        ],
        "commitId" : "f5a8e70f44acafc0d46fe573d5780471e04363d8",
        "timestamp" : 1707123132000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pylint: gsm_r.py\u000a\u000apySim/gsm_r.py:97:0: W0311: Bad indentation. Found 11 spaces, expected 12 (bad-indentation)\u000apySim/gsm_r.py:32:0: C0411: standard import \"from struct import pack, unpack\" should be placed before \"from pySim.utils import *\" (wrong-import-order)\u000apySim/gsm_r.py:33:0: C0411: third party import \"from construct import Struct, Bytes, Int8ub, Int16ub, Int24ub, Int32ub, FlagsEnum\" should be placed before \"from pySim.utils import *\" (wrong-import-order)\u000apySim/gsm_r.py:34:0: C0411: third party import \"from construct import Optional as COptional\" should be placed before \"from pySim.utils import *\" (wrong-import-order)\u000apySim/gsm_r.py:35:0: C0412: Imports from package pySim are not grouped (ungrouped-imports)\u000apySim/gsm_r.py:30:0: W0611: Unused import enum (unused-import)\u000apySim/gsm_r.py:32:0: W0611: Unused pack imported from struct (unused-import)\u000apySim/gsm_r.py:32:0: W0611: Unused unpack imported from struct (unused-import)\u000apySim/gsm_r.py:39:0: W0611: Unused import pySim.ts_51_011 (unused-import)\u000a\u000aChange-Id: I2a3bba5994d0d4d90fcd3f51bee962fec3a8b0dc\u000a",
        "date" : "2024-02-05 09:52:12 +0100",
        "id" : "f5a8e70f44acafc0d46fe573d5780471e04363d8",
        "msg" : "pylint: gsm_r.py",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/gsm_r.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/transport/calypso.py"
        ],
        "commitId" : "c4d80870e88605eaf754802815859f3ad1b5a02c",
        "timestamp" : 1707123137000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pylint: transport/calypso.py\u000a\u000apySim/transport/calypso.py:27:0: W0401: Wildcard import pySim.exceptions (wildcard-import)\u000apySim/transport/calypso.py:61:23: W0622: Redefining built-in 'type' (redefined-builtin)\u000apySim/transport/calypso.py:62:8: R1725: Consider using Python 3 style super() without arguments (super-with-arguments)\u000apySim/transport/calypso.py:73:8: R1725: Consider using Python 3 style super() without arguments (super-with-arguments)\u000apySim/transport/calypso.py:27:0: W0614: Unused import(s) NoCardError and SwMatchError from wildcard import of pySim.exceptions (unused-wildcard-import)\u000a\u000aChange-Id: I6b10d5f3370c00b07288300b537c6f0e17c84a87\u000a",
        "date" : "2024-02-05 09:52:17 +0100",
        "id" : "c4d80870e88605eaf754802815859f3ad1b5a02c",
        "msg" : "pylint: transport/calypso.py",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/transport/calypso.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/transport/modem_atcmd.py"
        ],
        "commitId" : "181becb676f5a769eb67cd7d05b45d5bdb10e400",
        "timestamp" : 1707123144000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pylint: transport/modem_atcmd.py\u000a\u000apySim/transport/modem_atcmd.py:70:0: C0325: Unnecessary parens after 'assert' keyword (superfluous-parens)\u000apySim/transport/modem_atcmd.py:28:0: W0401: Wildcard import pySim.exceptions (wildcard-import)\u000apySim/transport/modem_atcmd.py:60:22: C0123: Use isinstance() rather than type() for a typecheck. (unidiomatic-typecheck)\u000apySim/transport/modem_atcmd.py:72:12: W0707: Consider explicitly re-raising using 'except Exception as exc' and 'raise ReaderError('Failed to send AT command: %s' % cmd) from exc' (raise-missing-from)\u000apySim/transport/modem_atcmd.py:120:12: R1705: Unnecessary \"elif\" after \"return\", remove the leading \"el\" from \"elif\" (no-else-return)\u000apySim/transport/modem_atcmd.py:138:8: W1201: Use lazy % formatting in logging functions (logging-not-lazy)\u000apySim/transport/modem_atcmd.py:170:12: W0707: Consider explicitly re-raising using 'except Exception as exc' and 'raise ReaderError('Failed to parse response from modem: %s' % rsp) from exc' (raise-missing-from)\u000apySim/transport/modem_atcmd.py:168:13: W0612: Unused variable 'rsp_pdu_len' (unused-variable)\u000apySim/transport/modem_atcmd.py:21:0: C0411: standard import \"import time\" should be placed before \"import serial\" (wrong-import-order)\u000apySim/transport/modem_atcmd.py:22:0: C0411: standard import \"import re\" should be placed before \"import serial\" (wrong-import-order)\u000apySim/transport/modem_atcmd.py:23:0: C0411: standard import \"import argparse\" should be placed before \"import serial\" (wrong-import-order)\u000apySim/transport/modem_atcmd.py:24:0: C0411: standard import \"from typing import Optional\" should be placed before \"import serial\" (wrong-import-order)\u000apySim/transport/modem_atcmd.py:28:0: W0614: Unused import(s) NoCardError and SwMatchError from wildcard import of pySim.exceptions (unused-wildcard-import)\u000a\u000aChange-Id: I2c8994eabd973b65132af1030429b1021d0c20df\u000a",
        "date" : "2024-02-05 09:52:24 +0100",
        "id" : "181becb676f5a769eb67cd7d05b45d5bdb10e400",
        "msg" : "pylint: transport/modem_atcmd.py",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/transport/modem_atcmd.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/transport/pcsc.py"
        ],
        "commitId" : "7781c70c09689d2ccfea11d20931a2eff9da2a5f",
        "timestamp" : 1707123149000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pylint: transport/pcsc.py\u000a\u000apySim/transport/pcsc.py:26:0: W0404: Reimport 'CardConnectionException' (imported line 26) (reimported)\u000apySim/transport/pcsc.py:60:4: R1711: Useless return at end of function or method (useless-return)\u000apySim/transport/pcsc.py:74:12: W0707: Consider explicitly re-raising using 'except CardRequestTimeoutException as exc' and 'raise NoCardError() from exc' (raise-missing-from)\u000apySim/transport/pcsc.py:86:12: W0707: Consider explicitly re-raising using 'except CardConnectionException as exc' and 'raise ProtocolError() from exc' (raise-missing-from)\u000apySim/transport/pcsc.py:88:12: W0707: Consider explicitly re-raising using 'except NoCardException as exc' and 'raise NoCardError() from exc' (raise-missing-from)\u000apySim/transport/pcsc.py:22:0: W0611: Unused Union imported from typing (unused-import)\u000a\u000aChange-Id: I0ef440d8825300d6efb8959a67da095ab5623f9c\u000a",
        "date" : "2024-02-05 09:52:29 +0100",
        "id" : "7781c70c09689d2ccfea11d20931a2eff9da2a5f",
        "msg" : "pylint: transport/pcsc.py",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/transport/pcsc.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/transport/serial.py"
        ],
        "commitId" : "fdaefd9a8a8f0496cce40baeafd5ddd6a66bccca",
        "timestamp" : 1707123160000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pylint: transport/serial.py\u000a\u000apySim/transport/serial.py:54:0: C0325: Unnecessary parens after 'if' keyword (superfluous-parens)\u000apySim/transport/serial.py:89:0: C0325: Unnecessary parens after 'if' keyword (superfluous-parens)\u000apySim/transport/serial.py:225:0: C0325: Unnecessary parens after 'while' keyword (superfluous-parens)\u000apySim/transport/serial.py:63:12: R1705: Unnecessary \"else\" after \"return\", remove the \"else\" and de-indent the code inside it (no-else-return)\u000apySim/transport/serial.py:106:8: R1720: Unnecessary \"elif\" after \"raise\", remove the leading \"el\" from \"elif\" (no-else-raise)\u000apySim/transport/serial.py:124:12: W0707: Consider explicitly re-raising using 'except Exception as exc' and 'raise ValueError('Invalid reset pin %s' % self._rst_pin) from exc' (raise-missing-from)\u000apySim/transport/serial.py:204:12: R1723: Unnecessary \"elif\" after \"break\", remove the leading \"el\" from \"elif\" (no-else-break)\u000apySim/transport/serial.py:20:0: C0411: standard import \"import time\" should be placed before \"import serial\" (wrong-import-order)\u000apySim/transport/serial.py:21:0: C0411: standard import \"import os\" should be placed before \"import serial\" (wrong-import-order)\u000apySim/transport/serial.py:22:0: C0411: standard import \"import argparse\" should be placed before \"import serial\" (wrong-import-order)\u000apySim/transport/serial.py:23:0: C0411: standard import \"from typing import Optional\" should be placed before \"import serial\" (wrong-import-order)\u000a\u000aChange-Id: I82ef12492615a18a13cbdecf0371b3a5d02bbd5c\u000a",
        "date" : "2024-02-05 09:52:40 +0100",
        "id" : "fdaefd9a8a8f0496cce40baeafd5ddd6a66bccca",
        "msg" : "pylint: transport/serial.py",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/transport/serial.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/transport/__init__.py"
        ],
        "commitId" : "49d69335b24c6fa1d2553daa5f7f4cf4425ea0eb",
        "timestamp" : 1707123166000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pylint: transport/__init__.py\u000a\u000apySim/transport/__init__.py:139:0: C0325: Unnecessary parens after 'if' keyword (superfluous-parens)\u000a\u000aChange-Id: Ibeeb7d6fde40bb37774bbd09ad185203ac7bcb48\u000a",
        "date" : "2024-02-05 09:52:46 +0100",
        "id" : "49d69335b24c6fa1d2553daa5f7f4cf4425ea0eb",
        "msg" : "pylint: transport/__init__.py",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/transport/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/apdu_source/__init__.py"
        ],
        "commitId" : "c5ff0a6ab57156f88d9728fb49a2450408f6c4e9",
        "timestamp" : 1707123172000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pylint: apdu_source/__init__.py\u000a\u000apySim/apdu_source/__init__.py:1:0: C0114: Missing module docstring (missing-module-docstring)\u000apySim/apdu_source/__init__.py:17:8: W0107: Unnecessary pass statement (unnecessary-pass)\u000apySim/apdu_source/__init__.py:34:16: W0133: Exception statement has no effect (pointless-exception-statement)\u000a\u000aChange-Id: Iec552afd6004b849132132642910a4c7f91e3473\u000a",
        "date" : "2024-02-05 09:52:52 +0100",
        "id" : "c5ff0a6ab57156f88d9728fb49a2450408f6c4e9",
        "msg" : "pylint: apdu_source/__init__.py",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/apdu_source/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/apdu_source/gsmtap.py"
        ],
        "commitId" : "528d9225100724a928b71d2974775adc8754fd89",
        "timestamp" : 1707123178000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pylint: apdu_source/gsmtap.py\u000a\u000apySim/apdu_source/gsmtap.py:48:8: R1705: Unnecessary \"elif\" after \"return\", remove the leading \"el\" from \"elif\" (no-else-return)\u000apySim/apdu_source/gsmtap.py:44:20: W0612: Unused variable 'addr' (unused-variable)\u000apySim/apdu_source/gsmtap.py:22:0: C0411: first party import \"from pySim.apdu.ts_102_221 import ApduCommands as UiccApduCommands\" should be placed before \"from . import ApduSource, PacketType, CardReset\" (wrong-import-order)\u000apySim/apdu_source/gsmtap.py:23:0: C0411: first party import \"from pySim.apdu.ts_31_102 import ApduCommands as UsimApduCommands\" should be placed before \"from . import ApduSource, PacketType, CardReset\" (wrong-import-order)\u000apySim/apdu_source/gsmtap.py:24:0: C0411: first party import \"from pySim.apdu.global_platform import ApduCommands as GpApduCommands\" should be placed before \"from . import ApduSource, PacketType, CardReset\" (wrong-import-order)\u000apySim/apdu_source/gsmtap.py:19:0: W0611: Unused GsmtapMessage imported from pySim.gsmtap (unused-import)\u000a\u000aChange-Id: I672e8838ebe11015863fd4fd6047181a3f184658\u000a",
        "date" : "2024-02-05 09:52:58 +0100",
        "id" : "528d9225100724a928b71d2974775adc8754fd89",
        "msg" : "pylint: apdu_source/gsmtap.py",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/apdu_source/gsmtap.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/apdu_source/pyshark_gsmtap.py"
        ],
        "commitId" : "9bc016e7770fa774695ad35fe8390d85ccc5a755",
        "timestamp" : 1707123186000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pylint: apdu_source/pyshark_gsmtap\u000a\u000apySim/apdu_source/pyshark_gsmtap.py:90:0: C0305: Trailing newlines (trailing-newlines)\u000apySim/apdu_source/pyshark_gsmtap.py:68:8: R1705: Unnecessary \"elif\" after \"return\", remove the leading \"el\" from \"elif\" (no-else-return)\u000apySim/apdu_source/pyshark_gsmtap.py:30:0: C0411: first party import \"from pySim.apdu.ts_102_221 import ApduCommands as UiccApduCommands\" should be placed before \"from . import ApduSource, PacketType, CardReset\" (wrong-import-order)\u000apySim/apdu_source/pyshark_gsmtap.py:31:0: C0411: first party import \"from pySim.apdu.ts_31_102 import ApduCommands as UsimApduCommands\" should be placed before \"from . import ApduSource, PacketType, CardReset\" (wrong-import-order)\u000apySim/apdu_source/pyshark_gsmtap.py:32:0: C0411: first party import \"from pySim.apdu.global_platform import ApduCommands as GpApduCommands\" should be placed before \"from . import ApduSource, PacketType, CardReset\" (wrong-import-order)\u000apySim/apdu_source/pyshark_gsmtap.py:19:0: W0611: Unused import sys (unused-import)\u000apySim/apdu_source/pyshark_gsmtap.py:21:0: W0611: Unused pprint imported from pprint as pp (unused-import)\u000apySim/apdu_source/pyshark_gsmtap.py:25:0: W0611: Unused b2h imported from pySim.utils (unused-import)\u000apySim/apdu_source/pyshark_gsmtap.py:26:0: W0611: Unused Tpdu imported from pySim.apdu (unused-import)\u000a\u000aChange-Id: I0f2bfed2f671e02fc48bcc2a03c785edc691584f\u000a",
        "date" : "2024-02-05 09:53:06 +0100",
        "id" : "9bc016e7770fa774695ad35fe8390d85ccc5a755",
        "msg" : "pylint: apdu_source/pyshark_gsmtap",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/apdu_source/pyshark_gsmtap.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/apdu_source/pyshark_rspro.py"
        ],
        "commitId" : "295d4a490707c459c726374f6ee0da8afb5ec514",
        "timestamp" : 1707123192000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pylint: apdu_source/pyshark_rspro\u000a\u000apySim/apdu_source/pyshark_rspro.py:19:0: W0611: Unused import sys (unused-import)\u000apySim/apdu_source/pyshark_rspro.py:21:0: W0611: Unused pprint imported from pprint as pp (unused-import)\u000apySim/apdu_source/pyshark_rspro.py:25:0: W0611: Unused b2h imported from pySim.utils (unused-import)\u000a\u000aChange-Id: Ibe8482d8adbb82a74f36b0d64bc5dae27da02b73\u000a",
        "date" : "2024-02-05 09:53:12 +0100",
        "id" : "295d4a490707c459c726374f6ee0da8afb5ec514",
        "msg" : "pylint: apdu_source/pyshark_rspro",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/apdu_source/pyshark_rspro.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/apdu/ts_31_102.py"
        ],
        "commitId" : "0930bcbbb7923acff5587afdfee3d0ee2416e4ec",
        "timestamp" : 1707123196000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pylint: apdu/ts_31_102.py\u000a\u000apySim/apdu/ts_31_102.py:12:0: W0401: Wildcard import construct (wildcard-import)\u000apySim/apdu/ts_31_102.py:38:0: W0404: Reimport 'ApduCommand' (imported line 18) (reimported)\u000apySim/apdu/ts_31_102.py:38:0: W0404: Reimport 'ApduCommandSet' (imported line 18) (reimported)\u000a\u000aChange-Id: I191147af95142adcd7d768d7dae6480b0c7513fc\u000a",
        "date" : "2024-02-05 09:53:16 +0100",
        "id" : "0930bcbbb7923acff5587afdfee3d0ee2416e4ec",
        "msg" : "pylint: apdu/ts_31_102.py",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/apdu/ts_31_102.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/apdu/__init__.py"
        ],
        "commitId" : "9ef65099d26008c631d33dd4dd217e0808052962",
        "timestamp" : 1707123201000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pylint: apdu/__init__.py\u000a\u000apySim/apdu/__init__.py:41:0: W0105: String statement has no effect (pointless-string-statement)\u000apySim/apdu/__init__.py:55:4: C0204: Metaclass class method __new__ should have 'mcs' as first argument (bad-mcs-classmethod-argument)\u000apySim/apdu/__init__.py:187:8: R1705: Unnecessary \"elif\" after \"return\", remove the leading \"el\" from \"elif\" (no-else-return)\u000apySim/apdu/__init__.py:200:8: R1705: Unnecessary \"else\" after \"return\", remove the \"else\" and de-indent the code inside it (no-else-return)\u000apySim/apdu/__init__.py:208:8: R1705: Unnecessary \"else\" after \"return\", remove the \"else\" and de-indent the code inside it (no-else-return)\u000apySim/apdu/__init__.py:216:8: R1705: Unnecessary \"else\" after \"return\", remove the \"else\" and de-indent the code inside it (no-else-return)\u000apySim/apdu/__init__.py:224:8: R1705: Unnecessary \"else\" after \"return\", remove the \"else\" and de-indent the code inside it (no-else-return)\u000apySim/apdu/__init__.py:239:11: C0117: Consider changing \"not 'p1' in self.cmd_dict\" to \"'p1' not in self.cmd_dict\" (unnecessary-negation)\u000apySim/apdu/__init__.py:295:8: R1705: Unnecessary \"else\" after \"return\", remove the \"else\" and de-indent the code inside it (no-else-return)\u000apySim/apdu/__init__.py:313:8: R1705: Unnecessary \"else\" after \"return\", remove the \"else\" and de-indent the code inside it (no-else-return)\u000apySim/apdu/__init__.py:416:8: R1705: Unnecessary \"else\" after \"return\", remove the \"else\" and de-indent the code inside it (no-else-return)\u000apySim/apdu/__init__.py:429:12: R1705: Unnecessary \"else\" after \"return\", remove the \"else\" and de-indent the code inside it (no-else-return)\u000apySim/apdu/__init__.py:455:8: R1705: Unnecessary \"else\" after \"return\", remove the \"else\" and de-indent the code inside it (no-else-return)\u000apySim/apdu/__init__.py:31:0: C0411: standard import \"import typing\" should be placed before \"from termcolor import colored\" (wrong-import-order)\u000apySim/apdu/__init__.py:32:0: C0411: standard import \"from typing import List, Dict, Optional\" should be placed before \"from termcolor import colored\" (wrong-import-order)\u000a\u000aChange-Id: I5657912df474f3ed0e277458a8eb33e28aeb2927\u000a",
        "date" : "2024-02-05 09:53:21 +0100",
        "id" : "9ef65099d26008c631d33dd4dd217e0808052962",
        "msg" : "pylint: apdu/__init__.py",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/apdu/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/bsp.py"
        ],
        "commitId" : "e6e74229c9bba2f6eebe118a2f4626e9f4110dd1",
        "timestamp" : 1707123206000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pylint: pySim/esim/bsp.py\u000a\u000apySim/esim/bsp.py:1:0: C0114: Missing module docstring (missing-module-docstring)\u000apySim/esim/bsp.py:28:0: C0413: Import \"import abc\" should be placed at the top of the module (wrong-import-position)\u000apySim/esim/bsp.py:29:0: C0413: Import \"from typing import List\" should be placed at the top of the module (wrong-import-position)\u000apySim/esim/bsp.py:30:0: C0413: Import \"import logging\" should be placed at the top of the module (wrong-import-position)\u000apySim/esim/bsp.py:33:0: C0413: Import \"from cryptography.hazmat.primitives import hashes\" should be placed at the top of the module (wrong-import-position)\u000apySim/esim/bsp.py:34:0: C0413: Import \"from cryptography.hazmat.primitives.kdf.x963kdf import X963KDF\" should be placed at the top of the module (wrong-import-position)\u000apySim/esim/bsp.py:36:0: C0413: Import \"from Cryptodome.Cipher import AES\" should be placed at the top of the module (wrong-import-position)\u000apySim/esim/bsp.py:37:0: C0413: Import \"from Cryptodome.Hash import CMAC\" should be placed at the top of the module (wrong-import-position)\u000apySim/esim/bsp.py:39:0: C0413: Import \"from pySim.utils import bertlv_encode_len, bertlv_parse_one, b2h\" should be placed at the top of the module (wrong-import-position)\u000apySim/esim/bsp.py:48:55: W0613: Unused argument 'padding' (unused-argument)\u000apySim/esim/bsp.py:55:45: W0613: Unused argument 'multiple' (unused-argument)\u000apySim/esim/bsp.py:84:8: W0107: Unnecessary pass statement (unnecessary-pass)\u000apySim/esim/bsp.py:89:8: W0107: Unnecessary pass statement (unnecessary-pass)\u000apySim/esim/bsp.py:94:8: W0107: Unnecessary pass statement (unnecessary-pass)\u000apySim/esim/bsp.py:169:8: W0107: Unnecessary pass statement (unnecessary-pass)\u000apySim/esim/bsp.py:292:8: W0612: Unused variable 'tdict' (unused-variable)\u000apySim/esim/bsp.py:292:15: W0612: Unused variable 'l' (unused-variable)\u000apySim/esim/bsp.py:292:23: W0612: Unused variable 'remain' (unused-variable)\u000a\u000aChange-Id: I64bd634606c375e767676a4b5ba7c2cc042350c2\u000a",
        "date" : "2024-02-05 09:53:26 +0100",
        "id" : "e6e74229c9bba2f6eebe118a2f4626e9f4110dd1",
        "msg" : "pylint: pySim/esim/bsp.py",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/bsp.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/x509_cert.py"
        ],
        "commitId" : "f235b799e96f2ac07dfcbb8de4a0a9be62952599",
        "timestamp" : 1707123210000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pylint: esim/x509_cert.py\u000a\u000apySim/esim/x509_cert.py:70:4: W0107: Unnecessary pass statement (unnecessary-pass)\u000apySim/esim/x509_cert.py:91:20: C0123: Use isinstance() rather than type() for a typecheck. (unidiomatic-typecheck)\u000apySim/esim/x509_cert.py:105:28: W3101: Missing timeout argument for method 'requests.get' can cause your program to hang indefinitely (missing-timeout)\u000apySim/esim/x509_cert.py:163:0: C0413: Import \"from cryptography.hazmat.primitives.asymmetric.utils import decode_dss_signature\" should be placed at the top of the module (wrong-import-position)\u000apySim/esim/x509_cert.py:20:0: C0411: standard import \"from typing import Optional, List\" should be placed before \"import requests\" (wrong-import-order)\u000apySim/esim/x509_cert.py:163:0: C0411: third party import \"from cryptography.hazmat.primitives.asymmetric.utils import decode_dss_signature\" should be placed before \"from pySim.utils import b2h\" (wrong-import-order)\u000apySim/esim/x509_cert.py:163:0: C0412: Imports from package cryptography are not grouped (ungrouped-imports)\u000apySim/esim/x509_cert.py:22:0: W0611: Unused padding imported from cryptography.hazmat.primitives.asymmetric (unused-import)\u000apySim/esim/x509_cert.py:24:0: W0611: Unused InvalidSignature imported from cryptography.exceptions (unused-import)\u000a\u000aChange-Id: Ic435c9a7cfcc18cacec3a3d872925bd737fb5cd9\u000a",
        "date" : "2024-02-05 09:53:30 +0100",
        "id" : "f235b799e96f2ac07dfcbb8de4a0a9be62952599",
        "msg" : "pylint: esim/x509_cert.py",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/x509_cert.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/rsp.py"
        ],
        "commitId" : "2b84644c0827b3a0511d6c4078d32689c044dac2",
        "timestamp" : 1707123215000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pylint: esim/rsp.py\u000a\u000apySim/esim/rsp.py:101:4: W0107: Unnecessary pass statement (unnecessary-pass)\u000apySim/esim/rsp.py:27:0: C0411: standard import \"from collections.abc import MutableMapping\" should be placed before \"from cryptography.hazmat.primitives.asymmetric import ec\" (wrong-import-order)\u000apySim/esim/rsp.py:22:0: W0611: Unused import copyreg (unused-import)\u000apySim/esim/rsp.py:27:0: W0611: Unused MutableMapping imported from collections.abc (unused-import)\u000a\u000aChange-Id: Id87dbf82cd41ce6e5276e5bdd7af1877d77e3fab\u000a",
        "date" : "2024-02-05 09:53:35 +0100",
        "id" : "2b84644c0827b3a0511d6c4078d32689c044dac2",
        "msg" : "pylint: esim/rsp.py",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/rsp.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/personalization.py"
        ],
        "commitId" : "1258e464a1ac50c9eb32ea1d532f0d22c764af66",
        "timestamp" : 1707123220000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pylint: esim/saip/personalization.py\u000a\u000apySim/esim/saip/personalization.py:104:0: W0311: Bad indentation. Found 17 spaces, expected 16 (bad-indentation)\u000apySim/esim/saip/personalization.py:105:0: W0311: Bad indentation. Found 17 spaces, expected 16 (bad-indentation)\u000apySim/esim/saip/personalization.py:151:0: C0305: Trailing newlines (trailing-newlines)\u000apySim/esim/saip/personalization.py:36:4: C0204: Metaclass class method __new__ should have 'mcs' as first argument (bad-mcs-classmethod-argument)\u000apySim/esim/saip/personalization.py:56:4: W0237: Parameter 'pe_seq' has been renamed to 'pes' in overriding 'Iccid.apply' method (arguments-renamed)\u000apySim/esim/saip/personalization.py:19:0: W0611: Unused Optional imported from typing (unused-import)\u000a\u000aChange-Id: I70b3e266bbafabbfcec3d48027d50b45c2c17809\u000a",
        "date" : "2024-02-05 09:53:40 +0100",
        "id" : "1258e464a1ac50c9eb32ea1d532f0d22c764af66",
        "msg" : "pylint: esim/saip/personalization.py",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/personalization.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/templates.py"
        ],
        "commitId" : "5f6b64dc2591ee4fb47c31d2aa4cfc5fbbad9761",
        "timestamp" : 1707123225000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pylint: esim/saip/templates.py\u000a\u000apySim/esim/saip/templates.py:106:0: R1707: Disallow trailing comma tuple (trailing-comma-tuple)\u000apySim/esim/saip/templates.py:56:37: C0121: Comparison 'self.fid != None' should be 'self.fid is not None' (singleton-comparison)\u000apySim/esim/saip/templates.py:57:28: C0121: Comparison 'self.arr != None' should be 'self.arr is not None' (singleton-comparison)\u000apySim/esim/saip/templates.py:58:37: C0121: Comparison 'self.sfi != None' should be 'self.sfi is not None' (singleton-comparison)\u000apySim/esim/saip/templates.py:96:11: C0123: Use isinstance() rather than type() for a typecheck. (unidiomatic-typecheck)\u000apySim/esim/saip/templates.py:591:0: W1404: Implicit string concatenation found in list (implicit-str-concat)\u000a\u000aChange-Id: I181578ba630c8bdb558297e990411b59593652a0\u000a",
        "date" : "2024-02-05 09:53:45 +0100",
        "id" : "5f6b64dc2591ee4fb47c31d2aa4cfc5fbbad9761",
        "msg" : "pylint: esim/saip/templates.py",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/templates.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/oid.py"
        ],
        "commitId" : "530bf73cbcd7af3bfdf957d22e13690de935dc1a",
        "timestamp" : 1707123230000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pylint: esim/saip/oid.py\u000a\u000apySim/esim/saip/oid.py:30:11: C0123: Use isinstance() rather than type() for a typecheck. (unidiomatic-typecheck)\u000apySim/esim/saip/oid.py:46:11: C0123: Use isinstance() rather than type() for a typecheck. (unidiomatic-typecheck)\u000a\u000aChange-Id: I65c9cd1bb2b6a1747a7fbb25052adc75605bc870\u000a",
        "date" : "2024-02-05 09:53:50 +0100",
        "id" : "530bf73cbcd7af3bfdf957d22e13690de935dc1a",
        "msg" : "pylint: esim/saip/oid.py",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/oid.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/global_platform/scp.py"
        ],
        "commitId" : "4c0b80415ea9f19f07600923db862952f63642c3",
        "timestamp" : 1707123234000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pylint: global_platform/scp.py\u000a\u000apySim/global_platform/scp.py:27:0: W0404: Reimport 'Optional' (imported line 20) (reimported)\u000apySim/global_platform/scp.py:157:8: R1705: Unnecessary \"else\" after \"return\", remove the \"else\" and de-indent the code inside it (no-else-return)\u000apySim/global_platform/scp.py:165:8: W0107: Unnecessary pass statement (unnecessary-pass)\u000apySim/global_platform/scp.py:182:8: R1705: Unnecessary \"else\" after \"return\", remove the \"else\" and de-indent the code inside it (no-else-return)\u000apySim/global_platform/scp.py:189:8: R1705: Unnecessary \"else\" after \"return\", remove the \"else\" and de-indent the code inside it (no-else-return)\u000apySim/global_platform/scp.py:266:4: W0221: Variadics removed in overriding 'SCP02._wrap_cmd_apdu' method (arguments-differ)\u000apySim/global_platform/scp.py:298:4: W0237: Parameter 'rsp_apdu' has been renamed to 'apdu' in overriding 'SCP02.unwrap_rsp_apdu' method (arguments-renamed)\u000apySim/global_platform/scp.py:314:7: C0121: Comparison 'l == None' should be 'l is None' (singleton-comparison)\u000apySim/global_platform/scp.py:436:11: C0121: Comparison 'host_challenge == None' should be 'host_challenge is None' (singleton-comparison)\u000apySim/global_platform/scp.py:506:4: W0237: Parameter 'rsp_apdu' has been renamed to 'apdu' in overriding 'SCP03.unwrap_rsp_apdu' method (arguments-renamed)\u000apySim/global_platform/scp.py:27:0: C0411: standard import \"from typing import Optional\" should be placed before \"from Cryptodome.Cipher import DES3, DES\" (wrong-import-order)\u000a\u000aChange-Id: Idd2b779a6628c88d9a48c94b8581525209824426\u000a",
        "date" : "2024-02-05 09:53:54 +0100",
        "id" : "4c0b80415ea9f19f07600923db862952f63642c3",
        "msg" : "pylint: global_platform/scp.py",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/global_platform/scp.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/cdma_ruim.py"
        ],
        "commitId" : "4f3976d77f53967c17ff5e173641970ecc83d5db",
        "timestamp" : 1707123239000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pylint: cdma_ruim.py\u000a\u000apySim/cdma_ruim.py:30:0: W0401: Wildcard import construct (wildcard-import)\u000apySim/cdma_ruim.py:188:4: W0237: Parameter 'data_hex' has been renamed to 'resp_hex' in overriding 'CardProfileRUIM.decode_select_response' method (arguments-renamed)\u000apySim/cdma_ruim.py:30:0: C0411: third party import \"from construct import *\" should be placed before \"from pySim.utils import *\" (wrong-import-order)\u000a\u000aChange-Id: I4c384f37a6a317c6eddef8742572fcfa76a5fc20\u000a",
        "date" : "2024-02-05 09:53:59 +0100",
        "id" : "4f3976d77f53967c17ff5e173641970ecc83d5db",
        "msg" : "pylint: cdma_ruim.py",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/cdma_ruim.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/sysmocom_sja2.py"
        ],
        "commitId" : "0d9c8f73a8225ec08b394a9ad596389db0072424",
        "timestamp" : 1707123343000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pylint: sysmocom_sja2.py\u000a\u000apySim/sysmocom_sja2.py:20:0: W0401: Wildcard import pytlv.TLV (wildcard-import)\u000apySim/sysmocom_sja2.py:27:0: W0401: Wildcard import construct (wildcard-import)\u000apySim/sysmocom_sja2.py:21:0: C0411: standard import \"from struct import pack, unpack\" should be placed before \"from pytlv.TLV import *\" (wrong-import-order)\u000apySim/sysmocom_sja2.py:27:0: C0411: third party import \"from construct import *\" should be placed before \"from pySim.utils import *\" (wrong-import-order)\u000apySim/sysmocom_sja2.py:21:0: W0611: Unused pack imported from struct (unused-import)\u000apySim/sysmocom_sja2.py:25:0: W0611: Unused CardProfileUICC imported from pySim.ts_102_221 (unused-import)\u000a\u000aChange-Id: I0e5b5c6f3179f9710464af4cba91d682412b8a09\u000a",
        "date" : "2024-02-05 09:55:43 +0100",
        "id" : "0d9c8f73a8225ec08b394a9ad596389db0072424",
        "msg" : "pylint: sysmocom_sja2.py",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/sysmocom_sja2.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_31_102.py"
        ],
        "commitId" : "4b56c6cd3e494fc566deb187d8ab866e5998a0ff",
        "timestamp" : 1707123350000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pylint: ts_31_102.py\u000a\u000aChange-Id: I5b72ad476d338aa4048bb15a74796ef69191f028\u000a",
        "date" : "2024-02-05 09:55:50 +0100",
        "id" : "4b56c6cd3e494fc566deb187d8ab866e5998a0ff",
        "msg" : "pylint: ts_31_102.py",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_102.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/apdu/ts_102_221.py"
        ],
        "commitId" : "a5630dc45c23d395144728c522c59af496864dc3",
        "timestamp" : 1707123356000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pylint: apdu/ts_102_221.py\u000a\u000apySim/apdu/ts_102_221.py:60:16: R1724: Unnecessary \"else\" after \"continue\", remove the \"else\" and de-indent the code inside it (no-else-continue)\u000apySim/apdu/ts_102_221.py:107:16: W0107: Unnecessary pass statement (unnecessary-pass)\u000apySim/apdu/ts_102_221.py:294:8: R1703: The if statement can be replaced with 'return bool(test)' (simplifiable-if-statement)\u000apySim/apdu/ts_102_221.py:294:8: R1705: Unnecessary \"else\" after \"return\", remove the \"else\" and de-indent the code inside it (no-else-return)\u000apySim/apdu/ts_102_221.py:299:31: W0613: Unused argument 'lchan' (unused-argument)\u000a...\u000apySim/apdu/ts_102_221.py:389:8: R1705: Unnecessary \"elif\" after \"return\", remove the leading \"el\" from \"elif\" (no-else-return)\u000apySim/apdu/ts_102_221.py:421:8: R1705: Unnecessary \"elif\" after \"return\", remove the leading \"el\" from \"elif\" (no-else-return)\u000apySim/apdu/ts_102_221.py:425:12: R1705: Unnecessary \"elif\" after \"return\", remove the leading \"el\" from \"elif\" (no-else-return)\u000apySim/apdu/ts_102_221.py:438:8: R1705: Unnecessary \"else\" after \"return\", remove the \"else\" and de-indent the code inside it (no-else-return)\u000apySim/apdu/ts_102_221.py:26:0: C0411: standard import \"from typing import Optional, Dict, Tuple\" should be placed before \"from construct import GreedyRange, Struct\" (wrong-import-order)\u000a\u000aChange-Id: Id5caac8da4c965dbaf88d624cdc9dcc8fc168b8c\u000a",
        "date" : "2024-02-05 09:55:56 +0100",
        "id" : "a5630dc45c23d395144728c522c59af496864dc3",
        "msg" : "pylint: apdu/ts_102_221.py",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/apdu/ts_102_221.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_102_221.py"
        ],
        "commitId" : "a5fafe8b4857cbecb1bce8b47df2acf5712216d7",
        "timestamp" : 1707123362000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pylint: ts_102_221.py\u000a\u000apySim/ts_102_221.py:20:0: W0622: Redefining built-in 'BlockingIOError' (redefined-builtin)\u000apySim/ts_102_221.py:30:0: R0402: Use 'from pySim import iso7816_4' instead (consider-using-from-import)\u000apySim/ts_102_221.py:20:0: W0401: Wildcard import construct (wildcard-import)\u000apySim/ts_102_221.py:235:8: R1705: Unnecessary \"elif\" after \"return\", remove the leading \"el\" from \"elif\" (no-else-return)\u000apySim/ts_102_221.py:272:8: R1705: Unnecessary \"else\" after \"return\", remove the \"else\" and de-indent the code inside it (no-else-return)\u000apySim/ts_102_221.py:281:8: R1705: Unnecessary \"else\" after \"return\", remove the \"else\" and de-indent the code inside it (no-else-return)\u000apySim/ts_102_221.py:484:12: W0715: Exception arguments suggest string formatting might be intended (raising-format-tuple)\u000apySim/ts_102_221.py:486:12: W0715: Exception arguments suggest string formatting might be intended (raising-format-tuple)\u000apySim/ts_102_221.py:488:12: W0715: Exception arguments suggest string formatting might be intended (raising-format-tuple)\u000apySim/ts_102_221.py:523:11: C1802: Do not use `len(SEQUENCE)` without comparison to determine if a sequence is empty (use-implicit-booleaness-not-len)\u000apySim/ts_102_221.py:647:0: W0613: Unused argument 'kwargs' (unused-argument)\u000apySim/ts_102_221.py:747:19: W0612: Unused variable 'sw' (unused-variable)\u000apySim/ts_102_221.py:26:0: C0411: third party import \"from bidict import bidict\" should be placed before \"from pySim.construct import *\" (wrong-import-order)\u000apySim/ts_102_221.py:27:0: C0412: Imports from package pySim are not grouped (ungrouped-imports)\u000apySim/ts_102_221.py:29:0: W0611: Unused match_sim imported from pySim.profile (unused-import)\u000apySim/ts_102_221.py:34:0: W0611: Unused DF_GSM imported from pySim.ts_51_011 (unused-import)\u000apySim/ts_102_221.py:34:0: W0611: Unused DF_TELECOM imported from pySim.ts_51_011 (unused-import)\u000a\u000aChange-Id: I99d408bdf2551527f097a04240e857728b738621\u000a",
        "date" : "2024-02-05 09:56:02 +0100",
        "id" : "a5fafe8b4857cbecb1bce8b47df2acf5712216d7",
        "msg" : "pylint: ts_102_221.py",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_102_221.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ara_m.py"
        ],
        "commitId" : "f01c4b2c989999bde8c16ea0b572884b193fd16f",
        "timestamp" : 1707128856000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pylint: ara_m.py\u000a\u000apySim/ara_m.py:29:0: W0622: Redefining built-in 'BlockingIOError' (redefined-builtin)\u000apySim/ara_m.py:29:0: W0401: Wildcard import construct (wildcard-import)\u000apySim/ara_m.py:68:12: R1705: Unnecessary \"elif\" after \"return\", remove the leading \"el\" from \"elif\" (no-else-return)\u000apySim/ara_m.py:89:12: R1705: Unnecessary \"elif\" after \"return\", remove the leading \"el\" from \"elif\" (no-else-return)\u000apySim/ara_m.py:282:12: R1705: Unnecessary \"else\" after \"return\", remove the \"else\" and de-indent the code inside it (no-else-return)\u000apySim/ara_m.py:280:15: W0612: Unused variable 'sw' (unused-variable)\u000apySim/ara_m.py:312:34: W0613: Unused argument 'opts' (unused-argument)\u000apySim/ara_m.py:318:37: W0613: Unused argument 'opts' (unused-argument)\u000apySim/ara_m.py:356:15: C0121: Comparison 'opts.aid != None' should be 'opts.aid is not None' (singleton-comparison)\u000apySim/ara_m.py:385:37: W0613: Unused argument 'opts' (unused-argument)\u000apySim/ara_m.py:309:8: W0238: Unused private member `AddlShellCommands.__init(self)` (unused-private-member)\u000apySim/ara_m.py:309:8: W0238: Unused private member `ADF_ARAM.AddlShellCommands.__init(self)` (unused-private-member)\u000a\u000aChange-Id: I5a739187a8966cdb0ae5c6cbc7bc5d4115433aeb\u000a",
        "date" : "2024-02-05 11:27:36 +0100",
        "id" : "f01c4b2c989999bde8c16ea0b572884b193fd16f",
        "msg" : "pylint: ara_m.py",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ara_m.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/runtime.py"
        ],
        "commitId" : "356a6c0f99109dec7e0e1c07755deb55dc00fa2e",
        "timestamp" : 1707128856000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pylint: runtime.py\u000a\u000apySim/runtime.py:272:0: C0325: Unnecessary parens after 'raise' keyword (superfluous-parens)\u000apySim/runtime.py:276:0: C0325: Unnecessary parens after 'if' keyword (superfluous-parens)\u000apySim/runtime.py:280:0: C0325: Unnecessary parens after 'if' keyword (superfluous-parens)\u000apySim/runtime.py:349:0: C0325: Unnecessary parens after 'raise' keyword (superfluous-parens)\u000apySim/runtime.py:549:0: C0305: Trailing newlines (trailing-newlines)\u000apySim/runtime.py:29:4: R1705: Unnecessary \"elif\" after \"return\", remove the leading \"el\" from \"elif\" (no-else-return)\u000apySim/runtime.py:119:16: W0612: Unused variable 'data' (unused-variable)\u000apySim/runtime.py:153:8: R1705: Unnecessary \"else\" after \"return\", remove the \"else\" and de-indent the code inside it (no-else-return)\u000apySim/runtime.py:161:8: R1705: Unnecessary \"else\" after \"return\", remove the \"else\" and de-indent the code inside it (no-else-return)\u000apySim/runtime.py:212:8: R1705: Unnecessary \"else\" after \"return\", remove the \"else\" and de-indent the code inside it (no-else-return)\u000apySim/runtime.py:273:12: W0707: Consider explicitly re-raising using 'raise RuntimeError('%s: %s - %s' % (swm.sw_actual, k[0], k[1])) from swm' (raise-missing-from)\u000apySim/runtime.py:267:19: W0612: Unused variable 'sw' (unused-variable)\u000apySim/runtime.py:343:27: W0612: Unused variable 'sw' (unused-variable)\u000apySim/runtime.py:397:15: W0612: Unused variable 'sw' (unused-variable)\u000apySim/runtime.py:527:14: W0612: Unused variable 'sw' (unused-variable)\u000apySim/runtime.py:528:8: W0612: Unused variable 'tag' (unused-variable)\u000apySim/runtime.py:528:13: W0612: Unused variable 'length' (unused-variable)\u000apySim/runtime.py:528:28: W0612: Unused variable 'remainder' (unused-variable)\u000a\u000aChange-Id: I2e164dbaa2070116bed3bac63b0fa5b8aa5b1331\u000a",
        "date" : "2024-02-05 11:27:36 +0100",
        "id" : "356a6c0f99109dec7e0e1c07755deb55dc00fa2e",
        "msg" : "pylint: runtime.py",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/runtime.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/euicc.py"
        ],
        "commitId" : "09f9663005b9656e5b72af13b9f0c8ea320767e3",
        "timestamp" : 1707133074000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pylint: pySim/euicc.py\u000a\u000apySim/euicc.py:27:0: W0622: Redefining built-in 'BlockingIOError' (redefined-builtin)\u000apySim/euicc.py:27:0: W0401: Wildcard import construct (wildcard-import)\u000apySim/euicc.py:37:7: C0123: Use isinstance() rather than type() for a typecheck. (unidiomatic-typecheck)\u000apySim/euicc.py:47:9: C0123: Use isinstance() rather than type() for a typecheck. (unidiomatic-typecheck)\u000apySim/euicc.py:337:12: R1705: Unnecessary \"else\" after \"return\", remove the \"else\" and de-indent the code inside it (no-else-return)\u000apySim/euicc.py:325:63: W0613: Unused argument 'exp_sw' (unused-argument)\u000apySim/euicc.py:335:15: W0612: Unused variable 'sw' (unused-variable)\u000apySim/euicc.py:361:13: W0612: Unused variable 'data' (unused-variable)\u000apySim/euicc.py:361:19: W0612: Unused variable 'sw' (unused-variable)\u000apySim/euicc.py:363:52: W0613: Unused argument 'opts' (unused-argument)\u000apySim/euicc.py:380:41: W0613: Unused argument 'opts' (unused-argument)\u000apySim/euicc.py:386:37: W0613: Unused argument 'opts' (unused-argument)\u000apySim/euicc.py:392:37: W0613: Unused argument 'opts' (unused-argument)\u000apySim/euicc.py:398:39: W0613: Unused argument 'opts' (unused-argument)\u000apySim/euicc.py:415:39: W0613: Unused argument 'opts' (unused-argument)\u000apySim/euicc.py:478:29: W0613: Unused argument 'opts' (unused-argument)\u000apySim/euicc.py:480:13: W0612: Unused variable 'data' (unused-variable)\u000apySim/euicc.py:480:19: W0612: Unused variable 'sw' (unused-variable)\u000apySim/euicc.py:500:31: W0613: Unused argument 'opts' (unused-argument)\u000apySim/euicc.py:506:48: W0613: Unused argument 'opts' (unused-argument)\u000apySim/euicc.py:26:0: C0411: third party import \"from construct import Optional as COptional\" should be placed before \"from pySim.tlv import *\" (wrong-import-order)\u000apySim/euicc.py:27:0: C0411: third party import \"from construct import *\" should be placed before \"from pySim.tlv import *\" (wrong-import-order)\u000apySim/euicc.py:28:0: C0411: standard import \"import argparse\" should be placed before \"from construct import Optional as COptional\" (wrong-import-order)\u000apySim/euicc.py:29:0: C0411: third party import \"from cmd2 import cmd2, CommandSet, with_default_category\" should be placed before \"from pySim.tlv import *\" (wrong-import-order)\u000apySim/euicc.py:30:0: C0412: Imports from package pySim are not grouped (ungrouped-imports)\u000apySim/euicc.py:31:0: W0611: Unused CardADF imported from pySim.filesystem (unused-import)\u000apySim/euicc.py:31:0: W0611: Unused CardApplication imported from pySim.filesystem (unused-import)\u000a\u000aChange-Id: I6c33e2361a042a16f27e66cb883c392333b8383d\u000a",
        "date" : "2024-02-05 12:37:54 +0100",
        "id" : "09f9663005b9656e5b72af13b9f0c8ea320767e3",
        "msg" : "pylint: pySim/euicc.py",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/euicc.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/commands.py"
        ],
        "commitId" : "8829f8e690180289b617b5e27f838600c1f054ee",
        "timestamp" : 1707133298000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pylint: commands.py\u000a\u000apySim/commands.py:443:0: C0325: Unnecessary parens after 'if' keyword (superfluous-parens)\u000apySim/commands.py:446:0: C0325: Unnecessary parens after 'elif' keyword (superfluous-parens)\u000apySim/commands.py:669:0: C0325: Unnecessary parens after 'elif' keyword (superfluous-parens)\u000apySim/commands.py:27:0: W0622: Redefining built-in 'BlockingIOError' (redefined-builtin)\u000apySim/commands.py:27:0: W0401: Wildcard import construct (wildcard-import)\u000apySim/commands.py:30:0: W0404: Reimport 'Hexstr' (imported line 29) (reimported)\u000apySim/commands.py:42:8: R1705: Unnecessary \"else\" after \"return\", remove the \"else\" and de-indent the code inside it (no-else-return)\u000apySim/commands.py:48:8: R1705: Unnecessary \"else\" after \"return\", remove the \"else\" and de-indent the code inside it (no-else-return)\u000apySim/commands.py:98:8: R1705: Unnecessary \"else\" after \"return\", remove the \"else\" and de-indent the code inside it (no-else-return)\u000apySim/commands.py:114:8: R1705: Unnecessary \"else\" after \"return\", remove the \"else\" and de-indent the code inside it (no-else-return)\u000apySim/commands.py:131:8: R1705: Unnecessary \"else\" after \"return\", remove the \"else\" and de-indent the code inside it (no-else-return)\u000apySim/commands.py:223:8: R1705: Unnecessary \"else\" after \"return\", remove the \"else\" and de-indent the code inside it (no-else-return)\u000apySim/commands.py:234:8: R1705: Unnecessary \"else\" after \"return\", remove the \"else\" and de-indent the code inside it (no-else-return)\u000apySim/commands.py:252:11: C0123: Use isinstance() rather than type() for a typecheck. (unidiomatic-typecheck)\u000apySim/commands.py:271:11: C0123: Use isinstance() rather than type() for a typecheck. (unidiomatic-typecheck)\u000apySim/commands.py:274:18: W0612: Unused variable 'sw' (unused-variable)\u000apySim/commands.py:326:16: W0707: Consider explicitly re-raising using 'raise ValueError('%s, failed to read (offset %d)' % (str_sanitize(str(e)), offset)) from e' (raise-missing-from)\u000apySim/commands.py:386:16: W0707: Consider explicitly re-raising using 'raise ValueError('%s, failed to write chunk (chunk_offset %d, chunk_len %d)' % (str_sanitize(str(e)), chunk_offset, chunk_len)) from e' (raise-missing-from)\u000apySim/commands.py:443:12: R1720: Unnecessary \"elif\" after \"raise\", remove the leading \"el\" from \"elif\" (no-else-raise)\u000apySim/commands.py:521:14: R1714: Consider merging these comparisons with 'in' by using 'sw in ('62f1', '62f2')'. Use a set instead if elements are hashable. (consider-using-in)\u000apySim/commands.py:532:11: R1701: Consider merging these isinstance calls to isinstance(data, (bytearray, bytes)) (consider-merging-isinstance)\u000apySim/commands.py:666:8: R1720: Unnecessary \"elif\" after \"raise\", remove the leading \"el\" from \"elif\" (no-else-raise)\u000apySim/commands.py:762:12: R1705: Unnecessary \"elif\" after \"return\", remove the leading \"el\" from \"elif\" (no-else-return)\u000apySim/commands.py:776:12: R1705: Unnecessary \"elif\" after \"return\", remove the leading \"el\" from \"elif\" (no-else-return)\u000a\u000aChange-Id: Idfcd6f799d5de9ecacd2c3d1e0d1f7d932f2b8db\u000a",
        "date" : "2024-02-05 12:41:38 +0100",
        "id" : "8829f8e690180289b617b5e27f838600c1f054ee",
        "msg" : "pylint: commands.py",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/commands.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/apdu/ts_102_221.py",
          "pySim/filesystem.py"
        ],
        "commitId" : "f2322774c790ffbe6e7fda3c700fe355ac0e1ec3",
        "timestamp" : 1707151919000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pylint: filesystem.py\u000a\u000apySim/filesystem.py:823:0: C0325: Unnecessary parens after 'if' keyword (superfluous-parens)\u000apySim/filesystem.py:849:0: C0325: Unnecessary parens after 'if' keyword (superfluous-parens)\u000apySim/filesystem.py:43:0: W0401: Wildcard import pySim.exceptions (wildcard-import)\u000apySim/filesystem.py:74:45: C0121: Comparison 'fid == None' should be 'fid is None' (singleton-comparison)\u000apySim/filesystem.py:94:8: R1705: Unnecessary \"else\" after \"return\", remove the \"else\" and de-indent the code inside it (no-else-return)\u000apySim/filesystem.py:100:8: R1705: Unnecessary \"else\" after \"return\", remove the \"else\" and de-indent the code inside it (no-else-return)\u000apySim/filesystem.py:149:8: W0105: String statement has no effect (pointless-string-statement)\u000apySim/filesystem.py:170:11: C0121: Comparison 'self.parent == None' should be 'self.parent is None' (singleton-comparison)\u000apySim/filesystem.py:283:8: R1705: Unnecessary \"elif\" after \"return\", remove the leading \"el\" from \"elif\" (no-else-return)\u000apySim/filesystem.py:309:8: W0246: Useless parent or super() delegation in method '__init__' (useless-parent-delegation)\u000apySim/filesystem.py:314:15: C0117: Consider changing \"not 'fid' in kwargs\" to \"'fid' not in kwargs\" (unnecessary-negation)\u000apySim/filesystem.py:317:24: R1735: Consider using '{}' instead of a call to 'dict'. (use-dict-literal)\u000apySim/filesystem.py:418:11: C0121: Comparison 'name == None' should be 'name is None' (singleton-comparison)\u000apySim/filesystem.py:427:11: C0121: Comparison 'sfid == None' should be 'sfid is None' (singleton-comparison)\u000apySim/filesystem.py:452:28: R1735: Consider using '{}' instead of a call to 'dict'. (use-dict-literal)\u000apySim/filesystem.py:508:8: R1705: Unnecessary \"else\" after \"return\", remove the \"else\" and de-indent the code inside it (no-else-return)\u000apySim/filesystem.py:531:8: R1705: Unnecessary \"else\" after \"return\", remove the \"else\" and de-indent the code inside it (no-else-return)\u000apySim/filesystem.py:576:8: W0246: Useless parent or super() delegation in method '__init__' (useless-parent-delegation)\u000apySim/filesystem.py:599:19: W0612: Unused variable 'sw' (unused-variable)\u000apySim/filesystem.py:609:19: W0612: Unused variable 'sw' (unused-variable)\u000apySim/filesystem.py:620:19: W0612: Unused variable 'sw' (unused-variable)\u000apySim/filesystem.py:633:28: W0612: Unused variable 'sw' (unused-variable)\u000apySim/filesystem.py:642:41: W0613: Unused argument 'opts' (unused-argument)\u000apySim/filesystem.py:644:24: W0612: Unused variable 'sw' (unused-variable)\u000apySim/filesystem.py:696:8: R1705: Unnecessary \"elif\" after \"return\", remove the leading \"el\" from \"elif\" (no-else-return)\u000apySim/filesystem.py:723:8: R1705: Unnecessary \"elif\" after \"return\", remove the leading \"el\" from \"elif\" (no-else-return)\u000apySim/filesystem.py:749:8: R1705: Unnecessary \"elif\" after \"return\", remove the leading \"el\" from \"elif\" (no-else-return)\u000apySim/filesystem.py:777:8: R1705: Unnecessary \"elif\" after \"return\", remove the leading \"el\" from \"elif\" (no-else-return)\u000apySim/filesystem.py:797:8: W0246: Useless parent or super() delegation in method '__init__' (useless-parent-delegation)\u000apySim/filesystem.py:822:23: W0612: Unused variable 'sw' (unused-variable)\u000apySim/filesystem.py:838:19: W0612: Unused variable 'sw' (unused-variable)\u000apySim/filesystem.py:844:34: W0613: Unused argument 'opts' (unused-argument)\u000apySim/filesystem.py:848:23: W0612: Unused variable 'sw' (unused-variable)\u000apySim/filesystem.py:866:23: W0612: Unused variable 'sw' (unused-variable)\u000apySim/filesystem.py:878:19: W0612: Unused variable 'sw' (unused-variable)\u000apySim/filesystem.py:893:28: W0612: Unused variable 'sw' (unused-variable)\u000apySim/filesystem.py:910:24: W0612: Unused variable 'sw' (unused-variable)\u000apySim/filesystem.py:967:8: R1705: Unnecessary \"elif\" after \"return\", remove the leading \"el\" from \"elif\" (no-else-return)\u000apySim/filesystem.py:995:8: R1705: Unnecessary \"elif\" after \"return\", remove the leading \"el\" from \"elif\" (no-else-return)\u000apySim/filesystem.py:1023:8: R1705: Unnecessary \"elif\" after \"return\", remove the leading \"el\" from \"elif\" (no-else-return)\u000apySim/filesystem.py:1051:8: R1705: Unnecessary \"elif\" after \"return\", remove the leading \"el\" from \"elif\" (no-else-return)\u000apySim/filesystem.py:1114:8: R1705: Unnecessary \"elif\" after \"return\", remove the leading \"el\" from \"elif\" (no-else-return)\u000apySim/filesystem.py:1141:8: R1705: Unnecessary \"elif\" after \"return\", remove the leading \"el\" from \"elif\" (no-else-return)\u000apySim/filesystem.py:1167:8: R1705: Unnecessary \"elif\" after \"return\", remove the leading \"el\" from \"elif\" (no-else-return)\u000apySim/filesystem.py:1194:8: R1705: Unnecessary \"elif\" after \"return\", remove the leading \"el\" from \"elif\" (no-else-return)\u000apySim/filesystem.py:1226:8: W0246: Useless parent or super() delegation in method '__init__' (useless-parent-delegation)\u000apySim/filesystem.py:1236:19: W0612: Unused variable 'sw' (unused-variable)\u000apySim/filesystem.py:1239:35: W0613: Unused argument 'opts' (unused-argument)\u000apySim/filesystem.py:1252:19: W0612: Unused variable 'sw' (unused-variable)\u000apySim/filesystem.py:1263:19: W0612: Unused variable 'sw' (unused-variable)\u000apySim/filesystem.py:1315:24: R1735: Consider using '{}' instead of a call to 'dict'. (use-dict-literal)\u000apySim/filesystem.py:35:0: C0411: standard import \"import argparse\" should be placed before \"import cmd2\" (wrong-import-order)\u000apySim/filesystem.py:37:0: C0411: standard import \"from typing import cast, Optional, Iterable, List, Dict, Tuple, Union\" should be placed before \"import cmd2\" (wrong-import-order)\u000apySim/filesystem.py:27:0: W0611: Unused import code (unused-import)\u000apySim/filesystem.py:34:0: W0611: Unused with_argparser imported from cmd2 (unused-import)\u000apySim/filesystem.py:41:0: W0611: Unused i2h imported from pySim.utils (unused-import)\u000apySim/filesystem.py:41:0: W0611: Unused Hexstr imported from pySim.utils (unused-import)\u000apySim/filesystem.py:44:0: W0611: Unused js_path_find imported from pySim.jsonpath (unused-import)\u000apySim/filesystem.py:43:0: W0614: Unused import(s) NoCardError, ProtocolError, ReaderError and SwMatchError from wildcard import of pySim.exceptions (unused-wildcard-import)\u000a\u000aChange-Id: I94e1f5791e9fc34a60d0254978a35fd6ab2ff8d7\u000a",
        "date" : "2024-02-05 17:51:59 +0100",
        "id" : "f2322774c790ffbe6e7fda3c700fe355ac0e1ec3",
        "msg" : "pylint: filesystem.py",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/apdu/ts_102_221.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/filesystem.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_102_222.py"
        ],
        "commitId" : "472165f20fd510bec895ca6db021a337420d34de",
        "timestamp" : 1707152070000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pylint: ts_102_222.py\u000a\u000apySim/ts_102_222.py:195:0: W0311: Bad indentation. Found 15 spaces, expected 12 (bad-indentation)\u000apySim/ts_102_222.py:201:0: W0311: Bad indentation. Found 15 spaces, expected 12 (bad-indentation)\u000apySim/ts_102_222.py:26:0: W0401: Wildcard import pySim.exceptions (wildcard-import)\u000apySim/ts_102_222.py:35:4: W0246: Useless parent or super() delegation in method '__init__' (useless-parent-delegation)\u000apySim/ts_102_222.py:52:9: W0612: Unused variable 'data' (unused-variable)\u000apySim/ts_102_222.py:52:15: W0612: Unused variable 'sw' (unused-variable)\u000apySim/ts_102_222.py:73:9: W0612: Unused variable 'data' (unused-variable)\u000apySim/ts_102_222.py:73:15: W0612: Unused variable 'sw' (unused-variable)\u000apySim/ts_102_222.py:89:9: W0612: Unused variable 'data' (unused-variable)\u000apySim/ts_102_222.py:89:15: W0612: Unused variable 'sw' (unused-variable)\u000apySim/ts_102_222.py:107:9: W0612: Unused variable 'data' (unused-variable)\u000apySim/ts_102_222.py:107:15: W0612: Unused variable 'sw' (unused-variable)\u000apySim/ts_102_222.py:152:9: W0612: Unused variable 'data' (unused-variable)\u000apySim/ts_102_222.py:152:15: W0612: Unused variable 'sw' (unused-variable)\u000apySim/ts_102_222.py:203:9: W0612: Unused variable 'data' (unused-variable)\u000apySim/ts_102_222.py:203:15: W0612: Unused variable 'sw' (unused-variable)\u000apySim/ts_102_222.py:220:9: W0612: Unused variable 'data' (unused-variable)\u000apySim/ts_102_222.py:220:15: W0612: Unused variable 'sw' (unused-variable)\u000apySim/ts_102_222.py:24:0: C0411: standard import \"import argparse\" should be placed before \"import cmd2\" (wrong-import-order)\u000apySim/ts_102_222.py:23:0: W0611: Unused with_argparser imported from cmd2 (unused-import)\u000apySim/ts_102_222.py:27:0: W0611: Unused h2b imported from pySim.utils (unused-import)\u000apySim/ts_102_222.py:27:0: W0611: Unused swap_nibbles imported from pySim.utils (unused-import)\u000apySim/ts_102_222.py:27:0: W0611: Unused JsonEncoder imported from pySim.utils (unused-import)\u000apySim/ts_102_222.py:26:0: W0614: Unused import(s) NoCardError, ProtocolError, ReaderError and SwMatchError from wildcard import of pySim.exceptions (unused-wildcard-import)\u000a\u000aChange-Id: If251c6cb10e637a13adaaf3ae848501908b9c345\u000a",
        "date" : "2024-02-05 17:54:30 +0100",
        "id" : "472165f20fd510bec895ca6db021a337420d34de",
        "msg" : "pylint: ts_102_222.py",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_102_222.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/utils.py"
        ],
        "commitId" : "f2b20bf6ca4964c6abf4b5622a045d315f23cdcb",
        "timestamp" : 1707152070000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pylint: utils.py\u000a\u000apySim/utils.py:903:0: C0325: Unnecessary parens after 'if' keyword (superfluous-parens)\u000apySim/utils.py:153:16: R1719: The if expression can be replaced with 'bool(test)' (simplifiable-if-expression)\u000apySim/utils.py:158:16: R1719: The if expression can be replaced with 'bool(test)' (simplifiable-if-expression)\u000apySim/utils.py:166:16: R1719: The if expression can be replaced with 'bool(test)' (simplifiable-if-expression)\u000apySim/utils.py:222:19: R1719: The if expression can be replaced with 'not test' (simplifiable-if-expression)\u000apySim/utils.py:237:18: R1719: The if expression can be replaced with 'bool(test)' (simplifiable-if-expression)\u000apySim/utils.py:246:19: R1719: The if expression can be replaced with 'not test' (simplifiable-if-expression)\u000apySim/utils.py:279:11: W0612: Unused variable 'remainder' (unused-variable)\u000apySim/utils.py:541:7: R1714: Consider merging these comparisons with 'in' by using 'eutran_bits in (16384, 28672)'. Use a set instead if elements are hashable. (consider-using-in)\u000apySim/utils.py:550:7: R1714: Consider merging these comparisons with 'in' by using 'gsm_bits in (128, 140)'. Use a set instead if elements are hashable. (consider-using-in)\u000apySim/utils.py:614:7: C0121: Comparison 'imsi == None' should be 'imsi is None' (singleton-comparison)\u000apySim/utils.py:627:7: C0121: Comparison 'imsi == None' should be 'imsi is None' (singleton-comparison)\u000apySim/utils.py:733:7: R1714: Consider merging these comparisons with 'in' by using 'msisdn in ('', '+')'. Use a set instead if elements are hashable. (consider-using-in)\u000apySim/utils.py:774:8: W0612: Unused variable 'try_encode' (unused-variable)\u000apySim/utils.py:803:16: W0707: Consider explicitly re-raising using 'except ValueError as exc' and 'raise ValueError('PIN-ADM needs to be hex encoded using this option') from exc' (raise-missing-from)\u000apySim/utils.py:801:16: W0612: Unused variable 'try_encode' (unused-variable)\u000apySim/utils.py:821:7: C1802: Do not use `len(SEQUENCE)` without comparison to determine if a sequence is empty (use-implicit-booleaness-not-len)\u000apySim/utils.py:836:4: W0612: Unused variable 'e' (unused-variable)\u000apySim/utils.py:892:7: C0121: Comparison 'str_list == None' should be 'str_list is None' (singleton-comparison)\u000apySim/utils.py:991:11: R1701: Consider merging these isinstance calls to isinstance(o, (BytesIO, bytearray, bytes)) (consider-merging-isinstance)\u000a\u000aChange-Id: I190ae75964ef6e0ed43fae994693a8bccd21c7f7\u000a",
        "date" : "2024-02-05 17:54:30 +0100",
        "id" : "f2b20bf6ca4964c6abf4b5622a045d315f23cdcb",
        "msg" : "pylint: utils.py",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/utils.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/tlv.py"
        ],
        "commitId" : "6db681924cffc9f36c9fcdf1567a8cadcae5390c",
        "timestamp" : 1707152070000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pylint: tlv.py\u000a\u000apySim/tlv.py:29:0: W0401: Wildcard import pySim.exceptions (wildcard-import)\u000apySim/tlv.py:43:4: C0204: Metaclass class method __new__ should have 'mcs' as first argument (bad-mcs-classmethod-argument)\u000apySim/tlv.py:66:4: C0204: Metaclass class method __new__ should have 'mcs' as first argument (bad-mcs-classmethod-argument)\u000apySim/tlv.py:89:11: C0121: Comparison 'self.decoded == None' should be 'self.decoded is None' (singleton-comparison)\u000apySim/tlv.py:170:8: R1703: The if statement can be replaced with 'return bool(test)' (simplifiable-if-statement)\u000apySim/tlv.py:202:4: W0246: Useless parent or super() delegation in method '__init__' (useless-parent-delegation)\u000apySim/tlv.py:257:4: W0246: Useless parent or super() delegation in method '__init__' (useless-parent-delegation)\u000apySim/tlv.py:308:4: W0246: Useless parent or super() delegation in method '__init__' (useless-parent-delegation)\u000apySim/tlv.py:383:15: C0121: Comparison 'tag == None' should be 'tag is None' (singleton-comparison)\u000apySim/tlv.py:382:17: W0612: Unused variable 'r' (unused-variable)\u000apySim/tlv.py:389:16: W0612: Unused variable 'dec' (unused-variable)\u000apySim/tlv.py:461:22: R1718: Consider using a set comprehension (consider-using-set-comprehension)\u000apySim/tlv.py:473:0: C0206: Consider iterating with .items() (consider-using-dict-items)\u000apySim/tlv.py:473:58: C0201: Consider iterating the dictionary directly instead of calling .keys() (consider-iterating-dictionary)\u000apySim/tlv.py:20:0: W0611: Unused Optional imported from typing (unused-import)\u000apySim/tlv.py:20:0: W0611: Unused Dict imported from typing (unused-import)\u000apySim/tlv.py:20:0: W0611: Unused Any imported from typing (unused-import)\u000apySim/tlv.py:21:0: W0611: Unused bidict imported from bidict (unused-import)\u000apySim/tlv.py:28:0: W0611: Unused LV imported from pySim.construct (unused-import)\u000apySim/tlv.py:28:0: W0611: Unused HexAdapter imported from pySim.construct (unused-import)\u000apySim/tlv.py:28:0: W0611: Unused BcdAdapter imported from pySim.construct (unused-import)\u000apySim/tlv.py:28:0: W0611: Unused BitsRFU imported from pySim.construct (unused-import)\u000apySim/tlv.py:28:0: W0611: Unused GsmStringAdapter imported from pySim.construct (unused-import)\u000apySim/tlv.py:29:0: W0614: Unused import(s) NoCardError, ProtocolError, ReaderError and SwMatchError from wildcard import of pySim.exceptions (unused-wildcard-import)\u000a\u000aChange-Id: Ic22d00d3ae73ad81167276d9482b7b86a04476ba\u000a",
        "date" : "2024-02-05 17:54:30 +0100",
        "id" : "6db681924cffc9f36c9fcdf1567a8cadcae5390c",
        "msg" : "pylint: tlv.py",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/tlv.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/construct.py"
        ],
        "commitId" : "55be7d48ee8663d382b3565d51f94387c0ccab24",
        "timestamp" : 1707152070000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pylint: construct.py\u000a\u000apySim/construct.py:47:0: W0311: Bad indentation. Found 16 spaces, expected 12 (bad-indentation)\u000apySim/construct.py:59:0: W0311: Bad indentation. Found 16 spaces, expected 12 (bad-indentation)\u000apySim/construct.py:82:0: W0311: Bad indentation. Found 16 spaces, expected 12 (bad-indentation)\u000apySim/construct.py:1:0: C0114: Missing module docstring (missing-module-docstring)\u000apySim/construct.py:14:0: W0105: String statement has no effect (pointless-string-statement)\u000apySim/construct.py:178:29: W0613: Unused argument 'instr' (unused-argument)\u000apySim/construct.py:199:15: C0121: Comparison 'codepoint_prefix == None' should be 'codepoint_prefix is None' (singleton-comparison)\u000apySim/construct.py:269:15: C0121: Comparison 'v == False' should be 'v is False' if checking for the singleton value False, or 'not v' if testing for falsiness (singleton-comparison)\u000apySim/construct.py:271:17: C0121: Comparison 'v == True' should be 'v is True' if checking for the singleton value True, or 'v' if testing for truthiness (singleton-comparison)\u000apySim/construct.py:385:15: C0123: Use isinstance() rather than type() for a typecheck. (unidiomatic-typecheck)\u000apySim/construct.py:392:15: C0123: Use isinstance() rather than type() for a typecheck. (unidiomatic-typecheck)\u000apySim/construct.py:408:11: C0123: Use isinstance() rather than type() for a typecheck. (unidiomatic-typecheck)\u000apySim/construct.py:421:7: R1701: Consider merging these isinstance calls to isinstance(c, (Container, dict)) (consider-merging-isinstance)\u000apySim/construct.py:444:11: R1729: Use a generator instead 'all(v == 255 for v in raw_bin_data)' (use-a-generator)\u000apySim/construct.py:434:81: W0613: Unused argument 'exclude_prefix' (unused-argument)\u000apySim/construct.py:544:12: W0707: Consider explicitly re-raising using 'raise IntegerError(str(e), path=path) from e' (raise-missing-from)\u000apySim/construct.py:561:8: R1731: Consider using 'nbytes = max(nbytes, minlen)' instead of unnecessary if block (consider-using-max-builtin)\u000apySim/construct.py:573:12: W0707: Consider explicitly re-raising using 'raise IntegerError(str(e), path=path) from e' (raise-missing-from)\u000apySim/construct.py:3:0: C0411: standard import \"import typing\" should be placed before \"from construct.lib.containers import Container, ListContainer\" (wrong-import-order)\u000apySim/construct.py:10:0: C0411: third party import \"import gsm0338\" should be placed before \"from pySim.utils import b2h, h2b, swap_nibbles\" (wrong-import-order)\u000apySim/construct.py:11:0: C0411: standard import \"import codecs\" should be placed before \"from construct.lib.containers import Container, ListContainer\" (wrong-import-order)\u000apySim/construct.py:12:0: C0411: standard import \"import ipaddress\" should be placed before \"from construct.lib.containers import Container, ListContainer\" (wrong-import-order)\u000apySim/construct.py:7:0: W0611: Unused BitwisableString imported from construct.core (unused-import)\u000a\u000aChange-Id: Ic8a06d65a7bcff9ef399fe4e7e5d82f271c946bb\u000a",
        "date" : "2024-02-05 17:54:30 +0100",
        "id" : "55be7d48ee8663d382b3565d51f94387c0ccab24",
        "msg" : "pylint: construct.py",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/construct.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/global_platform/__init__.py"
        ],
        "commitId" : "908634396ff6a6d2adf907576523c449d9a8dbab",
        "timestamp" : 1707152070000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pylint: global_platform/__init__.py\u000a\u000apySim/global_platform/__init__.py:468:4: W0221: Number of parameters was 2 in 'CardFile.decode_select_response' and is now 1 in overriding 'ADF_SD.decode_select_response' method (arguments-differ)\u000apySim/global_platform/__init__.py:473:8: W0246: Useless parent or super() delegation in method '__init__' (useless-parent-delegation)\u000apySim/global_platform/__init__.py:491:19: W0612: Unused variable 'sw' (unused-variable)\u000apySim/global_platform/__init__.py:528:22: W0612: Unused variable 'sw' (unused-variable)\u000apySim/global_platform/__init__.py:559:12: C0200: Consider using enumerate instead of iterating with range and len (consider-using-enumerate)\u000apySim/global_platform/__init__.py:587:18: W0612: Unused variable 'sw' (unused-variable)\u000apySim/global_platform/__init__.py:617:20: W0612: Unused variable 'dec' (unused-variable)\u000apySim/global_platform/__init__.py:645:12: W0612: Unused variable 'data' (unused-variable)\u000apySim/global_platform/__init__.py:645:18: W0612: Unused variable 'sw' (unused-variable)\u000apySim/global_platform/__init__.py:746:15: C0121: Comparison 'opts.key_id == None' should be 'opts.key_id is None' (singleton-comparison)\u000apySim/global_platform/__init__.py:746:39: C0121: Comparison 'opts.key_ver == None' should be 'opts.key_ver is None' (singleton-comparison)\u000apySim/global_platform/__init__.py:750:15: C0121: Comparison 'opts.key_id != None' should be 'opts.key_id is not None' (singleton-comparison)\u000apySim/global_platform/__init__.py:752:15: C0121: Comparison 'opts.key_ver != None' should be 'opts.key_ver is not None' (singleton-comparison)\u000apySim/global_platform/__init__.py:787:16: W0612: Unused variable 'rsp_hex' (unused-variable)\u000apySim/global_platform/__init__.py:787:25: W0612: Unused variable 'sw' (unused-variable)\u000apySim/global_platform/__init__.py:836:30: W0612: Unused variable 'sw' (unused-variable)\u000apySim/global_platform/__init__.py:839:12: W0612: Unused variable 'ext_auth_resp' (unused-variable)\u000apySim/global_platform/__init__.py:846:33: W0613: Unused argument 'opts' (unused-argument)\u000apySim/global_platform/__init__.py:878:15: R1716: Simplify chained comparison between the operands (chained-comparison)\u000apySim/global_platform/__init__.py:886:29: W0613: Unused argument 'kvn' (unused-argument)\u000apySim/global_platform/__init__.py:893:0: C0413: Import \"from Cryptodome.Cipher import DES, DES3, AES\" should be placed at the top of the module (wrong-import-position)\u000apySim/global_platform/__init__.py:23:0: C0411: standard import \"from typing import Optional, List, Dict, Tuple\" should be placed before \"from construct import Optional as COptional\" (wrong-import-order)\u000apySim/global_platform/__init__.py:24:0: C0411: standard import \"from copy import deepcopy\" should be placed before \"from construct import Optional as COptional\" (wrong-import-order)\u000apySim/global_platform/__init__.py:893:0: C0411: third party import \"from Cryptodome.Cipher import DES, DES3, AES\" should be placed before \"from pySim.global_platform.scp import SCP02, SCP03\" (wrong-import-order)\u000apySim/global_platform/__init__.py:893:0: C0412: Imports from package Cryptodome are not grouped (ungrouped-imports)\u000a\u000aChange-Id: Iea6afb5e72e035637e761bb25535f48fd4bc99f4\u000a",
        "date" : "2024-02-05 17:54:30 +0100",
        "id" : "908634396ff6a6d2adf907576523c449d9a8dbab",
        "msg" : "pylint: global_platform/__init__.py",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/global_platform/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/global_platform/__init__.py"
        ],
        "commitId" : "9d1487af6dbf8b8ea2d1bb83045fd51bc1ec48fa",
        "timestamp" : 1707152070000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "global_platform: Fix INSTALL [for personalization]\u000a\u000aThe APDU hex string needs to use %02x instead of %02u...\u000a\u000aChange-Id: Ic3b30ba623ee04f5190c77afd226b52165b3183f\u000a",
        "date" : "2024-02-05 17:54:30 +0100",
        "id" : "9d1487af6dbf8b8ea2d1bb83045fd51bc1ec48fa",
        "msg" : "global_platform: Fix INSTALL [for personalization]",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/global_platform/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-shell.py"
        ],
        "commitId" : "d6ecf272f5895b7d9cb8b1ef1d2be229f035f63f",
        "timestamp" : 1707152091000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-shell: Fix regression in 'apdu' command on cards without profile\u000a\u000aCards where no profile was detected don't have a logical channel, and\u000ahence must use the raw APDU at all times.\u000a\u000aChange-Id: I08e5d190bdb4e62ee808bfd77584cb3e0b85a8ae\u000aFixes: Change-Id Id0c364f772c31e11e8dfa21624d8685d253220d0\u000a",
        "date" : "2024-02-05 17:54:51 +0100",
        "id" : "d6ecf272f5895b7d9cb8b1ef1d2be229f035f63f",
        "msg" : "pySim-shell: Fix regression in 'apdu' command on cards without profile",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/global_platform/__init__.py"
        ],
        "commitId" : "e1c0b626d81a17b6b1cc8d7e08e97ebe2d70c8a2",
        "timestamp" : 1707248192000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "global_platform: Add --suppress-key-check option to put_key command\u000a\u000aIn some cases we may not want to auto-generate the Key Check Values.\u000a\u000aChange-Id: I244b717b3e3aae6eb3ad512f9e23ff0b65958bb7\u000a",
        "date" : "2024-02-06 20:36:32 +0100",
        "id" : "e1c0b626d81a17b6b1cc8d7e08e97ebe2d70c8a2",
        "msg" : "global_platform: Add --suppress-key-check option to put_key command",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/global_platform/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/__init__.py",
          "pySim/esim/es2p.py",
          "contrib/jenkins.sh",
          "contrib/es2p_client.py"
        ],
        "commitId" : "95873a964e13bb122e54838d9bd180bb31b4d9c8",
        "timestamp" : 1707511311000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "Introduce code for ES2+ API client functionality\u000a\u000aChange-Id: Id652bb4c2df8893a824b8bb44beeafdfbb91de3f\u000a",
        "date" : "2024-02-09 21:41:51 +0100",
        "id" : "95873a964e13bb122e54838d9bd180bb31b4d9c8",
        "msg" : "Introduce code for ES2+ API client functionality",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/__init__.py"
          },
          {
            "editType" : "add",
            "file" : "pySim/esim/es2p.py"
          },
          {
            "editType" : "edit",
            "file" : "contrib/jenkins.sh"
          },
          {
            "editType" : "add",
            "file" : "contrib/es2p_client.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_31_102.py"
        ],
        "commitId" : "eac459fe24223fc8b456ee07c56a639efb0ae598",
        "timestamp" : 1707757459000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "ts_31_102: Add support for \"USIM supporting non-IMSI SUPI Type\"\u000a\u000aThis type of USIM was introduced in Release 16.4. It is basically\u000aa copy of ADF.USIM without the EF.IMSI file and a dedicated AID.\u000a\u000aChange-Id: Ifcde27873a398273a89889bb38537f79859383e9\u000a",
        "date" : "2024-02-12 18:04:19 +0100",
        "id" : "eac459fe24223fc8b456ee07c56a639efb0ae598",
        "msg" : "ts_31_102: Add support for \"USIM supporting non-IMSI SUPI Type\"",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_102.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_102_221.py",
          "docs/shell.rst"
        ],
        "commitId" : "1432af51500de2b06cfc6861416e8e29128c05fd",
        "timestamp" : 1707760794000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "Add terminal_capability command to send TERMINAL CAPABILITY\u000a\u000aTS 102 221 specifies a TERMINAL CAPABILITY command using which the\u000aterminal (Software + hardware talking to the card) can expose their\u000acapabilities.  This is also used in the eUICC universe to let the eUICC\u000aknow which features are supported.\u000a\u000aChange-Id: Iaeb8b4c34524edbb93217bf401e466399626e9b0\u000a",
        "date" : "2024-02-12 18:59:54 +0100",
        "id" : "1432af51500de2b06cfc6861416e8e29128c05fd",
        "msg" : "Add terminal_capability command to send TERMINAL CAPABILITY",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_102_221.py"
          },
          {
            "editType" : "edit",
            "file" : "docs/shell.rst"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/global_platform/scp.py",
          "pySim/global_platform/__init__.py",
          "pySim/commands.py"
        ],
        "commitId" : "979c837286d3e5fa41322d2f97c4a31494cb5da5",
        "timestamp" : 1708025729000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "Dynamically determine maximum CMD data length depending on SCP\u000a\u000aIf we're using a Secure Channel Protocol, this will add overhead\u000ain terms of the C-MAC appended to the C-APDU.  This means in turn that\u000athe useable length of the data field shrinks by a certain number of\u000abytes.\u000a\u000aLet's make sure the SCP instances expose an 'overhead' property\u000aof how much overhead they add - and that other commands use this to\u000adetermine the maximum command data field length.\u000a\u000aChange-Id: I0a081a23efe20c77557600e62b52ba90a401058d\u000a",
        "date" : "2024-02-15 20:35:29 +0100",
        "id" : "979c837286d3e5fa41322d2f97c4a31494cb5da5",
        "msg" : "Dynamically determine maximum CMD data length depending on SCP",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/commands.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/global_platform/scp.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/global_platform/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tests/test_utils.py",
          "pySim/utils.py"
        ],
        "commitId" : "efdf423a7f758987de249412e8e67ac94f9d09aa",
        "timestamp" : 1708291808000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "utils: Add function to verify Luhn check digits and to sanitize ICCIDs\u000a\u000aChange-Id: I7812420cf97984dd834fca6a38c5e5ae113243cb\u000a",
        "date" : "2024-02-18 22:30:08 +0100",
        "id" : "efdf423a7f758987de249412e8e67ac94f9d09aa",
        "msg" : "utils: Add function to verify Luhn check digits and to sanitize ICCIDs",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/utils.py"
          },
          {
            "editType" : "edit",
            "file" : "tests/test_utils.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/asn1/saip/PE_Definitions-3.3.1.asn"
        ],
        "commitId" : "54b4f0ccbd65832d4ff4ec2439642c6c0f08089c",
        "timestamp" : 1708291808000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "asn1/saip: Fix typo in original ASN.1: Compontents -> Components\u000a\u000aChange-Id: I6bec5625579873a9ec267d896584608c9d5e3a2f\u000a",
        "date" : "2024-02-18 22:30:08 +0100",
        "id" : "54b4f0ccbd65832d4ff4ec2439642c6c0f08089c",
        "msg" : "asn1/saip: Fix typo in original ASN.1: Compontents -> Components",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/asn1/saip/PE_Definitions-3.3.1.asn"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/validation.py",
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "d16a20ccc3e67ffab1142d4f0541989ccc36a7ec",
        "timestamp" : 1708291808000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "saip: profile processing; merging with templates\u000a\u000aIntroduce code that makes use of the information from\u000apySim.esim.saip.templates to build a complete representation of a file\u000aby merging the template with the ProfileElement decribing the file.\u000a\u000aThis happens within the class pySim.esim.saip.File, whose instances are\u000acreated from ProfileElement + Template.\u000a\u000aChange-Id: Ib1674920e488ade9597cb039e4e2047dcbc7864e\u000a",
        "date" : "2024-02-18 22:30:08 +0100",
        "id" : "d16a20ccc3e67ffab1142d4f0541989ccc36a7ec",
        "msg" : "saip: profile processing; merging with templates",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/validation.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "5ff0bafcdab012ceaaa5f9372d3014d50145db07",
        "timestamp" : 1708291808000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pylint: esim/saip/__init__.py\u000a\u000apySim/esim/saip/__init__.py:28:0: R0402: Use 'from pySim.esim.saip import templates' instead (consider-using-from-import)\u000apySim/esim/saip/__init__.py:166:8: R1705: Unnecessary \"else\" after \"return\", remove the \"else\" and de-indent the code inside it (no-else-return)\u000apySim/esim/saip/__init__.py:206:4: W0612: Unused variable 'tagdict' (unused-variable)\u000apySim/esim/saip/__init__.py:273:23: C1802: Do not use `len(SEQUENCE)` without comparison to determine if a sequence is empty (use-implicit-booleaness-not-len)\u000a\u000aChange-Id: I12ef46c847d197fb0c01e624818aeac14eb99e31\u000a",
        "date" : "2024-02-18 22:30:08 +0100",
        "id" : "5ff0bafcdab012ceaaa5f9372d3014d50145db07",
        "msg" : "pylint: esim/saip/__init__.py",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/validation.py"
        ],
        "commitId" : "7d88b076ad69932e560a077124f20e3e475ad89e",
        "timestamp" : 1708291808000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pylint: esim/saip/validation.py\u000a\u000apySim/esim/saip/validation.py:95:42: C0117: Consider changing \"not not ('usim' in m_svcs or 'isim' in m_svcs)\" to \"'usim' in m_svcs or 'isim' in m_svcs\" (unnecessary-negation)\u000apySim/esim/saip/validation.py:129:0: C0305: Trailing newlines (trailing-newlines)\u000a\u000aChange-Id: Idcc9871d6a7068e8aedbd8cd81f4156918af5e50\u000a",
        "date" : "2024-02-18 22:30:08 +0100",
        "id" : "7d88b076ad69932e560a077124f20e3e475ad89e",
        "msg" : "pylint: esim/saip/validation.py",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/validation.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/__init__.py",
          "pySim/esim/saip/personalization.py"
        ],
        "commitId" : "922b8a279c1e3bc3fe5137704585f6eb27ed3c7c",
        "timestamp" : 1708291808000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "saip: improve docstrings\u000a\u000aChange-Id: I0ca82a434e0bde3dc1b304dfc179d568588631c6\u000a",
        "date" : "2024-02-18 22:30:08 +0100",
        "id" : "922b8a279c1e3bc3fe5137704585f6eb27ed3c7c",
        "msg" : "saip: improve docstrings",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/personalization.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "osmo-smdpp.py"
        ],
        "commitId" : "8449b14d08b3a607a702c0906e875ed5eb6e0188",
        "timestamp" : 1708469737000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "osmo-smdpp: Get rid of hard-coded ICCID\u000a\u000aRead the ICCID from the header of the UPP when building the\u000aProfileMetdata.  This allows the download of profiles with arbitrary ICCID.\u000a\u000aChange-Id: I1b9e17f757f9935436828e6dc1ab75ff17d1d1a4\u000a",
        "date" : "2024-02-20 23:55:37 +0100",
        "id" : "8449b14d08b3a607a702c0906e875ed5eb6e0188",
        "msg" : "osmo-smdpp: Get rid of hard-coded ICCID",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "osmo-smdpp.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "smdpp-data/upp/TS48V2-SAIP2-1-NOBERTLV-UNIQUE.der",
          "smdpp-data/upp/TS48V3-SAIP2-3-NOBERTLV-UNIQUE.der",
          "smdpp-data/upp/TS48V5-SAIP2-3-BERTLV-SUCI-UNIQUE.der",
          "smdpp-data/upp/TS48V5-SAIP2-1B-NOBERTLV-UNIQUE.der",
          "smdpp-data/upp/TS48V5-SAIP2-1A-NOBERTLV-UNIQUE.der",
          "smdpp-data/upp/TS48V2-SAIP2-1-BERTLV-UNIQUE.der",
          "smdpp-data/upp/TS48V1-A-UNIQUE.der",
          "smdpp-data/upp/TS48V5-SAIP2-3-NOBERTLV-UNIQUE.der",
          "smdpp-data/upp/TS48V3-SAIP2-3-BERTLV-UNIQUE.der",
          "smdpp-data/upp/TS48V3-SAIP2-1-BERTLV-UNIQUE.der",
          "smdpp-data/upp/TS48V2-SAIP2-3-NOBERTLV-UNIQUE.der",
          "smdpp-data/upp/TS48V4-SAIP2-3-BERTLV-UNIQUE.der",
          "smdpp-data/upp/TS48V4-SAIP2-3-NOBERTLV-UNIQUE.der",
          "smdpp-data/upp/TS48V3-SAIP2-1-NOBERTLV-UNIQUE.der",
          "smdpp-data/upp/TS48V4-SAIP2-1B-NOBERTLV-UNIQUE.der",
          "smdpp-data/upp/TS48V1-B-UNIQUE.der",
          "smdpp-data/upp/TS48V2-SAIP2-3-BERTLV-UNIQUE.der",
          "smdpp-data/upp/TS48V4-SAIP2-1A-NOBERTLV-UNIQUE.der"
        ],
        "commitId" : "aa76546d165b54bd1113d6e38e722543be1069b4",
        "timestamp" : 1708503760000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "osmo-smdpp: Add TS.48 profiles modified for unique ICCIDs\u000a\u000aThe original TS.48 profiles have shared/overlapping ICCIDs meaning you\u000acan always install one of them on a given eUICC.  Let's add a set of\u000amodified TS.48 profiles so  you can install any number of them in\u000aparallel on a single eUICC, switching between them via your LPA.\u000a\u000aChange-Id: Id5019b290db1ee90ae1c72b312f08bf3184908ea\u000a",
        "date" : "2024-02-21 09:22:40 +0100",
        "id" : "aa76546d165b54bd1113d6e38e722543be1069b4",
        "msg" : "osmo-smdpp: Add TS.48 profiles modified for unique ICCIDs",
        "paths" : [
          {
            "editType" : "add",
            "file" : "smdpp-data/upp/TS48V3-SAIP2-3-NOBERTLV-UNIQUE.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/upp/TS48V4-SAIP2-3-BERTLV-UNIQUE.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/upp/TS48V2-SAIP2-1-BERTLV-UNIQUE.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/upp/TS48V3-SAIP2-1-NOBERTLV-UNIQUE.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/upp/TS48V1-B-UNIQUE.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/upp/TS48V4-SAIP2-1B-NOBERTLV-UNIQUE.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/upp/TS48V2-SAIP2-1-NOBERTLV-UNIQUE.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/upp/TS48V2-SAIP2-3-BERTLV-UNIQUE.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/upp/TS48V5-SAIP2-3-BERTLV-SUCI-UNIQUE.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/upp/TS48V3-SAIP2-1-BERTLV-UNIQUE.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/upp/TS48V1-A-UNIQUE.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/upp/TS48V2-SAIP2-3-NOBERTLV-UNIQUE.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/upp/TS48V3-SAIP2-3-BERTLV-UNIQUE.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/upp/TS48V5-SAIP2-1B-NOBERTLV-UNIQUE.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/upp/TS48V4-SAIP2-1A-NOBERTLV-UNIQUE.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/upp/TS48V5-SAIP2-3-NOBERTLV-UNIQUE.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/upp/TS48V4-SAIP2-3-NOBERTLV-UNIQUE.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/upp/TS48V5-SAIP2-1A-NOBERTLV-UNIQUE.der"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tests/test_esim_saip.py",
          "pySim/esim/saip/personalization.py"
        ],
        "commitId" : "318faef583c8afa9e7e1eb2d3b71337fa69f52b2",
        "timestamp" : 1708503760000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "saip.personalization: include encode/decode of value; add validation method\u000a\u000aChange-Id: Ia9fa39c25817448afb191061acd4be894300eeef\u000a",
        "date" : "2024-02-21 09:22:40 +0100",
        "id" : "318faef583c8afa9e7e1eb2d3b71337fa69f52b2",
        "msg" : "saip.personalization: include encode/decode of value; add validation",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "tests/test_esim_saip.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/personalization.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/personalization.py"
        ],
        "commitId" : "19fa98e7d037d9d953262aeae3fe56b45ecc4df2",
        "timestamp" : 1708503760000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "saip.personalization: Add support for SCP80/81/02/03 keys\u000a\u000aThose keys are normally per-card unique, and hence the personalization\u000amust be able to modify them in the profile.\u000a\u000aChange-Id: Ibe4806366f1cce8edb09d52613b1dd56250fa5ae\u000a",
        "date" : "2024-02-21 09:22:40 +0100",
        "id" : "19fa98e7d037d9d953262aeae3fe56b45ecc4df2",
        "msg" : "saip.personalization: Add support for SCP80/81/02/03 keys",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/personalization.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/personalization.py"
        ],
        "commitId" : "2de552e7123b16a54129ba8cfde5a1a25a09df6b",
        "timestamp" : 1708503835000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "saip.personalization: differentiate input_value from value\u000a\u000aWhen personalizing e.g. the ICCID, the input_value is the raw\u000aincrementing counter.  From that, we calculate the Luhn check digit,\u000aand that \"output\" value is what we'll put in to the EF.ICCID specific\u000aencoder.\u000a\u000aHowever, we also store that output value in the instance in order\u000ato generate the output CSV file containig the card-specific\u000apersonalization data.\u000a\u000aChange-Id: Idfcd26c8ca9d73a9c2955f7c97e711dd59a27c4e\u000a",
        "date" : "2024-02-21 09:23:55 +0100",
        "id" : "2de552e7123b16a54129ba8cfde5a1a25a09df6b",
        "msg" : "saip.personalization: differentiate input_value from value",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/personalization.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/personalization.py"
        ],
        "commitId" : "6d63712b51ba3c77361f9dd11f6fe672b0ddedca",
        "timestamp" : 1708503838000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "saip.personalization: automatically compute class 'name' attribute\u000a\u000aWe can use the metaclass to set a proper non-camel-case name attribute.\u000a\u000aChange-Id: If02df436c8f5ce01d21e9ee077ad3736e669d103\u000a",
        "date" : "2024-02-21 09:23:58 +0100",
        "id" : "6d63712b51ba3c77361f9dd11f6fe672b0ddedca",
        "msg" : "saip.personalization: automatically compute class 'name' attribute",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/personalization.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/personalization.py"
        ],
        "commitId" : "b18c7d9be09882aee9b79f5b7d4f9bb51af97a09",
        "timestamp" : 1708503838000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "saip.personalization: Fix encoding of ICCID in ProfileHeader\u000a\u000aTo make things exciting, they decided that the ICCID in the profile\u000aheader is encoded different from the ICCID contained in EF.ICCID...\u000a\u000aChange-Id: I5eacdcdc6bd0ada431eb047bfae930d79d6e3af8\u000a",
        "date" : "2024-02-21 09:23:58 +0100",
        "id" : "b18c7d9be09882aee9b79f5b7d4f9bb51af97a09",
        "msg" : "saip.personalization: Fix encoding of ICCID in ProfileHeader",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/personalization.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tests/test_euicc.py"
        ],
        "commitId" : "decb4680927a2566af67b848382437a6549f850a",
        "timestamp" : 1709318179000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/fixeria",
          "fullName" : "Vadim Yanitskiy"
        },
        "authorEmail" : "vyanitskiy@sysmocom.de",
        "comment" : "tests: assertEquals() is deprecated, use assertEqual()\u000a\u000aThis fixes deprecation warnings printed by Python 3.11.7.\u000a\u000aChange-Id: I1de93b0fee9e8439f7da8a3b9fd2a6974973fb4f\u000a",
        "date" : "2024-03-02 01:36:19 +0700",
        "id" : "decb4680927a2566af67b848382437a6549f850a",
        "msg" : "tests: assertEquals() is deprecated, use assertEqual()",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "tests/test_euicc.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "docs/shell.rst"
        ],
        "commitId" : "2c219cd706e0ad6ace7eaf17543b109d03215697",
        "timestamp" : 1710158129000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "docs/shell: Give users some hints on what to do if encoding/decoding fails\u000a\u000aChange-Id: I557991da748126f3585b88b27706b29e0264635b\u000aRelated: OS#6385\u000a",
        "date" : "2024-03-11 12:55:29 +0100",
        "id" : "2c219cd706e0ad6ace7eaf17543b109d03215697",
        "msg" : "docs/shell: Give users some hints on what to do if encoding/decoding",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "docs/shell.rst"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/sysmocom_sja2.py"
        ],
        "commitId" : "ee4db7010b8da616ef0a0ef023cf9261445fb569",
        "timestamp" : 1710414324000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "sysmocom_sja2: Add test vectors for EF_USIM_AUTH_KEY\u000a\u000aChange-Id: I8be62ba52fbbf6d470f771906a5d3734cca5bac8\u000a",
        "date" : "2024-03-14 12:05:24 +0100",
        "id" : "ee4db7010b8da616ef0a0ef023cf9261445fb569",
        "msg" : "sysmocom_sja2: Add test vectors for EF_USIM_AUTH_KEY",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/sysmocom_sja2.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "osmo-smdpp.py"
        ],
        "commitId" : "7b524fa079f8b166eb905befe0f84f181106c109",
        "timestamp" : 1710491256000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "osmo-smdpp: fix generation of transactionId\u000a\u000aThe hex string of the generated transactionId contains lowercase hex\u000adigits. However SGP.22 explicitly spcifies to use uppercase hex digits\u000awhen using JSON fromatted messages. See section 6.5.2.6 for example.\u000a\u000aRelated: SYS#6720\u000aChange-Id: I8439aa9d70f6fe798fa88b623bac13debdc19ca1\u000a",
        "date" : "2024-03-15 09:27:36 +0100",
        "id" : "7b524fa079f8b166eb905befe0f84f181106c109",
        "msg" : "osmo-smdpp: fix generation of transactionId",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "osmo-smdpp.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-prog.py"
        ],
        "commitId" : "3aa0b41f3931f2a96a45ca1e7919df1ef04f512d",
        "timestamp" : 1710534789000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-prog: convert from optparse to argparse\u000a\u000aWe already use argparse everywhere else, and we have moved reader-driver\u000aargument parsing into the library expecting argparse.\u000a\u000aChange-Id: I7407496643247c754d002656688e9fdcbcf644a8\u000a",
        "date" : "2024-03-15 20:33:09 +0000",
        "id" : "3aa0b41f3931f2a96a45ca1e7919df1ef04f512d",
        "msg" : "pySim-prog: convert from optparse to argparse",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-prog.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/transport/pcsc.py"
        ],
        "commitId" : "24a7f168bd53e97305d3dc2dea7b0d4bb28c20ab",
        "timestamp" : 1710534789000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pcsc: open reader/card in EXCLUSIVE mode by default\u000a\u000aThere was a support request hinting that other applications\u000aconcurrently accessed the SIM and were messing up the card state while\u000apySim-shell was running.\u000a\u000aLet's avoid such situations by opening the card/reader in EXCLUSIVE mode\u000aby default.  If somebody really has a special use case, they can now add\u000athe --pcsc-shared flag to restore the legacy behavior (SHARED mode).\u000a\u000aChange-Id: I90d887714b559a4604708d3c6dd23b5e05f40576\u000a",
        "date" : "2024-03-15 20:33:09 +0000",
        "id" : "24a7f168bd53e97305d3dc2dea7b0d4bb28c20ab",
        "msg" : "pcsc: open reader/card in EXCLUSIVE mode by default",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/transport/pcsc.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "setup.py"
        ],
        "commitId" : "479aeb0b00fdb96a5dc2a92db962c84146f53884",
        "timestamp" : 1710972106000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/osmocom",
          "fullName" : "icecream"
        },
        "authorEmail" : "osmocom@hypodyne.net",
        "comment" : "add missing modules to setup.py\u000a\u000aChange-Id: I330d5e35e5f1b508c6209b6894009b5fdd35d660\u000a",
        "date" : "2024-03-20 15:01:46 -0700",
        "id" : "479aeb0b00fdb96a5dc2a92db962c84146f53884",
        "msg" : "add missing modules to setup.py",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "setup.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "contrib/jenkins.sh"
        ],
        "commitId" : "a412c436b4bd399863723056b5607d6af1ae4725",
        "timestamp" : 1711046340000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/fixeria",
          "fullName" : "Vadim Yanitskiy"
        },
        "authorEmail" : "vyanitskiy@sysmocom.de",
        "comment" : "contrib/jenkins.sh: add 'distcheck' job to check package integrity\u000a\u000aThe idea of this new job is to catch package integrity problems,\u000alike the missing entries in setup.py/packages[] or missing deps.\u000a\u000aChange-Id: Ic72d58494e8fd0cab8d66ce60f7b70593b770872\u000aRelated: osmo-ci.git I9d4d9e9de2b16a4b745791f3c9c93507f43bfa6d\u000a",
        "date" : "2024-03-21 18:39:00 +0000",
        "id" : "a412c436b4bd399863723056b5607d6af1ae4725",
        "msg" : "contrib/jenkins.sh: add 'distcheck' job to check package integrity",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "contrib/jenkins.sh"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "README.md"
        ],
        "commitId" : "0c5dfd9d231f67759aa3cc621217a877843a91b0",
        "timestamp" : 1711184808000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "README.md: Point to simtrace mailing list\u000a\u000aSIM card related topics are best kept there and not on openbsc.\u000a\u000aChange-Id: I0dedd2ed0ab07c6020f9d30857654c5600c53814\u000a",
        "date" : "2024-03-23 10:06:48 +0100",
        "id" : "0c5dfd9d231f67759aa3cc621217a877843a91b0",
        "msg" : "README.md: Point to simtrace mailing list",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "README.md"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "README.md"
        ],
        "commitId" : "60eef0264a17e0acbf7427d7f14242758aa020f5",
        "timestamp" : 1711184808000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "README.md: Link to discourse forum\u000a\u000aChange-Id: Ia5ecbd4f2c2a5dfa1ba69ae2b5712da7abc93c4e\u000a",
        "date" : "2024-03-23 10:06:48 +0100",
        "id" : "60eef0264a17e0acbf7427d7f14242758aa020f5",
        "msg" : "README.md: Link to discourse forum",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "README.md"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "README.md"
        ],
        "commitId" : "f3432eef4cbc3dfb1b7745d65b9f33b48614ca35",
        "timestamp" : 1711184808000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "README.md: Add link to issue tracker\u000a\u000aChange-Id: I33f4e05486d609b2c903c8341dccf1ee01e90577\u000a",
        "date" : "2024-03-23 10:06:48 +0100",
        "id" : "f3432eef4cbc3dfb1b7745d65b9f33b48614ca35",
        "msg" : "README.md: Add link to issue tracker",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "README.md"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          ".github/FUNDING.yml"
        ],
        "commitId" : "7aeeb4f4755094c4bafc1a23fd76b9fba9edb42f",
        "timestamp" : 1711185775000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "Add funding link to github mirror\u000a\u000asee https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/displaying-a-sponsor-button-in-your-repository\u000a\u000aChange-Id: Ib23e6f406ab9546f59ec9e8c6b3eaf27c3dce410\u000a",
        "date" : "2024-03-23 09:22:55 +0000",
        "id" : "7aeeb4f4755094c4bafc1a23fd76b9fba9edb42f",
        "msg" : "Add funding link to github mirror",
        "paths" : [
          {
            "editType" : "add",
            "file" : ".github/FUNDING.yml"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/es2p.py"
        ],
        "commitId" : "b2b29cfed1d0b23d004b3ec122c7c9d1c51f4d49",
        "timestamp" : 1712098171000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "esim.es2p: Permit ApiParamInteger to be an actual integer\u000a\u000aUsually, the specifications say that the integer type is actually\u000atransmitted as a JSON string type.  However, it seems some\u000aimplementations do return a native JSON integer type.  Let's be\u000atolerant in that regard.\u000a\u000aChange-Id: I5b47f8bba01225d53eff2ca086e53a2133abed7f\u000a",
        "date" : "2024-04-03 00:49:31 +0200",
        "id" : "b2b29cfed1d0b23d004b3ec122c7c9d1c51f4d49",
        "msg" : "esim.es2p: Permit ApiParamInteger to be an actual integer",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/es2p.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/es2p.py"
        ],
        "commitId" : "1d1ba8e4cc0cb8c1f862dad04b26e5d4786b924d",
        "timestamp" : 1712098173000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "esim.esp2: Allow HTTP methods other than POST\u000a\u000aWhile all official/standardized ES2+ API functions use POST, there\u000aare some vendor-specific extensions using different HTTP methods.  Be\u000aflexible enough to allow derived classes to easily specify other methods.\u000a\u000aChange-Id: I4b1a0dc7e6662485397c7708933bf16e5ed56e10\u000a",
        "date" : "2024-04-03 00:49:33 +0200",
        "id" : "1d1ba8e4cc0cb8c1f862dad04b26e5d4786b924d",
        "msg" : "esim.esp2: Allow HTTP methods other than POST",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/es2p.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/filesystem.py"
        ],
        "commitId" : "57df6f6e6856c5633816a901dda3d17e77fcce18",
        "timestamp" : 1715363933000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "filesystem: Enforce lower-case hex AID\u000a\u000aour utils.b2h() returns values in lower-case hex string notation,\u000aso let's make sure the CardADF and CardApplication AID values are also\u000astored in lower case notation, othewise the matching baesd on AIDs\u000areturned from the card will not work, specifically as we use uppercase\u000aAIDs in pySim.euicc for CardApplicationECASD and CardApplicationISDR.\u000a\u000aRather than change those two instances, let's solve it in a generic way.\u000a\u000aWe already do the same for the CardFile.fid member.\u000a\u000aChange-Id: Ie42392412d9eb817fbc563d9165faab198ffa7a9\u000a",
        "date" : "2024-05-10 19:58:53 +0200",
        "id" : "57df6f6e6856c5633816a901dda3d17e77fcce18",
        "msg" : "filesystem: Enforce lower-case hex AID",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/filesystem.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/euicc.py"
        ],
        "commitId" : "900b04559b28606692ed261d425e0dce1dd40f98",
        "timestamp" : 1715365169000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "euicc: Fix shell command for SGP.31 get_certs\u000a\u000aChange-Id: I2e59070992bb522d14a5e4956f0d8e738a785dd8\u000a",
        "date" : "2024-05-10 18:19:29 +0000",
        "id" : "900b04559b28606692ed261d425e0dce1dd40f98",
        "msg" : "euicc: Fix shell command for SGP.31 get_certs",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/euicc.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/global_platform/__init__.py"
        ],
        "commitId" : "a644fecc01af11534d65704e1cc302f47f18fc36",
        "timestamp" : 1715365712000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.global_platform: Fix key encryption with DEK\u000a\u000aWhen a SCP is active, the DEK is used to encrypt any key material\u000athat's installed using PUT KEY.  The code prior to this patch fails\u000ato handle this case as it calls the encrypt_key() method on the wrong\u000aobject.\u000a\u000aChange-Id: I6e10fb9c7881ba74ad2986c36bba95b336470838\u000a",
        "date" : "2024-05-10 18:28:32 +0000",
        "id" : "a644fecc01af11534d65704e1cc302f47f18fc36",
        "msg" : "pySim.global_platform: Fix key encryption with DEK",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/global_platform/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-trace.py",
          "pysim-testdata/pySim-trace_test_gsmtap.pcapng.ok"
        ],
        "commitId" : "73a5c74114ffdda7295f2d8b2f329a535e062cb3",
        "timestamp" : 1715365858000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-trace: Support decoding of eUICC traces\u000a\u000aLet's register the ISD-R and ECASD applications so we avoid the warnings\u000aprinted when processing an eUICC protocol trace:\u000a\u000aWARNING  pySim.apdu.ts_102_221: SELECT UNKNOWN AID a0000005591010ffffffff8900000100\u000a\u000aChange-Id: I362a1a7f12d979ff0b7971d5300db9ed56bb1ee5\u000a",
        "date" : "2024-05-10 20:30:58 +0200",
        "id" : "73a5c74114ffdda7295f2d8b2f329a535e062cb3",
        "msg" : "pySim-trace: Support decoding of eUICC traces",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-trace.py"
          },
          {
            "editType" : "edit",
            "file" : "pysim-testdata/pySim-trace_test_gsmtap.pcapng.ok"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/commands.py"
        ],
        "commitId" : "45b7d0126b82c2bdefeb80ebb2b6b9b41a84789b",
        "timestamp" : 1716393839000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "commands.py: Resolve possible variable use before assignment\u000a\u000apySim/commands.py:223:18: E0606: Possibly using variable 'skip' before assignment (possibly-used-before-assignment)\u000a\u000aLet's raise an exception in the erroneous case.\u000a\u000aChange-Id: Id1a892c3446e472699e77f076c2414277e92c98d\u000a",
        "date" : "2024-05-22 18:03:59 +0200",
        "id" : "45b7d0126b82c2bdefeb80ebb2b6b9b41a84789b",
        "msg" : "commands.py: Resolve possible variable use before assignment",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/commands.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/commands.py"
        ],
        "commitId" : "bb2cba83c5a336d1b8e03b3cb31b5c6b81bfb7b8",
        "timestamp" : 1716393839000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "commands.py: Resolve possible variable use before assignment\u000a\u000apySim/commands.py:608:39: E0606: Possibly using variable 'p2' before assignment (possibly-used-before-assignment)\u000a\u000aLet's raise an exception in the erroneous case.\u000a\u000aChange-Id: I23adf2e89aa8a13246cc20ef022c84f0113eb2cd\u000a",
        "date" : "2024-05-22 18:03:59 +0200",
        "id" : "bb2cba83c5a336d1b8e03b3cb31b5c6b81bfb7b8",
        "msg" : "commands.py: Resolve possible variable use before assignment",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/commands.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/euicc.py"
        ],
        "commitId" : "c3d04ab19306c93c9d6af60d185214799700478a",
        "timestamp" : 1716393839000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "euicc.py: Resolve possible variable use before assignment\u000a\u000apySim/euicc.py:436:31: E0606: Possibly using variable 'p_id' before assignment (possibly-used-before-assignment)\u000apySim/euicc.py:455:31: E0606: Possibly using variable 'p_id' before assignment (possibly-used-before-assignment)\u000apySim/euicc.py:473:31: E0606: Possibly using variable 'p_id' before assignment (possibly-used-before-assignment)\u000a\u000aLet's raise an exception in the erroneous case.\u000a\u000aChange-Id: Ifdf4651e503bae6ea3e91c89c2121b416a12fb1a\u000a",
        "date" : "2024-05-22 18:03:59 +0200",
        "id" : "c3d04ab19306c93c9d6af60d185214799700478a",
        "msg" : "euicc.py: Resolve possible variable use before assignment",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/euicc.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "osmo-smdpp.py"
        ],
        "commitId" : "81bc26cc31769678d9870d0f3116aa8af9b9b292",
        "timestamp" : 1716393839000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "osmo-smdpp.py: Resolve possible variable use before assignment\u000a\u000aosmo-smdpp.py:374:72: E0601: Using variable 'iccid_str' before assignment (used-before-assignment)\u000a\u000aLet's raise an exception in the erroneous case.\u000a\u000aChange-Id: I01b308226e12f91699b1b5c6bb06f853be47e185\u000a",
        "date" : "2024-05-22 18:03:59 +0200",
        "id" : "81bc26cc31769678d9870d0f3116aa8af9b9b292",
        "msg" : "osmo-smdpp.py: Resolve possible variable use before assignment",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "osmo-smdpp.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-prog.py"
        ],
        "commitId" : "a3f22ea259ac24ab57fa6608e3741a6f10616efd",
        "timestamp" : 1716393839000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-prog.py: Resolve possible variable use before assignment\u000a\u000apySim-prog.py:741:7: E0606: Possibly using variable 'cp' before assignment (possibly-used-before-assignment)\u000a\u000aChange-Id: I6ab307db378d2ca76dfeae53dc3befa7c103974d\u000a",
        "date" : "2024-05-22 18:03:59 +0200",
        "id" : "a3f22ea259ac24ab57fa6608e3741a6f10616efd",
        "msg" : "pySim-prog.py: Resolve possible variable use before assignment",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-prog.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-trace.py"
        ],
        "commitId" : "568d8cf5dbb0ee968b39db425a859167eb79979f",
        "timestamp" : 1716393839000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-trace.py: Resolve possible variable use before assignment\u000a\u000apySim-trace.py:198:27: E0606: Possibly using variable 's' before assignment (possibly-used-before-assignment)\u000a\u000aChange-Id: I28c137a20143b2cd6ea9a0d5461ab61fcd6fe935\u000a",
        "date" : "2024-05-22 18:03:59 +0200",
        "id" : "568d8cf5dbb0ee968b39db425a859167eb79979f",
        "msg" : "pySim-trace.py: Resolve possible variable use before assignment",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-trace.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/euicc.py"
        ],
        "commitId" : "91ec099680112ae4457c74f6b9c879435330f7d8",
        "timestamp" : 1716393839000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "euicc: clarify which eUICCs are supported\u000a\u000aWe currently do not support M2M eUICC\u000a\u000aChange-Id: I3deb9f181075411484158471012ed449c83028fa\u000a",
        "date" : "2024-05-22 18:03:59 +0200",
        "id" : "91ec099680112ae4457c74f6b9c879435330f7d8",
        "msg" : "euicc: clarify which eUICCs are supported",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/euicc.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/sysmocom_sja2.py"
        ],
        "commitId" : "daeba3c1fb4e3e73293dbb546af686b8101bbc2a",
        "timestamp" : 1716393839000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "sysmocom_sjs2: Make sure 'Const' is imported\u000a\u000a  File \"/crypt/space/home/laforge/projects/git/pysim/pySim/sysmocom_sja2.py\", line 180, in __init__\u000a    self._construct = Struct(Const(b'\\x82'), 'time_unit'/self.TimeUnit, 'value'/Int8ub,\u000a                             ^^^^^\u000aNameError: name 'Const' is not defined\u000a\u000aChange-Id: If34a48e349680ef84e68a4a1a19dde536ecda0e6\u000a",
        "date" : "2024-05-22 18:03:59 +0200",
        "id" : "daeba3c1fb4e3e73293dbb546af686b8101bbc2a",
        "msg" : "sysmocom_sjs2: Make sure 'Const' is imported",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/sysmocom_sja2.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/cat.py"
        ],
        "commitId" : "172c9f7ca6a2c8aadf1f1ae06055c08ae7eea6e8",
        "timestamp" : 1716476093000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim/cat: Fix contruct for Address class/IE\u000a\u000aSomething like \"this._.total_len-1\" only works during decode. Let's\u000ause GreedyBytes instead, working for encode and decode.\u000a\u000aChange-Id: Idf8326298cab7ebc68b09c7e829bfc2061222f51\u000a",
        "date" : "2024-05-23 16:54:53 +0200",
        "id" : "172c9f7ca6a2c8aadf1f1ae06055c08ae7eea6e8",
        "msg" : "pySim/cat: Fix contruct for Address class/IE",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/cat.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/transport/pcsc.py"
        ],
        "commitId" : "56264669a7548ca4c0cc816cea67472b1a7ff1dc",
        "timestamp" : 1716582181000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pcsc: don't assume opts.pcsc_shared is present\u000a\u000aFixes running contrib/sim-rest-server.py:\u000a  builtins.AttributeError: 'Namespace' object has no attribute 'pcsc_shared'\u000a\u000aChange-Id: I864f65849c5d43cf7c73e60f1935afdf4273f696\u000a",
        "date" : "2024-05-24 20:23:01 +0000",
        "id" : "56264669a7548ca4c0cc816cea67472b1a7ff1dc",
        "msg" : "pcsc: don't assume opts.pcsc_shared is present",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/transport/pcsc.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "contrib/sim-rest-client.py"
        ],
        "commitId" : "6add18ea087a0849307c0d0a3d41f8df5a8a82ac",
        "timestamp" : 1716582215000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "contrib/sim-rest-client: don't crash without args\u000a\u000aWhen running without an argument, let argparse print a nice usage error:\u000a\u000a  $ ./sim-rest-client.py\u000a  usage: sim-rest-client.py [-h] [-H HOST] [-p PORT] [-v] [-n SLOT_NR] {auth,info} ...\u000a  sim-rest-client.py: error: the following arguments are required: {auth,info}\u000a\u000aInstead of:\u000a\u000a  $ ./sim-rest-client.py\u000a  Traceback (most recent call last):\u000a    File \"/usr/share/pysim/contrib/./sim-rest-client.py\", line 185, in <module>\u000a      main(sys.argv)\u000a    File \"/usr/share/pysim/contrib/./sim-rest-client.py\", line 181, in main\u000a      args.func(args)\u000a      ^^^^^^^^^\u000a  AttributeError: 'Namespace' object has no attribute 'func'\u000a\u000aChange-Id: I92998d9b94dcfb9dcfc3da161fe5d8f45f242b78\u000a",
        "date" : "2024-05-24 20:23:35 +0000",
        "id" : "6add18ea087a0849307c0d0a3d41f8df5a8a82ac",
        "msg" : "contrib/sim-rest-client: don't crash without args",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "contrib/sim-rest-client.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/global_platform/__init__.py"
        ],
        "commitId" : "8844603941c1a7d6dfe2b2226e300c0f91528d73",
        "timestamp" : 1716714089000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim/global_platform: Fix install_for_personalization command\u000a\u000aA mix-up betewen underscore and dash resulted in:\u000a\u000aChange-Id: I49d12b7c7ae2a343940e87d5069c0ae44a9bc50c\u000aAttributeError: 'Namespace' object has no attribute 'application_aid'\u000a",
        "date" : "2024-05-26 11:01:29 +0200",
        "id" : "8844603941c1a7d6dfe2b2226e300c0f91528d73",
        "msg" : "pySim/global_platform: Fix install_for_personalization command",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/global_platform/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/commands.py"
        ],
        "commitId" : "a823ce89f6c79f4212e7cf52655e88cf38570eee",
        "timestamp" : 1716714089000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim/commands: STATUS: Use indeterminate length Le/P3 == '00'\u000a\u000aLet's have the card tell us what the length is by indicating '00'\u000ainstead of stating 'FF'.  This is better aligned with general practice\u000aand won't break assumptions in other parts of the code like SCP\u000atransport.\u000a\u000aChange-Id: Ied63c6e1970e3dfc675da5e5f94579fbb06fea51\u000a",
        "date" : "2024-05-26 11:01:29 +0200",
        "id" : "a823ce89f6c79f4212e7cf52655e88cf38570eee",
        "msg" : "pySim/commands: STATUS: Use indeterminate length Le/P3 == '00'",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/commands.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/euicc.py"
        ],
        "commitId" : "3ba10b61e10435e920c4ffa008c4f924395a0fc3",
        "timestamp" : 1716714089000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pysim/euicc: Remove duplicated code\u000a\u000aThe get_eid command is actually sending the command apdu twice, as\u000ait contains both an older implementation (result unused) and the newer\u000aone.\u000a\u000aChange-Id: Ie82bb09f4fc30bc879029b83147dad5614792b48\u000a",
        "date" : "2024-05-26 11:01:29 +0200",
        "id" : "3ba10b61e10435e920c4ffa008c4f924395a0fc3",
        "msg" : "pysim/euicc: Remove duplicated code",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/euicc.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-shell.py",
          "pySim/runtime.py"
        ],
        "commitId" : "f47433863e6218d4c55663a34ce0130e52ecbee0",
        "timestamp" : 1716714089000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "runtime: Introduce an 'identity' dict for things like ATR, ICCID, EID\u000a\u000aThis patch introduces the dict, as well as its first use for ATR storage\u000a\u000aChange-Id: Ief5ceaf5afe82800e33da233573293527befd2f4\u000a",
        "date" : "2024-05-26 11:01:29 +0200",
        "id" : "f47433863e6218d4c55663a34ce0130e52ecbee0",
        "msg" : "runtime: Introduce an 'identity' dict for things like ATR, ICCID, EID",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/runtime.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-shell.py"
        ],
        "commitId" : "7f6102365ceac7a5bfb5315e5d3b016b71294bcc",
        "timestamp" : 1716714089000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-shell: Migrate PySimApp.iccid to RuntimeState.identity['ICCID']\u000a\u000aIn the previous patch, we've introduced a new 'identities' dict as part\u000aof the runtime state.  Let's migrate our ICCID storage into it for\u000aconsistency.\u000a\u000aChange-Id: Ibdcf9a7c4e7e445201640bce33b768bcc4460db1\u000a",
        "date" : "2024-05-26 11:01:29 +0200",
        "id" : "7f6102365ceac7a5bfb5315e5d3b016b71294bcc",
        "msg" : "pySim-shell: Migrate PySimApp.iccid to RuntimeState.identity['ICCID']",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/euicc.py",
          "pySim/app.py",
          "pySim-shell.py"
        ],
        "commitId" : "e4450afb4ebf37fd2c2a2a089236f87a9fd92b45",
        "timestamp" : 1716714089000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.app: Attempt to retrieve the EID of a SGP.22 / SGP.32 eUICC\u000a\u000a... and populate the RuntimeState.identity['EID'] wit it, so other\u000a[future] parts of the system can use it.\u000a\u000aLet's also print the EID (if available) from the 'cardinfo' shell\u000acommand.\u000a\u000aChange-Id: Idc2ea1d9263f39b3dff403e1535a5e6c4e88b26f\u000a",
        "date" : "2024-05-26 11:01:29 +0200",
        "id" : "e4450afb4ebf37fd2c2a2a089236f87a9fd92b45",
        "msg" : "pySim.app: Attempt to retrieve the EID of a SGP.22 / SGP.32 eUICC",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/euicc.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/app.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "docs/shell.rst"
        ],
        "commitId" : "3dabbafdba2cbfee6528d057220184f857ea8485",
        "timestamp" : 1717092419000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "docs/shell: Mention GlobalPlatform and eUICC commands in overview\u000a\u000aChange-Id: I5b6ad752fea09ed9632f150dfbbabf2156a5a9c0\u000a",
        "date" : "2024-05-30 20:06:59 +0200",
        "id" : "3dabbafdba2cbfee6528d057220184f857ea8485",
        "msg" : "docs/shell: Mention GlobalPlatform and eUICC commands in overview",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "docs/shell.rst"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/rsp.py",
          "osmo-smdpp.py"
        ],
        "commitId" : "56912caac7545276082bd9e48980e0ba33d84007",
        "timestamp" : 1717092419000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "osmo-smdpp: Don't re-encode euiccSigned1/euiccSigned2\u000a\u000aWe used to re-encode those parts of a decoded ASN.1 struct that is\u000acryptographically signed in the GSMA SGP.22 specification.  However, if\u000athe received data follows a later spec and contains new/unknown records,\u000athen our poor-man's attempt at re-encoding will render a different\u000abinary, which in turn means the signature check will fail.\u000a\u000aLet's instead do a manual step-by-step raw decode of the DER TLV\u000astructure to extract the actual binary information of parts of ASN.1\u000aobjects.\u000a\u000aChange-Id: I4e31fd4b23ec3be15b9d07c2c30a3e31e22bdda1\u000aCloses: OS#6473\u000a",
        "date" : "2024-05-30 20:06:59 +0200",
        "id" : "56912caac7545276082bd9e48980e0ba33d84007",
        "msg" : "osmo-smdpp: Don't re-encode euiccSigned1/euiccSigned2",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/rsp.py"
          },
          {
            "editType" : "edit",
            "file" : "osmo-smdpp.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "osmo-smdpp.py"
        ],
        "commitId" : "64a5901c4c42a2ca5ef8071cdf938e9e59f25b07",
        "timestamp" : 1717092419000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "osmo-smdpp: Make error message more descriptive\u000a\u000aBefore this patch we had three different error causes that would cause a\u000a\"Verification failed\" error message.  Let's state explicitly which part\u000aof verification did actually fail.\u000a\u000aChange-Id: I5030758fe365bb802ae367b494aace5a66bc7a91\u000a",
        "date" : "2024-05-30 20:06:59 +0200",
        "id" : "64a5901c4c42a2ca5ef8071cdf938e9e59f25b07",
        "msg" : "osmo-smdpp: Make error message more descriptive",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "osmo-smdpp.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/global_platform/uicc.py"
        ],
        "commitId" : "ddbfc043ac0fd977a0b18f4b729b9211eea4d432",
        "timestamp" : 1717092419000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "add globalplatform.uicc\u000a\u000aGlobalPlatform has a [non-public] \"UICC Configuration\" spec, which\u000adefines some specific aspects of implementing GlobalPlatform in the\u000acontext of an UICC.  Let's add some python definitions about it.\u000a\u000aChange-Id: If4cb110a9bc5f873b0e097c006bef59264ee48fa\u000a",
        "date" : "2024-05-30 20:06:59 +0200",
        "id" : "ddbfc043ac0fd977a0b18f4b729b9211eea4d432",
        "msg" : "add globalplatform.uicc",
        "paths" : [
          {
            "editType" : "add",
            "file" : "pySim/global_platform/uicc.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/rsp.py",
          "osmo-smdpp.py"
        ],
        "commitId" : "2755b54ded29c8a61babf966ad3e6005d4f64cb2",
        "timestamp" : 1717352611000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "[cosmetic] fix typos in comments\u000a\u000aChange-Id: I549ef7002e6ebef3f13af620cad8d03c7f4d891a\u000a",
        "date" : "2024-06-02 18:23:31 +0000",
        "id" : "2755b54ded29c8a61babf966ad3e6005d4f64cb2",
        "msg" : "[cosmetic] fix typos in comments",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "osmo-smdpp.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/esim/rsp.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/rsp.py",
          "pySim/utils.py"
        ],
        "commitId" : "ee7be445285334ccce1734e003c3222662d922a0",
        "timestamp" : 1717430877000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "utils: Introduce BER-TLV parsers that return raw tag or even raw TLV\u000a\u000aIn the eSIM RSP univers there are some rather ugly layering violatoins\u000awhere ASN.1 cannot be parsed but we have to mess with raw TLVs and the\u000adetails of DER encoding.  Let's add two funtions that make it more\u000aconvenient to work with this: They return the raw tag as integer, or\u000aeven the entire encoded TLV rather than the value part only.\u000a\u000aChange-Id: I1e68a4003b833e86e9282c77325afa86ce144b98\u000a",
        "date" : "2024-06-03 16:07:57 +0000",
        "id" : "ee7be445285334ccce1734e003c3222662d922a0",
        "msg" : "utils: Introduce BER-TLV parsers that return raw tag or even raw TLV",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/rsp.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/utils.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/bsp.py"
        ],
        "commitId" : "fe28a1d87d52920d01168d961009201a2b4647d6",
        "timestamp" : 1717430877000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "esim.bsp: Fix a bug in demac_only_one()\u000a\u000aWhen de-MAC-ing at the recipient side, we must increment the cipher(!)\u000ablock number even if no ciphering is done at all.\u000a\u000aWe did this correctly for MAC (sender) case, but not on the de-MAC\u000a(receiver) case.\u000a\u000aChange-Id: I97993f9e8357b36401d435aaa15558d1c7e411eb\u000a",
        "date" : "2024-06-03 16:07:57 +0000",
        "id" : "fe28a1d87d52920d01168d961009201a2b4647d6",
        "msg" : "esim.bsp: Fix a bug in demac_only_one()",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/bsp.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "80976b65e5a6db49440d4e94a367f4389e69d0af",
        "timestamp" : 1717534317000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "esim.saip: Introduce ProfileElement derived classes\u000a\u000aIt's rather useful to have derived classes implementing specific\u000afunctions related to that SAIP profile type.  Let's introruce that\u000aconcept and a first example for securityDomain, where methods allow\u000achecking/adding/removing support for SCPs.\u000a\u000aChange-Id: I0929cc704b2aabddbc2ddee79ab8b674b1ed4691\u000a",
        "date" : "2024-06-04 20:51:57 +0000",
        "id" : "80976b65e5a6db49440d4e94a367f4389e69d0af",
        "msg" : "esim.saip: Introduce ProfileElement derived classes",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "77256d0c488b9bdba81099716abb36ee61a68b58",
        "timestamp" : 1717534317000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "esim.saip: Implement SecurityDomainSD.{add,has,remove}_key() methods\u000a\u000aThis way it's possible to programmatically inspect and modify the\u000ahigh-level decoded key material inside a securityDomain profile element.\u000a\u000aChange-Id: I18b1444303de80eaddd840a7e0061ea0098a8ba1\u000a",
        "date" : "2024-06-04 20:51:57 +0000",
        "id" : "77256d0c488b9bdba81099716abb36ee61a68b58",
        "msg" : "esim.saip: Implement SecurityDomainSD.{add,has,remove}_key() methods",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/validation.py"
        ],
        "commitId" : "4d5d2f5849b5769a0adc9104db81ca18f8356f78",
        "timestamp" : 1717534317000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.esim.saip.validation: Ensure unique PE identification value\u000a\u000aChange-Id: I37b9eb4cfb74de79b0493986d976c8a5f8ccd8ea\u000a",
        "date" : "2024-06-04 20:51:57 +0000",
        "id" : "4d5d2f5849b5769a0adc9104db81ca18f8356f78",
        "msg" : "pySim.esim.saip.validation: Ensure unique PE identification value",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/validation.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "bc949649da40effb8cf94a7c50010a428fb60f1f",
        "timestamp" : 1717534846000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "esim.saip: Implement ProfileElement.header_name for more PE types\u000a\u000aWe now cover all PE types as of PE_Definitions-3.3.1.asn\u000a\u000aChange-Id: I37951a0441fe53fce7a329066aebd973389cb743\u000a",
        "date" : "2024-06-04 23:00:46 +0200",
        "id" : "bc949649da40effb8cf94a7c50010a428fb60f1f",
        "msg" : "esim.saip: Implement ProfileElement.header_name for more PE types",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "0251367ddb11b533e6f9a8e70455dcd06f646945",
        "timestamp" : 1717535917000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.esim.saip: Meaningful constructors for [I]SD + SSD\u000a\u000aSo far the main use case was to read a ProfileElement-SD from\u000aa DER file.  But when we want to construct one from scratch,\u000awe need to have the constructor put some meaningful [default]\u000avalues into the class members.\u000a\u000aChange-Id: I69e104f1d78165c12291317326dbab05977a1574\u000a",
        "date" : "2024-06-04 23:18:37 +0200",
        "id" : "0251367ddb11b533e6f9a8e70455dcd06f646945",
        "msg" : "pySim.esim.saip: Meaningful constructors for [I]SD + SSD",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "docs/card-key-provider.rst",
          "docs/shell.rst"
        ],
        "commitId" : "a3d41a147f36a1f7a75c933748be922896ac083c",
        "timestamp" : 1717535917000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "document the CardKeyProvider\u000a\u000aChange-Id: Ie6fc24695dd956a4f9fd6f243d3b0ef66acf877b\u000a",
        "date" : "2024-06-04 23:18:37 +0200",
        "id" : "a3d41a147f36a1f7a75c933748be922896ac083c",
        "msg" : "document the CardKeyProvider",
        "paths" : [
          {
            "editType" : "add",
            "file" : "docs/card-key-provider.rst"
          },
          {
            "editType" : "edit",
            "file" : "docs/shell.rst"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "docs/card-key-provider.rst",
          "contrib/csv-encrypt-columns.py",
          "pySim-shell.py",
          "pySim/card_key_provider.py"
        ],
        "commitId" : "1aaf978d9f1b290d13a82d7f1efef671f9fc4099",
        "timestamp" : 1717535917000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "CardKeyProvider: Implement support for column-based transport key encryption\u000a\u000aIt's generally a bad idea to keep [card specific] key material lying\u000aaround unencrypted in CSV files.  The industry standard solution in the\u000aGSMA is a so-called \"transport key\", which encrypts the key material.\u000a\u000aLet's introduce support for this in the CardKeyProvider (and\u000aspecifically, the CardKeyProviderCSV) and allow the user to specify\u000atransport key material as command line options to pySim-shell.\u000a\u000aDifferent transport keys can be used for different key materials, so\u000aallow specification of keys on a CSV-column base.\u000a\u000aThe higher-level goal is to allow the CSV file not only to store\u000athe ADM keys (like now), but also global platform key material for\u000aestablishing SCP towards various security domains in a given card.\u000a\u000aChange-Id: I13146a799448d03c681dc868aaa31eb78b7821ff\u000a",
        "date" : "2024-06-04 23:18:37 +0200",
        "id" : "1aaf978d9f1b290d13a82d7f1efef671f9fc4099",
        "msg" : "CardKeyProvider: Implement support for column-based transport key",
        "paths" : [
          {
            "editType" : "add",
            "file" : "contrib/csv-encrypt-columns.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          },
          {
            "editType" : "edit",
            "file" : "docs/card-key-provider.rst"
          },
          {
            "editType" : "edit",
            "file" : "pySim/card_key_provider.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/euicc.py",
          "pySim/global_platform/__init__.py"
        ],
        "commitId" : "add30ecbfff32ee57a29b2524441e1c532d86fe7",
        "timestamp" : 1717535917000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "global_platform/euicc: Implement obtaining SCP keys from CardKeyProvider\u000a\u000aNow that CardKeyProvider is capable of storing key materials\u000atransport-key-encrypted, we can use this functionality to look up the\u000aSCP02 / SCP03 key material for a given security domain.\u000a\u000aThis patch implements this for the ISD-R and ECASD using a look-up by\u000aEID inside the CSV.\u000a\u000aChange-Id: I2a21f031ab8af88019af1b8390612678b9b35880\u000a",
        "date" : "2024-06-04 23:18:37 +0200",
        "id" : "add30ecbfff32ee57a29b2524441e1c532d86fe7",
        "msg" : "global_platform/euicc: Implement obtaining SCP keys from CardKeyProvider",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/euicc.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/global_platform/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-trace.py",
          "pySim/apdu_source/tca_loader_log.py"
        ],
        "commitId" : "16749075f9a8e10ec32df7d51058fbac4a5648e3",
        "timestamp" : 1717864702000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-trace: Add support for the TCA Loader log file format\u000a\u000aThe \"TCA Loader\" is a freeware utility program published by the\u000aTrusted Connectivity Alliance for testing SCP80, SCP81, SCP02 and SCP03\u000ain UICCs.  It can generate text log files of the APDUs it exchanges;\u000alet's add this file format to pySim-trace\u000a\u000aChange-Id: Ie76d36bb18c6bd8968d2a5b74ec1b8c5ccaaa409\u000a",
        "date" : "2024-06-08 18:38:22 +0200",
        "id" : "16749075f9a8e10ec32df7d51058fbac4a5648e3",
        "msg" : "pySim-trace: Add support for the TCA Loader log file format",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-trace.py"
          },
          {
            "editType" : "add",
            "file" : "pySim/apdu_source/tca_loader_log.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/apdu/__init__.py"
        ],
        "commitId" : "33a6daee6d70c681d468e95b2c4e42e3d17cd233",
        "timestamp" : 1717864702000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.apdu: Allow TLV based decoders for APDU command and response body\u000a\u000aSo far we only supported construct.\u000a\u000aChange-Id: Ibb80d328c9a1f464aa5338ca0ca1d6bfb00734e1\u000a",
        "date" : "2024-06-08 18:38:22 +0200",
        "id" : "33a6daee6d70c681d468e95b2c4e42e3d17cd233",
        "msg" : "pySim.apdu: Allow TLV based decoders for APDU command and response body",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/apdu/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/cat.py"
        ],
        "commitId" : "5529a41a63b10e181a8392c0de2f1a6052636680",
        "timestamp" : 1717864702000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.cat: More TLV Definitions for Event Download\u000a\u000aChange-Id: I713f12577cab1678cdf97b7ae0e6f3815a42242c\u000a",
        "date" : "2024-06-08 18:38:22 +0200",
        "id" : "5529a41a63b10e181a8392c0de2f1a6052636680",
        "msg" : "pySim.cat: More TLV Definitions for Event Download",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/cat.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/apdu/ts_102_221.py"
        ],
        "commitId" : "f22637f151d2c4f7869614c591c885b3a688b571",
        "timestamp" : 1717864702000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.apdu.ts_102_221: Decode the ENVELOPE command body using pySim.cat TLV\u000a\u000aThis will decode the ENVELOPE body in pySim-trace further.\u000a\u000aBefore:\u000a\u000a00 ENVELOPE                                             -        9000 {'p1': 0, 'p2': 0, 'cmd': 'd14682028381060291978b3c40048111227ff6407070611535002d02700000281516011212000001eae1bd578fa25791898128811b2206cc71639ca292ec2526da8aef4273d2fe2e', 'rsp': '027100001f0a00000100000001200000ab12800101230d08a0000001510000000f829000'}\u000a\u000aAfter:\u000a\u000a00 ENVELOPE                                             -        9000 {'p1': 0, 'p2': 0, 'cmd': [{'smspp_download': [{'device_identities': {'source_dev_id': 'network', 'dest_dev_id': 'uicc'}}, {'address': {'ton_npi': 145, 'call_number': '79'}}, {'sms_tpdu': {'tpdu': '40048111227ff6407070611535002d02700000281516011212000001eae1bd578fa25791898128811b2206cc71639ca292ec2526da8aef4273d2fe2e'}}]}], 'rsp': '027100001f0a00000100000001200000ab12800101230d08a0000001510000000f829000'}\u000a\u000aChange-Id: I5ecdbe0b5fa8856cb723569896b73cd49778ed5f\u000a",
        "date" : "2024-06-08 18:38:22 +0200",
        "id" : "f22637f151d2c4f7869614c591c885b3a688b571",
        "msg" : "pySim.apdu.ts_102_221: Decode the ENVELOPE command body using pySim.cat",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/apdu/ts_102_221.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/cat.py",
          "pySim/apdu/ts_102_221.py"
        ],
        "commitId" : "2eea70f6bc2dc64a285c70d59c78b5449ce5bbaa",
        "timestamp" : 1717864702000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.apdu.ts_102_221: Decode FETCH and TERMINAL RESPONSE body\u000a\u000aThis gives a meaningful decode during pySim-trace.\u000a\u000aChange-Id: Ifa410e1fefc25e87ffa8e3a2230af80180a36a18\u000a",
        "date" : "2024-06-08 18:38:22 +0200",
        "id" : "2eea70f6bc2dc64a285c70d59c78b5449ce5bbaa",
        "msg" : "pySim.apdu.ts_102_221: Decode FETCH and TERMINAL RESPONSE body",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/cat.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/apdu/ts_102_221.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/cat.py"
        ],
        "commitId" : "2c39d81b4bb2baf40f3803fdfd6ff673526b4730",
        "timestamp" : 1717870508000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim/cat: Decode the \"Type of Comand\" from numeric value to a string\u000a\u000aThis makes pySim-trace of proactive UICC much more readable.\u000a\u000aChange-Id: I833ec02bf281fe49de2be326018e91f521de52c0\u000a",
        "date" : "2024-06-08 20:15:08 +0200",
        "id" : "2c39d81b4bb2baf40f3803fdfd6ff673526b4730",
        "msg" : "pySim/cat: Decode the \"Type of Comand\" from numeric value to a string",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/cat.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/cat.py"
        ],
        "commitId" : "7b3d4b805c9afc82a3ff50f95744a8df97fc3cbe",
        "timestamp" : 1717928271000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim/cat: Fix \"Decode the \"Type of Comand\" from numeric value to a string\"\u000a\u000aThis fixes a bug introduced in Change-Id: I833ec02bf281fe49de2be326018e91f521de52c0\u000a\u000aChange-Id: I8b466c123173a5be335df3e1d77ef1c5f717a7d9\u000a",
        "date" : "2024-06-09 12:17:51 +0200",
        "id" : "7b3d4b805c9afc82a3ff50f95744a8df97fc3cbe",
        "msg" : "pySim/cat: Fix \"Decode the \"Type of Comand\" from numeric value to a",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/cat.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/http_json_api.py",
          "pySim/esim/es2p.py"
        ],
        "commitId" : "f1495c1e4e00427e68c067bf9e0c027e113cf953",
        "timestamp" : 1717928296000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "esim.es2p: Split generic part of HTTP/REST API from ES2+\u000a\u000aThis way we can reuse it for other eSIM RSP HTTP interfaces like\u000aES9+, ES11, ...\u000a\u000aChange-Id: I468041da40a88875e8df15b04d3ad508e06f16f7\u000a",
        "date" : "2024-06-09 12:18:16 +0200",
        "id" : "f1495c1e4e00427e68c067bf9e0c027e113cf953",
        "msg" : "esim.es2p: Split generic part of HTTP/REST API from ES2+",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/es2p.py"
          },
          {
            "editType" : "add",
            "file" : "pySim/esim/http_json_api.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/es9p.py"
        ],
        "commitId" : "0d1dea01dfea3e1cf85d5a2047097f3d84615b71",
        "timestamp" : 1717928296000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "add pySim.esim.es9p with definitions of the ES9+ HTTP Interface\u000a\u000aLet's use the infrastructure of pySim.esim.http_json_api to define\u000athe ES9+ API Functions.  This can in turn be used by clients or even\u000aosmo-smdpp can be ported over to using this infratructure rather than\u000aopen-coding a lot of the encoding/decoding of API request/response\u000aparameters.\u000a\u000aChange-Id: I194ef1d186391f36245c099cc70a4813185ecf9c\u000a",
        "date" : "2024-06-09 12:18:16 +0200",
        "id" : "0d1dea01dfea3e1cf85d5a2047097f3d84615b71",
        "msg" : "add pySim.esim.es9p with definitions of the ES9+ HTTP Interface",
        "paths" : [
          {
            "editType" : "add",
            "file" : "pySim/esim/es9p.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/http_json_api.py",
          "pySim/esim/es9p.py"
        ],
        "commitId" : "f07161d396a122437bcce39ee4ea9b1ac4c08448",
        "timestamp" : 1717928296000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "http_json_api / es9p: Add User-Agent header\u000a\u000aES9+ (And ES11) require the use of User-Agent, while ES2+ not.\u000a\u000aChange-Id: Iffe64d82087940a82fbfa73bf5d2b7e864ae5d67\u000a",
        "date" : "2024-06-09 12:18:16 +0200",
        "id" : "f07161d396a122437bcce39ee4ea9b1ac4c08448",
        "msg" : "http_json_api / es9p: Add User-Agent header",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/http_json_api.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/esim/es9p.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "contrib/es9p_client.py",
          "pySim/esim/es8p.py"
        ],
        "commitId" : "888c6e56473941e65c9213989e479b1288fb50d0",
        "timestamp" : 1717928296000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "add contrib/es9p_client: Perform ES9+ client functions like LPA+eUICC\u000a\u000aThis tool can be used to test the SM-DP+. It implements the full dance\u000aof all HTTPs API operations to get to the downloadProfile, and will\u000adecrypt the BPP to the UPP, which is then subsequently stored as file on\u000adisk.\u000a\u000aNeedless to say, this will only work if you have an eUICC certificate +\u000aprivate key that is compatible with the CI of your SM-DP+.\u000a\u000aChange-Id: Idf8881e82f9835f5221c58b78ced9937cf5fb520\u000a",
        "date" : "2024-06-09 12:18:16 +0200",
        "id" : "888c6e56473941e65c9213989e479b1288fb50d0",
        "msg" : "add contrib/es9p_client: Perform ES9+ client functions like LPA+eUICC",
        "paths" : [
          {
            "editType" : "add",
            "file" : "contrib/es9p_client.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/esim/es8p.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/http_json_api.py",
          "contrib/es9p_client.py",
          "pySim/esim/es9p.py"
        ],
        "commitId" : "50d9e2a6d8d577bee80c0d9891dbb99a223bcf84",
        "timestamp" : 1717928296000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "esim.es9p: Suppress sending requestHeader on ES9+\u000a\u000aSGP.22 states that ES9+ should not include a requestHeader\u000a\u000aChange-Id: Ic9aa874a82241d7b26e2bcb0423961173e103020\u000a",
        "date" : "2024-06-09 12:18:16 +0200",
        "id" : "50d9e2a6d8d577bee80c0d9891dbb99a223bcf84",
        "msg" : "esim.es9p: Suppress sending requestHeader on ES9+",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/es9p.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/esim/http_json_api.py"
          },
          {
            "editType" : "edit",
            "file" : "contrib/es9p_client.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "0cb0e02c5cb6feaafe28a1ea291a5a7838f9d58e",
        "timestamp" : 1717928296000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "esim.saip: Introduce ProfileElement.identification property\u000a\u000aChange-Id: I6525bb78619e574296488843e021d505e0632d99\u000a",
        "date" : "2024-06-09 12:18:16 +0200",
        "id" : "0cb0e02c5cb6feaafe28a1ea291a5a7838f9d58e",
        "msg" : "esim.saip: Introduce ProfileElement.identification property",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/oid.py",
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "4680503acccab89531d014adb498f2865d30afa0",
        "timestamp" : 1717928296000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "esim.saip: Add ProfileElementSequence.remove_naas_of_type\u000a\u000aThis method allows the caller to remove all NAAs of a certain type,\u000afor example to remove all CSIM instances from a given profile.\u000a\u000aChange-Id: I64438bf0be58bad7a561c3744b7e9b1338a7857c\u000a",
        "date" : "2024-06-09 12:18:16 +0200",
        "id" : "4680503acccab89531d014adb498f2865d30afa0",
        "msg" : "esim.saip: Add ProfileElementSequence.remove_naas_of_type",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/oid.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/tlv.py"
        ],
        "commitId" : "144bae3f37333cd30f1479d67d7e10641f76f46e",
        "timestamp" : 1717928296000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.tlv: Correctly parse COMPREHENSION-TLV without comprehension bit\u000a\u000aThe uppermost bit of COMPREHENSION-TLV tags indicates whether the\u000arecipient is required to \"comprehend\" that IE or not. So every IE\u000aactually has two tag values: one with and one without that bit set.\u000a\u000aAs all our existing TLV definitions of COMPR_TLV_IE have that bit set,\u000alet's assume this is the default, but use the same definition also for\u000athe situation where that bit is not set.\u000a\u000aChange-Id: I58d04ec13be0c12d9fb8cb3d5a0480d0defb6c95\u000a",
        "date" : "2024-06-09 12:18:16 +0200",
        "id" : "144bae3f37333cd30f1479d67d7e10641f76f46e",
        "msg" : "pySim.tlv: Correctly parse COMPREHENSION-TLV without comprehension bit",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/tlv.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/cat.py"
        ],
        "commitId" : "05349a0c65d571eeaf7dca84e394ed9c2ee01265",
        "timestamp" : 1717964271000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.cat: Make sure to always set comprehension bit in COMPR_TLV_IE\u000a\u000aour implementation currently assumes that all derived classes are\u000acreated with a tag value that has the comprehension bit set.\u000a\u000aChange-Id: I6e5f2a69c960c03015c3f233f8fbc2a7a802f07e\u000a",
        "date" : "2024-06-09 22:17:51 +0200",
        "id" : "05349a0c65d571eeaf7dca84e394ed9c2ee01265",
        "msg" : "pySim.cat: Make sure to always set comprehension bit in COMPR_TLV_IE",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/cat.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/tlv.py"
        ],
        "commitId" : "cdf661b24cfebb63b57405c2b55b3c42a8f277c8",
        "timestamp" : 1717966173000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.tlv.COMPR_TLV_IE: Patch comprehension bit if derived class misses it\u000a\u000aOur current implementation assumes that all COMPR_TLV_IE are created\u000awith a raw tag value that has the comprehension bit set.  Check for this\u000aduring the class __new__ method and print a warning if we have to fix it up\u000a\u000aChange-Id: I299cd65f32dffda9040d18c17a374e8dc9ebe7da\u000a",
        "date" : "2024-06-09 22:49:33 +0200",
        "id" : "cdf661b24cfebb63b57405c2b55b3c42a8f277c8",
        "msg" : "pySim.tlv.COMPR_TLV_IE: Patch comprehension bit if derived class misses",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/tlv.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "contrib/jenkins.sh"
        ],
        "commitId" : "a5634c248b3415d95b4a4cfc6caf54a1de20d5d7",
        "timestamp" : 1717966173000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "jenkins.sh: Include es9p_client in pylint\u000a\u000aChange-Id: I06f6773b8b5d3dfa588617d5af81c2fddb474a3d\u000a",
        "date" : "2024-06-09 22:49:33 +0200",
        "id" : "a5634c248b3415d95b4a4cfc6caf54a1de20d5d7",
        "msg" : "jenkins.sh: Include es9p_client in pylint",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "contrib/jenkins.sh"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "contrib/jenkins.sh",
          "pySim/pprint.py",
          "contrib/saip-tool.py"
        ],
        "commitId" : "3b4a673de4f79f5a5be0bd413b8991c1b12697cb",
        "timestamp" : 1718002779000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "add contrib/saip-tool.py\u000a\u000aThis is a tool to work with eSIM profiles in SAIP format.  It allows\u000ato dump the contents, run constraint checkers as well as splitting\u000aof the PE-Sequence into the individual PEs.\u000a\u000aChange-Id: I396bcd594e0628dfc26bd90233317a77e2f91b20\u000a",
        "date" : "2024-06-10 08:59:39 +0200",
        "id" : "3b4a673de4f79f5a5be0bd413b8991c1b12697cb",
        "msg" : "add contrib/saip-tool.py",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "contrib/jenkins.sh"
          },
          {
            "editType" : "add",
            "file" : "contrib/saip-tool.py"
          },
          {
            "editType" : "add",
            "file" : "pySim/pprint.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/cat.py"
        ],
        "commitId" : "4a191089dc02747115e0d299147ba430d2309456",
        "timestamp" : 1718002779000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.cat: Add more alredy-defined IEs to ProactiveCmd classes\u000a\u000a... also add some spec references\u000a\u000aChange-Id: If071abdc61c7c881bdea5292d12c74a1024f6784\u000a",
        "date" : "2024-06-10 08:59:39 +0200",
        "id" : "4a191089dc02747115e0d299147ba430d2309456",
        "msg" : "pySim.cat: Add more alredy-defined IEs to ProactiveCmd classes",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/cat.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ota.py"
        ],
        "commitId" : "1a9cabbbf008ad919294d815ade3e44cb96c441d",
        "timestamp" : 1718002779000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim/ota: Don't modify input argument in OtaDialectSms.encode_cmd\u000a\u000aChange-Id: I4c4c44002762696b931ed3580ffe54daf62ffa61\u000a",
        "date" : "2024-06-10 08:59:39 +0200",
        "id" : "1a9cabbbf008ad919294d815ade3e44cb96c441d",
        "msg" : "pySim/ota: Don't modify input argument in OtaDialectSms.encode_cmd",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ota.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ota.py"
        ],
        "commitId" : "8bd551af321af3ca3e73a48def87b303e91333fc",
        "timestamp" : 1718005500000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.ota.OtaDialectSms: Move SMS header construct up to class level\u000a\u000athis way we can use it in other [future] methods.\u000a\u000aChange-Id: If296f823c18864fddcfb9cb1b82a087bac8875d4\u000a",
        "date" : "2024-06-10 07:45:00 +0000",
        "id" : "8bd551af321af3ca3e73a48def87b303e91333fc",
        "msg" : "pySim.ota.OtaDialectSms: Move SMS header construct up to class level",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ota.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ota.py",
          "tests/test_ota.py"
        ],
        "commitId" : "32401a54e627494e5bf3749559be133739f2da7b",
        "timestamp" : 1718019568000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.ota.OtaDialectSms: Implement command decoding\u000a\u000aSo far we only implemented command encoding and response decoding.\u000aLet's also add command decoding, which is useful for example when\u000adecoding protocol traces.\u000a\u000aChange-Id: Id666cea8a91a854209f3c19c1f09b512bb493c85\u000a",
        "date" : "2024-06-10 11:39:28 +0000",
        "id" : "32401a54e627494e5bf3749559be133739f2da7b",
        "msg" : "pySim.ota.OtaDialectSms: Implement command decoding",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "tests/test_ota.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ota.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tests/test_ota.py"
        ],
        "commitId" : "1aa77c5d7457fdb2313d9824c1cced08517427e1",
        "timestamp" : 1718019568000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "tests/ota_test.py: Allow stand-alone execution\u000a\u000aLet's add a __main__ section to allow stand-alone execution via\u000a\u0009python3 ./tests/test_ota.py\u000a\u000aChange-Id: Ic3940ac23c7ddc1013e21f41eae6076a11dfd4f4\u000a",
        "date" : "2024-06-10 11:39:28 +0000",
        "id" : "1aa77c5d7457fdb2313d9824c1cced08517427e1",
        "msg" : "tests/ota_test.py: Allow stand-alone execution",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "tests/test_ota.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "osmo-smdpp.py"
        ],
        "commitId" : "5964bdd5a495461816807eba8b6de601405dd132",
        "timestamp" : 1718019568000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "osmo-smdpp: use NIST-P256 by default\u000a\u000aThe eSIM specs allow for both brainpool and nist; in reality the\u000adeployments use the NIST P256 curve.\u000a\u000aosmo-smdpp currently only supports a single certificate; let's use the\u000aNIST one by default.\u000a\u000aChange-Id: Idc7809f320505279c8a75e9b667be0a2af802f6b\u000a",
        "date" : "2024-06-10 11:39:28 +0000",
        "id" : "5964bdd5a495461816807eba8b6de601405dd132",
        "msg" : "osmo-smdpp: use NIST-P256 by default",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "osmo-smdpp.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "contrib/unber.py"
        ],
        "commitId" : "5341bf902f1e6d1d08d35a541b25332b99104519",
        "timestamp" : 1718019568000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "unber.py: work-around pylint reporting (possibly-used-before-assignment)\u000a\u000acontrib/unber.py:39:22: E0606: Possibly using variable 'content' before assignment (possibly-used-before-assignment)\u000a\u000aChange-Id: I725cd5e05e3121c853669eb4bbfe5ba51b79eb75\u000a",
        "date" : "2024-06-10 11:39:28 +0000",
        "id" : "5341bf902f1e6d1d08d35a541b25332b99104519",
        "msg" : "unber.py: work-around pylint reporting (possibly-used-before-assignment)",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "contrib/unber.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "contrib/jenkins.sh"
        ],
        "commitId" : "36276e7b2aeeccb6d71acd90341033a5a96e2eb0",
        "timestamp" : 1718019568000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "contrib/jenkins.sh: Execute pylint also on all contrib python scripts\u000a\u000aThis way we get linting coverage for sim-rest-{server,client}, eidtool,\u000aunber and others.\u000a\u000aChange-Id: I2d6271d493d0f6765e6a184f8ae32f8325317be2\u000a",
        "date" : "2024-06-10 11:39:28 +0000",
        "id" : "36276e7b2aeeccb6d71acd90341033a5a96e2eb0",
        "msg" : "contrib/jenkins.sh: Execute pylint also on all contrib python scripts",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "contrib/jenkins.sh"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "contrib/es9p_client.py"
        ],
        "commitId" : "f36e9fd39fe8e786a6c0f05c418bb5e1b7bf1c35",
        "timestamp" : 1718019580000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "es9p_client: Use a plausible TAC (copy from lpac)\u000a\u000aSome SM-DP+ (notably Idemia) fail if the TAC is not valid.\u000a\u000aChange-Id: I48890c4a56147410d0cd5c4e47647b8eb5ad9998\u000a",
        "date" : "2024-06-10 13:39:40 +0200",
        "id" : "f36e9fd39fe8e786a6c0f05c418bb5e1b7bf1c35",
        "msg" : "es9p_client: Use a plausible TAC (copy from lpac)",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "contrib/es9p_client.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "ecb65bc2f2f35feba36add7593c62b06379bce2b",
        "timestamp" : 1718019580000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "esim.saip: Remove debug print()\u000a\u000aChange-Id: I8dfe29302225d951e656d1321bbd249bfe242602\u000a",
        "date" : "2024-06-10 13:39:40 +0200",
        "id" : "ecb65bc2f2f35feba36add7593c62b06379bce2b",
        "msg" : "esim.saip: Remove debug print()",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "contrib/saip-tool.py",
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "3d70f659f3813f8fc882d4563eb5bcfc01187e10",
        "timestamp" : 1718019580000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "saip-tool: Add new 'info' action to print general information\u000a\u000aIt will print something like this:\u000a\u000aSAIP Profile Version: 2.1\u000aProfile Type: 'GSMA Generic eUICC Test Profile'\u000aICCID: 8949449999999990023f\u000aMandatory Services: usim, isim, csim, javacard, usim-test-algorithm\u000a\u000aNAAs: mf[1], usim[1], csim[1], isim[1]\u000aNAA mf\u000aNAA usim (a0000000871002ff49ff0589)\u000a        IMSI: 001010123456063\u000aNAA csim\u000aNAA isim (a0000000871004ff49ff0589)\u000a\u000aNumber of applications: 0\u000a\u000aChange-Id: I107d457c3313a766229b569453c18a8d69134bec\u000a",
        "date" : "2024-06-10 13:39:40 +0200",
        "id" : "3d70f659f3813f8fc882d4563eb5bcfc01187e10",
        "msg" : "saip-tool: Add new 'info' action to print general information",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          },
          {
            "editType" : "edit",
            "file" : "contrib/saip-tool.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "contrib/saip-tool.py",
          "pySim/javacard.py",
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "b6532b56d2e78be6ac98977b82d63c65879abe34",
        "timestamp" : 1718088327000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "saip-tool: Add 'extract-apps' to dump all applications from eSIM profile\u000a\u000aThis new action can be used to dump all java applications as either raw\u000aIJC file or converted to CAP format (the usual format generated by\u000aJavaCard toolchains).\u000a\u000aChange-Id: I51cffa5ba3ddbea491341d678ec9249d7cf470a5\u000a",
        "date" : "2024-06-11 08:45:27 +0200",
        "id" : "b6532b56d2e78be6ac98977b82d63c65879abe34",
        "msg" : "saip-tool: Add 'extract-apps' to dump all applications from eSIM profile",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "contrib/saip-tool.py"
          },
          {
            "editType" : "add",
            "file" : "pySim/javacard.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/cat.py",
          "pySim/tlv.py"
        ],
        "commitId" : "698886247f592cede824984723e78b41a0ef6b64",
        "timestamp" : 1720593580000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.tlv: Fix ComprTlvMeta() not passing kwargs to parent __new__\u000a\u000aThis fixes commit cdf661b24cfebb63b57405c2b55b3c42a8f277c8\u000a\"pySim.tlv.COMPR_TLV_IE: Patch comprehension bit if derived class misses it\"\u000awhere we introduce a comprehension-TLV specific derived metaclass, which forgets\u000ato pass the kwargs through to the parent metaclass.\u000a\u000aChange-Id: If65a8169bcf91bb2f943d0316f1140e07f0b8b8e\u000a",
        "date" : "2024-07-10 08:39:40 +0200",
        "id" : "698886247f592cede824984723e78b41a0ef6b64",
        "msg" : "pySim.tlv: Fix ComprTlvMeta() not passing kwargs to parent __new__",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/cat.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/tlv.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tests/test_esim_saip.py",
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "200bf6eb8bb863737d3268152f25a45465f0af1a",
        "timestamp" : 1720594283000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.esim.saip: Meaningful defaults in PE Constructor + test\u000a\u000aLet's make sure the constructor of ProfileElement subclasses set\u000ameaningful defaults to the self.decoded member, so that the to_der()\u000amethod can actually encode it.   This is required when constructing\u000aa profile from scratch, as opposed to loading an existing one from DER.\u000a\u000aAlso, add a test to verify that the encoder passes without exception;\u000adoesn't test the generated binary data.\u000a\u000aChange-Id: I401bca16e58461333733877ec79102a5ae7fe410\u000a",
        "date" : "2024-07-10 06:51:23 +0000",
        "id" : "200bf6eb8bb863737d3268152f25a45465f0af1a",
        "msg" : "pySim.esim.saip: Meaningful defaults in PE Constructor + test",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          },
          {
            "editType" : "edit",
            "file" : "tests/test_esim_saip.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/__init__.py"
        ],
        "commitId" : "c0ea1495558d380ee6d8f74524885a6607fa0ab6",
        "timestamp" : 1720594283000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.esim: Allow calling compile_asn1_subdir() with non-DER coddec\u000a\u000athis isn't needed for the on-wire format, but can be useful for debug\u000aoutput in GSER or JER.\u000a\u000aChange-Id: I1de4b9506a92d60f582c328a180760332584f9e4\u000a",
        "date" : "2024-07-10 06:51:23 +0000",
        "id" : "c0ea1495558d380ee6d8f74524885a6607fa0ab6",
        "msg" : "pySim.esim: Allow calling compile_asn1_subdir() with non-DER coddec",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tests/test_esim_saip.py",
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "292191d67a7449747c666323cab283caa63cd032",
        "timestamp" : 1720594283000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.esim.saip: Add ProfileElementAKA constructor + methods\u000a\u000aThis helps us to construct an akaParameter PE from scratch.\u000a\u000aChange-Id: I4cc42c98bf82aec085ab7f48aea4ff7efa0eae9e\u000a",
        "date" : "2024-07-10 06:51:23 +0000",
        "id" : "292191d67a7449747c666323cab283caa63cd032",
        "msg" : "pySim.esim.saip: Add ProfileElementAKA constructor + methods",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          },
          {
            "editType" : "edit",
            "file" : "tests/test_esim_saip.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tests/test_esim_saip.py"
        ],
        "commitId" : "992e60902a98d17e6d792904af67416be9e77fab",
        "timestamp" : 1720594283000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "tests: Add ProfileElementSD and ProfileElementSSD to test_constructor_encode\u000a\u000aChange-Id: Idc6f37b487dfa8a69ac7a50a537cfc317113d501\u000a",
        "date" : "2024-07-10 06:51:23 +0000",
        "id" : "992e60902a98d17e6d792904af67416be9e77fab",
        "msg" : "tests: Add ProfileElementSD and ProfileElementSSD to",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "tests/test_esim_saip.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/oid.py",
          "pySim/esim/saip/templates.py",
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "3c530c3c1a4d6860d6fe7921104a53b4466ffede",
        "timestamp" : 1720594283000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.saip.oid: Properly differentiate optional from non-optional templates\u000a\u000aThere are e.g. templates for usim and for opt-usim, and they should not\u000abe confused with each other.  Let's reflect that in the naming.\u000a\u000aChange-Id: Ic6d04ce3172dc969c6b8c018b8d305eb6fd3f550\u000a",
        "date" : "2024-07-10 06:51:23 +0000",
        "id" : "3c530c3c1a4d6860d6fe7921104a53b4466ffede",
        "msg" : "pySim.saip.oid: Properly differentiate optional from non-optional",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/templates.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/oid.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tests/test_esim_saip.py",
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "2668eb6148aaa209f97005803823b09224f5534a",
        "timestamp" : 1720594283000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.esim.saip: Add ProfileElementOpt{USIM,ISIM} classes\u000a\u000aChange-Id: Iebff2e767baa19f272eeddc62d7d5b3a8f665db5\u000a",
        "date" : "2024-07-10 06:51:23 +0000",
        "id" : "2668eb6148aaa209f97005803823b09224f5534a",
        "msg" : "pySim.esim.saip: Add ProfileElementOpt{USIM,ISIM} classes",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "tests/test_esim_saip.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tests/test_esim_saip.py",
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "3b7e2ae2c1bdeca35f535467120b947b12e982dd",
        "timestamp" : 1720594283000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.saip: Add ProfileElementRFM class\u000a\u000aChange-Id: I547e02c12345932deafa4b914fcaeaa183b69798\u000a",
        "date" : "2024-07-10 06:51:23 +0000",
        "id" : "3b7e2ae2c1bdeca35f535467120b947b12e982dd",
        "msg" : "pySim.saip: Add ProfileElementRFM class",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "tests/test_esim_saip.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "5f9b8a8fc12496118d74f6733f653c4cbaad92b4",
        "timestamp" : 1720594283000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.esim.saip: Move initialization of PE header to base class\u000a\u000aLet's avoid the copy+paste in the subclass constructors and initialize the profile\u000aelement header in the base class constructor.\u000a\u000aChange-Id: I6e69ae1f0d33d963247fc506db33b3840c10c19a\u000a",
        "date" : "2024-07-10 06:51:23 +0000",
        "id" : "5f9b8a8fc12496118d74f6733f653c4cbaad92b4",
        "msg" : "pySim.esim.saip: Move initialization of PE header to base class",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tests/test_esim_saip.py",
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "03aebf5b436e16cc5a1276c1e96856691c0c80a7",
        "timestamp" : 1720594283000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.esim.saip: ProfileElement{Header,End} classes\u000a\u000aChange-Id: I88e18c1ee4907eeac3ae5d04d7bc30d6765f91fa\u000a",
        "date" : "2024-07-10 06:51:23 +0000",
        "id" : "03aebf5b436e16cc5a1276c1e96856691c0c80a7",
        "msg" : "pySim.esim.saip: ProfileElement{Header,End} classes",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          },
          {
            "editType" : "edit",
            "file" : "tests/test_esim_saip.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "b5679386d7073652c2784133319aa8fe7cad7344",
        "timestamp" : 1720594283000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.esim.saip: Add methods to rebuild \"mandatory\" lists in ProfileHeader\u000a\u000aThe ProfileHeader PE contain lists of template-oids and services that\u000aare mandatory in this profile.  Let's add methods that can be used to\u000a(re-) compute those lists based on the actual PE contents of the\u000asequence.\u000a\u000aThe idea is that during programmatic construction of a profile, those methods\u000awould be called after appending all PEs, just before encoding the\u000aprofile as DER.\u000a\u000aChange-Id: Ib43db8695c6eb63965756364fda7546d82df0beb\u000a",
        "date" : "2024-07-10 06:51:23 +0000",
        "id" : "b5679386d7073652c2784133319aa8fe7cad7344",
        "msg" : "pySim.esim.saip: Add methods to rebuild \"mandatory\" lists in",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "contrib/saip-tool.py"
        ],
        "commitId" : "37320da4ab3b1bd7ae1e99a314a13a2fd9b1d408",
        "timestamp" : 1720594283000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "saip-tool: Dump information about security domains from \"info\" command\u000a\u000aoutput looks like this:\u000a\u000aNumber of security domains: 1\u000aSecurity domain Instance AID: a000000151000000\u000a        KVN=0x01, KID=0x01, [SdKeyComp(type=aes, mac_len=8, data=00000000000000000000000000000000)]\u000a        KVN=0x01, KID=0x02, [SdKeyComp(type=aes, mac_len=8, data=00000000000000000000000000000000)]\u000a        KVN=0x01, KID=0x03, [SdKeyComp(type=aes, mac_len=8, data=00000000000000000000000000000000)]\u000a\u000aChange-Id: Ia25f5ca6d7e888f7032301dd2561d066a3870010\u000a",
        "date" : "2024-07-10 06:51:23 +0000",
        "id" : "37320da4ab3b1bd7ae1e99a314a13a2fd9b1d408",
        "msg" : "saip-tool: Dump information about security domains from \"info\" command",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "contrib/saip-tool.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "contrib/saip-tool.py"
        ],
        "commitId" : "76b3488829af27ce0e8e0baf2fd9ba64de03f974",
        "timestamp" : 1720594283000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "saip-tool: Also dump RFM information in \"info\" command\u000a\u000aexample output:\u000a\u000aNumber of RFM instances: 2\u000aRFM instanceAID: d276000005aa060200000000b00000 (-> TAR: b00000)\u000a        MSL: 0x16\u000aRFM instanceAID: d276000005aa060200000000b00001 (-> TAR: b00001)\u000a        MSL: 0x16\u000a        ADF AID: a0000000871002ff33ffff8901010100\u000a\u000aChange-Id: I534267c7420fc5bd96eaded6078e986161729073\u000a",
        "date" : "2024-07-10 06:51:23 +0000",
        "id" : "76b3488829af27ce0e8e0baf2fd9ba64de03f974",
        "msg" : "saip-tool: Also dump RFM information in \"info\" command",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "contrib/saip-tool.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tests/test_tlv.py",
          "pySim/tlv.py"
        ],
        "commitId" : "1c2ec93164c6f88f7c3388318c45dc03bc4cb0fb",
        "timestamp" : 1720627839000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.tlv: Add COMPACT_TLV_IE TLV variant\u000a\u000athe COMPACT-TLV variant is a TLV variant that ISO7816 uses for encoding\u000atag and length into a single octet. This is used (for example) in ATR\u000ahistorical bytes.\u000a\u000aLet's add support for this to our pySim TLV encoder/decoder.\u000a\u000aChange-Id: I9e98d150b97317ae0c6be2366bdaaeaeddf8031c\u000a",
        "date" : "2024-07-10 18:10:39 +0200",
        "id" : "1c2ec93164c6f88f7c3388318c45dc03bc4cb0fb",
        "msg" : "pySim.tlv: Add COMPACT_TLV_IE TLV variant",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "tests/test_tlv.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/tlv.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/transport/__init__.py"
        ],
        "commitId" : "b865d383aa8a8e84b4842cce88149701afb2ffc3",
        "timestamp" : 1720904660000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.transport: Fix proactive_handler from_dict() calls\u000a\u000aChange-Id: I2aa19ef6a19085d77c1b4f2d434a01ee241bd9a8\u000a",
        "date" : "2024-07-13 23:04:20 +0200",
        "id" : "b865d383aa8a8e84b4842cce88149701afb2ffc3",
        "msg" : "pySim.transport: Fix proactive_handler from_dict() calls",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/transport/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ota.py"
        ],
        "commitId" : "dacacd206df0fa4bbb791135aed45bd3363bd555",
        "timestamp" : 1720904842000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.ota: Handle cases where 'secured_data' is empty\u000a\u000awhile it's true that in situations where response_status == 'por_ok'\u000awe are guaranteed to have a 'secured_data' key in the dict, its value\u000acould well be b'', which in turn causes us to run into an exception,\u000acalling a decoder on an empty byte value; let's avoid that.\u000a\u000aChange-Id: I7c919f9987585d3b42347c54bd3082a54b8c2a0a\u000a",
        "date" : "2024-07-13 23:07:22 +0200",
        "id" : "dacacd206df0fa4bbb791135aed45bd3363bd555",
        "msg" : "pySim.ota: Handle cases where 'secured_data' is empty",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ota.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ota.py"
        ],
        "commitId" : "0c40a2245b79f53d1de94d2807e2763b28adbb27",
        "timestamp" : 1720904842000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.ota: Raise exception if encoded length would exceed 140 bytes\u000a\u000aSMS cannot exceed 140 bytes, and TS 31.115 explicitly states that larger\u000amessages must use multi-part SMS, which we don't yet implement here.\u000a\u000aChange-Id: I8a1543838be2add1c3cfdf7155676cf2b9827e6e\u000a",
        "date" : "2024-07-13 23:07:22 +0200",
        "id" : "0c40a2245b79f53d1de94d2807e2763b28adbb27",
        "msg" : "pySim.ota: Raise exception if encoded length would exceed 140 bytes",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ota.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/commands.py"
        ],
        "commitId" : "12902730bf4ff216ada3b237a6658071625fb92d",
        "timestamp" : 1720904842000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.commands: Check return value of TERMINAL PROFILE command\u000a\u000aChange-Id: Iaede74caf22970869c2c85b42d1e6f70d52c65cb\u000a",
        "date" : "2024-07-13 23:07:22 +0200",
        "id" : "12902730bf4ff216ada3b237a6658071625fb92d",
        "msg" : "pySim.commands: Check return value of TERMINAL PROFILE command",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/commands.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/transport/__init__.py"
        ],
        "commitId" : "c805f00bff35904886d4623205c9ab756efa9c8b",
        "timestamp" : 1720904942000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "transport: Implement treatment of 62xx and 63xx warning/error responses\u000a\u000aTS 102 221 specifies that (in case of a class 4 command) and as SW\u000a62xx or 63xx, we should send a GET RESPONSE just like in the 61xx\u000acase in order to get the respective response.\u000a\u000aAs we don't really know if it's a case1/2/3/4 command in the\u000apySim.transport, let's always send the GET RESPONSE in case SW 62xx or\u000a63xx are received.  It shouldn't hurt - in the worst case there's no\u000aresponse available...\u000a\u000aChange-Id: Ibb1398194a16fc1f1f9bc46af6c66fb6575240cd\u000a",
        "date" : "2024-07-13 23:09:02 +0200",
        "id" : "c805f00bff35904886d4623205c9ab756efa9c8b",
        "msg" : "transport: Implement treatment of 62xx and 63xx warning/error responses",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/transport/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/cat.py"
        ],
        "commitId" : "5fdfa1463e4cd209fc93867d959931ce16f22006",
        "timestamp" : 1721040010000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.cat: More spec references + explanations in comments\u000a\u000aChange-Id: I4a89156075ae225594740451b33c3dec8983cf04\u000a",
        "date" : "2024-07-15 12:40:10 +0200",
        "id" : "5fdfa1463e4cd209fc93867d959931ce16f22006",
        "msg" : "pySim.cat: More spec references + explanations in comments",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/cat.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "contrib/saip-tool.py"
        ],
        "commitId" : "23dd13542e0c8ca6e1afd6305276064967d125f4",
        "timestamp" : 1721142417000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "saip-tool: Fix output of TAR values in \"print\" subcommand\u000a\u000aChange-Id: Ifba1048e3000829d54769b0420f5134e2f9b04e1\u000a",
        "date" : "2024-07-16 15:06:57 +0000",
        "id" : "23dd13542e0c8ca6e1afd6305276064967d125f4",
        "msg" : "saip-tool: Fix output of TAR values in \"print\" subcommand",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "contrib/saip-tool.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/http_json_api.py"
        ],
        "commitId" : "96e2a521e942d676dd7bd2af9a403faa8a12d95d",
        "timestamp" : 1721149135000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.esim.http_json_api: 'header' is not always present in response\u000a\u000aFor example, the ES9+ handleNotification function is defined with an\u000aempty response body, so we cannot unconditionally assume that every HTTP\u000aresponse will contain a JSON \"header\" value.\u000a\u000aChange-Id: Ia3c5703b746c1eba91f85f8545f849a3f2d56e0b\u000a",
        "date" : "2024-07-16 16:58:55 +0000",
        "id" : "96e2a521e942d676dd7bd2af9a403faa8a12d95d",
        "msg" : "pySim.esim.http_json_api: 'header' is not always present in response",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/http_json_api.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "osmo-smdpp.py"
        ],
        "commitId" : "0519e2b7e1c6470c67f6755eef3f74023c0ba734",
        "timestamp" : 1721222529000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "osmo-smdpp: Make sure to return empty HTTP response in handleNotification\u000a\u000aSGP.22 is quite clear in that handleNotification shall return an empty\u000aHTTP response body.  Let's make sure we comply to that and don't report\u000aa JSON response.\u000a\u000aChange-Id: I1cad539accbc3e7222bfd4780955b3b1ff694c5b\u000a",
        "date" : "2024-07-17 15:22:09 +0200",
        "id" : "0519e2b7e1c6470c67f6755eef3f74023c0ba734",
        "msg" : "osmo-smdpp: Make sure to return empty HTTP response in",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "osmo-smdpp.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "contrib/es9p_client.py"
        ],
        "commitId" : "9d0c2947f14d6737181bfdbe7b46e2d1163d9118",
        "timestamp" : 1721222529000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "es9p_client: Move code into a class; do common steps in constructor\u000a\u000aThis is in preparation of supporting more than just 'download'\u000a\u000aChange-Id: I5a165efcb97d9264369a9c6571cd92022cbcdfb0\u000a",
        "date" : "2024-07-17 15:22:09 +0200",
        "id" : "9d0c2947f14d6737181bfdbe7b46e2d1163d9118",
        "msg" : "es9p_client: Move code into a class; do common steps in constructor",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "contrib/es9p_client.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "contrib/es9p_client.py",
          "pySim/esim/__init__.py"
        ],
        "commitId" : "3ad3da89954d413f0aa47e5aff0e5bd4d2454607",
        "timestamp" : 1721232357000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "contrib/es9p_client: Add support for reporting notifications to SM-DP+\u000a\u000aThe ES9+ interface is not only used for downloading eSIM profiles, but\u000ait is also used to report back the installation result as well as\u000aprofile management operations like enable/disable/delete.\u000a\u000aChange-Id: Iefba7fa0471b34eae30700ed43531a515af0eb93\u000a",
        "date" : "2024-07-17 18:05:57 +0200",
        "id" : "3ad3da89954d413f0aa47e5aff0e5bd4d2454607",
        "msg" : "contrib/es9p_client: Add support for reporting notifications to SM-DP+",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "contrib/es9p_client.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/esim/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "osmo-smdpp.py"
        ],
        "commitId" : "5370178ca2747b1072d5ba3d762f9fd18b765e65",
        "timestamp" : 1721232357000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "osmo-smdpp: Implement 'other' notification signature validation\u000a\u000a\"other\" notifications (enable, disable, delete) contain ECDSA\u000asignatures that also need verification.\u000a\u000aChange-Id: If610058b7af6f9fc7822576c93f9970e2ce9aba9\u000a",
        "date" : "2024-07-17 18:05:57 +0200",
        "id" : "5370178ca2747b1072d5ba3d762f9fd18b765e65",
        "msg" : "osmo-smdpp: Implement 'other' notification signature validation",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "osmo-smdpp.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "osmo-smdpp.py",
          "pySim/esim/es8p.py"
        ],
        "commitId" : "84077f239f381ef871aba75fceffb72ed974b956",
        "timestamp" : 1721232357000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "osmo-smdpp: Request enable/disable/delete notifications in metadata\u000a\u000athis way, the eUICC will send us notifications whenever our profiles are\u000aenabled/disabled/deleted.\u000a\u000aChange-Id: I2861290864522b691b30b079c7c2e1466904df2d\u000a",
        "date" : "2024-07-17 18:05:57 +0200",
        "id" : "84077f239f381ef871aba75fceffb72ed974b956",
        "msg" : "osmo-smdpp: Request enable/disable/delete notifications in metadata",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/es8p.py"
          },
          {
            "editType" : "edit",
            "file" : "osmo-smdpp.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/es8p.py"
        ],
        "commitId" : "03194c08774ed5fc872a691d4cc35e4b01dfafef",
        "timestamp" : 1721232357000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.esim.es8p: Add support for encoding icon in ProfileMetadata\u000a\u000aChange-Id: I8c6a0c628f07c2a9608174457d20b8955114731a\u000a",
        "date" : "2024-07-17 18:05:57 +0200",
        "id" : "03194c08774ed5fc872a691d4cc35e4b01dfafef",
        "msg" : "pySim.esim.es8p: Add support for encoding icon in ProfileMetadata",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/es8p.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/global_platform/http.py",
          "pySim/cat.py",
          "tests/test_tlvs.py"
        ],
        "commitId" : "e18586ddf0c8b5bddef570dcc080c71a603bafe5",
        "timestamp" : 1721232357000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.globalplatform: Add 'http' submodule for GP Amd B RAM over HTTPS\u000a\u000aThis implements the first parts of the \"GlobalPlatform Remote\u000aApplication Management over HTTP Card Specification v2.3 - Amendment B,\u000aVersoin 1.2\".  Specifically, this patch covers the TLV definitions for\u000athe OTA message used for HTTPS session triggering.\u000a\u000aThis also adds some more unit test coverage to pySim.cat, based on\u000areal-world data that was captured nested inside the HTTPS Administration\u000asession triggering parameters.\u000a\u000aChange-Id: Ia7d7bd6df41bdf1249011bad9a9a38b7669edc54\u000a",
        "date" : "2024-07-17 18:05:57 +0200",
        "id" : "e18586ddf0c8b5bddef570dcc080c71a603bafe5",
        "msg" : "pySim.globalplatform: Add 'http' submodule for GP Amd B RAM over HTTPS",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/cat.py"
          },
          {
            "editType" : "edit",
            "file" : "tests/test_tlvs.py"
          },
          {
            "editType" : "add",
            "file" : "pySim/global_platform/http.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "osmo-smdpp.py",
          "pySim/esim/es9p.py"
        ],
        "commitId" : "92bae20b49a8f3b441dbf1bc821528956876bfd5",
        "timestamp" : 1721234222000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "osmo-smdpp + es9p_client: HTTP status 204 is used for handleNotification\u000a\u000aAs SGP.22 states, the handleNotification endpoint uses HTTP status 204,\u000anot 200 (due to its empty body).\u000a\u000aChange-Id: I890bdbd3e1c4578d2d5f0367958fdce26e338cac\u000a",
        "date" : "2024-07-17 18:37:02 +0200",
        "id" : "92bae20b49a8f3b441dbf1bc821528956876bfd5",
        "msg" : "osmo-smdpp + es9p_client: HTTP status 204 is used for handleNotification",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "osmo-smdpp.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/esim/es9p.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_31_103.py",
          "pysim-testdata/pySim-trace_test_gsmtap.pcapng.ok"
        ],
        "commitId" : "282aeadcc4ff9540d83b5fbba219c72f5182f88e",
        "timestamp" : 1721234235000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.ts_31_103: update to spec v18.1.0 Release 18\u000a\u000aThis adds two new EFs and one new IST service.\u000a\u000aChange-Id: Iced1700046b459399a3e8305e1387ec65eeb3536\u000a",
        "date" : "2024-07-17 18:37:15 +0200",
        "id" : "282aeadcc4ff9540d83b5fbba219c72f5182f88e",
        "msg" : "pySim.ts_31_103: update to spec v18.1.0 Release 18",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_103.py"
          },
          {
            "editType" : "edit",
            "file" : "pysim-testdata/pySim-trace_test_gsmtap.pcapng.ok"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_31_103.py",
          "pySim/ts_31_103_shared.py"
        ],
        "commitId" : "fb56f3554646855e418ae4178c70f7dd6fd5a0ca",
        "timestamp" : 1721234235000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "move parts of pySim.ts_31_103 to pySim.ts_31_103_shared\u000a\u000aThis is requird to make some definitions available to USIM / ts_31_102\u000awithout introducing circular dependencies.\u000a\u000aChange-Id: I32e29f400d2da047e821bf732316b21805b5a1e2\u000a",
        "date" : "2024-07-17 18:37:15 +0200",
        "id" : "fb56f3554646855e418ae4178c70f7dd6fd5a0ca",
        "msg" : "move parts of pySim.ts_31_103 to pySim.ts_31_103_shared",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_103.py"
          },
          {
            "editType" : "add",
            "file" : "pySim/ts_31_103_shared.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_31_102.py"
        ],
        "commitId" : "6f5a0498bfef4893ce026a9c68b9df09693cd726",
        "timestamp" : 1721234235000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "[cosmetic] ts_31_102: Note in comment which release introdcued recent files\u000a\u000aChange-Id: I0c1250b532992ae954b1d8ab20993cb9fa947695\u000a",
        "date" : "2024-07-17 18:37:15 +0200",
        "id" : "6f5a0498bfef4893ce026a9c68b9df09693cd726",
        "msg" : "[cosmetic] ts_31_102: Note in comment which release introdcued recent",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_102.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_31_102.py"
        ],
        "commitId" : "f174ad688565460b4b9dd2e6c64ef3a88cb2a5f3",
        "timestamp" : 1721297743000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "ts_31_102: Make use of ts_31_103_shared and add Rel 18 files\u000a\u000aChange-Id: I68ca15084f9654468bd37526c02a66322085b25b\u000a",
        "date" : "2024-07-18 12:15:43 +0200",
        "id" : "f174ad688565460b4b9dd2e6c64ef3a88cb2a5f3",
        "msg" : "ts_31_102: Make use of ts_31_103_shared and add Rel 18 files",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_102.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_31_102.py"
        ],
        "commitId" : "03eae595a350d8b50189c29146406b3cadd92cbb",
        "timestamp" : 1721297743000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.ts_31_102: Fix name of EF.VBSCA\u000a\u000aIt's VGCS but VBS.  There's no VBCS.\u000a\u000aChange-Id: I3c4a7ec9cd6a56fe7b85832afc68685f8dccbfd1\u000a",
        "date" : "2024-07-18 12:15:43 +0200",
        "id" : "03eae595a350d8b50189c29146406b3cadd92cbb",
        "msg" : "pySim.ts_31_102: Fix name of EF.VBSCA",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_102.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/apdu/__init__.py"
        ],
        "commitId" : "289d2343fa0f8c2f6df153d24b85593933efd2c5",
        "timestamp" : 1721406216000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.apdu: Refactor cmd_to_dict() method\u000a\u000aLet's factor out the \"automatic processing using _tlv / _construct\" as a\u000aseparate method.  This way we enable a derived class to first call that\u000aautomatic processing method, and then amend its output in a second step.\u000a\u000aChange-Id: I1f066c0f1502020c88d99026c25bf2e283c3b4f5\u000a",
        "date" : "2024-07-19 18:23:36 +0200",
        "id" : "289d2343fa0f8c2f6df153d24b85593933efd2c5",
        "msg" : "pySim.apdu: Refactor cmd_to_dict() method",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/apdu/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/apdu/__init__.py"
        ],
        "commitId" : "d93d774dcc30685dda3df8835850c3c53f34bd10",
        "timestamp" : 1721406269000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.apdu: Fix APDU CLA matching\u000a\u000aThe cla values as hex strings must be compared in case insensitive manner\u000a\u000aChange-Id: I890bc385d6209e6cfe9b0c38bd9deee7ae50e5f5\u000a",
        "date" : "2024-07-19 18:24:29 +0200",
        "id" : "d93d774dcc30685dda3df8835850c3c53f34bd10",
        "msg" : "pySim.apdu: Fix APDU CLA matching",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/apdu/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/apdu_source/pyshark_gsmtap.py",
          "pySim/apdu_source/gsmtap.py",
          "pySim/apdu/ts_102_222.py",
          "pySim/apdu_source/tca_loader_log.py"
        ],
        "commitId" : "699b49ef1b105ef2a117d0d2d98c509d0b6242b8",
        "timestamp" : 1721810225000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.apdu.ts_102_222: APDU decoding for administrative commands\u000a\u000aChange-Id: I77c97221da19e1a67d96f7cfb69785baefc675c0\u000a",
        "date" : "2024-07-24 10:37:05 +0200",
        "id" : "699b49ef1b105ef2a117d0d2d98c509d0b6242b8",
        "msg" : "pySim.apdu.ts_102_222: APDU decoding for administrative commands",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/apdu_source/pyshark_gsmtap.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/apdu_source/tca_loader_log.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/apdu_source/gsmtap.py"
          },
          {
            "editType" : "add",
            "file" : "pySim/apdu/ts_102_222.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pysim-testdata/pySim-trace_test_gsmtap.pcapng.ok",
          "pySim-trace.py"
        ],
        "commitId" : "c800f2a71631cbd4970d668cee26b0295788b7ed",
        "timestamp" : 1721810225000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-trace: display decoded result as JSON, not as python dict\u000a\u000aThis means users can copy+paste or otherwise post-process the data in a\u000astandard format.\u000a\u000aChange-Id: I3135f2f52b8d61684a71b836915b43da5c48422b\u000a",
        "date" : "2024-07-24 10:37:05 +0200",
        "id" : "c800f2a71631cbd4970d668cee26b0295788b7ed",
        "msg" : "pySim-trace: display decoded result as JSON, not as python dict",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pysim-testdata/pySim-trace_test_gsmtap.pcapng.ok"
          },
          {
            "editType" : "edit",
            "file" : "pySim-trace.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/apdu/ts_102_221.py",
          "tests/test_apdu.py",
          "pySim/apdu/__init__.py",
          "pySim/apdu/ts_31_102.py"
        ],
        "commitId" : "87b4f99a9085d9e760e63c7ff31d3c42a9697aaa",
        "timestamp" : 1721974846000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.apdu: Get rid of HexAdapter\u000a\u000aIn the past, we always wrapped a HexAdapter around bytes-like data in\u000aorder to make sure it's printed as hex-digits.  However, now that we are\u000adoing JSON output it's much easier to let the pySim.utils.JsonEncoder\u000atake care of this in a generic way.\u000a\u000aWe should do a similar migration all over pySim (pySim-shell,\u000afilesystem, etc.) - but for now only do it in the low-hanging fruit of\u000apySim-trace aka pySim.apdu\u000a\u000aChange-Id: I0cde40b2db08b4db9c10c1ece9ca6fdd42aa9154\u000a",
        "date" : "2024-07-26 06:20:46 +0000",
        "id" : "87b4f99a9085d9e760e63c7ff31d3c42a9697aaa",
        "msg" : "pySim.apdu: Get rid of HexAdapter",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "tests/test_apdu.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/apdu/__init__.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/apdu/ts_102_221.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/apdu/ts_31_102.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/runtime.py"
        ],
        "commitId" : "2cca36e8fdbc111bd0ea5eb46b5a02df40964fd4",
        "timestamp" : 1721975047000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "runtime: add missing docstring\u000a\u000aChange-Id: Iee2702c5326f1ec2a32c40b675ba1647387c40c8\u000aRelated: OS#6092\u000a",
        "date" : "2024-07-26 06:24:07 +0000",
        "id" : "2cca36e8fdbc111bd0ea5eb46b5a02df40964fd4",
        "msg" : "runtime: add missing docstring",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/runtime.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_102_222.py",
          "pySim/runtime.py"
        ],
        "commitId" : "c78ea1ffa6b0f6d94dc70639d161b1d4e3d3d874",
        "timestamp" : 1721975047000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "runtime: rename get_file_for_selectable to get_file_for_filename\u000a\u000aLet's rename get_file_for_selectable to get_file_for_filename so that it\u000ais immediately clear what the method does.\u000a\u000aRelated: OS#6092\u000aChange-Id: Ifed860814229857ad8b969e50849debbf5d8918f\u000a",
        "date" : "2024-07-26 06:24:07 +0000",
        "id" : "c78ea1ffa6b0f6d94dc70639d161b1d4e3d3d874",
        "msg" : "runtime: rename get_file_for_selectable to get_file_for_filename",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/runtime.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_102_222.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_31_103_shared.py"
        ],
        "commitId" : "9aeadea4c333f7e23b80ba5be689b6dfcda99b19",
        "timestamp" : 1721975047000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "ts_31_103_shared: fix file structure of EF.WebRTCURI\u000a\u000aEF_WebRTCURI should inherit from LinFixedEF intead of TransparentEF.\u000a(See also 3gpp TS 31.103, section 4.2.20)\u000a\u000aRelated: OS#6092\u000aChange-Id: I903c483a8553fbe599fa7b5a2aefb28bc85b5078\u000a",
        "date" : "2024-07-26 06:24:07 +0000",
        "id" : "9aeadea4c333f7e23b80ba5be689b6dfcda99b19",
        "msg" : "ts_31_103_shared: fix file structure of EF.WebRTCURI",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_103_shared.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-shell.py"
        ],
        "commitId" : "f26042f92db924b1ecf59639793b048ba302f1cf",
        "timestamp" : 1721975047000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-shell: fix comment formatting\u000a\u000aRelated: OS#6092\u000aChange-Id: I101868a6f0220b62977c5e633df2607467cfba91\u000a",
        "date" : "2024-07-26 06:24:07 +0000",
        "id" : "f26042f92db924b1ecf59639793b048ba302f1cf",
        "msg" : "pySim-shell: fix comment formatting",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ota.py"
        ],
        "commitId" : "4f2a6ebf1ff6befdab093accea4e64d795e6d92d",
        "timestamp" : 1721975897000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.ota: Add construct definition for SIM File + TK Param definition\u000a\u000aChange-Id: Ie5aa2babaf66af49eb5223e5e9d4451089baf055\u000a",
        "date" : "2024-07-26 08:38:17 +0200",
        "id" : "4f2a6ebf1ff6befdab093accea4e64d795e6d92d",
        "msg" : "pySim.ota: Add construct definition for SIM File + TK Param definition",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ota.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/apdu/global_platform.py",
          "pySim/global_platform/__init__.py"
        ],
        "commitId" : "0c022944ff5a10348e100d36e01755c3166d0466",
        "timestamp" : 1721975897000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.apdu.global_platform: Decode the INSTALL command parameters\u000a\u000aChange-Id: I1c323c1cb1be504c6ad5b7efb0fa85d87eaa8cf7\u000a",
        "date" : "2024-07-26 08:38:17 +0200",
        "id" : "0c022944ff5a10348e100d36e01755c3166d0466",
        "msg" : "pySim.apdu.global_platform: Decode the INSTALL command parameters",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/global_platform/__init__.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/apdu/global_platform.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "contrib/saip-tool.py"
        ],
        "commitId" : "c60944a7de24ce7bc5ffafed015a83e0f4f47c1a",
        "timestamp" : 1721975897000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "saip-tool: Fix TAR display for implicit TAR\u000a\u000aUntil Change-Id Ifba1048e3000829d54769b0420f5134e2f9b04e1 the TAR\u000aoutput was working for implicit tar.  With said commit we fixed it\u000afor explicit tar but broke implicit tar.\u000a\u000aWith this commit it works for both implicit and explicit TAR.\u000a\u000aChange-Id: I76133b0e02996a138257f3fba5ceb0d2fc6fad80\u000a",
        "date" : "2024-07-26 08:38:17 +0200",
        "id" : "c60944a7de24ce7bc5ffafed015a83e0f4f47c1a",
        "msg" : "saip-tool: Fix TAR display for implicit TAR",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "contrib/saip-tool.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/global_platform/scp.py"
        ],
        "commitId" : "34dce409b9489ebf3b9258440f7e2294a25d4cda",
        "timestamp" : 1721975897000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.global_platform.ota: Support KVN 0x70 for SCP02\u000a\u000aThis is a non-standard extension of sysmocom products.\u000a\u000aChange-Id: I00d52f7629aae190ee487ea3453f42b5f94cf42f\u000a",
        "date" : "2024-07-26 08:38:17 +0200",
        "id" : "34dce409b9489ebf3b9258440f7e2294a25d4cda",
        "msg" : "pySim.global_platform.ota: Support KVN 0x70 for SCP02",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/global_platform/scp.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/filesystem.py",
          "pySim-shell.py"
        ],
        "commitId" : "d29bdbc2c8fb22f621857254b782594be6273405",
        "timestamp" : 1722068524000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-shell: move export code into filesystem class model\u000a\u000aThe code that generates the filesystem export lines for the various\u000adifferent file structures can be moved into the filesystem class model.\u000a\u000aThis simplifies the code since we do not need any extra logic to\u000adistinguish between the different file structures.\u000a\u000aRelated: OS#6092\u000aChange-Id: Icc2ee60cfc4379411744ca1033d79a1ee9cff5a6\u000a",
        "date" : "2024-07-27 08:22:04 +0000",
        "id" : "d29bdbc2c8fb22f621857254b782594be6273405",
        "msg" : "pySim-shell: move export code into filesystem class model",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/filesystem.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/runtime.py",
          "pySim-shell.py"
        ],
        "commitId" : "7858f591fec4047a8083f9a837183589f76fc1ad",
        "timestamp" : 1722068524000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-shell: turn \"ADF-escape-code\" into an lchan method.\u000a\u000aWhen we traverse the file system using the command \"export\" we will\u000aalso select all ADFs but not all ADFs may have UICC file system support.\u000aThis makes it impossible to exit those ADFs again. To exit anyway we\u000aselect an application with filesystem support first and then the parent\u000aEF we wanted to select originally. This method may not only be useful\u000awhen traversing the filesystem, so let's put it into the RuntimeLchan\u000aclass and change it a little so that it would also work if the ADF in\u000aquestion is an a sub DF.\u000a\u000aRelated: OS#6092\u000aChange-Id: I72de51bc7519fafbcc71d829719a8af35d774342\u000a",
        "date" : "2024-07-27 08:22:04 +0000",
        "id" : "7858f591fec4047a8083f9a837183589f76fc1ad",
        "msg" : "pySim-shell: turn \"ADF-escape-code\" into an lchan method.",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/runtime.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-shell.py",
          "pySim/runtime.py"
        ],
        "commitId" : "4fefac78b80447e7965583ad22a30f988b13b6f9",
        "timestamp" : 1722068524000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-shell: fix reset command\u000a\u000aThe reset command resets the card using the card object. This unfortunately\u000aleaves the RuntimeState uninformed about the event. However, the RuntimeState\u000aclass also has a reset method that resets the card and the RuntimeState. Let's\u000ause this reset method. Also fix this method so that it ensures that the SCP is\u000aalso no longer present.\u000a\u000aRelated: OS#6092\u000aChange-Id: I1ad29c9e7ce7d80bebc92fa173ed7a44ee4c2998\u000a",
        "date" : "2024-07-27 08:22:04 +0000",
        "id" : "4fefac78b80447e7965583ad22a30f988b13b6f9",
        "msg" : "pySim-shell: fix reset command",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/runtime.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/runtime.py",
          "pySim-shell.py"
        ],
        "commitId" : "dff7bb0687009aafda6016bf5bdeb84e24402b3c",
        "timestamp" : 1722068524000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-shell: clean up method calls in do_switch_channel\u000a\u000aThe function do_switch_channel method calls methods in RuntimeLchan\u000athat should be private. There is also a code duplication in\u000aRuntimeLchan that should be cleaned up.\u000a\u000aRelated: OS#6092\u000aChange-Id: Ie5e5f45787abaaf032e1b49f51d447653cf2c996\u000a",
        "date" : "2024-07-27 08:22:04 +0000",
        "id" : "dff7bb0687009aafda6016bf5bdeb84e24402b3c",
        "msg" : "pySim-shell: clean up method calls in do_switch_channel",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/runtime.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-shell.py"
        ],
        "commitId" : "43fc87516869572e7c925745ccbdaadb88934628",
        "timestamp" : 1722068577000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-shell: fix comment formatting\u000a\u000aRelated: OS#6092\u000aChange-Id: Icea88c061436d26a3240fc666fcc3fe1bd36d2ba\u000a",
        "date" : "2024-07-27 08:22:57 +0000",
        "id" : "43fc87516869572e7c925745ccbdaadb88934628",
        "msg" : "pySim-shell: fix comment formatting",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ara_m.py"
        ],
        "commitId" : "2c0e3358a72e25a2e20ed57c97db0342132511f4",
        "timestamp" : 1722068577000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "ara_m: fix sourcecode formatting\u000a\u000aRelated: OS#6092\u000aChange-Id: I374eefdd1a2763552c98c1928753197e9f753e2b\u000a",
        "date" : "2024-07-27 08:22:57 +0000",
        "id" : "2c0e3358a72e25a2e20ed57c97db0342132511f4",
        "msg" : "ara_m: fix sourcecode formatting",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ara_m.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ara_m.py"
        ],
        "commitId" : "e931966a066b67267af13b71ef49f2512140a519",
        "timestamp" : 1722068577000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "ara_m: fix misspelled object name\u000a\u000aRelated: OS#6092\u000aChange-Id: I2c2289658f099aa1d25a4ab3292dea9a7c16c123\u000a",
        "date" : "2024-07-27 08:22:57 +0000",
        "id" : "e931966a066b67267af13b71ef49f2512140a519",
        "msg" : "ara_m: fix misspelled object name",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ara_m.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/oid.py",
          "tests/test_esim_saip.py"
        ],
        "commitId" : "6d2e385acfd555be420d51655456f7dfe5d673b0",
        "timestamp" : 1722069026000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.esim.saip: Add OID comparison functions\u000a\u000aChange-Id: Iab642e0cc6597f667ea126827ea888652f0f2689\u000a",
        "date" : "2024-07-27 10:30:26 +0200",
        "id" : "6d2e385acfd555be420d51655456f7dfe5d673b0",
        "msg" : "pySim.esim.saip: Add OID comparison functions",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/oid.py"
          },
          {
            "editType" : "edit",
            "file" : "tests/test_esim_saip.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "d25ea35e7eb1e54a19c728795c1167bd97e766c1",
        "timestamp" : 1722069026000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.esim.saip: Decode each 'File' element in ProfileElement\u000a\u000aWhen loading a ProfileElement from its DER-ecoded format, populate\u000aa dict with a pySim.esim.saip.File object for each file.\u000a\u000aChange-Id: Ie2791c10289eb28daed2904467b0c5e5b11c94c2\u000a",
        "date" : "2024-07-27 10:30:26 +0200",
        "id" : "d25ea35e7eb1e54a19c728795c1167bd97e766c1",
        "msg" : "pySim.esim.saip: Decode each 'File' element in ProfileElement",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/tlv.py"
        ],
        "commitId" : "75a109419cc8b777d740208fd1d0f0c0ad7932aa",
        "timestamp" : 1722069026000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.tlv: Add convenience methods to IE class\u000a\u000aThe new methods allow programmatic resolution of nested IEs from\u000aa parent, assuming there's only one child of a given type (which is\u000aoften but not always the case).\u000a\u000aChange-Id: Ic95b74437647ae8d4bf3cdc481832afb622e3cf0\u000a",
        "date" : "2024-07-27 10:30:26 +0200",
        "id" : "75a109419cc8b777d740208fd1d0f0c0ad7932aa",
        "msg" : "pySim.tlv: Add convenience methods to IE class",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/tlv.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/runtime.py"
        ],
        "commitId" : "2a963a7ac0fc12910a9ffff26025fc17f0b8559a",
        "timestamp" : 1722069026000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.runtime: Be more verbose if incompatible method is called\u000a\u000aChange-Id: I57190d50a63e0c22a8c5921e1348fae31b23e3d4\u000a",
        "date" : "2024-07-27 10:30:26 +0200",
        "id" : "2a963a7ac0fc12910a9ffff26025fc17f0b8559a",
        "msg" : "pySim.runtime: Be more verbose if incompatible method is called",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/runtime.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/commands.py"
        ],
        "commitId" : "eda408fba3f6e3a78ba0316e0f1fa5d2ba386fe1",
        "timestamp" : 1722069026000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.commands: Don't convert SwMatchError to ValueError\u000a\u000aIn the read and write command implementations, we used to catch\u000alower-layer exceptions (usually SwMatchError) and \"translate\" that into\u000aa value error, only to add more information to the exception.  This\u000ameant that higher-layer code could no longer detect this was actually\u000aa SwMatchError exception type.\u000a\u000aLet's instead use the add_note() method to amend the existing exception,\u000arather than raising a new one of different type.\u000a\u000aChange-Id: Ic94d0fe60a8a5e15aade56ec418192ecf31ac5e7\u000a",
        "date" : "2024-07-27 10:30:26 +0200",
        "id" : "eda408fba3f6e3a78ba0316e0f1fa5d2ba386fe1",
        "msg" : "pySim.commands: Don't convert SwMatchError to ValueError",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/commands.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/tlv.py"
        ],
        "commitId" : "d29f244aad8a7e93f366ae299ce74b535e06697c",
        "timestamp" : 1722069026000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.tlv: Separate {to,from}_val_dict() from {to,from}_dict()\u000a\u000aThere are some situations where we want to work with a type-name-wrapped\u000adict that includes the type information, and others where we don't want\u000athat.  The main reason is that nested IEs can only be reconstructed if\u000awe can determine the type/class of the nested IE from the dict data.\u000a\u000aLet's explicitly offer {to,from}_val_dict() methods that work with\u000athe value-part only\u000a\u000aRelated: OS#6453\u000aChange-Id: I81654ea54aed9e598943f41a26a57dcc3a7f10c2\u000a",
        "date" : "2024-07-27 10:30:26 +0200",
        "id" : "d29f244aad8a7e93f366ae299ce74b535e06697c",
        "msg" : "pySim.tlv: Separate {to,from}_val_dict() from {to,from}_dict()",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/tlv.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/exceptions.py",
          "docs/shell.rst",
          "pySim-shell.py"
        ],
        "commitId" : "de5de0e9db3627e1c885603fa229986ee8e00098",
        "timestamp" : 1722250102000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-shell: add \"fsdump\" command\u000a\u000aThis command exports the entire filesystem state as one JSON document,\u000awhich can be useful for storing it in a noSQL database, or for doing a\u000astructured diff between different such dumps.\u000a\u000aIt's similar to \"export\", but then reasonably different to rectify a\u000aseparate command.\u000a\u000aChange-Id: Ib179f57bc04d394efe11003ba191dca6098192d3\u000a",
        "date" : "2024-07-29 10:48:22 +0000",
        "id" : "de5de0e9db3627e1c885603fa229986ee8e00098",
        "msg" : "pySim-shell: add \"fsdump\" command",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/exceptions.py"
          },
          {
            "editType" : "edit",
            "file" : "docs/shell.rst"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/commands.py"
        ],
        "commitId" : "bff8902ce15ab6b5d739460152f61fce1cdae5fd",
        "timestamp" : 1722250911000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.commands: make use of status word interpreter for CHV\u000a\u000aRelated: OS#6398\u000aChange-Id: I71efe9d6804c4845bb81f1b3b443215dad0ac301\u000a",
        "date" : "2024-07-29 13:01:51 +0200",
        "id" : "bff8902ce15ab6b5d739460152f61fce1cdae5fd",
        "msg" : "pySim.commands: make use of status word interpreter for CHV",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/commands.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/filesystem.py"
        ],
        "commitId" : "f3b3ba15b88d18484be2bd547668b55936519e62",
        "timestamp" : 1722250911000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.filesystem: Add Path for abstraction/utility around file system paths\u000a\u000aChange-Id: I202baa378988431a318850e3593ff1929d94d268\u000a",
        "date" : "2024-07-29 13:01:51 +0200",
        "id" : "f3b3ba15b88d18484be2bd547668b55936519e62",
        "msg" : "pySim.filesystem: Add Path for abstraction/utility around file system",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/filesystem.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_102_221.py"
        ],
        "commitId" : "cf65d92039e428ebb3225e8b0ece48221e8e12eb",
        "timestamp" : 1722251001000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.ts_102_221: Fix FileDescriptor encoding for BER-TLV case\u000a\u000aThis fixes a long-standing bug in the FileDescriptor IE class which so\u000afar only supported decoding, but not encoding of BER-TLV file\u000adescriptors.\u000a\u000aChange-Id: I598b0e1709ee004bcf01a53beb91f68470e1f3da\u000a",
        "date" : "2024-07-29 13:03:21 +0200",
        "id" : "cf65d92039e428ebb3225e8b0ece48221e8e12eb",
        "msg" : "pySim.ts_102_221: Fix FileDescriptor encoding for BER-TLV case",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_102_221.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_102_221.py"
        ],
        "commitId" : "e3e964589ff04d84223781c140b09284ed777f9f",
        "timestamp" : 1722251001000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.ts_102_221: Add ProprietaryInformation sub-IEs of TS 102 222\u000a\u000aWe put those in ts_102_221 because that's where ProprietaryInformation\u000ais defined, and we don't want to risk circular dependencies.\u000a\u000aChange-Id: I526acfeacee9e4f7118f280b3549fd04fdb74336\u000a",
        "date" : "2024-07-29 13:03:21 +0200",
        "id" : "e3e964589ff04d84223781c140b09284ed777f9f",
        "msg" : "pySim.ts_102_221: Add ProprietaryInformation sub-IEs of TS 102 222",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_102_221.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "e354ef7d050664ef0e41a6a1fd2459121bd19573",
        "timestamp" : 1722251176000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.esim.saip: Initial support for parsing GenericFileManagement\u000a\u000aChange-Id: I4a92f5849158a59f6acca05121d38adc0a495906\u000a",
        "date" : "2024-07-29 13:06:16 +0200",
        "id" : "e354ef7d050664ef0e41a6a1fd2459121bd19573",
        "msg" : "pySim.esim.saip: Initial support for parsing GenericFileManagement",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "8b1060a30e30ad0acd561f15ae58920caace4ca8",
        "timestamp" : 1722251187000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "Reference pySim.filesystem derived classes from SAIP templates\u000a\u000aChange-Id: Ia1c810262f1cfa48dae192c7de620c7f0fb69c25\u000a",
        "date" : "2024-07-29 13:06:27 +0200",
        "id" : "8b1060a30e30ad0acd561f15ae58920caace4ca8",
        "msg" : "Reference pySim.filesystem derived classes from SAIP templates",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "3d6a712e8c670fb099b30579e2018943d4995a1f",
        "timestamp" : 1722251187000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "Fix missing AIDs in pySim.saip templates\u000a\u000aChange-Id: Ie02e2d27ece0fbd9719468c8d31febd1937468f8\u000a",
        "date" : "2024-07-29 13:06:27 +0200",
        "id" : "3d6a712e8c670fb099b30579e2018943d4995a1f",
        "msg" : "Fix missing AIDs in pySim.saip templates",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/templates.py"
        ],
        "commitId" : "6b1c6a986cd278ae6260ed3fe967313cf6e724fd",
        "timestamp" : 1722251187000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.esim.saip.templates: Build tree from template files\u000a\u000aChange-Id: I13e80e9dbddbb145411378a0d9e01461aef75db4\u000a",
        "date" : "2024-07-29 13:06:27 +0200",
        "id" : "6b1c6a986cd278ae6260ed3fe967313cf6e724fd",
        "msg" : "pySim.esim.saip.templates: Build tree from template files",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/templates.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "4f9ee0fa752599e862703ce6f987a233eeecbe60",
        "timestamp" : 1722251187000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.esim.saip: Refactor from_der() method to have class_for_petype()\u000a\u000aChange-Id: I2e70dddb0b3adb41781e4db76de60bff2ae4fdb7\u000a",
        "date" : "2024-07-29 13:06:27 +0200",
        "id" : "4f9ee0fa752599e862703ce6f987a233eeecbe60",
        "msg" : "pySim.esim.saip: Refactor from_der() method to have class_for_petype()",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "4fd3fa445cd0fe4448b3f47969f22476015c126a",
        "timestamp" : 1722251187000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.esim.saip: Add subclasses for gsm-access, phonebook, 5gs, saip\u000a\u000aThose are all optional ProfileElements related to the USIM NAA.\u000a\u000aChange-Id: I621cc3d2440babdc11b4b038f16acf418bbc88ad\u000a",
        "date" : "2024-07-29 13:06:27 +0200",
        "id" : "4fd3fa445cd0fe4448b3f47969f22476015c126a",
        "msg" : "pySim.esim.saip: Add subclasses for gsm-access, phonebook, 5gs, saip",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ara_m.py"
        ],
        "commitId" : "d3fb38965b6c11461250ce22557f9200c70e7303",
        "timestamp" : 1722251187000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "ara_m: Fix pySim.tlv.IE.from_dict() calls\u000a\u000aHistorically, to_dict and from_dict were not symmetric; this has been\u000afixed in I07e4feb3800b420d8be7aae8911f828f1da9dab8 in December 2023.\u000a\u000aThis however broke the ara_m legacy use of the from_dict() methods.\u000aWe've just introduced a from_val_dict() method in\u000aI81654ea54aed9e598943f41a26a57dcc3a7f10c2, let's make use of it.\u000a\u000aChange-Id: I3aaec40eb665d6254be7b103444c04ff48aac36d\u000a",
        "date" : "2024-07-29 13:06:27 +0200",
        "id" : "d3fb38965b6c11461250ce22557f9200c70e7303",
        "msg" : "ara_m: Fix pySim.tlv.IE.from_dict() calls",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ara_m.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/tlv.py"
        ],
        "commitId" : "d81c2086c8866a74d7feb97b258e654545286d84",
        "timestamp" : 1722460633000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.tlv: Fix from_dict of nested TLVs\u000a\u000aThe existing logic is wrong.  How we call from_dict() doesn't differ if\u000aa member IE itself contains a nested collection: We always must pass a\u000asingle-entry dict with the snak-case name of the class to from_dict().\u000a\u000aChange-Id: Ic1f9db45db75b887227c2e20785198814cbab0f5\u000aFixes: OS#6453\u000a",
        "date" : "2024-07-31 23:17:13 +0200",
        "id" : "d81c2086c8866a74d7feb97b258e654545286d84",
        "msg" : "pySim.tlv: Fix from_dict of nested TLVs",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/tlv.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_51_011.py",
          "pySim/ts_102_221.py"
        ],
        "commitId" : "7c06bcdd571a907c1ca833be2019f947219c0c48",
        "timestamp" : 1722460633000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "Support EF.ICCID and EF.PL on classic TS 51.011 SIM\u000a\u000aSo far we only had the EF.ICCID and EF.PL within our UICC card profile.\u000aHowever, a classic GSM SIM card is not an UICC, so the CardProfileSIM\u000aalso needs those files.\u000a\u000aTo avoid circular dependencies, move the definitions from ts_102_221.py\u000ato ts_51_011.py\u000a\u000aChange-Id: I6eaa5b579f02c7d75f443ee2b2cc8ae0ba13f2fe\u000aCloses: OS#6485\u000a",
        "date" : "2024-07-31 23:17:13 +0200",
        "id" : "7c06bcdd571a907c1ca833be2019f947219c0c48",
        "msg" : "Support EF.ICCID and EF.PL on classic TS 51.011 SIM",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_51_011.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_102_221.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-shell.py"
        ],
        "commitId" : "fdae0ff90db6f275bb7941b98bc55fc9ec502c55",
        "timestamp" : 1722505098000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-shell: Support hexadecimal ADM pin in 'verify_adm'\u000a\u000aChange-Id: I4191ed79ebe7869d8411d280a32ac2d4bbc210e3\u000aCloses: OS#6480\u000a",
        "date" : "2024-08-01 11:38:18 +0200",
        "id" : "fdae0ff90db6f275bb7941b98bc55fc9ec502c55",
        "msg" : "pySim-shell: Support hexadecimal ADM pin in 'verify_adm'",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-shell.py"
        ],
        "commitId" : "08d7c10211efe06eb5eabc12d6ddaba4d46008db",
        "timestamp" : 1722768362000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-shell: Support other ADMx values beyond ADM1 from 'verify_adm'\u000a\u000aChange-Id: Icce6903c1e449889f8bc5003ccfe6af767a26d44\u000a",
        "date" : "2024-08-04 12:46:02 +0200",
        "id" : "08d7c10211efe06eb5eabc12d6ddaba4d46008db",
        "msg" : "pySim-shell: Support other ADMx values beyond ADM1 from 'verify_adm'",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "d3a6bbc215c341962c107227bf431bb975bac456",
        "timestamp" : 1722768372000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.esim.saip: Add subcasses for EAP, DF.SNPN and DF.5G_ProSe\u000a\u000aChange-Id: I8f29e72d387c66c99ceccffc9de23a68fd15dc46\u000a",
        "date" : "2024-08-04 12:46:12 +0200",
        "id" : "d3a6bbc215c341962c107227bf431bb975bac456",
        "msg" : "pySim.esim.saip: Add subcasses for EAP, DF.SNPN and DF.5G_ProSe",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/templates.py"
        ],
        "commitId" : "041a1b33fc7ae55868da70a3c0629498c89ad80f",
        "timestamp" : 1722768372000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.esim.saip.template: Permit file-size for BER-TLV files\u000a\u000aWe previously only permitted this for transparent files (TR), but\u000afile size can of course also be specified for BER-TLV files.\u000a\u000aChange-Id: Ie007cf2ccde0a17d0fb853a96b833f064ae52c59\u000a",
        "date" : "2024-08-04 12:46:12 +0200",
        "id" : "041a1b33fc7ae55868da70a3c0629498c89ad80f",
        "msg" : "pySim.esim.saip.template: Permit file-size for BER-TLV files",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/templates.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/templates.py"
        ],
        "commitId" : "d2254377b6204f244931c649251425ac0b234cad",
        "timestamp" : 1722768372000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.esim.saip.templates: Add a notion of the path of a file\u000a\u000aThe SAIP data format is inherently flat and doesn't intrinsically\u000ahave an idea of the tree-like structure of a filesystem.  However,\u000aif we want to (for example) convert a physical USIM into an eSIM\u000aprofile, we need to find the template for a given file, where the file\u000ais identified by its path.\u000a\u000aLet's expose a path property of the FileTemplate object, and populate\u000athat when creating the FileTemplate as part of a ProfileTemplate.\u000a\u000aChange-Id: Ie145ba159081daf8fbfa544f6d4248f05b7eea96\u000a",
        "date" : "2024-08-04 12:46:12 +0200",
        "id" : "d2254377b6204f244931c649251425ac0b234cad",
        "msg" : "pySim.esim.saip.templates: Add a notion of the path of a file",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/templates.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/templates.py"
        ],
        "commitId" : "19328e3bbd6f588af63683a2361041e7cb012ee8",
        "timestamp" : 1722768372000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.esim.saip.templates: Update to SAIP v3.3.1 (July 2023)\u000a\u000aThis new TCA SAIP version introduces a number of aditional templates\u000a\u000aChange-Id: Ie8aeae3f5b36a3141a70f670c220932389d241a6\u000a",
        "date" : "2024-08-04 12:46:12 +0200",
        "id" : "19328e3bbd6f588af63683a2361041e7cb012ee8",
        "msg" : "pySim.esim.saip.templates: Update to SAIP v3.3.1 (July 2023)",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/templates.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/filesystem.py"
        ],
        "commitId" : "46bc37fa65056ad1246d466ee773b67ca7c5f0f5",
        "timestamp" : 1722768372000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.filesystem: Add __len__ method to Path object\u000a\u000aThis returns the length of the path.\u000a\u000aChange-Id: I5e3ba726ed180405c4218ebeee240a3a40527f99\u000a",
        "date" : "2024-08-04 12:46:12 +0200",
        "id" : "46bc37fa65056ad1246d466ee773b67ca7c5f0f5",
        "msg" : "pySim.filesystem: Add __len__ method to Path object",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/filesystem.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/oid.py"
        ],
        "commitId" : "5b513a543f0d4aa05d61bf8ad5281e058e6b7bce",
        "timestamp" : 1722768372000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.esim.saip.oid: Fix OID defininitions for v3.3.1 IoT templates\u000a\u000aChange-Id: Iac620362ae9336199f3b3b168a4bfeda3e2b7c35\u000a",
        "date" : "2024-08-04 12:46:12 +0200",
        "id" : "5b513a543f0d4aa05d61bf8ad5281e058e6b7bce",
        "msg" : "pySim.esim.saip.oid: Fix OID defininitions for v3.3.1 IoT templates",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/oid.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-shell.py"
        ],
        "commitId" : "44d51a7b16de2faf4828a87a9e8284fdab8b0dda",
        "timestamp" : 1722864015000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "pySim-shell: fix typo\u000a\u000aChange-Id: I1bd995ae9eb59a44a48da62a7b0262faa84a4f2b\u000a",
        "date" : "2024-08-05 15:20:15 +0200",
        "id" : "44d51a7b16de2faf4828a87a9e8284fdab8b0dda",
        "msg" : "pySim-shell: fix typo",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/templates.py"
        ],
        "commitId" : "465d1a07e049cb65ef206bb60ef6cfa4ffabf975",
        "timestamp" : 1722873375000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.esim.saip.templates: Add SaipSpecVersion\u000a\u000aThe SAIP specification version implicitly determines which filesystem\u000atemplates (or versions thereof) are supported.  So if a given eUICC\u000astates it implements SAIP version 2.3.0, then we have to translate\u000athis into which template versions that means.  The new SaipSpecVersion\u000aand its derived classes do exactly that.\u000a\u000aChange-Id: I3a894c72c22e42bd2067e067be80a67197ad1bf2\u000a",
        "date" : "2024-08-05 15:56:15 +0000",
        "id" : "465d1a07e049cb65ef206bb60ef6cfa4ffabf975",
        "msg" : "pySim.esim.saip.templates: Add SaipSpecVersion",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/templates.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/templates.py"
        ],
        "commitId" : "ca1b00f99e04c0de1452576b2ec0bc69f266b325",
        "timestamp" : 1722873375000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.esim.saip.templates: Explicitly specifiy repeatable default value\u000a\u000aChange-Id: I9ae2c36f5bffac392c1219bb6ea21c1c05dff4b9\u000a",
        "date" : "2024-08-05 15:56:15 +0000",
        "id" : "ca1b00f99e04c0de1452576b2ec0bc69f266b325",
        "msg" : "pySim.esim.saip.templates: Explicitly specifiy repeatable default value",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/templates.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/templates.py"
        ],
        "commitId" : "8f5fd37b4a117f2be93b831993a726a8ce53f12e",
        "timestamp" : 1722873375000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.esim.saip.templates: Fix '...' notation in default value\u000a\u000aThe default value must contain '...' to indicate a variable-length\u000adefault value section, not '..'\u000a\u000aChange-Id: I8d78278065c145b86460acf8eb723babe777c4f6\u000a",
        "date" : "2024-08-05 15:56:15 +0000",
        "id" : "8f5fd37b4a117f2be93b831993a726a8ce53f12e",
        "msg" : "pySim.esim.saip.templates: Fix '...' notation in default value",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/templates.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/templates.py"
        ],
        "commitId" : "10e9e97724721d1ced82e2ce118b70304a18b1ba",
        "timestamp" : 1722873375000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.esim.saip.templates: Add expand_default_value() method\u000a\u000aThis method can be used to expand the default value pattern of the\u000afile system template for the file to the specified (record, file) length.\u000a\u000aChange-Id: Id3eb16910c0bdfa572294e14ca1cd44ca95ca69f\u000a",
        "date" : "2024-08-05 15:56:15 +0000",
        "id" : "10e9e97724721d1ced82e2ce118b70304a18b1ba",
        "msg" : "pySim.esim.saip.templates: Add expand_default_value() method",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/templates.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ara_m.py"
        ],
        "commitId" : "4515f1cf87b22f5493dc25acf2dccb63274a2a25",
        "timestamp" : 1722928844000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "ara_m: fix --apdu-filter setting\u000a\u000aThe code for the --apdu-filter commandline option is not yet finished.\u000aLet's finish it and make it work.\u000a\u000aRelated: OS#6092\u000aChange-Id: Ib5fb388972fde0d50c3db0082ebf40bcca404681\u000a",
        "date" : "2024-08-06 09:20:44 +0200",
        "id" : "4515f1cf87b22f5493dc25acf2dccb63274a2a25",
        "msg" : "ara_m: fix --apdu-filter setting",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ara_m.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/cards.py"
        ],
        "commitId" : "7d9c6583efe8c6f5cb9f49718b85bef332915b7d",
        "timestamp" : 1723039821000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.cards: Make file_exists() check for activated/deactivated\u000a\u000aThe Card.file_exists() method is only called by legacy pySim-{read,prog}\u000awhen it wants to determine if it can read/write a file.  Therefore\u000ait actually doesn't only want to know if the file exists, but also\u000aif it's not deactivated.\u000a\u000aChange-Id: I73bd1ab3780e475c96a10cd5dbdd45b829c67335\u000aCloses: OS#6530\u000a",
        "date" : "2024-08-07 14:10:21 +0000",
        "id" : "7d9c6583efe8c6f5cb9f49718b85bef332915b7d",
        "msg" : "pySim.cards: Make file_exists() check for activated/deactivated",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/cards.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/filesystem.py"
        ],
        "commitId" : "b4530e71b7337fb344a521691959fe756d3f8410",
        "timestamp" : 1723106799000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "filesystem: add placeholder export method in CardFile base class\u000a\u000aWe add export methods in subclasses of CardFile but the base class\u000aitself lacks an export method. To make the code more readable and\u000ato avoid unnecessary exceptions, les's add a default export method\u000athat just returns a comment.\u000a\u000aRelated: OS#6092\u000aChange-Id: Ife2a9bad14750db84a87fab907297028c33f1f7d\u000a",
        "date" : "2024-08-08 10:46:39 +0200",
        "id" : "b4530e71b7337fb344a521691959fe756d3f8410",
        "msg" : "filesystem: add placeholder export method in CardFile base class",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/filesystem.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/filesystem.py"
        ],
        "commitId" : "03901cc9cea982ef478d7197145522d4f191465c",
        "timestamp" : 1723106809000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "filesystem: add export method for ADF files\u000a\u000aThis patch adds an export method to CardADF, which calls the application\u000aspecific export method in CardApplication class\u000a\u000aRelated: OS#6092\u000aChange-Id: I8129656096ecaf41b36e5f2afbbfbebcd0587886\u000a",
        "date" : "2024-08-08 10:46:49 +0200",
        "id" : "03901cc9cea982ef478d7197145522d4f191465c",
        "msg" : "filesystem: add export method for ADF files",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/filesystem.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ara_m.py"
        ],
        "commitId" : "b92f4f52cca918a76e74524ec8ea37af0a490cf9",
        "timestamp" : 1723106879000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "ara_m: add export support for the ARA-M application\u000a\u000aThis patch adds an export method to the CardApplicationARAM class.\u000aThis method reads the ARA-M configuration and transforms it into\u000aexecuteable command lines, which can be executed as a script later\u000ato restore an ARA-M configuration.\u000a\u000aRelated: OS#6092\u000aChange-Id: I811cb9d25cb8ee194b4ead5fb2cabf1fdc0c1c43\u000a",
        "date" : "2024-08-08 10:47:59 +0200",
        "id" : "b92f4f52cca918a76e74524ec8ea37af0a490cf9",
        "msg" : "ara_m: add export support for the ARA-M application",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ara_m.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/filesystem.py"
        ],
        "commitId" : "2d235f814309c68d41357c3a9266b4c7cb956778",
        "timestamp" : 1723124255000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "filesystem: fix typo\u000a\u000aChange-Id: I17f184bbcf494c5fe944602224cf72d6a22cbc9d\u000a",
        "date" : "2024-08-08 15:37:35 +0200",
        "id" : "2d235f814309c68d41357c3a9266b4c7cb956778",
        "msg" : "filesystem: fix typo",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/filesystem.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/runtime.py",
          "pySim-shell.py"
        ],
        "commitId" : "8597b64ee6a0640be88627e140e051f6ab4c99ec",
        "timestamp" : 1723124255000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "runtime: integrate escape route for applications without ADF support\u000a\u000athe select_parent method in RuntimeLchan currently implements a way\u000ato escape from an application that has no filesystem support. However,\u000athis escape route can be integrated directly into the select_file\u000amethod. This will give us the benefit that it will work transparently\u000ain all code locations.\u000a\u000a(This also means we can get rid of the select_parent method again)\u000a\u000aRelated: OS#6120\u000aChange-Id: Ie6f37d13af880d24a9c7a8a95cef436b603587c7\u000a",
        "date" : "2024-08-08 15:37:35 +0200",
        "id" : "8597b64ee6a0640be88627e140e051f6ab4c99ec",
        "msg" : "runtime: integrate escape route for applications without ADF support",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/runtime.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/runtime.py"
        ],
        "commitId" : "12cc6821c46221c510b2d91f86fea05674e5aafc",
        "timestamp" : 1723124255000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "runtime: add method to lookup a file by name without selecting it\u000a\u000aIn some cases it might come in handy to be able to lookup a random file\u000ain the file system tree before actually selecting it. This would be\u000avery useful in situations where we need to check the presence of the\u000afile or if we need to check certain file attributes before performing\u000asome task.\u000a\u000aRelated: OS#6092\u000aChange-Id: I6b6121e749cea843163659e1a26bb3893c032e29\u000a",
        "date" : "2024-08-08 15:37:35 +0200",
        "id" : "12cc6821c46221c510b2d91f86fea05674e5aafc",
        "msg" : "runtime: add method to lookup a file by name without selecting it",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/runtime.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-shell.py"
        ],
        "commitId" : "c421645ba6ad77c5039700d8d6cdbecf25602d10",
        "timestamp" : 1723124547000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "pySim-shell: improve export and enable exportation of DF and ADF files\u000a\u000aSince we now have the ability to provide export methods for all file\u000atypes in the file system (this also includes DF and ADF files), we need\u000ato support this at shell command level as well. Let's also renovate the\u000awalk method and the action method that does the actual exporting.\u000a\u000aRelated: OS#6092\u000aChange-Id: I3ee661dbae5c11fec23911775f352ac13bc2c6e5\u000a",
        "date" : "2024-08-08 15:42:27 +0200",
        "id" : "c421645ba6ad77c5039700d8d6cdbecf25602d10",
        "msg" : "pySim-shell: improve export and enable exportation of DF and ADF files",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-shell.py"
        ],
        "commitId" : "526fdae6e5e0840f9ba159422b090d2a40ff5de1",
        "timestamp" : 1723458627000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "pySim-shell: improve fsdump\u000a\u000aIn the previous patch we have improved the export command. Since\u000athe implementation of the fsdump command is very similar to the\u000aimplementation of the export command we can now apply the same\u000aimprovements to the fsdump command as well.\u000a\u000aChange-Id: I4d2ef7b383025a5bbf122f18ecd51b7d73aaba14\u000aRelated: OS#6092\u000a",
        "date" : "2024-08-12 12:30:27 +0200",
        "id" : "526fdae6e5e0840f9ba159422b090d2a40ff5de1",
        "msg" : "pySim-shell: improve fsdump",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/templates.py"
        ],
        "commitId" : "89dff98fb6bdfc3b606879a27905037e1f189ade",
        "timestamp" : 1723744105000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.esim.saip.templates: Introduce dependency/hierarchy information\u000a\u000aThe SAIP specification is very weird in a way that it treats the DF and\u000aEF descriptions as some kind of flat structure without describing the\u000ahierarchy.  So when creating a DF, sometimes it should be created below\u000athe current DF, and sometimes it should be adjacent next to the current\u000aDF.\u000a\u000aLet's introduce\u000a* a 'ppath' property of FileTemplate to indicate if a file is anything\u000a  but a direct sibling of the 'base DF' of the PE\u000a* an 'extends' property of ProfileTemplate to indicate that a given\u000a  template does not have its own 'base DF', but that its contents merely\u000a  extends that of another ProfileTemplate\u000a* a 'parent' property of ProfileTemplate to indicate a parent\u000a  ProfileTemplate below whose 'base DF' our files should be placed.\u000a\u000aChange-Id: Ieab4835cd21008b289713784c0eb7170af2ccfb9\u000a",
        "date" : "2024-08-15 19:48:25 +0200",
        "id" : "89dff98fb6bdfc3b606879a27905037e1f189ade",
        "msg" : "pySim.esim.saip.templates: Introduce dependency/hierarchy information",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/templates.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_102_221.py"
        ],
        "commitId" : "022d562ae1a4686f747292f79334b25266e83835",
        "timestamp" : 1723744105000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.ts_102_221: Make sure FileDescriptor for BER-TLV contains file_type\u000a\u000abefore this change, structure == 'ber_tlv' was missing the\u000afile_type == working_ef attribute.  So for linear_fixed, transparent\u000aand cyclic, the file_type attribute was present, but for ber_tlv it was\u000amissing. This is illogical from a user point of vie and makes downstream code\u000apotentially more complex, as it cannot match on working_ef for all EF\u000atypes.\u000a\u000aChange-Id: If0076cc6dd35a818c08309885f6ef1c1704052c6\u000a",
        "date" : "2024-08-15 19:48:25 +0200",
        "id" : "022d562ae1a4686f747292f79334b25266e83835",
        "msg" : "pySim.ts_102_221: Make sure FileDescriptor for BER-TLV contains",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_102_221.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/filesystem.py"
        ],
        "commitId" : "97dfcaa9c72447d04390f48432baa7ba939bc96f",
        "timestamp" : 1723823201000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.filesystem: Permit Path object construction from FID integer list\u000a\u000awe so far supported construction of the Path object from a string or\u000aa list of strings.  Let's also add the option of constructing it from a\u000apath consisting of a list of integer FID values.\u000a\u000aChange-Id: Ia7e9375b3258d1fbfdc892cefba3e3bbe841c550\u000a",
        "date" : "2024-08-16 17:46:41 +0200",
        "id" : "97dfcaa9c72447d04390f48432baa7ba939bc96f",
        "msg" : "pySim.filesystem: Permit Path object construction from FID integer list",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/filesystem.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "contrib/saip-tool.py"
        ],
        "commitId" : "1f477495ec534b7e27741b2945123de352a29976",
        "timestamp" : 1723823201000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "saip-tool: Set default log level to INFO (instead of DEBUG)\u000a\u000amost users don't want to debug the program.\u000a\u000aChange-Id: I54ae558cf8d87bf64cc75431cc4edcc694fa9084\u000a",
        "date" : "2024-08-16 17:46:41 +0200",
        "id" : "1f477495ec534b7e27741b2945123de352a29976",
        "msg" : "saip-tool: Set default log level to INFO (instead of DEBUG)",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "contrib/saip-tool.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/oid.py"
        ],
        "commitId" : "b2970d4bbee576c7f454efa2faf810706cb77c50",
        "timestamp" : 1723824372000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.esim.saip.oid: Allow OID instance in prefix_match()\u000a\u000aSo far the prefix_match() required a string argument; let's also\u000apermit another OID object to be passed; we internally convert that\u000ato string.\u000a\u000aChange-Id: I0feb7782d1813cc46ec78f170eb0fce804aebe3a\u000a",
        "date" : "2024-08-16 18:06:12 +0200",
        "id" : "b2970d4bbee576c7f454efa2faf810706cb77c50",
        "msg" : "pySim.esim.saip.oid: Allow OID instance in prefix_match()",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/oid.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "contrib/saip-tool.py"
        ],
        "commitId" : "01ddec2fdc92a2058af09c81b3b8c247062c3eb8",
        "timestamp" : 1724002723000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "contrib/saip-tool: Add command-line arguments to configure log level\u000a\u000aChange-Id: I4257d7b76193cdaad8c8571ff49f29067e8ab8c8\u000a",
        "date" : "2024-08-18 19:38:43 +0200",
        "id" : "01ddec2fdc92a2058af09c81b3b8c247062c3eb8",
        "msg" : "contrib/saip-tool: Add command-line arguments to configure log level",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "contrib/saip-tool.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "6d495fb24ddc34507a8777ec45372f8d020ced6e",
        "timestamp" : 1724002724000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.esim.saip: Improve File.from_template feature support\u000a\u000aWhen populating a File from a FileTemplate, let's make sure we\u000a* correctly treat the maximum file size for BER-TLV files\u000a* respect the default value pattern / repeat pattern\u000a* respect the high_update flag.\u000a\u000aChange-Id: I3ba092e0893f53a18264dff5fa37b12ccd9bd47e\u000a",
        "date" : "2024-08-18 19:38:44 +0200",
        "id" : "6d495fb24ddc34507a8777ec45372f8d020ced6e",
        "msg" : "pySim.esim.saip: Improve File.from_template feature support",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "31c3c9a1e3a1bfc7f95ecdc5c42ed373697730b0",
        "timestamp" : 1724002724000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.esim.saip: Refactor file size encoding into a method\u000a\u000aChange-Id: I46b8cb81ef8cc1794c11b61e0adfb575f937b349\u000a",
        "date" : "2024-08-18 19:38:44 +0200",
        "id" : "31c3c9a1e3a1bfc7f95ecdc5c42ed373697730b0",
        "msg" : "pySim.esim.saip: Refactor file size encoding into a method",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "6a1e5eb4ee1dee6f0b093f55df19e0f577a37f08",
        "timestamp" : 1724002724000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.esim.saip: Move AKA specific post_dec + pre_enc to AKA subclass\u000a\u000aHaving AKA specific code in the generic ProfileElement base class dated\u000aback to when we didn't have a ProfileElementAKA subclass.\u000a\u000aChange-Id: Icd332183758b8ef20a77507b728f5e455698def0\u000a",
        "date" : "2024-08-18 19:38:44 +0200",
        "id" : "6a1e5eb4ee1dee6f0b093f55df19e0f577a37f08",
        "msg" : "pySim.esim.saip: Move AKA specific post_dec + pre_enc to AKA subclass",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "3b30994ff0d35a315c2591cca8654a40ad536ba0",
        "timestamp" : 1724002724000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.esim.saip: pass up **kwargs from ProfileElement sub-class constructors\u000a\u000aChange-Id: Ib2b7f6d7428d03e9a8c23af39a61f450096c12bc\u000a",
        "date" : "2024-08-18 19:38:44 +0200",
        "id" : "3b30994ff0d35a315c2591cca8654a40ad536ba0",
        "msg" : "pySim.esim.saip: pass up **kwargs from ProfileElement sub-class",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "b349149a88991d18ffc6ddf12fae29f9a309940e",
        "timestamp" : 1724002724000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.esim.saip: Back-reference from ProfileElement to ProfileElementSequence\u000a\u000aStore a back-reference to the PE-Sequence in the PE object; this is\u000aneccessary for some upcoming patches, e.g. to determine the position in\u000athe sequence, access the global filesystem hierarchy, etc.\u000a\u000aChange-Id: I24b692e47e4dd0afb5a17b04d5e0251dded3d611\u000a",
        "date" : "2024-08-18 19:38:44 +0200",
        "id" : "b349149a88991d18ffc6ddf12fae29f9a309940e",
        "msg" : "pySim.esim.saip: Back-reference from ProfileElement to",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "3a95fa12f61a4788b1f41011e9795abf6a6bb141",
        "timestamp" : 1724002724000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.esim.saip: Add some more docstring comments\u000a\u000aChange-Id: I70cf2b4dff1952f581efa3b21211c542f43ce565\u000a",
        "date" : "2024-08-18 19:38:44 +0200",
        "id" : "3a95fa12f61a4788b1f41011e9795abf6a6bb141",
        "msg" : "pySim.esim.saip: Add some more docstring comments",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "ab3e04fdb18bffea05c24392c67841bfcbeec371",
        "timestamp" : 1724002724000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.esim.saip: Fix typo in ProfileElementAKA.set_mapping() method\u000a\u000aChange-Id: Icd1594c6c2a8536a4ab8d1fc698307f05f539bdb\u000a",
        "date" : "2024-08-18 19:38:44 +0200",
        "id" : "ab3e04fdb18bffea05c24392c67841bfcbeec371",
        "msg" : "pySim.esim.saip: Fix typo in ProfileElementAKA.set_mapping() method",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "39613da6a74ac694550d5b0f24f1546923c6867b",
        "timestamp" : 1724002724000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.esim.saip: Fix key used in FsProfileElement.files2pe\u000a\u000aThe self.files member is a dict.  Hence we should use those dict\u000akeys when [re]building the decoded dict. The previous code ignored\u000ait and re-constructed the key from File.pe_name - but that's not\u000aalways identical.\u000a\u000aChange-Id: I0e6c97721fb1cfc6b5c21595d85bd374d485b573\u000a",
        "date" : "2024-08-18 19:38:44 +0200",
        "id" : "39613da6a74ac694550d5b0f24f1546923c6867b",
        "msg" : "pySim.esim.saip: Fix key used in FsProfileElement.files2pe",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "cd22b9aee3187236447787ebb181840df7f3b0c0",
        "timestamp" : 1724002724000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.esim.saip.File: move away from stream for file content\u000a\u000aLet's linearize the file content in a bytes member variable self.body.\u000a\u000aChange-Id: I6cb23a3a644854abd3dfd3b50b586ce80da21353\u000a",
        "date" : "2024-08-18 19:38:44 +0200",
        "id" : "cd22b9aee3187236447787ebb181840df7f3b0c0",
        "msg" : "pySim.esim.saip.File: move away from stream for file content",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "contrib/jenkins.sh"
        ],
        "commitId" : "5e2b93eb55780c81eb4c650be04ed1d9495d332a",
        "timestamp" : 1724267044000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "jenkins: use osmo-clean-workspace.sh before and after build\u000a\u000aRelated: osmo-ci.git I2409b2928b4d7ebbd6c005097d4ad7337307dd93\u000aChange-Id: I5ebebfa27e4b0c7b2fb3aa60618a82c1bfdaa19a\u000aFixes: OS#6546\u000a",
        "date" : "2024-08-21 19:04:04 +0000",
        "id" : "5e2b93eb55780c81eb4c650be04ed1d9495d332a",
        "msg" : "jenkins: use osmo-clean-workspace.sh before and after build",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "contrib/jenkins.sh"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "contrib/saip-tool.py",
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "c6f8457ff1c99065cc1bab79bf9bffcae7b9da6d",
        "timestamp" : 1724395867000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.esim.saip: maintain a parsed fileystem hierarchy\u000a\u000aWith this change, the ProfileElementSequence object will maintain a\u000arepresentation of the filesystem hierarchy of the eSIM profile.  Every\u000afile that is added by a ProfileElement will add a FsNode into that tree,\u000aand each FsNode will point to the File object for the respective file.\u000a\u000aThis allows us to find files by their path, as well as add files by\u000apath.\u000a\u000aChange-Id: I2caadc24b1087855f23f3c57cdf8dabbf81757c0\u000a",
        "date" : "2024-08-23 06:51:07 +0000",
        "id" : "c6f8457ff1c99065cc1bab79bf9bffcae7b9da6d",
        "msg" : "pySim.esim.saip: maintain a parsed fileystem hierarchy",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          },
          {
            "editType" : "edit",
            "file" : "contrib/saip-tool.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/es2p.py"
        ],
        "commitId" : "6d4c566fd7816a58ee504749964eec109183bf77",
        "timestamp" : 1724395867000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "Fix pySim.esim.es2p.Param.timestamp._encode\u000a\u000a************* Module pySim.esim.es2p\u000apySim/esim/es2p.py:107:19: E1101: Class 'datetime' has no 'toisoformat' member (no-member)\u000a\u000aChange-Id: Ib762792d595048bf6d7d6f5acbe2715f137ae5bb\u000a",
        "date" : "2024-08-23 06:51:07 +0000",
        "id" : "6d4c566fd7816a58ee504749964eec109183bf77",
        "msg" : "Fix pySim.esim.es2p.Param.timestamp._encode",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/es2p.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "osmo-smdpp.py"
        ],
        "commitId" : "a86b1abc03c1f7ecd4434a67b166c65affa1151e",
        "timestamp" : 1724395867000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "osmo-smdpp: Proper error handling in case ctxParams1 is missing member\u000a\u000a************* Module osmo-smdpp\u000aosmo-smdpp.py:373:15: E0601: Using variable 'iccid_str' before assignment (used-before-assignment)\u000a\u000aChange-Id: I52bef18cbcc9f5d14519ff1473532c8502d45908\u000a",
        "date" : "2024-08-23 06:51:07 +0000",
        "id" : "a86b1abc03c1f7ecd4434a67b166c65affa1151e",
        "msg" : "osmo-smdpp: Proper error handling in case ctxParams1 is missing member",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "osmo-smdpp.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "contrib/saip-tool.py"
        ],
        "commitId" : "a5e2a8dbfd9de4ae613494d3e3c9ba01b387b79e",
        "timestamp" : 1724395867000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "contrib/saip-tool: Add 'tree' command to display filesystem tree of profile\u000a\u000aChange-Id: I5cda7ef814648543c63938ac6a4fb9dba79379ff\u000a",
        "date" : "2024-08-23 06:51:07 +0000",
        "id" : "a5e2a8dbfd9de4ae613494d3e3c9ba01b387b79e",
        "msg" : "contrib/saip-tool: Add 'tree' command to display filesystem tree of",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "contrib/saip-tool.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/runtime.py"
        ],
        "commitId" : "89dbdbdccc37d885035fe79f2b4fe95235793dfd",
        "timestamp" : 1724395897000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "runtime: fix get_file_by_name\u000a\u000aThe method get_file_by_name compares the selectable directly with the\u000agiven file name. This is not correct. The comparison should be with the\u000apath element from the pathlist.\u000a\u000aRelated: OS#6092\u000aChange-Id: Id2d0704678935d9b9e2f1aeb6eaccbff6fa9d429\u000a",
        "date" : "2024-08-23 06:51:37 +0000",
        "id" : "89dbdbdccc37d885035fe79f2b4fe95235793dfd",
        "msg" : "runtime: fix get_file_by_name",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/runtime.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-shell.py"
        ],
        "commitId" : "1f920310793bbb2f6b977af88d09ee8d9a2ea95b",
        "timestamp" : 1724395897000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-shell: fix CardKeyProvider for chv management commands\u000a\u000aThe CardKeyProvider support for the commands enable_chv, disable_chv,\u000averify_chv, change_chv and unblock_chv is broken. The reason for this\u000ais the annotation \"type=is_decimal\" in the argument parser. This annotation\u000aprevents the usage of string placeholders (\"PIN1\", \"PUK1\", etc).\u000a\u000aLet's fix this by finding a better solution. We can also replace any\u000amissing PIN/PUK code by checking if it is supplied or not. If not,\u000awe query the CardKeyProvider. This also makes the usage of the *_chv\u000acommands more uniform with the verify_adm command.\u000a\u000aRelated: OS#6531\u000aChange-Id: I565b56ac608e801c67ca53d337bdec9efa3f3817\u000a",
        "date" : "2024-08-23 06:51:37 +0000",
        "id" : "1f920310793bbb2f6b977af88d09ee8d9a2ea95b",
        "msg" : "pySim-shell: fix CardKeyProvider for chv management commands",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/filesystem.py"
        ],
        "commitId" : "585e16a923333e3bfe9150255e0e08b7612a8536",
        "timestamp" : 1724411847000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "filesystem: fix double space in docstring\u000a\u000aChange-Id: I69ef171ac2dd2e2717404b1f3b10f986af419f6e\u000a",
        "date" : "2024-08-23 13:17:27 +0200",
        "id" : "585e16a923333e3bfe9150255e0e08b7612a8536",
        "msg" : "filesystem: fix double space in docstring",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/filesystem.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-shell.py"
        ],
        "commitId" : "d20be98ed1154cd4a7cf5b9a9e44de4f39fd9a5e",
        "timestamp" : 1724684290000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "pySim-shell: fix sourcecode formatting\u000a\u000aChange-Id: I7133e93366eaacca5ace301172a08ae84e211c0e\u000a",
        "date" : "2024-08-26 16:58:10 +0200",
        "id" : "d20be98ed1154cd4a7cf5b9a9e44de4f39fd9a5e",
        "msg" : "pySim-shell: fix sourcecode formatting",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/filesystem.py"
        ],
        "commitId" : "edf266726d256ff472fbef2dfbfecbd505e586ba",
        "timestamp" : 1724684290000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "filesystem: add command to delete all contents from a BER-TLV EF\u000a\u000aWhen working with BER-TLF files, we can only delete one tag at a time.\u000aThere is no way to delete all tags at once. This may make working with\u000aBER-TLV files difficult, in particular when scripting is used and the\u000ascript needs to start with an empty file. Also export has problems,\u000asince it does not reset the file before setting the new values there\u000amay be unexpected results in case there still tags in the file that\u000aare not set during import. To fill the gap, let's add a commandd that\u000adeletes all tags in a BER-TLV EF at once.\u000a\u000aRelated: OS#6531\u000aChange-Id: I5d6bcfe865df7cb8fa6dd0052cab3b364d929f94\u000a",
        "date" : "2024-08-26 16:58:10 +0200",
        "id" : "edf266726d256ff472fbef2dfbfecbd505e586ba",
        "msg" : "filesystem: add command to delete all contents from a BER-TLV EF",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/filesystem.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/euicc.py",
          "pySim-shell.py",
          "pySim/ts_102_222.py",
          "pySim/filesystem.py"
        ],
        "commitId" : "d5943934a5d539ea021ae4cba39a1a896ac15af7",
        "timestamp" : 1724684290000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "pySim-shell, cosmetic: define positional arguments last\u000a\u000aWhen we define command arguments using the ArgumentParser, we sometimes\u000adefine the positional arguments first. However, since positional arguments\u000ausually follow after the optional (--xyz) arguments, we should define the\u000apositional arguments last.\u000a\u000aRelated: OS#6531\u000aChange-Id: I2412eb6e7dc32ae95a575f31d4489ce210d85ea0\u000a",
        "date" : "2024-08-26 16:58:10 +0200",
        "id" : "d5943934a5d539ea021ae4cba39a1a896ac15af7",
        "msg" : "pySim-shell, cosmetic: define positional arguments last",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/euicc.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_102_222.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/filesystem.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-shell.py"
        ],
        "commitId" : "8c1a1c5cc50a2f51a7cc0ea80c01d0018885569e",
        "timestamp" : 1724684290000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "pySim-shell: prevent opening/closing logical channel 0\u000a\u000aThe basic logical channel 0 is always present. It cannot be created or\u000aclosed. Let's restrict the value range of chan_nr, so that only valid\u000alchan numbers can be passed.\u000a\u000aRelated: OS#6531\u000aChange-Id: I4eebd9f15fadd18e1caeb033fda36c59446fcab8\u000a",
        "date" : "2024-08-26 16:58:10 +0200",
        "id" : "8c1a1c5cc50a2f51a7cc0ea80c01d0018885569e",
        "msg" : "pySim-shell: prevent opening/closing logical channel 0",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "f807983a98c38efc4d2e05acd92e54e206f37390",
        "timestamp" : 1724768620000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.esim.saip: Add missing entry for 'rfm' to class4petype\u000a\u000aChange-Id: I5fec2b026fc6a1197fc1e18d880ea6d10fd4a611\u000a",
        "date" : "2024-08-27 14:23:40 +0000",
        "id" : "f807983a98c38efc4d2e05acd92e54e206f37390",
        "msg" : "pySim.esim.saip: Add missing entry for 'rfm' to class4petype",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/global_platform/__init__.py"
        ],
        "commitId" : "1034a9749f377d7e11393bf0bf7d1454a113ba87",
        "timestamp" : 1724842344000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "global_platform: fix help description for establish_scp03\u000a\u000aThe argument parser object for establish_scp03 (est_scp03_parser) is\u000acopied from est_scp02_parser. This object still has the .description\u000aproperty set, which is the description for establish_scp02. To get\u000athe description string that is defined in do_establish_scp03, we must\u000aremove the old description string first.\u000a\u000aRelated: OS#6531\u000aChange-Id: Ibb26bddf88b2e644a7f0c6b2a06bde228aa8afc7\u000a",
        "date" : "2024-08-28 12:52:24 +0200",
        "id" : "1034a9749f377d7e11393bf0bf7d1454a113ba87",
        "msg" : "global_platform: fix help description for establish_scp03",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/global_platform/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/global_platform/__init__.py"
        ],
        "commitId" : "cc4c021bb16c9a26581ac9efb13a4348a9f1b70e",
        "timestamp" : 1724842394000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "global_platform: use scp_key_identity ICCID for ADF.ISD\u000a\u000aRelated: OS#6531\u000aChange-Id: I73a6f7088321a2b703074aa5228910709050cab2\u000a",
        "date" : "2024-08-28 12:53:14 +0200",
        "id" : "cc4c021bb16c9a26581ac9efb13a4348a9f1b70e",
        "msg" : "global_platform: use scp_key_identity ICCID for ADF.ISD",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/global_platform/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-shell.py",
          "pySim/ara_m.py",
          "pySim/commands.py"
        ],
        "commitId" : "caabee4ccb3113a22251dbc45947a2f00b181a18",
        "timestamp" : 1724842394000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "ara_m: use class byte of current lchan\u000a\u000aThe ara_m commands use APDUs with a fix class byte (0x80). This means\u000athat all ARA-M related features only work in the basic logical channel.\u000aTo fix this, let's compute the class byte for the current logical channel\u000adynamically inside the send_apdu methods of SimCardCommands. This will\u000afix the problem globally.\u000a\u000aRelated: OS#6531\u000aChange-Id: Ie3e48678f178a488bfaea6cc2b9a3e18145a8d10\u000a",
        "date" : "2024-08-28 12:53:14 +0200",
        "id" : "caabee4ccb3113a22251dbc45947a2f00b181a18",
        "msg" : "ara_m: use class byte of current lchan",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ara_m.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/commands.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/euicc.py",
          "pySim/commands.py"
        ],
        "commitId" : "d8637f3a70688c8f0b44e1cdd3f540eea971956b",
        "timestamp" : 1724842394000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "commands: get rid of cla4lchan\u000a\u000aThe send_apdu* methods now support lchan patching, so there is no longer\u000aa need for computing the class byte manually (which is prone get forgotten)\u000abefore calling a send_apdu*. It is now enough to supply an APDU that has\u000aa class byte with the default channel selected. This also means we do not\u000aneed cla4lchan anymore, so let's restruture the code and get rid of it\u000acompletely.\u000a\u000aRelated: OS#6531\u000aChange-Id: Ia795f3c16a8875484fce3b44e61497d5aa52b447\u000a",
        "date" : "2024-08-28 12:53:14 +0200",
        "id" : "d8637f3a70688c8f0b44e1cdd3f540eea971956b",
        "msg" : "commands: get rid of cla4lchan",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/euicc.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/commands.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/global_platform/scp.py"
        ],
        "commitId" : "c595221bc3b92b995f14f2ab0ef742e8a85bcf0d",
        "timestamp" : 1724994338000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "scp: fix key length in dek_encrypt and dek_decrypt\u000a\u000aWhen creating the DES cipher object with DES.new, we use the property\u000acard_keys.dek. This property may hold a 16 byte key, but DES uses\u000aan 8 byte key (56 bit + 8 bit integrity). Pycryptodome does not\u000aautomatically ignore excess key bytes. Instead it throws an\u000aexception. This means we need to make sure to supply only the first\u000a8 bytes of card_keys.dek\u000a\u000aSee also: https://pycryptodome.readthedocs.io/en/latest/src/cipher/des.html\u000a\u000aRelated: OS#6531\u000aChange-Id: I92e0dc6a6196b532bd8b53fca7b9e78070d6903f\u000a",
        "date" : "2024-08-30 05:05:38 +0000",
        "id" : "c595221bc3b92b995f14f2ab0ef742e8a85bcf0d",
        "msg" : "scp: fix key length in dek_encrypt and dek_decrypt",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/global_platform/scp.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_31_102.py"
        ],
        "commitId" : "a90bf12ea1806d2e3c0476e9e84b40c84744befb",
        "timestamp" : 1724994950000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "ts_31_102: Add mssing help string for get_identity parameter --nswo-context\u000a\u000aRelated: OS#6531\u000aChange-Id: I3ebd3a2ceb7f2580f4cd939b3f002f38f236d7f2\u000a",
        "date" : "2024-08-30 05:15:50 +0000",
        "id" : "a90bf12ea1806d2e3c0476e9e84b40c84744befb",
        "msg" : "ts_31_102: Add mssing help string for get_identity parameter",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_102.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "docs/suci-tutorial.rst"
        ],
        "commitId" : "8680698f97478c631e324ea0a06aa5720691fb24",
        "timestamp" : 1724995458000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "suci-tutorial: fix incorrect hnet_pubkey value\u000a\u000aThe first hnet_pubkey value with the identifier 27 seems to be incorrect.\u000aIt differs from the value suggested in 3GPP TS 31.121, section 4.9.4 and\u000aalso does not work with the on card SUCI calculation.\u000a\u000aThe tutorial also contains a reference to 3GPP TS 33.501, Annex C.4. This\u000aspec specifies an ECIES Profile A and an ECIES Profile B. The tutorial\u000arecommends to use a key from profile B, but it actually uses a key from\u000aprofile A.\u000a\u000aRelated: OS#6531\u000aChange-Id: I6fddf8a6efc28ad0d40b1715973429904e00d2b2\u000a",
        "date" : "2024-08-30 05:24:18 +0000",
        "id" : "8680698f97478c631e324ea0a06aa5720691fb24",
        "msg" : "suci-tutorial: fix incorrect hnet_pubkey value",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "docs/suci-tutorial.rst"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tests/test_globalplatform.py",
          "tests/unittests/test_euicc.py",
          "tests/unittests/test_files.py",
          "tests/unittests/test_globalplatform.py",
          "tests/test_construct.py",
          "tests/unittests/test_construct.py",
          "tests/test_sms.py",
          "tests/unittests/test_utils.py",
          "tests/unittests/test_esim.py",
          "tests/unittests/test_esim_saip.py",
          "tests/unittests/test_tlvs.py",
          "tests/unittests/test_sms.py",
          "tests/test_tlv.py",
          "tests/test_esim_bsp.py",
          "tests/test_ota.py",
          "tests/unittests/test_apdu.py",
          "tests/test_apdu.py",
          "tests/test_utils.py",
          "tests/unittests/test_esim_bsp.py",
          "tests/test_euicc.py",
          "tests/test_esim.py",
          "tests/unittests/test_ota.py",
          "tests/test_esim_saip.py",
          "tests/unittests/test_tlv.py",
          "tests/test_files.py",
          "contrib/jenkins.sh",
          "tests/test_tlvs.py"
        ],
        "commitId" : "e0241037e7673a03425334ddd8a90f202bae9681",
        "timestamp" : 1724995520000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "tests: move unittests into a sub directory\u000a\u000aWe currently mix the unit-tests with the shell script based integration\u000atests. Let's put them into a dedicated sub directory.\u000a\u000aRelated: OS#6531\u000aChange-Id: I0978c5353d0d479a050bbb6e7ae5a63db5e08d24\u000a",
        "date" : "2024-08-30 05:25:20 +0000",
        "id" : "e0241037e7673a03425334ddd8a90f202bae9681",
        "msg" : "tests: move unittests into a sub directory",
        "paths" : [
          {
            "editType" : "delete",
            "file" : "tests/test_files.py"
          },
          {
            "editType" : "add",
            "file" : "tests/unittests/test_globalplatform.py"
          },
          {
            "editType" : "delete",
            "file" : "tests/test_euicc.py"
          },
          {
            "editType" : "delete",
            "file" : "tests/test_apdu.py"
          },
          {
            "editType" : "delete",
            "file" : "tests/test_esim.py"
          },
          {
            "editType" : "delete",
            "file" : "tests/test_esim_bsp.py"
          },
          {
            "editType" : "add",
            "file" : "tests/unittests/test_tlvs.py"
          },
          {
            "editType" : "add",
            "file" : "tests/unittests/test_esim.py"
          },
          {
            "editType" : "delete",
            "file" : "tests/test_sms.py"
          },
          {
            "editType" : "delete",
            "file" : "tests/test_ota.py"
          },
          {
            "editType" : "delete",
            "file" : "tests/test_tlv.py"
          },
          {
            "editType" : "delete",
            "file" : "tests/test_tlvs.py"
          },
          {
            "editType" : "add",
            "file" : "tests/unittests/test_utils.py"
          },
          {
            "editType" : "add",
            "file" : "tests/unittests/test_esim_saip.py"
          },
          {
            "editType" : "delete",
            "file" : "tests/test_construct.py"
          },
          {
            "editType" : "add",
            "file" : "tests/unittests/test_tlv.py"
          },
          {
            "editType" : "edit",
            "file" : "contrib/jenkins.sh"
          },
          {
            "editType" : "add",
            "file" : "tests/unittests/test_ota.py"
          },
          {
            "editType" : "add",
            "file" : "tests/unittests/test_construct.py"
          },
          {
            "editType" : "delete",
            "file" : "tests/test_esim_saip.py"
          },
          {
            "editType" : "add",
            "file" : "tests/unittests/test_euicc.py"
          },
          {
            "editType" : "add",
            "file" : "tests/unittests/test_sms.py"
          },
          {
            "editType" : "add",
            "file" : "tests/unittests/test_esim_bsp.py"
          },
          {
            "editType" : "delete",
            "file" : "tests/test_globalplatform.py"
          },
          {
            "editType" : "add",
            "file" : "tests/unittests/test_files.py"
          },
          {
            "editType" : "add",
            "file" : "tests/unittests/test_apdu.py"
          },
          {
            "editType" : "delete",
            "file" : "tests/test_utils.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "contrib/fsdump-diff-apply.py"
        ],
        "commitId" : "8ac2647004a5c19f9d14b534205fb01bce01474b",
        "timestamp" : 1725109925000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "contrib: script to generate \"update\" commands from diff of fsdumps\u000a\u000aChange-Id: I08897cd353093575f98c68580afbc68b6f2f878f\u000a",
        "date" : "2024-08-31 13:12:05 +0000",
        "id" : "8ac2647004a5c19f9d14b534205fb01bce01474b",
        "msg" : "contrib: script to generate \"update\" commands from diff of fsdumps",
        "paths" : [
          {
            "editType" : "add",
            "file" : "contrib/fsdump-diff-apply.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tests/pySim-trace_test.sh",
          "tests/pySim-trace_test/pySim-trace_test_gsmtap.pcapng.ok",
          "pysim-testdata/pySim-trace_test_gsmtap.pcapng",
          "tests/pySim-trace_test/pySim-trace_test_gsmtap.pcapng",
          "pysim-testdata/pySim-trace_test_gsmtap.pcapng.ok",
          "tests/pySim-trace_test/pySim-trace_test.sh",
          "contrib/jenkins.sh"
        ],
        "commitId" : "eb4ca1189c1410ae3dade2703c78bcd3d0403236",
        "timestamp" : 1725289641000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "tests: move pySim-trace test and its data into a sub directory\u000a\u000aWe currently have the test data for pySim-trace in pysim-testdata.\u000aThis means we mix the test data with the data from our original\u000apySim integration tests. This is very confusing. Let's put the\u000atest data and the testcase for pySim-trace into a dedicated\u000asub directory.\u000a\u000aChange-Id: I565b4268a05c1a1334b5e7d3fbcd9ef2ef0f0c4c\u000aRelated: OS#6531\u000a",
        "date" : "2024-09-02 17:07:21 +0200",
        "id" : "eb4ca1189c1410ae3dade2703c78bcd3d0403236",
        "msg" : "tests: move pySim-trace test and its data into a sub directory",
        "paths" : [
          {
            "editType" : "add",
            "file" : "tests/pySim-trace_test/pySim-trace_test_gsmtap.pcapng.ok"
          },
          {
            "editType" : "delete",
            "file" : "pysim-testdata/pySim-trace_test_gsmtap.pcapng"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-trace_test/pySim-trace_test.sh"
          },
          {
            "editType" : "delete",
            "file" : "pysim-testdata/pySim-trace_test_gsmtap.pcapng.ok"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-trace_test/pySim-trace_test_gsmtap.pcapng"
          },
          {
            "editType" : "delete",
            "file" : "tests/pySim-trace_test.sh"
          },
          {
            "editType" : "edit",
            "file" : "contrib/jenkins.sh"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tests/pySim-prog_test/sysmoISIM-SJA2.ok",
          "tests/pySim-prog_test/sysmosim-gr1.ok",
          "pysim-testdata/sysmoUSIM-SJS1.data",
          "pysim-testdata/sysmoUSIM-SJS1.ok",
          "pysim-testdata/sysmosim-gr1.ok",
          "pysim-testdata/Wavemobile-SIM.ok",
          "tests/pySim-prog_test/Wavemobile-SIM.ok",
          "pysim-testdata/sysmoISIM-SJA2.data",
          "tests/pySim-prog_test/sysmoUSIM-SJS1.data",
          "tests/pySim-prog_test/fakemagicsim.ok",
          "pysim-testdata/Fairwaves-SIM.ok",
          "pysim-testdata/sysmoISIM-SJA2.ok",
          "pysim-testdata/Wavemobile-SIM.data",
          "pysim-testdata/fakemagicsim.ok",
          "tests/pySim-prog_test/sysmoISIM-SJA2.data",
          "tests/pySim-prog_test/sysmoUSIM-SJS1.ok",
          "tests/pySim-prog_test.sh",
          "pysim-testdata/fakemagicsim.data",
          "pysim-testdata/Fairwaves-SIM.data",
          "tests/pySim-prog_test/fakemagicsim.data",
          "pysim-testdata/sysmosim-gr1.data",
          "tests/pySim-prog_test/Wavemobile-SIM.data",
          "tests/pySim-prog_test/sysmosim-gr1.data",
          "tests/pySim-prog_test/pySim-prog_test.sh",
          "contrib/jenkins.sh",
          "tests/pySim-prog_test/Fairwaves-SIM.ok",
          "tests/pySim-prog_test/Fairwaves-SIM.data"
        ],
        "commitId" : "4d99c2b2042bd73d5d7c8878ec47806717de56d1",
        "timestamp" : 1725289641000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "tests: move pySim-prog test and its data into a sub directory\u000a\u000aWe currently have the shell script that performs the test in the\u000atests directory and the related data in pysim-testdata directory.\u000aThis is confusing, let's have evrything in a dedicated sub directory\u000a\u000aChange-Id: Ic995a7f600d164fc0be3c2eb8255dbe043429bea\u000aRelated: OS#6531\u000a",
        "date" : "2024-09-02 17:07:21 +0200",
        "id" : "4d99c2b2042bd73d5d7c8878ec47806717de56d1",
        "msg" : "tests: move pySim-prog test and its data into a sub directory",
        "paths" : [
          {
            "editType" : "delete",
            "file" : "pysim-testdata/Wavemobile-SIM.ok"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-prog_test/Fairwaves-SIM.ok"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-prog_test/Wavemobile-SIM.data"
          },
          {
            "editType" : "delete",
            "file" : "pysim-testdata/sysmoISIM-SJA2.data"
          },
          {
            "editType" : "delete",
            "file" : "pysim-testdata/fakemagicsim.data"
          },
          {
            "editType" : "delete",
            "file" : "pysim-testdata/sysmosim-gr1.data"
          },
          {
            "editType" : "delete",
            "file" : "tests/pySim-prog_test.sh"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-prog_test/Wavemobile-SIM.ok"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-prog_test/Fairwaves-SIM.data"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-prog_test/pySim-prog_test.sh"
          },
          {
            "editType" : "edit",
            "file" : "contrib/jenkins.sh"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-prog_test/sysmosim-gr1.ok"
          },
          {
            "editType" : "delete",
            "file" : "pysim-testdata/fakemagicsim.ok"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-prog_test/sysmoUSIM-SJS1.data"
          },
          {
            "editType" : "delete",
            "file" : "pysim-testdata/Wavemobile-SIM.data"
          },
          {
            "editType" : "delete",
            "file" : "pysim-testdata/sysmoUSIM-SJS1.data"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-prog_test/fakemagicsim.data"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-prog_test/sysmoUSIM-SJS1.ok"
          },
          {
            "editType" : "delete",
            "file" : "pysim-testdata/Fairwaves-SIM.data"
          },
          {
            "editType" : "delete",
            "file" : "pysim-testdata/sysmoISIM-SJA2.ok"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-prog_test/fakemagicsim.ok"
          },
          {
            "editType" : "delete",
            "file" : "pysim-testdata/sysmoUSIM-SJS1.ok"
          },
          {
            "editType" : "delete",
            "file" : "pysim-testdata/Fairwaves-SIM.ok"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-prog_test/sysmosim-gr1.data"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-prog_test/sysmoISIM-SJA2.data"
          },
          {
            "editType" : "delete",
            "file" : "pysim-testdata/sysmosim-gr1.ok"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-prog_test/sysmoISIM-SJA2.ok"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "docs/suci-tutorial.rst"
        ],
        "commitId" : "df08441472001adc44462c5e45d90d3ebf3b4970",
        "timestamp" : 1725290528000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "suci-tutorial: put download links for specs to the front\u000a\u000aThe section Technical References has direct download links for the relevant specs.\u000aThen later in th Key Provisioning section another download link follows and another\u000aone is redundant. Let's put all download links into the Technical References section\u000aand then only use the spec numbers in the following. This way we have all download\u000alinks in one location.\u000a\u000aRelated: OS#6531\u000aChange-Id: Ibcbc6bb5d836d32c381922a35afa3b73b5f90621\u000a",
        "date" : "2024-09-02 17:22:08 +0200",
        "id" : "df08441472001adc44462c5e45d90d3ebf3b4970",
        "msg" : "suci-tutorial: put download links for specs to the front",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "docs/suci-tutorial.rst"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "docs/suci-tutorial.rst"
        ],
        "commitId" : "f0034e4fe8204193fb9549efa215165b2326c25a",
        "timestamp" : 1725290588000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "suci-tutorial: fix spec reference\u000a\u000aRelated: OS#6531\u000aChange-Id: If98c0b1093c7d19ea0278758c635b8405b465a2e\u000a",
        "date" : "2024-09-02 17:23:08 +0200",
        "id" : "f0034e4fe8204193fb9549efa215165b2326c25a",
        "msg" : "suci-tutorial: fix spec reference",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "docs/suci-tutorial.rst"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tests/pySim-prog_test/pySim-prog_test.sh"
        ],
        "commitId" : "33256ddfed7c0726f36dfa6ff5e61f31f8b00d2c",
        "timestamp" : 1725359900000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "pySim-prog_test: tolerate empty reader slots\u000a\u000aThe test currently expects all reader slots to be populated. This means\u000athe cards may plugged into a random order, but there may not be any empty\u000aslots in the system at all. This requirement is easy to meet when each\u000acard has its own single-slot USB PCSC-reader, but as soon as multislot\u000areaders are used there may be some empty slots.\u000a\u000aRelated: OS#6532\u000aChange-Id: I7ba1d1350b6998d65e90408184accdb212556a7c\u000a",
        "date" : "2024-09-03 12:38:20 +0200",
        "id" : "33256ddfed7c0726f36dfa6ff5e61f31f8b00d2c",
        "msg" : "pySim-prog_test: tolerate empty reader slots",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "tests/pySim-prog_test/pySim-prog_test.sh"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tests/pySim-prog_test/pySim-prog_test.sh"
        ],
        "commitId" : "4d1f4fde4fb34f0fed559a0ee1518fcaeb3c743b",
        "timestamp" : 1725359910000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "pySim-prog_test: tolerate missing .data files\u000a\u000aWhen the test detects a card, but does not find the .data faile for\u000ait, then it fails. This can be a problem in case we want to intentionally\u000aexclude a specific card model.\u000a\u000aRelated: OS#6532\u000aChange-Id: Iba196ada0076385de7bffcb157a85fda0a6c1852\u000a",
        "date" : "2024-09-03 12:38:30 +0200",
        "id" : "4d1f4fde4fb34f0fed559a0ee1518fcaeb3c743b",
        "msg" : "pySim-prog_test: tolerate missing .data files",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "tests/pySim-prog_test/pySim-prog_test.sh"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tests/pySim-prog_test/pySim-prog_test.sh"
        ],
        "commitId" : "aa182e98157b21c462e8001a59c4a8fedd22ed6e",
        "timestamp" : 1725359910000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "pySim-prog_test: supress stderr when probing for cards\u000a\u000aWhen probing for cards, the probing might fail in case the terminal\u000ais empty. This results into lengthy error log output that is not\u000aof interest.\u000a\u000aRelated: OS#6532\u000aChange-Id: I1d44f9458a05992d79b0152d3affcfeb783cccff\u000a",
        "date" : "2024-09-03 12:38:30 +0200",
        "id" : "aa182e98157b21c462e8001a59c4a8fedd22ed6e",
        "msg" : "pySim-prog_test: supress stderr when probing for cards",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "tests/pySim-prog_test/pySim-prog_test.sh"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "contrib/jenkins.sh"
        ],
        "commitId" : "a437d11135e66b7645021c606c8b2099358302c8",
        "timestamp" : 1725393379000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "contrib/jenkins.sh: Install dependencies before calling pylint\u000a\u000aThis is the only way we can make sure pylint has all required\u000ainformation about imports from packages we depend upon.\u000a\u000aChange-Id: I29582aa3d7f9ace9ce832d5b907420aaf14881fb\u000a",
        "date" : "2024-09-03 21:56:19 +0200",
        "id" : "a437d11135e66b7645021c606c8b2099358302c8",
        "msg" : "contrib/jenkins.sh: Install dependencies before calling pylint",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "contrib/jenkins.sh"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_31_103.py",
          "pySim/ts_102_310.py",
          "pySim/global_platform/uicc.py",
          "pySim/esim/bsp.py",
          "pySim/utils.py",
          "pySim/card_key_provider.py",
          "pySim/esim/saip/__init__.py",
          "setup.py",
          "tests/unittests/test_globalplatform.py",
          "tests/unittests/test_construct.py",
          "pySim-prog.py",
          "pySim/construct.py",
          "pySim/iso7816_4.py",
          "tests/unittests/test_utils.py",
          "pySim/transport/calypso.py",
          "pySim-read.py",
          "pySim/gsmtap.py",
          "pySim/euicc.py",
          "pySim/cat.py",
          "pySim/cards.py",
          "pySim/apdu/ts_31_102.py",
          "pySim/sms.py",
          "pySim/transport/modem_atcmd.py",
          "pySim/transport/serial.py",
          "pySim/commands.py",
          "osmo-smdpp.py",
          "pySim/esim/es8p.py",
          "pySim/apdu/ts_102_222.py",
          "pySim/sysmocom_sja2.py",
          "pySim/esim/rsp.py",
          "pySim/ts_31_104.py",
          "pySim/global_platform/__init__.py",
          "pySim/transport/pcsc.py",
          "pySim/secure_channel.py",
          "pySim/apdu/__init__.py",
          "tests/unittests/test_esim_bsp.py",
          "README.md",
          "contrib/csv-encrypt-columns.py",
          "pySim-shell.py",
          "pySim/runtime.py",
          "pySim/filesystem.py",
          "pySim/gsm_r.py",
          "pySim/transport/__init__.py",
          "pySim/ts_31_102_telecom.py",
          "tests/unittests/test_files.py",
          "contrib/es9p_client.py",
          "pySim/ts_51_011.py",
          "tests/unittests/test_esim.py",
          "tests/unittests/test_esim_saip.py",
          "pySim/cdma_ruim.py",
          "requirements.txt",
          "contrib/saip-tool.py",
          "tests/unittests/test_tlvs.py",
          "pySim/ts_102_222.py",
          "tests/unittests/test_sms.py",
          "pySim/esim/saip/personalization.py",
          "pySim/ts_31_102.py",
          "pySim/global_platform/http.py",
          "tests/unittests/test_apdu.py",
          "pySim/ara_m.py",
          "pySim/tlv.py",
          "pySim/ota.py",
          "pySim-trace.py",
          "pySim/apdu/global_platform.py",
          "pySim/ts_31_103_shared.py",
          "pySim/global_platform/scp.py",
          "contrib/unber.py",
          "tests/unittests/test_ota.py",
          "tests/unittests/test_tlv.py",
          "pySim/apdu/ts_102_221.py",
          "pySim/ts_102_221.py"
        ],
        "commitId" : "a3962b2076d157e075262c51e6c4d0a48ba12465",
        "timestamp" : 1725393467000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "Migrate over to using pyosmocom\u000a\u000aWe're creating a 'pyosmocom' pypi module which contains a number of core\u000aOsmocom libraries / interfaces that are not specific to SIM card stuff\u000acontained here.\u000a\u000aThe main modules moved in this initial step are pySim.tlv, pySim.utils\u000aand pySim.construct. utils is split, not all of the contents is\u000aunrelated to SIM Cards.  The other two are moved completely.\u000a\u000aChange-Id: I4b63e45bcb0c9ba2424dacf85e0222aee735f411\u000a",
        "date" : "2024-09-03 21:57:47 +0200",
        "id" : "a3962b2076d157e075262c51e6c4d0a48ba12465",
        "msg" : "Migrate over to using pyosmocom",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_103_shared.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_102_222.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/esim/es8p.py"
          },
          {
            "editType" : "edit",
            "file" : "tests/unittests/test_tlvs.py"
          },
          {
            "editType" : "delete",
            "file" : "tests/unittests/test_construct.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/global_platform/__init__.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/apdu/ts_102_221.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/global_platform/http.py"
          },
          {
            "editType" : "edit",
            "file" : "tests/unittests/test_ota.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ara_m.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim-prog.py"
          },
          {
            "editType" : "edit",
            "file" : "osmo-smdpp.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim-read.py"
          },
          {
            "editType" : "edit",
            "file" : "setup.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/cat.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/apdu/ts_31_102.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_102_telecom.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_104.py"
          },
          {
            "editType" : "edit",
            "file" : "tests/unittests/test_esim.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/apdu/ts_102_222.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/iso7816_4.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/runtime.py"
          },
          {
            "editType" : "delete",
            "file" : "tests/unittests/test_tlv.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/commands.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/pcsc.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/utils.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/cdma_ruim.py"
          },
          {
            "editType" : "edit",
            "file" : "requirements.txt"
          },
          {
            "editType" : "edit",
            "file" : "pySim/apdu/global_platform.py"
          },
          {
            "editType" : "edit",
            "file" : "README.md"
          },
          {
            "editType" : "edit",
            "file" : "pySim/card_key_provider.py"
          },
          {
            "editType" : "delete",
            "file" : "pySim/tlv.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_102_310.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/global_platform/uicc.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_102_221.py"
          },
          {
            "editType" : "edit",
            "file" : "contrib/csv-encrypt-columns.py"
          },
          {
            "editType" : "edit",
            "file" : "tests/unittests/test_files.py"
          },
          {
            "editType" : "delete",
            "file" : "pySim/construct.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/calypso.py"
          },
          {
            "editType" : "edit",
            "file" : "contrib/unber.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/apdu/__init__.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/sms.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_51_011.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/secure_channel.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/euicc.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/filesystem.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim-trace.py"
          },
          {
            "editType" : "edit",
            "file" : "tests/unittests/test_utils.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/personalization.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/esim/bsp.py"
          },
          {
            "editType" : "edit",
            "file" : "tests/unittests/test_esim_bsp.py"
          },
          {
            "editType" : "edit",
            "file" : "contrib/es9p_client.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_103.py"
          },
          {
            "editType" : "edit",
            "file" : "tests/unittests/test_esim_saip.py"
          },
          {
            "editType" : "edit",
            "file" : "contrib/saip-tool.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/modem_atcmd.py"
          },
          {
            "editType" : "edit",
            "file" : "tests/unittests/test_globalplatform.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/gsmtap.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/serial.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/gsm_r.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/global_platform/scp.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/__init__.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ota.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_102.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/cards.py"
          },
          {
            "editType" : "edit",
            "file" : "tests/unittests/test_apdu.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/sysmocom_sja2.py"
          },
          {
            "editType" : "edit",
            "file" : "tests/unittests/test_sms.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/esim/rsp.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "setup.py",
          "requirements.txt",
          "pySim/apdu_source/pyshark_gsmtap.py",
          "pySim/apdu_source/gsmtap.py",
          "pySim/gsmtap.py",
          "pySim/apdu_source/tca_loader_log.py"
        ],
        "commitId" : "9036d6d3fbad59ae88e0ba850f90c6dc62ed8b7b",
        "timestamp" : 1725393467000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "remove pySim.gsmtap as it has moved to osmopython.gsmtap\u000a\u000aChange-Id: I631bb85bc6e76b089004d9f2e2082d70cbccf200\u000a",
        "date" : "2024-09-03 21:57:47 +0200",
        "id" : "9036d6d3fbad59ae88e0ba850f90c6dc62ed8b7b",
        "msg" : "remove pySim.gsmtap as it has moved to osmopython.gsmtap",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/apdu_source/tca_loader_log.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/apdu_source/pyshark_gsmtap.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/apdu_source/gsmtap.py"
          },
          {
            "editType" : "delete",
            "file" : "pySim/gsmtap.py"
          },
          {
            "editType" : "edit",
            "file" : "requirements.txt"
          },
          {
            "editType" : "edit",
            "file" : "setup.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "52735f36859731703e0e6d6dbd2cffb8316613b8",
        "timestamp" : 1725393467000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.esim.saip: Fix weird DF names\u000a\u000aSometimes the struct member is called like df-telecom, but in other\u000acases it's called df-df-saip  with a double 'df' in front.  That makes\u000ano sense, but we have to deal with it from our constructors...\u000a\u000aChange-Id: If5e670441f03a47fa34e97a326909b24927c12f7\u000a",
        "date" : "2024-09-03 21:57:47 +0200",
        "id" : "52735f36859731703e0e6d6dbd2cffb8316613b8",
        "msg" : "pySim.esim.saip: Fix weird DF names",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "65cbe48953f1163f49213e881c0ba51b97faf1ab",
        "timestamp" : 1725393467000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.esim.saip: Another naming irregularity.\u000a\u000aThe choice member is called df-5gprose but the header is called\u000a'df-5g-prose-header' (note the '-' between '5g' and 'prose'). WTF.\u000a\u000aChange-Id: I86004ac2e18a187c26c5e470344908512d21fb9e\u000a",
        "date" : "2024-09-03 21:57:47 +0200",
        "id" : "65cbe48953f1163f49213e881c0ba51b97faf1ab",
        "msg" : "pySim.esim.saip: Another naming irregularity.",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "73dd3d06377e44fc9bf00b49d875af3c19b91fa4",
        "timestamp" : 1725393467000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.esim.saip: Add missing initialization of File.df_name\u000a\u000aChange-Id: Iaf596a8914850ccae584c3b78dc7711db736ac80\u000a",
        "date" : "2024-09-03 21:57:47 +0200",
        "id" : "73dd3d06377e44fc9bf00b49d875af3c19b91fa4",
        "msg" : "pySim.esim.saip: Add missing initialization of File.df_name",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "981220641d2931e40f8a98da71dd6016cabbd64f",
        "timestamp" : 1725393467000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.esim.saip.File: Turn file_size into a computed property\u000a\u000aThis way, we can use file_size for both record-oriented and transparent EF\u000a\u000aChange-Id: Ib787cabe969202073a8c10042e200f3d2c29db73\u000a",
        "date" : "2024-09-03 21:57:47 +0200",
        "id" : "981220641d2931e40f8a98da71dd6016cabbd64f",
        "msg" : "pySim.esim.saip.File: Turn file_size into a computed property",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "b22bab0b20d1fc8bf254b4db59f322067ad055d3",
        "timestamp" : 1725393467000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.esim.saip.ProfileElementGFM: Initialize 'fileManagementCMD'\u000a\u000aWhen constructing a ProfileElmentGFM from scratch, initialize the\u000adecoded['fileManagementCMD'], as it is a mandatory member during\u000aASN.1 encode.\u000a\u000aChange-Id: Iaae99348d36b7f0c739daf039d6ea2305b7ca9db\u000a",
        "date" : "2024-09-03 21:57:47 +0200",
        "id" : "b22bab0b20d1fc8bf254b4db59f322067ad055d3",
        "msg" : "pySim.esim.saip.ProfileElementGFM: Initialize 'fileManagementCMD'",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/templates.py"
        ],
        "commitId" : "6aabb92c38541c234e52f10b26cd7c0b592be7c0",
        "timestamp" : 1725393467000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "esim.saip.templates: Fix expand_default_value_pattern for length==0\u000a\u000aThe original code treated length==0 like length==None (unspecified),\u000awhich is wrong.\u000a\u000aChange-Id: I39fa1e2b1b9d6d1c671ea37bdbec1d6f97e8a5e7\u000a",
        "date" : "2024-09-03 21:57:47 +0200",
        "id" : "6aabb92c38541c234e52f10b26cd7c0b592be7c0",
        "msg" : "esim.saip.templates: Fix expand_default_value_pattern for length==0",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/templates.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/commands.py"
        ],
        "commitId" : "bd7c21257c1328c984ac800a3b07c0055cb2c338",
        "timestamp" : 1725398248000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "commands: avoid double lchan patching, get rid of cla_byte getter+setter methods\u000a\u000aThe SimCardCommands has a cla_byte @property method, which automatically\u000areturns the lchan patched CLA byte. We use cla_byte property to build\u000athe UICC command APDUs inside SimCardCommands and then we hand the APDU\u000aover to the send_apdu* methods. The cla_byte @property method as well\u000aas the send_apdu* methods perform the lchan patching. This means the CLA\u000abyte gets patched twice, which is technically not an issue, but can be\u000aconfusing when trying to understand the code.\u000a\u000aTo fix this, let's remove the @property methods and turn cla_byte into\u000aa normal property again. This is also more accurate since the cla_byte\u000aproperty originally was introduced to switch between UICC and classic\u000aSIM APDU commands, which have almost identcal APDUs.\u000a\u000aRelated: OS#6531\u000aChange-Id: I420f8a5f7ff8d9e5ef94d6519fb3716d6c7caf64\u000a",
        "date" : "2024-09-03 21:17:28 +0000",
        "id" : "bd7c21257c1328c984ac800a3b07c0055cb2c338",
        "msg" : "commands: avoid double lchan patching, get rid of cla_byte getter+setter",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/commands.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-shell.py"
        ],
        "commitId" : "f81331808f9b2dd8872e335a88995296bd169d0a",
        "timestamp" : 1725434114000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-shell: rework startup procedure and introduce non interactive mode\u000a\u000aWhen pySim-shell is used in a scripted environment, we may easily get trapped in\u000athe pySim-shell prompt. This may happen in particular in case the script file\u000ais not executed due to problem with the reader initialization. In such a case\u000apySim-shell will not exit automatically and the shellscript that was calling\u000apySim-shell will stall indefinetly.\u000a\u000aTo make the use of pySim-shell more reliable in scripted environments, let's\u000aadd a --noprompt option that ensures the interactive mode is never entered.\u000aLet's also exit with an appropriate return code in case of initialization\u000aerrors, so that the calling script can know that something went wrong.\u000a\u000aRelated: OS#6531\u000aChange-Id: I07ecb27b37e2573629981a0d032cc95cd156be7e\u000a",
        "date" : "2024-09-04 07:15:14 +0000",
        "id" : "f81331808f9b2dd8872e335a88995296bd169d0a",
        "msg" : "pySim-shell: rework startup procedure and introduce non interactive mode",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "docs/suci-tutorial.rst"
        ],
        "commitId" : "471162dc769b11bd71d16775161c174755e1bfd0",
        "timestamp" : 1725435403000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "suci-tutorial: add section about SUCI calculation by the USIM\u000a\u000aThe tutorial describes how SUCI calculation in the UE is configured,\u000alet's now add a section about SUCI calculation by the USIM.\u000a\u000aRelated: OS#6531\u000aChange-Id: I45d47f9278b30d99ebde6891de0ba8cc74b1a0a0\u000a",
        "date" : "2024-09-04 09:36:43 +0200",
        "id" : "471162dc769b11bd71d16775161c174755e1bfd0",
        "msg" : "suci-tutorial: add section about SUCI calculation by the USIM",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "docs/suci-tutorial.rst"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-shell.py"
        ],
        "commitId" : "639806cc5aa97225a76ec1dc54ae687a897dd204",
        "timestamp" : 1725435404000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-shell: do not display 'AIDs:' when there are none\u000a\u000aThe command cardinfo also displays the AIDs of the card applications.\u000aHowever, on classic GSM sim cards there are no applications. In this\u000acase cardinfo will still display the string 'AIDs:', but it will of\u000acourse not list any AIDs under this string.\u000a\u000aRelated: OS#6531\u000aChange-Id: Ifb111ce43fdebe85d30857dfc61ab570380b68d1\u000a",
        "date" : "2024-09-04 09:36:44 +0200",
        "id" : "639806cc5aa97225a76ec1dc54ae687a897dd204",
        "msg" : "pySim-shell: do not display 'AIDs:' when there are none",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_31_102.py",
          "pySim-shell.py",
          "pySim/ts_102_221.py",
          "pySim/ts_51_011.py",
          "pySim/filesystem.py"
        ],
        "commitId" : "398fdd7e8cba321a6cfcbda180d0287833b5a774",
        "timestamp" : 1725435448000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-shell: use upper case letters for positional arguments\u000a\u000aWhen we define positional arguments for the argument parser, we usually\u000ause upper case letters only. However, there are some code locations that\u000ause lower case letters. Let's translate those to capital letters to\u000ahave a consistent appeariance.\u000a\u000aRelated: OS#6531\u000aChange-Id: Iec1ff8262bc6e9cf87c3cbf7b32fa5f753b7e574\u000a",
        "date" : "2024-09-04 09:37:28 +0200",
        "id" : "398fdd7e8cba321a6cfcbda180d0287833b5a774",
        "msg" : "pySim-shell: use upper case letters for positional arguments",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_102_221.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_102.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_51_011.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/filesystem.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "docs/suci-tutorial.rst"
        ],
        "commitId" : "ee9ac2f7ff984cdedf5664a2e8d1bc1e9f73ba51",
        "timestamp" : 1725436455000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "suci-tutorial: fix typo s/symo/sysmo/\u000a\u000aChange-Id: I0d3bdcf590e8dfef6deabc9967fd2f04152e1020\u000a",
        "date" : "2024-09-04 09:54:15 +0200",
        "id" : "ee9ac2f7ff984cdedf5664a2e8d1bc1e9f73ba51",
        "msg" : "suci-tutorial: fix typo s/symo/sysmo/",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "docs/suci-tutorial.rst"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/transport/__init__.py"
        ],
        "commitId" : "726097e51f1052b19bb2d8b5f0ef15c44f01b80c",
        "timestamp" : 1725535853000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "transport: define TERMINAL RESPONSE content within ProactiveHandler\u000a\u000aSo far the core proactive handling code would always generate a positive\u000aresponse, with no way for the ProactiveHandler call-back to influence\u000athat or to include additional IEs/TLVs.\u000a\u000aLet's change that.\u000a\u000aChange-Id: Ic772b3383533f845689ac97ad03fcf67cf59c208\u000a",
        "date" : "2024-09-05 11:30:53 +0000",
        "id" : "726097e51f1052b19bb2d8b5f0ef15c44f01b80c",
        "msg" : "transport: define TERMINAL RESPONSE content within ProactiveHandler",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/transport/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/app.py"
        ],
        "commitId" : "bf0689a48e774919c97f12e24cc9ae6a88169f58",
        "timestamp" : 1725713038000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.app: Properly reset card state after reading EID\u000a\u000aThe code had two problems:\u000a\u000a* the RESET was only performed in the successful case, but not if\u000a  some exceptio was raised\u000a\u000a* the RESET was a low-level reset bypassing the RuntimeState,\u000a  so the lchan.selected_file was stale afterwards\u000a\u000aFixes: Change-Id Idc2ea1d9263f39b3dff403e1535a5e6c4e88b26f\u000a\u000aChange-Id: Ib23d3d5b58b456a25157a622c1010c81cd8b2213\u000a",
        "date" : "2024-09-07 14:43:58 +0200",
        "id" : "bf0689a48e774919c97f12e24cc9ae6a88169f58",
        "msg" : "pySim.app: Properly reset card state after reading EID",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/app.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/transport/__init__.py"
        ],
        "commitId" : "241d65db126ea3c9e22415ef65c9055261331b26",
        "timestamp" : 1725713038000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.transport: Add support for generic stdout apdu tracer\u000a\u000aAny program using argparse_add_reader_args() will get a new\u000along-opt '--apdu-trace' which enables a raw APDU trace to the console.\u000a\u000aChange-Id: I4bc3d2e023ba360f07f024d7b661a93322f87530\u000a",
        "date" : "2024-09-07 14:43:58 +0200",
        "id" : "241d65db126ea3c9e22415ef65c9055261331b26",
        "msg" : "pySim.transport: Add support for generic stdout apdu tracer",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/transport/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/transport/__init__.py",
          "pySim/transport/pcsc.py",
          "pySim/transport/calypso.py",
          "pySim-trace.py",
          "pySim/transport/modem_atcmd.py",
          "pySim/transport/serial.py"
        ],
        "commitId" : "2fe9b6a3e9f997b12bf0042e7620a5a86242d06d",
        "timestamp" : 1725993476000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.transport: Also trace card reset events in ApduTracer\u000a\u000aChange-Id: Ia46b65124520eb2b8015dfa3f0a135b497668b92\u000a",
        "date" : "2024-09-10 20:37:56 +0200",
        "id" : "2fe9b6a3e9f997b12bf0042e7620a5a86242d06d",
        "msg" : "pySim.transport: Also trace card reset events in ApduTracer",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-trace.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/calypso.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/pcsc.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/modem_atcmd.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/__init__.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/serial.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/commands.py"
        ],
        "commitId" : "c3fe111c0efd34d855c666c2621456f4a62cf406",
        "timestamp" : 1725993616000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.commands: use _checksw during get_data() method\u000a\u000aAll other methods use send_apdu_checksw, just get_data()\u000awas missing the _checksw part.\u000a\u000aChange-Id: Ic784bf0c30b22e5e83843aa6694e2706b4b2ac48\u000a",
        "date" : "2024-09-10 20:40:16 +0200",
        "id" : "c3fe111c0efd34d855c666c2621456f4a62cf406",
        "msg" : "pySim.commands: use _checksw during get_data() method",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/commands.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/euicc.py"
        ],
        "commitId" : "07b67439f87d9306e722261029b27c3acecdb226",
        "timestamp" : 1725993616000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.euicc: Add 'get_data sgp02_eid' in ADF.ECASD of M2M eUICC\u000a\u000aThe M2M eUICC are completely different from the consumer/IoT eUICC.\u000a\u000aObtaining the EID works via GET DATA in the ECASD.  Let's add support\u000afor that.\u000a\u000aChange-Id: I6cca6f75d268229244c90b3f1f88e26c89a2b4e0\u000a",
        "date" : "2024-09-10 20:40:16 +0200",
        "id" : "07b67439f87d9306e722261029b27c3acecdb226",
        "msg" : "pySim.euicc: Add 'get_data sgp02_eid' in ADF.ECASD of M2M eUICC",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/euicc.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-shell.py"
        ],
        "commitId" : "7633a1123917534c4e9b301dce6dc2084759f79e",
        "timestamp" : 1726058244000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "pySim-shell: print cardinfo hexstrings in lowercase\u000a\u000aTo ensure consistency, let's print the cardinfo hexstrings in lowercase\u000aonly.\u000a\u000aRelated: OS#6531\u000aChange-Id: Ia6a8bd0e700c7fd933fb6c1b1050ed9494462d60\u000a",
        "date" : "2024-09-11 14:37:24 +0200",
        "id" : "7633a1123917534c4e9b301dce6dc2084759f79e",
        "msg" : "pySim-shell: print cardinfo hexstrings in lowercase",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-prog.py"
        ],
        "commitId" : "492379e61a880159a24d5ec891a127b1ff8addbc",
        "timestamp" : 1726482019000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "pySim-prog: fix sourcecode formatting\u000a\u000aChange-Id: I0e567a1a681891f33f170c5df50c691b20b6a978\u000a",
        "date" : "2024-09-16 12:20:19 +0200",
        "id" : "492379e61a880159a24d5ec891a127b1ff8addbc",
        "msg" : "pySim-prog: fix sourcecode formatting",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-prog.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-prog.py"
        ],
        "commitId" : "bd762c77aee72d78b4f60318ab1ab2924989afc5",
        "timestamp" : 1726482043000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "pySim-prog: fix sourcecode formatting\u000a\u000aChange-Id: Ie4d4ec6d1752013fa8aa39912aa600c2b4afac74\u000a",
        "date" : "2024-09-16 12:20:43 +0200",
        "id" : "bd762c77aee72d78b4f60318ab1ab2924989afc5",
        "msg" : "pySim-prog: fix sourcecode formatting",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-prog.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/cdma_ruim.py",
          "pySim/ts_102_221.py",
          "pySim/profile.py",
          "pySim/ts_51_011.py"
        ],
        "commitId" : "5f2dfc28ff45d979d37d9f799ed2dc526c929f14",
        "timestamp" : 1726586565000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim/profile: Change match_with_profile from static to class method\u000a\u000aThis was suggested by vyanitskiy during gerrit patch review in\u000ahttps://gerrit.osmocom.org/c/pysim/+/38049 in order to make the\u000aupcoming eUICC CardProfiles simpler.\u000a\u000aChange-Id: Ia7c049b31cb1c5c5bb682406d9dd7a73bcd43185\u000a",
        "date" : "2024-09-17 15:22:45 +0000",
        "id" : "5f2dfc28ff45d979d37d9f799ed2dc526c929f14",
        "msg" : "pySim/profile: Change match_with_profile from static to class method",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_102_221.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/cdma_ruim.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/profile.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_51_011.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/cdma_ruim.py",
          "pySim/profile.py",
          "pySim/ts_102_221.py",
          "pySim/ts_51_011.py"
        ],
        "commitId" : "72186cce84720ed4eee7f0d719a7c6ce91546644",
        "timestamp" : 1726586565000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.profile: Further refactor card <-> profile matching\u000a\u000aThe new architecture avoids sim/ruim/uicc specific methods in\u000apySim.profile and instead moves the profile-specific code into the\u000aprofile; it also solves everything within the class hierarchy, no need\u000afor global methods.\u000a\u000aChange-Id: I3b6c44d2f5cce2513c3ec8a3ce939a242f3e4901\u000a",
        "date" : "2024-09-17 15:22:45 +0000",
        "id" : "72186cce84720ed4eee7f0d719a7c6ce91546644",
        "msg" : "pySim.profile: Further refactor card <-> profile matching",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/profile.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/cdma_ruim.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_102_221.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_51_011.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/euicc.py",
          "pySim/cdma_ruim.py",
          "pySim/ts_51_011.py",
          "pySim/ts_102_221.py"
        ],
        "commitId" : "84857accf3caa50dcc6f793d07aec7044c031ad1",
        "timestamp" : 1726586565000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-shell: Detect different eUICC types and print during start-up\u000a\u000aChange-Id: I54ea4ce663693f3951040dcc8a16bf532bf99c02\u000a",
        "date" : "2024-09-17 15:22:45 +0000",
        "id" : "84857accf3caa50dcc6f793d07aec7044c031ad1",
        "msg" : "pySim-shell: Detect different eUICC types and print during start-up",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/cdma_ruim.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_51_011.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_102_221.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/euicc.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "docs/library.rst"
        ],
        "commitId" : "8e42a12048ce0b4dd3e5411887b4e1ce1f0e9f40",
        "timestamp" : 1726586565000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "docs: remove traces of modules migrated to pyosmocom\u000a\u000aChange-Id: I2ebb17f9781c90a81e9e554bddd7a851ef51c82a\u000a",
        "date" : "2024-09-17 15:22:45 +0000",
        "id" : "8e42a12048ce0b4dd3e5411887b4e1ce1f0e9f40",
        "msg" : "docs: remove traces of modules migrated to pyosmocom",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "docs/library.rst"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "docs/osmo-smdpp.rst"
        ],
        "commitId" : "ad3d73e734e49a2d02bdb8220dfb7b6d86238b0d",
        "timestamp" : 1726586565000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "docs: Bring osmo-smdpp documentation up to date with code\u000a\u000aChange-Id: Ibaab1fadd5d35ecdb356bed1820074b1b0a1752e\u000aCloses: OS#6418\u000a",
        "date" : "2024-09-17 15:22:45 +0000",
        "id" : "ad3d73e734e49a2d02bdb8220dfb7b6d86238b0d",
        "msg" : "docs: Bring osmo-smdpp documentation up to date with code",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "docs/osmo-smdpp.rst"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "setup.py",
          "requirements.txt"
        ],
        "commitId" : "87e1ba6c184b9fb400875a9046cb8cd07ca45b6f",
        "timestamp" : 1726586743000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "update pyosmocom dependency to 0.0.3\u000a\u000a0.0.3 fixes an important problem related to enabling callers of build_construct()\u000ato pass in a total_len value in order to specify the target output size.\u000a\u000aChange-Id: I01687bb54e65bf5cc318745df588c3d6ea14eb83\u000a",
        "date" : "2024-09-17 17:25:43 +0200",
        "id" : "87e1ba6c184b9fb400875a9046cb8cd07ca45b6f",
        "msg" : "update pyosmocom dependency to 0.0.3",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "requirements.txt"
          },
          {
            "editType" : "edit",
            "file" : "setup.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-prog.py"
        ],
        "commitId" : "39e4a4b7c5ed6c0a623f7c0c4b28fa9e7ee43633",
        "timestamp" : 1726588050000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-prog: add FIXME note to tell that writing hlr.db files is broken\u000a\u000aThe writing to osmo-hlr SQLITE files is broken since the SQLITE format\u000ahas evolved over time. Let's add a FIXME note to tell that this needs\u000afixing.\u000a\u000aRelated: SYS#4120\u000aChange-Id: I2b23f8bb9f3c2adeb48b010834057f5b4fb1e626\u000a",
        "date" : "2024-09-17 15:47:30 +0000",
        "id" : "39e4a4b7c5ed6c0a623f7c0c4b28fa9e7ee43633",
        "msg" : "pySim-prog: add FIXME note to tell that writing hlr.db files is broken",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-prog.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-prog.py"
        ],
        "commitId" : "3dc04969135132015b77904b997c0d7a71b6511f",
        "timestamp" : 1726588050000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-prog: treat --imsi and --iccid equally\u000a\u000aWhen using a CSV file, we can either read the IMSI or ICCID from the\u000aCSV file before programming. However, should also be possible to\u000asupply both manually to identify the CSV file entry using the --imsi\u000aor --iccid option. This currently only works for the IMSI, but not\u000afor the ICCID.\u000a\u000aRelated: SYS#4120\u000aChange-Id: Id3083c7794a7bd59501997f22afdc23bad3069e6\u000a",
        "date" : "2024-09-17 15:47:30 +0000",
        "id" : "3dc04969135132015b77904b997c0d7a71b6511f",
        "msg" : "pySim-prog: treat --imsi and --iccid equally",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-prog.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-prog.py"
        ],
        "commitId" : "3eb74829df34059c0dce23b7ca64579bc9c73058",
        "timestamp" : 1726588050000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-prog: fix commandline parameter check for CSV mode\u000a\u000aThe CSV mode needs one of the four additional parameters: --imsi\u000a--iccid, --read-iccid or --read-imsi. Also this check is unrelated\u000ato the batch mode. The CSV file parameter reading works independently\u000afrom the batch mode.\u000a\u000aRelated: SYS#4120\u000aChange-Id: I1292afb85122ed2b7944d02ede69c928a453866f\u000a",
        "date" : "2024-09-17 15:47:30 +0000",
        "id" : "3eb74829df34059c0dce23b7ca64579bc9c73058",
        "msg" : "pySim-prog: fix commandline parameter check for CSV mode",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-prog.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "docs/legacy.rst"
        ],
        "commitId" : "94ecf9a92968861ad51d622e24e92d13c30326b6",
        "timestamp" : 1726588050000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-prog: rework documentation\u000a\u000aThe documentation for the classic pySim-prog application is a bit\u000asparse. Let's rework it so that it includes the most important\u000ainformation that is required to operate pySim-prog. Let's also add\u000aa section about how the batch mode and CSV files are used.\u000a\u000aRelated: SYS#4120\u000aChange-Id: I1d1a65154cea7fa77428b412fcf8c7b4cba629b1\u000a",
        "date" : "2024-09-17 15:47:30 +0000",
        "id" : "94ecf9a92968861ad51d622e24e92d13c30326b6",
        "msg" : "pySim-prog: rework documentation",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "docs/legacy.rst"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/runtime.py"
        ],
        "commitId" : "9a6425b6f277e92745665907c33a0eb598e4554a",
        "timestamp" : 1726595986000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "runtime: add new API functions to get the record len and file size\u000a\u000aWe have an API function to get the number of records, let's now also\u000aadd API functions to get the record length and the overall size of\u000athe currently selected file.\u000a\u000aRelated: OS#5714\u000aChange-Id: Ica7811c04161d8098b40c7219ed6b939df716cfd\u000a",
        "date" : "2024-09-17 17:59:46 +0000",
        "id" : "9a6425b6f277e92745665907c33a0eb598e4554a",
        "msg" : "runtime: add new API functions to get the record len and file size",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/runtime.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/filesystem.py"
        ],
        "commitId" : "6942a40909e6ffb0fa10d0609b04c5cf51e42558",
        "timestamp" : 1726648894000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "filesystem, cosmetic: remove excess whitespace\u000a\u000aChange-Id: I902670590ae75a5d197616ae37d8268a60125121\u000a",
        "date" : "2024-09-18 10:41:34 +0200",
        "id" : "6942a40909e6ffb0fa10d0609b04c5cf51e42558",
        "msg" : "filesystem, cosmetic: remove excess whitespace",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/filesystem.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/runtime.py",
          "pySim-shell.py"
        ],
        "commitId" : "d5ddd04f33ad9413ffc06cc4bc6a8014e297da9b",
        "timestamp" : 1726648894000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "pySim-shell: improve command \"desc\"\u000a\u000aThe \"desc\" command displays a string with a file description, let's also\u000adisplay some size information as part of the description as well.\u000a\u000aRelated: OS#5714\u000aChange-Id: I98e139ba2bf35df5524245cdd96f5c52cf09b986\u000a",
        "date" : "2024-09-18 10:41:34 +0200",
        "id" : "d5ddd04f33ad9413ffc06cc4bc6a8014e297da9b",
        "msg" : "pySim-shell: improve command \"desc\"",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/runtime.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "setup.py",
          "requirements.txt"
        ],
        "commitId" : "154e29c89a90216678b756f30bf001d431fa4258",
        "timestamp" : 1726769373000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "requirements: require at least construct version 2.10.70\u000a\u000aOlder construct versions seem to have problems, in particular with\u000aevaluating COptional() correctly. With 2.10.70 no such problems\u000awere observed.\u000a\u000aRelated: OS#5714\u000aChange-Id: If59dc708a7194649d1f42c4cf33f6328edcb80d2\u000a",
        "date" : "2024-09-19 18:09:33 +0000",
        "id" : "154e29c89a90216678b756f30bf001d431fa4258",
        "msg" : "requirements: require at least construct version 2.10.70",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "requirements.txt"
          },
          {
            "editType" : "edit",
            "file" : "setup.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tests/pySim-prog_test/sysmoISIM-SJA2.data"
        ],
        "commitId" : "dca641aaa277ad8573edd384f1edd794c921d631",
        "timestamp" : 1726834534000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-prog_test: do not set an ICCID parameter for sysmoISIM-SJA2\u000a\u000aThe sysmoISIM-SJA2 does not support changing of the ICCID.\u000apySim-prog will also reject this, so let's remove the ICCID\u000afrom the parameter list.\u000a\u000aRelated: OS#4384\u000aChange-Id: I89571f2bf7c4cec4d621c322a58687b7781b0ed2\u000a",
        "date" : "2024-09-20 12:15:34 +0000",
        "id" : "dca641aaa277ad8573edd384f1edd794c921d631",
        "msg" : "pySim-prog_test: do not set an ICCID parameter for sysmoISIM-SJA2",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "tests/pySim-prog_test/sysmoISIM-SJA2.data"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tests/pySim-prog_test/sysmoUSIM-SJS1.ok",
          "tests/pySim-prog_test/sysmosim-gr1.ok",
          "tests/pySim-prog_test/sysmosim-gr1.data",
          "tests/pySim-prog_test/sysmoUSIM-SJS1.data"
        ],
        "commitId" : "01a96cd8e464083bfc6c10631b38bc587a5bb101",
        "timestamp" : 1726834534000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-prog_test: individual ICCIDs for all cards\u000a\u000aOur test cards need to stay recognizable, so it is important that\u000aeach card has a unique ICCID. This means we must write an individual\u000aICCID, when we test writing the ICCID.\u000a\u000aRelated: OS#4384\u000aChange-Id: I858a35e526e7b4868e901222d587258412779f41\u000a",
        "date" : "2024-09-20 12:15:34 +0000",
        "id" : "01a96cd8e464083bfc6c10631b38bc587a5bb101",
        "msg" : "pySim-prog_test: individual ICCIDs for all cards",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "tests/pySim-prog_test/sysmoUSIM-SJS1.data"
          },
          {
            "editType" : "edit",
            "file" : "tests/pySim-prog_test/sysmosim-gr1.data"
          },
          {
            "editType" : "edit",
            "file" : "tests/pySim-prog_test/sysmoUSIM-SJS1.ok"
          },
          {
            "editType" : "edit",
            "file" : "tests/pySim-prog_test/sysmosim-gr1.ok"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-shell.py"
        ],
        "commitId" : "26ee39bebf8e26221d85c1e4b7482c10db13d0b6",
        "timestamp" : 1726840010000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "pySim-shell: recognize ADP pins longer than 8 digits as hexadecimal\u000a\u000aWhen a hexadecimal formatted ADM pin is retrieved via the\u000acard_key_provider, it still requires the --pin-is-hex parameter so\u000athat sanitize_pin_adm knows the correct format.\u000a\u000aThis unfortunately ruins the card_key_provider feature for all cards\u000athat use hexadecimal pins, because the --pin-is-hex would also be\u000arequired in scripts, which makes a script either useable for cards\u000awith hexadecimal ADM or for for cards with ASCII ADM.\u000a\u000aTo minimize the problem, let's recognize all ADM pins longer than 8\u000adigits as hexadecimal in case --pin-is-hex is not set.\u000a\u000aRelated: OS#4348\u000aChange-Id: Iad9398365d448946c499ce89e3cfb2c3af5d525e\u000a",
        "date" : "2024-09-20 15:46:50 +0200",
        "id" : "26ee39bebf8e26221d85c1e4b7482c10db13d0b6",
        "msg" : "pySim-shell: recognize ADP pins longer than 8 digits as hexadecimal",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tests/pySim-prog_test/sysmoISIM-SJA5.ok",
          "tests/pySim-prog_test/sysmoISIM-SJA5.data"
        ],
        "commitId" : "d7032955c566c10f6cedcdf2aafc134abc4727c3",
        "timestamp" : 1726845530000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "pySim-prog_test: add test vectors for sysmoISIM-SJA5\u000a\u000aThe sysmoISIM-SJA5 has no testvectors yet\u000a\u000aChange-Id: Ia6684ab3ee6c85cfe7bc0ab80d34a26e3499907a\u000a",
        "date" : "2024-09-20 17:18:50 +0200",
        "id" : "d7032955c566c10f6cedcdf2aafc134abc4727c3",
        "msg" : "pySim-prog_test: add test vectors for sysmoISIM-SJA5",
        "paths" : [
          {
            "editType" : "add",
            "file" : "tests/pySim-prog_test/sysmoISIM-SJA5.ok"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-prog_test/sysmoISIM-SJA5.data"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tests/pySim-shell_test/chv/test_manage_direct.template",
          "tests/pySim-shell_test/fsdump/test.script",
          "tests/pySim-shell_test/cardinfo/sysmoEUICC1-C2T-cardinfo.ok",
          "tests/pySim-shell_test/chv/test_unblock_direct.ok",
          "tests/pySim-shell_test/authenticate/auth_result.ok",
          "tests/pySim-shell_test/verify_adm/test_csv.script",
          "tests/pySim-shell_test/gp/test_est_scp03_csv.script",
          "tests/pySim-shell_test/euicc/test_get_profiles_info.script",
          "tests/pySim-shell_test/euicc/test_rm_notif.template",
          "tests/pySim-shell_test/euicc/euicc_info2.ok",
          "tests/pySim-shell_test/ara_m/adf_ara-m.script.ok",
          "tests/pySim-shell_test/verify_adm/test.py",
          "tests/pySim-shell_test/chv/test_unblock_direct.template",
          "tests/pySim-shell_test/ara_m/adf_ara-m.cfg.ok",
          "tests/pySim-shell_test/euicc/notifications.ok",
          "tests/pySim-shell_test/authenticate/__init__.py",
          "tests/pySim-shell_test/file_specific/ef_imsi.ok",
          "tests/pySim-shell_test/fsdump/__init__.py",
          "tests/pySim-shell_test/gp/test_put_delete_key.script",
          "tests/pySim-shell_test/fsdump/test.py",
          "tests/pySim-shell_test/file_admin/test_create_delete_df.script",
          "tests/pySim-shell_test/__init__.py",
          "tests/pySim-shell_test/verify_adm/test_direct.template",
          "tests/pySim-shell_test/ara_m/__init__.py",
          "tests/pySim-shell_test/gp/test_get_status.script",
          "tests/pySim-shell_test/chv/test_manage_csv.ok",
          "tests/pySim-shell_test/verify_adm/test_cmdline.script",
          "tests/pySim-shell_test/file_admin/__init__.py",
          "tests/pySim-shell_test/file_admin/test.py",
          "tests/pySim-shell_test/file_specific/test_ef_ust.script",
          "tests/pySim-shell_test/fsdump/fsdump.json.ok",
          "tests/pySim-shell_test/file_admin/test_create_resize_delete_linear_fixed_ef.script",
          "tests/pySim-shell_test/file_specific/test_ef_ist.script",
          "tests/pySim-shell_test/navigate_fs/test_uicc.script",
          "tests/pySim-shell_test/chv/test_unblock_csv.ok",
          "tests/pySim-shell_test/gp/key_information.ok",
          "tests/pySim-shell_test/gp/test_est_scp03_direct.template",
          "tests/pySim-shell_test/euicc/test_set_nickname.script",
          "tests/pySim-shell_test/navigate_fs/checkpoints_sim.ok",
          "tests/pySim-shell_test/ara_m/test.script",
          "tests/pySim-shell_test/euicc/get_eid.ok",
          "tests/pySim-shell_test/file_content/test_record_sim.ok",
          "tests/pySim-shell_test/cardinfo/sysmoISIM-SJA2-cardinfo.ok",
          "tests/pySim-shell_test/file_content/test_record_sim.script",
          "tests/pySim-shell_test/cardinfo/test.py",
          "tests/pySim-shell_test/authenticate/test.py",
          "tests/pySim-shell_test/file_content/test_binary_sim.script",
          "tests/pySim-shell_test/file_content/test_binary_sim.ok",
          "tests/pySim-shell_test/navigate_fs/__init__.py",
          "tests/pySim-shell_test/cardinfo/test.template",
          "tests/pySim-shell_test/export/test_import.script",
          "tests/pySim-shell_test/chv/test_manage_direct.ok",
          "tests/pySim-shell_test/euicc/test_get_euicc_info.script",
          "tests/pySim-shell_test/file_content/test_ber_tlv_uicc.script",
          "tests/pySim-shell_test/file_content/test_ber_tlv_uicc.ok",
          "tests/pySim-shell_test/file_content/test_record_uicc.script",
          "tests/pySim-shell_test/utils.py",
          "tests/pySim-shell_test/ara_m/adf_ara-m_empty.cfg.ok",
          "tests/pySim-shell_test/file_content/test_binary_uicc.ok",
          "tests/pySim-shell_test/navigate_fs/test.py",
          "tests/pySim-shell_test/cardinfo/__init__.py",
          "tests/pySim-shell_test/euicc/__init__.py",
          "tests/pySim-shell_test/navigate_fs/checkpoints_uicc.ok",
          "tests/pySim-shell_test/README.txt",
          "tests/pySim-shell_test/file_specific/test.py",
          "tests/pySim-shell_test/verify_adm/__init__.py",
          "tests/pySim-shell_test/card_data.csv",
          "tests/pySim-shell_test/gp/get_status_isd.ok",
          "tests/pySim-shell_test/export/test.py",
          "tests/pySim-shell_test/export/test_export.script",
          "tests/pySim-shell_test/euicc/test.py",
          "tests/pySim-shell_test/get_identity/test.script",
          "tests/pySim-shell_test/get_identity/test.py",
          "tests/pySim-shell_test/euicc/set_nickname.ok",
          "tests/pySim-shell_test/euicc/test_list_notif.script",
          "tests/pySim-shell_test/export/export.script.ok",
          "tests/pySim-shell_test/gp/test_est_scp02_direct.template",
          "tests/pySim-shell_test/config.yaml",
          "tests/pySim-shell_test/gp/test.py",
          "tests/pySim-shell_test/lchan/test.ok",
          "tests/pySim-shell_test/chv/test_manage_csv.template",
          "tests/pySim-shell_test/file_specific/__init__.py",
          "tests/pySim-shell_test/cardinfo/sysmoSIM-GR1-cardinfo.ok",
          "tests/pySim-shell_test/file_content/__init__.py",
          "tests/pySim-shell_test/euicc/euicc_info1.ok",
          "tests/pySim-shell_test/lchan/__init__.py",
          "tests/pySim-shell_test/file_content/test_binary_uicc.script",
          "contrib/jenkins.sh",
          "tests/pySim-shell_test/gp/test_est_scp02_csv.script",
          "tests/pySim-shell_test/euicc/enable_disable_profile.ok",
          "tests/pySim-shell_test/file_admin/test_activate_deactivate_file.script",
          "tests/pySim-shell_test/file_content/test_record_uicc.ok",
          "tests/pySim-shell_test/chv/test_unblock_csv.script",
          "tests/pySim-shell_test/export/__init__.py",
          "tests/pySim-shell_test/chv/__init__.py",
          "tests/pySim-shell_test/authenticate/test.script",
          "tests/pySim-shell_test/euicc/get_profiles_info.ok",
          "tests/pySim-shell_test/file_admin/activate_deactivate_file.ok",
          "tests/pySim-shell_test/lchan/test.py",
          "tests/pySim-shell_test/lchan/test.script",
          "tests/pySim-shell_test/euicc/test_enable_disable_profile.script",
          "tests/pySim-shell_test/ara_m/test.py",
          "tests/pySim-shell_test/get_identity/__init__.py",
          "tests/pySim-shell_test/euicc/test_get_eid.script",
          "tests/pySim-shell_test/gp/__init__.py",
          "tests/pySim-shell_test/file_specific/test_ef_ist.ok",
          "tests/pySim-shell_test/cardinfo/sysmoISIM-SJA5-S17-cardinfo.ok",
          "tests/pySim-shell_test/navigate_fs/test_sim.script",
          "tests/pySim-shell_test/chv/test.py",
          "tests/pySim-shell_test/file_specific/test_ef_ust.ok",
          "tests/pySim-shell_test/file_content/test.py",
          "tests/pySim-shell_test/file_specific/test_update_imsi_plmn.script",
          "tests/pySim-shell_test/euicc/test_gen_notif.script",
          "tests/pySim-shell_test/file_admin/test_create_resize_delete_transparent_ef.script"
        ],
        "commitId" : "f87a00c04f2825cb8f8ea22f7b00ba7a40b72d73",
        "timestamp" : 1726847607000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "Add testsuite for pySim-shell with real cards\u000a\u000aThis patch adds a comprehensive testsuite for pySim-shell. The testsuite\u000ais based on python's unittest framework in combination with pySim-shell\u000ascripts.\u000a\u000aRelated: OS#6531\u000aChange-Id: Ieae1330767a6e55e62437f5f988a0d33b727b5de\u000a",
        "date" : "2024-09-20 17:53:27 +0200",
        "id" : "f87a00c04f2825cb8f8ea22f7b00ba7a40b72d73",
        "msg" : "Add testsuite for pySim-shell with real cards",
        "paths" : [
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/README.txt"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/euicc/test_gen_notif.script"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/file_content/test_binary_sim.ok"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/file_content/test.py"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/gp/test_est_scp02_direct.template"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/cardinfo/sysmoSIM-GR1-cardinfo.ok"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/navigate_fs/checkpoints_uicc.ok"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/chv/test_manage_direct.ok"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/ara_m/adf_ara-m.cfg.ok"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/navigate_fs/checkpoints_sim.ok"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/file_content/test_binary_uicc.script"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/cardinfo/sysmoISIM-SJA5-S17-cardinfo.ok"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/cardinfo/sysmoEUICC1-C2T-cardinfo.ok"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/chv/test_manage_csv.template"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/file_admin/test_create_resize_delete_transparent_ef.script"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/authenticate/auth_result.ok"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/gp/test_get_status.script"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/utils.py"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/euicc/test_get_eid.script"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/file_content/__init__.py"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/file_content/test_record_sim.ok"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/euicc/enable_disable_profile.ok"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/file_admin/test_create_delete_df.script"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/verify_adm/test.py"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/lchan/__init__.py"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/export/test_export.script"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/euicc/set_nickname.ok"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/file_admin/activate_deactivate_file.ok"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/gp/test_est_scp03_direct.template"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/ara_m/test.script"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/file_specific/test_ef_ust.ok"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/euicc/test_get_profiles_info.script"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/navigate_fs/test_sim.script"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/export/export.script.ok"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/lchan/test.script"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/gp/key_information.ok"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/gp/test_put_delete_key.script"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/euicc/notifications.ok"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/file_specific/ef_imsi.ok"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/gp/test_est_scp03_csv.script"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/euicc/euicc_info2.ok"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/euicc/test.py"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/file_content/test_ber_tlv_uicc.script"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/chv/test_unblock_direct.template"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/ara_m/adf_ara-m.script.ok"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/file_specific/__init__.py"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/file_content/test_ber_tlv_uicc.ok"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/euicc/get_eid.ok"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/export/__init__.py"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/chv/test_unblock_csv.script"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/navigate_fs/test_uicc.script"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/authenticate/__init__.py"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/navigate_fs/test.py"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/file_specific/test_ef_ust.script"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/gp/test.py"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/get_identity/test.script"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/file_specific/test.py"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/get_identity/__init__.py"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/file_specific/test_ef_ist.ok"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/euicc/test_get_euicc_info.script"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/file_admin/__init__.py"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/file_content/test_binary_sim.script"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/config.yaml"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/cardinfo/test.template"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/chv/__init__.py"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/chv/test.py"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/fsdump/fsdump.json.ok"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/file_specific/test_update_imsi_plmn.script"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/lchan/test.ok"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/file_specific/test_ef_ist.script"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/gp/test_est_scp02_csv.script"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/navigate_fs/__init__.py"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/lchan/test.py"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/file_admin/test_create_resize_delete_linear_fixed_ef.script"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/chv/test_manage_direct.template"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/file_content/test_record_sim.script"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/verify_adm/__init__.py"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/export/test.py"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/euicc/test_enable_disable_profile.script"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/cardinfo/test.py"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/__init__.py"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/euicc/euicc_info1.ok"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/export/test_import.script"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/verify_adm/test_csv.script"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/cardinfo/sysmoISIM-SJA2-cardinfo.ok"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/fsdump/test.py"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/file_content/test_record_uicc.ok"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/euicc/get_profiles_info.ok"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/authenticate/test.script"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/file_admin/test.py"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/verify_adm/test_cmdline.script"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/fsdump/test.script"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/gp/__init__.py"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/cardinfo/__init__.py"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/get_identity/test.py"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/file_content/test_binary_uicc.ok"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/file_content/test_record_uicc.script"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/euicc/test_set_nickname.script"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/chv/test_unblock_direct.ok"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/euicc/__init__.py"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/chv/test_manage_csv.ok"
          },
          {
            "editType" : "edit",
            "file" : "contrib/jenkins.sh"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/card_data.csv"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/authenticate/test.py"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/fsdump/__init__.py"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/euicc/test_list_notif.script"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/gp/get_status_isd.ok"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/verify_adm/test_direct.template"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/chv/test_unblock_csv.ok"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/ara_m/__init__.py"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/ara_m/adf_ara-m_empty.cfg.ok"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/ara_m/test.py"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/file_admin/test_activate_deactivate_file.script"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/euicc/test_rm_notif.template"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          ".gitignore"
        ],
        "commitId" : "c09d4cc6b80b8eccf18c363843288f5f3d436fbf",
        "timestamp" : 1727073535000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/osmith",
          "fullName" : "Oliver Smith"
        },
        "authorEmail" : "osmith@sysmocom.de",
        "comment" : "gitignore: add files generated with jenkins.sh\u000a\u000aChange-Id: Iaffe04a3dfebd46efc479dc3665fd67f2c95f375\u000a",
        "date" : "2024-09-23 08:38:55 +0200",
        "id" : "c09d4cc6b80b8eccf18c363843288f5f3d436fbf",
        "msg" : "gitignore: add files generated with jenkins.sh",
        "paths" : [
          {
            "editType" : "edit",
            "file" : ".gitignore"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "contrib/jenkins.sh"
        ],
        "commitId" : "7b95fac0221dfb2b78d37da0165381408066ba71",
        "timestamp" : 1727073535000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/osmith",
          "fullName" : "Oliver Smith"
        },
        "authorEmail" : "osmith@sysmocom.de",
        "comment" : "contrib/jenkins: add SKIP_CLEAN_WORKSPACE\u000a\u000aIn order to run this script from pyosmocom's contrib/jenkins.sh script,\u000awe want to skip the clean workspace step. Add an environment variable to\u000ado that.\u000a\u000aRelated: OS#6570\u000aChange-Id: Ic8dc9b85da17719195f7374d37eccb4dedba6ce8\u000a",
        "date" : "2024-09-23 08:38:55 +0200",
        "id" : "7b95fac0221dfb2b78d37da0165381408066ba71",
        "msg" : "contrib/jenkins: add SKIP_CLEAN_WORKSPACE",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "contrib/jenkins.sh"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tests/pySim-shell_test/euicc/test.py"
        ],
        "commitId" : "d96d04718e3e4937379a5f646f7c8e25c41b81f2",
        "timestamp" : 1727092371000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "pySim-shell_test: disable test_list_and_rm_notif\u000a\u000aThe testcase euicc.test_list_and_rm_notif fails due to a problem\u000awith the eUICC. The eUICC reports the following error when a\u000adelete notification attempt is made:\u000a\u000a\"delete_notification_status\": \"undefinedError\"\u000a\u000aLet's temporarily disable this testcase until the problem is resolved.\u000a\u000aChange-Id: I7d0b6a998499d84f0eb4e24592ad43210ac54806\u000a",
        "date" : "2024-09-23 13:52:51 +0200",
        "id" : "d96d04718e3e4937379a5f646f7c8e25c41b81f2",
        "msg" : "pySim-shell_test: disable test_list_and_rm_notif",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "tests/pySim-shell_test/euicc/test.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-shell.py"
        ],
        "commitId" : "78c22a7d635de4db9feaca36d85d89817494a425",
        "timestamp" : 1727107996000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-shell: New '-e' command line argument\u000a\u000aUsing '-e' it is possible to specify *multiple* pySim-shell commands\u000awhich shall be executed at startup.  This extends the current ability\u000ato execute just a single command.\u000a\u000aExample:\u000a ./pySim-shell.py -p0 -e 'select ADF.USIM/EF.IMSI' -e 'read_binary_decoded'\u000a\u000aChange-Id: I74004f46105553f077c039ca0f86f75afccc7342\u000a",
        "date" : "2024-09-23 16:13:16 +0000",
        "id" : "78c22a7d635de4db9feaca36d85d89817494a425",
        "msg" : "pySim-shell: New '-e' command line argument",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_31_102.py",
          "pySim/gsm_r.py",
          "tests/pySim-shell_test/file_content/test_record_uicc.ok",
          "pySim/filesystem.py",
          "pySim/runtime.py",
          "pySim/ts_31_102_telecom.py",
          "tests/unittests/test_files.py",
          "pySim/ts_51_011.py",
          "pySim/sysmocom_sja2.py"
        ],
        "commitId" : "efddffe0158c50b6c36b5fd76795c89350921793",
        "timestamp" : 1727453839000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "filesystem: pass total_len to construct of when encoding file contents\u000a\u000aIn our construct models we frequently use a context parameter \"total_len\",\u000awe also pass this parameter to construct when we decode files, but we\u000ado not pass it when we generate files. This is a problem, because when\u000atotal_len is used in the construct model, this parameter must be known\u000aalso when decoding the file.\u000a\u000aLet's make sure that the total_len is properly determined and and passed\u000ato construct (via pyosmocom).\u000a\u000aRelated: OS#5714\u000aChange-Id: I1b7a51594fbc5d9fe01132c39354a2fa88d53f9b\u000a",
        "date" : "2024-09-27 18:17:19 +0200",
        "id" : "efddffe0158c50b6c36b5fd76795c89350921793",
        "msg" : "filesystem: pass total_len to construct of when encoding file contents",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/filesystem.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_102.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/sysmocom_sja2.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_51_011.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/gsm_r.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_102_telecom.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/runtime.py"
          },
          {
            "editType" : "edit",
            "file" : "tests/unittests/test_files.py"
          },
          {
            "editType" : "edit",
            "file" : "tests/pySim-shell_test/file_content/test_record_uicc.ok"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_102_221.py",
          "pySim/ts_31_102.py"
        ],
        "commitId" : "4045146f62b331a2819e831cbe3b040a060c4e91",
        "timestamp" : 1727453839000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "cosmetic: use **kwargs instead of **_kwargs\u000a\u000aSome methods sometimes have a **_kwargs parameter, let's be consistent\u000aand use **kwargs only.\u000a\u000aRelated: OS#5714\u000aChange-Id: I98857cc774185e55a604eb4fbfbf62ed4bd6ded7\u000a",
        "date" : "2024-09-27 18:17:19 +0200",
        "id" : "4045146f62b331a2819e831cbe3b040a060c4e91",
        "msg" : "cosmetic: use **kwargs instead of **_kwargs",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_102_221.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_102.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_51_011.py",
          "tests/pySim-trace_test/pySim-trace_test_gsmtap.pcapng.ok"
        ],
        "commitId" : "39552464d8097023b4cef861b0ab216b390ef4c2",
        "timestamp" : 1727453839000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "ts_51_011: replace encoding of EF.MSISDN with construct model\u000a\u000aThe encoding of EF.MSISDN is currently done with enc_msisdn and\u000adec_msisdn from utils.py. Let's replace this with a construct\u000abased model, similar to the one we already use with EF.ADN\u000a\u000aRelated: OS#5714\u000aChange-Id: I647f5c63f7f87902a86c0c5d8e92fdc7f4350a5a\u000a",
        "date" : "2024-09-27 18:17:19 +0200",
        "id" : "39552464d8097023b4cef861b0ab216b390ef4c2",
        "msg" : "ts_51_011: replace encoding of EF.MSISDN with construct model",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "tests/pySim-trace_test/pySim-trace_test_gsmtap.pcapng.ok"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_51_011.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_51_011.py"
        ],
        "commitId" : "dc2ca5d6be4ac435b0c6b73ac0bd82df973131a6",
        "timestamp" : 1727453839000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "ts_51_011: fix unittest for EF.ADN\u000a\u000aThe unittest for EF.ADN can run with _test_de_encode. However, the original\u000atest vectors seem to be from a card with a slightly larger record size, so\u000athey need a bit of re-alignment\u000a\u000aRelated: OS#5714\u000aChange-Id: I241792e66ee6167be6ddc076453344b6307d6265\u000a",
        "date" : "2024-09-27 18:17:19 +0200",
        "id" : "dc2ca5d6be4ac435b0c6b73ac0bd82df973131a6",
        "msg" : "ts_51_011: fix unittest for EF.ADN",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_51_011.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_51_011.py"
        ],
        "commitId" : "10ea4a07141b1f970373367d38d1f8b726e6e015",
        "timestamp" : 1727453839000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "ts_51_011: use _test_de_encode instead of _test_decode in EF.CFIS unittest\u000a\u000aThe unittest for EF.CFIS only runs with _test_decode, but it also runs with\u000a_test_de_encode without any problems\u000a\u000aRelated: OS#5714\u000aChange-Id: Ib876fd799f871fe64ced2a7b64847ffd09e16ed9\u000a",
        "date" : "2024-09-27 18:17:19 +0200",
        "id" : "10ea4a07141b1f970373367d38d1f8b726e6e015",
        "msg" : "ts_51_011: use _test_de_encode instead of _test_decode in EF.CFIS",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_51_011.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_102_221.py"
        ],
        "commitId" : "1f45799188e4b61fcbe7aaff8af4611789a03c5e",
        "timestamp" : 1727453839000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "ts_102_221: se _test_de_encode instead of _test_decode in EF.DIR unittest\u000a\u000aThe unittest for EF.DIR only runs with _test_decode, but it also runs with\u000a_test_de_encode without any problems\u000a\u000aRelated: OS#5714\u000aChange-Id: If459073c6ff927c1cc1790d506e3979243b1fb4c\u000a",
        "date" : "2024-09-27 18:17:19 +0200",
        "id" : "1f45799188e4b61fcbe7aaff8af4611789a03c5e",
        "msg" : "ts_102_221: se _test_de_encode instead of _test_decode in EF.DIR",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_102_221.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/legacy/cards.py",
          "pySim/legacy/utils.py",
          "tests/unittests/test_utils.py",
          "pySim-read.py",
          "pySim/utils.py"
        ],
        "commitId" : "93c89856c825139e8ead856b4439f24e2851418a",
        "timestamp" : 1727453839000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "utils: move enc_msisdn and dec_msisdn to legacy/utils.py\u000a\u000aWe now have a construct based encoder/decoder for the record content\u000aof EF.MSISDN. This means that we do not need the functions enc_msisdn\u000aand dec_msisdn in the non-legacy code anymore. We can now move both\u000ato legacy/utils.py.\u000a\u000aRelated: OS#5714\u000aChange-Id: I19ec8ba14551ec282fc0cc12ae2f6d528bdfc527\u000a",
        "date" : "2024-09-27 18:17:19 +0200",
        "id" : "93c89856c825139e8ead856b4439f24e2851418a",
        "msg" : "utils: move enc_msisdn and dec_msisdn to legacy/utils.py",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/legacy/utils.py"
          },
          {
            "editType" : "edit",
            "file" : "tests/unittests/test_utils.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim-read.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/legacy/cards.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/utils.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tests/card_sanitizer/card_data.csv",
          "tests/card_sanitizer/card_backup_3b9f96801fc78031a073be21136743200718000001a5_8988211320300000028.script",
          "tests/card_sanitizer/card_backup_3b9f95801fc78031e073f62113674d4516004301008f_89445310150011013678.script",
          "tests/card_sanitizer/card_backup_3b9a940092027593110001020221_1122334455667788990.script",
          "tests/card_sanitizer/card_backup_3b991800118822334455667760_2222334455667788990.script",
          "tests/card_sanitizer/card_backup_3b9f96801fc78031a073be21136744220610000001a9_8988219000000117833.script",
          "tests/card_sanitizer/card_backup_3b9f96801f878031e073fe211b674a4c753034054ba9_8988211000000467343.script",
          "tests/card_sanitizer/card_sanitizer.py",
          "tests/card_sanitizer/card_backup_3b9f96801f878031e073fe211b674a357530350265f8_8949440000001155314.script"
        ],
        "commitId" : "7429bc0ca08d9eb9a65974e05d2d27e001edfd84",
        "timestamp" : 1728117860000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "tests: sanitize all cards before running tests\u000a\u000aEven though our tests are written in a way that they shouldn't interfere\u000awith each other, it may happen that one testrun writes content to a file\u000athat upsets a different testrun. The resulting problems are often\u000adifficult to diagnose.\u000a\u000aTo minimize the problem, let's add code that can reset the cards to a\u000adefined state. This can be done using pySim-shell's export\u000afeature. We can generate a backup from a known good state and then play\u000aback the backup to reset files that have been changed. Files that didn't\u000achange will not be written thanks to the conserve_write feature of\u000apySim-shell.\u000a\u000aRelated: OS#4384\u000aChange-Id: I42eaf61280968518164f2280245136fd30a603ce\u000a",
        "date" : "2024-10-05 08:44:20 +0000",
        "id" : "7429bc0ca08d9eb9a65974e05d2d27e001edfd84",
        "msg" : "tests: sanitize all cards before running tests",
        "paths" : [
          {
            "editType" : "add",
            "file" : "tests/card_sanitizer/card_data.csv"
          },
          {
            "editType" : "add",
            "file" : "tests/card_sanitizer/card_backup_3b9f95801fc78031e073f62113674d4516004301008f_89445310150011013678.script"
          },
          {
            "editType" : "add",
            "file" : "tests/card_sanitizer/card_backup_3b9f96801fc78031a073be21136743200718000001a5_8988211320300000028.script"
          },
          {
            "editType" : "add",
            "file" : "tests/card_sanitizer/card_backup_3b9f96801f878031e073fe211b674a357530350265f8_8949440000001155314.script"
          },
          {
            "editType" : "add",
            "file" : "tests/card_sanitizer/card_backup_3b9f96801f878031e073fe211b674a4c753034054ba9_8988211000000467343.script"
          },
          {
            "editType" : "add",
            "file" : "tests/card_sanitizer/card_backup_3b9a940092027593110001020221_1122334455667788990.script"
          },
          {
            "editType" : "add",
            "file" : "tests/card_sanitizer/card_backup_3b991800118822334455667760_2222334455667788990.script"
          },
          {
            "editType" : "add",
            "file" : "tests/card_sanitizer/card_backup_3b9f96801fc78031a073be21136744220610000001a9_8988219000000117833.script"
          },
          {
            "editType" : "add",
            "file" : "tests/card_sanitizer/card_sanitizer.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "contrib/jenkins.sh"
        ],
        "commitId" : "7c62fc5ec402f29344092fc54bfd36d62578bb2e",
        "timestamp" : 1728655198000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "jenkins: build docs in virtualenv as well\u000a\u000aThe build system uses a virtual environment, in which it installs\u000apysim and its dependencies. This is done for the integration tests,\u000abut not when building the sphinx documentation. However, the\u000adocumentation build process also invokes pysim code to generate\u000adocumentation from the docstrings. This means we need pysim with\u000aall its dependencies for the doc building as well.\u000a\u000aChange-Id: I6381eeef7fa19873ca0cc330a0ab43b7ef5096e4\u000aRelated: SYS#7094\u000a",
        "date" : "2024-10-11 15:59:58 +0200",
        "id" : "7c62fc5ec402f29344092fc54bfd36d62578bb2e",
        "msg" : "jenkins: build docs in virtualenv as well",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "contrib/jenkins.sh"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "docs/Makefile"
        ],
        "commitId" : "a8cfeb0111c263f1163b8a84e14ade5486fadb2a",
        "timestamp" : 1728655851000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/osmith",
          "fullName" : "Oliver Smith"
        },
        "authorEmail" : "osmith@sysmocom.de",
        "comment" : "docs/Makefile: make SPHINXBUILD work in venv\u000a\u000asphinx-build doesn't use the PYTHONPATH from the venv, unless it runs\u000aas python3 -m sphinx.cmd.build. We need it to use the imports from\u000aPYTHONPATH, so we can update the pyosmocom version in requirements.txt\u000ain a patch, and this new version will be used in the jenkins job that\u000aruns during gerrit review. Otherwise the previously installed version\u000a(from the docker image) will be used.\u000a\u000aRelated: https://github.com/sphinx-doc/sphinx/issues/8910\u000aChange-Id: I487e1af6a3493df5b806cc2d3d2b70bc5233b89f\u000a",
        "date" : "2024-10-11 16:10:51 +0200",
        "id" : "a8cfeb0111c263f1163b8a84e14ade5486fadb2a",
        "msg" : "docs/Makefile: make SPHINXBUILD work in venv",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "docs/Makefile"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/euicc.py",
          "setup.py",
          "requirements.txt"
        ],
        "commitId" : "3a905d637c00d707f635d0f138cbbf0301b900e3",
        "timestamp" : 1728655987000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/osmith",
          "fullName" : "Oliver Smith"
        },
        "authorEmail" : "osmith@sysmocom.de",
        "comment" : "pySim.euicc: Fix ASN.1 encoding of integer values\u000a\u000aChange-Id: I26ee41705f5e95c5fa3a9997cbaebdacca3e89a7\u000aCloses: SYS#7094\u000a",
        "date" : "2024-10-11 16:13:07 +0200",
        "id" : "3a905d637c00d707f635d0f138cbbf0301b900e3",
        "msg" : "pySim.euicc: Fix ASN.1 encoding of integer values",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/euicc.py"
          },
          {
            "editType" : "edit",
            "file" : "setup.py"
          },
          {
            "editType" : "edit",
            "file" : "requirements.txt"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tests/pySim-shell_test/euicc/test.py"
        ],
        "commitId" : "82b0f1b39a3a5ee85e063266214002dc9d5441a3",
        "timestamp" : 1728655987000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/osmith",
          "fullName" : "Oliver Smith"
        },
        "authorEmail" : "osmith@sysmocom.de",
        "comment" : "pySim-shell_test: re-enable test_list_and_rm_notif\u000a\u000aThe problems with test_list_and_rm_notif (see also change id\u000aI7d0b6a998499d84f0eb4e24592ad43210ac54806) are now resolved, so\u000awe can re-enable the testcase now.\u000a\u000aCloses: SYS#7094\u000aChange-Id: I95eb3b9c02a69653797851197e882ea9316805fc\u000a",
        "date" : "2024-10-11 16:13:07 +0200",
        "id" : "82b0f1b39a3a5ee85e063266214002dc9d5441a3",
        "msg" : "pySim-shell_test: re-enable test_list_and_rm_notif",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "tests/pySim-shell_test/euicc/test.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "docs/shell.rst"
        ],
        "commitId" : "f4dd9b5cebf41371dc8d8377e5496f7ab0dee514",
        "timestamp" : 1729412059000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "docs/shell: Add missing :ref: when referencing other command\u000a\u000aChange-Id: I18f110e6313932d82b19ecaa7e07ef00c2339513\u000a",
        "date" : "2024-10-20 10:14:19 +0200",
        "id" : "f4dd9b5cebf41371dc8d8377e5496f7ab0dee514",
        "msg" : "docs/shell: Add missing :ref: when referencing other command",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "docs/shell.rst"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/templates.py"
        ],
        "commitId" : "f9631fb361527d7c2dac1cd93fb309c9d6d99204",
        "timestamp" : 1729412074000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.esim.saip.templates: Fix DF_TELECOM FileID (7F10, not 7F11)\u000a\u000aChange-Id: I4bc37f9d99c046cd6c6accaaf460a39eb79b660f\u000a",
        "date" : "2024-10-20 10:14:34 +0200",
        "id" : "f9631fb361527d7c2dac1cd93fb309c9d6d99204",
        "msg" : "pySim.esim.saip.templates: Fix DF_TELECOM FileID (7F10, not 7F11)",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/templates.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/global_platform/__init__.py"
        ],
        "commitId" : "ba22e238f3fe88d384502181e2422789b46c1f94",
        "timestamp" : 1729863012000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "global_platform: ensure ArgumentParser gets a list for choices\u000a\u000aWhen we use the argument parser with choices, we sometimes use a\u000alist that we derive from a dictionary. However if we do that we\u000astill must ensure that we really put a list and not a dict_values\u000aor dict_keys class as parameter because this won't work any longer\u000awith cmd2 version 2.5.0\u000a\u000aRelated: OS#6601\u000aChange-Id: I165fefd8feb0d96cedc15d036fb32da381f711b3\u000a",
        "date" : "2024-10-25 15:30:12 +0200",
        "id" : "ba22e238f3fe88d384502181e2422789b46c1f94",
        "msg" : "global_platform: ensure ArgumentParser gets a list for choices",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/global_platform/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tests/pySim-shell_test/file_specific/test_ef_ust.ok",
          "pySim/ts_31_102.py",
          "tests/pySim-shell_test/export/export.script.ok",
          "tests/pySim-shell_test/fsdump/fsdump.json.ok"
        ],
        "commitId" : "12328c090d60359ded0817288f654d864ac52525",
        "timestamp" : 1729872559000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "pySim.ts_31_102: Add support for EF.EARFCNList\u000a\u000aThis adds a construct + pyosmocore.tlv based declarative encoder/decoder\u000afor the EF.EARFCNList file used in the context of NB-IoT in later\u000arelease USIMs.\u000a\u000aChange-Id: I16797ca58c3ad6ebaf588d04fec011a0cbcfcef3\u000a",
        "date" : "2024-10-25 18:09:19 +0200",
        "id" : "12328c090d60359ded0817288f654d864ac52525",
        "msg" : "pySim.ts_31_102: Add support for EF.EARFCNList",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "tests/pySim-shell_test/file_specific/test_ef_ust.ok"
          },
          {
            "editType" : "edit",
            "file" : "tests/pySim-shell_test/export/export.script.ok"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_102.py"
          },
          {
            "editType" : "edit",
            "file" : "tests/pySim-shell_test/fsdump/fsdump.json.ok"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tests/pySim-shell_test/utils.py"
        ],
        "commitId" : "d8d52bdf77209eb392875d71b0713c233360d740",
        "timestamp" : 1729899689000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-shell_test/utils: delete log files in general\u000a\u000aWhen we get rid of temporary files, we delete those using a wildcard,\u000abut for the logs from pySim-shell we explicitly memorize the name\u000aof the pySim-shell logfile and delete it later by this explicit\u000aname. This is not necessary, let's just delete all log files present\u000ausing a wildcard.\u000a\u000aRelated: OS#6601\u000aChange-Id: I09dc7e59d1a3dcb68f54e3a8dccb86a1bc6c9ee6\u000a",
        "date" : "2024-10-25 23:41:29 +0000",
        "id" : "d8d52bdf77209eb392875d71b0713c233360d740",
        "msg" : "pySim-shell_test/utils: delete log files in general",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "tests/pySim-shell_test/utils.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tests/pySim-shell_test/utils.py"
        ],
        "commitId" : "32d6a9ab5fab4407c0d4aca72b2e41496ffe56a5",
        "timestamp" : 1729899689000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-shell_test/utils: enumerate pySim-shell logs\u000a\u000aWhen pySim-shell is called by a testcase, a logfile is createted. The logfile\u000afilename contains the testcase name. However, a testcase may run pySim-shell\u000amultiple times. In this case we overwrite the log from previous run. Let's use a\u000acounter to generate unique file names for each run, so that we won't lose logs\u000afrom previous runs.\u000a\u000aRelated: OS#6601\u000aChange-Id: Ib2195d9b2231f74d0a6c4fb28f4889b6c45efb1e\u000a",
        "date" : "2024-10-25 23:41:29 +0000",
        "id" : "32d6a9ab5fab4407c0d4aca72b2e41496ffe56a5",
        "msg" : "pySim-shell_test/utils: enumerate pySim-shell logs",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "tests/pySim-shell_test/utils.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tests/pySim-shell_test/utils.py"
        ],
        "commitId" : "98f4ea1447567e16c250161d42ab4e2d35534371",
        "timestamp" : 1729899689000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-shell_test/utils: display pySim-shell logfile content\u000a\u000aWhen we configure the tests to display file content, we only display files that\u000awe compare, let's also display log file contents from pySim-shell. This will\u000abe useful in situations where we only have log output from the tests, but no\u000aaccess to the file system of the test host.\u000a\u000aRelated: OS#6601\u000aChange-Id: Ibf6f78d7e71c213c7ca1caaf21c4c890e892261e\u000a",
        "date" : "2024-10-25 23:41:29 +0000",
        "id" : "98f4ea1447567e16c250161d42ab4e2d35534371",
        "msg" : "pySim-shell_test/utils: display pySim-shell logfile content",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "tests/pySim-shell_test/utils.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/commands.py"
        ],
        "commitId" : "5d54f3b8d8b435c1966abf0e22ca03fd01053078",
        "timestamp" : 1730453355000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "commands: fix typo\u000a\u000aChange-Id: I4103b7474063a26f09666361aef72abcd35bc12d\u000a",
        "date" : "2024-11-01 10:29:15 +0100",
        "id" : "5d54f3b8d8b435c1966abf0e22ca03fd01053078",
        "msg" : "commands: fix typo",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/commands.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/global_platform/scp.py"
        ],
        "commitId" : "909b8c1611ebfa710cc9ab3827bf17f4b9944581",
        "timestamp" : 1730453367000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "global_platform/scp: fix typo\u000a\u000aChange-Id: Ib26d983c6a80419326de812af2781c5e710dbcfc\u000a",
        "date" : "2024-11-01 10:29:27 +0100",
        "id" : "909b8c1611ebfa710cc9ab3827bf17f4b9944581",
        "msg" : "global_platform/scp: fix typo",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/global_platform/scp.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/commands.py"
        ],
        "commitId" : "464d1ac2bef05e78909386a97b887421b8dd6968",
        "timestamp" : 1730453367000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "commands: fix double space character in apidoc\u000a\u000aChange-Id: Id0dbe4578fd212bc240aac80e1e416cb57e92cc7\u000a",
        "date" : "2024-11-01 10:29:27 +0100",
        "id" : "464d1ac2bef05e78909386a97b887421b8dd6968",
        "msg" : "commands: fix double space character in apidoc",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/commands.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/commands.py"
        ],
        "commitId" : "35b9b3c54239e2c3f39d960b279a92523e3b1429",
        "timestamp" : 1730453367000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "commands: fix apidoc (wrong order of parameters)\u000a\u000aChange-Id: I4d17c71c7f992ecd795dd214d34f2e094c0a5b53\u000a",
        "date" : "2024-11-01 10:29:27 +0100",
        "id" : "35b9b3c54239e2c3f39d960b279a92523e3b1429",
        "msg" : "commands: fix apidoc (wrong order of parameters)",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/commands.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tests/pySim-shell_test/gp/test_est_scp02_direct.template",
          "tests/pySim-shell_test/gp/test_est_scp03_csv.script",
          "tests/pySim-shell_test/gp/test_est_scp03_direct.template",
          "tests/pySim-shell_test/gp/test_est_scp02_csv.script"
        ],
        "commitId" : "59593e0f28b7b10d667c87a6d6d7c5a515f97a69",
        "timestamp" : 1730716085000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "pySim-shell-test: improve global platform tests\u000a\u000aThe tests that check the establishment of a secure channel currently only test\u000asecurity level 3. Also the get_data command after it only tests data reception\u000afrom the card.\u000a\u000aLet's extend the test coverage and test the SCP establishment for security\u000alevel 1 as well. Let's also add a get_status command to make sure sending data\u000ato the card also works (without exceptions).\u000a\u000aRelated: OS#6367\u000aChange-Id: Idff40b414a249e532df1bdce2a8deb9b0cb9718f\u000a",
        "date" : "2024-11-04 11:28:05 +0100",
        "id" : "59593e0f28b7b10d667c87a6d6d7c5a515f97a69",
        "msg" : "pySim-shell-test: improve global platform tests",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "tests/pySim-shell_test/gp/test_est_scp03_csv.script"
          },
          {
            "editType" : "edit",
            "file" : "tests/pySim-shell_test/gp/test_est_scp03_direct.template"
          },
          {
            "editType" : "edit",
            "file" : "tests/pySim-shell_test/gp/test_est_scp02_direct.template"
          },
          {
            "editType" : "edit",
            "file" : "tests/pySim-shell_test/gp/test_est_scp02_csv.script"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/global_platform/scp.py"
        ],
        "commitId" : "f4c156ae575a6cd0da434150292bb7cd665a64df",
        "timestamp" : 1730716085000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "global_platform/scp: mapdu may be undeclared\u000a\u000awhen we sign and encrypt the APDU in _wrap_cmd_apdu (SCP03) we return an \"mapdu\"\u000aat the end. However, in the (unlikely?) case where self.do_cencand\u000aself.do_cmac are false, mapdu will be undeclared. In _wrap_cmd_apdu for SCP02\u000awe just re-use the apdu variable and return it at the end, so when no\u000aencryption and no signing is applied, the APDU falls just through without any\u000amodifications. We should have the same mechanism for the SCP03 wrapping as\u000awell.\u000a\u000aRelated: OS#6367\u000a\u000aChange-Id: Ic7089a69dffd7313572c5b3e5953200be5925766\u000a",
        "date" : "2024-11-04 11:28:05 +0100",
        "id" : "f4c156ae575a6cd0da434150292bb7cd665a64df",
        "msg" : "global_platform/scp: mapdu may be undeclared",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/global_platform/scp.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tests/pySim-shell_test/utils.py"
        ],
        "commitId" : "882e24677ff0532d4967b1480c826cad2d0ec1f5",
        "timestamp" : 1730716085000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "pySim-shell_test/utils: print logfile on all types of errors\u000a\u000aWhen pySim-shell has problems starting up, it exits with an error\u000acode. This is detected by the testsuite, but it also causes an\u000aearly exit, so that the log file content are not printed.\u000a\u000aChange-Id: Ic0f34eda32a7c557810abcb05a84e343741fdb8a\u000a",
        "date" : "2024-11-04 11:28:05 +0100",
        "id" : "882e24677ff0532d4967b1480c826cad2d0ec1f5",
        "msg" : "pySim-shell_test/utils: print logfile on all types of errors",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "tests/pySim-shell_test/utils.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-shell.py"
        ],
        "commitId" : "5887fb70fb34d085ecd76562efd13ed74f1cc822",
        "timestamp" : 1730716085000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "pySim-shell: allow checking of APDU responses\u000a\u000aThe \"apdu\" command allows us to send custom APDUs to a card. This command is\u000aoften used in low level initialization scripts or tests. To stop the script\u000aexecution in case of an error, the command allows us to specify a status word\u000athat must match the status word of the response. But we have no such mechanism\u000afor the response itself. Let's add another parameter where we can pass a regex\u000athat the response must match.\u000a\u000aRelated: OS#6367\u000aChange-Id: I97bbcdf37bdcf00ad50a875b96940c211de7073d\u000a",
        "date" : "2024-11-04 11:28:05 +0100",
        "id" : "5887fb70fb34d085ecd76562efd13ed74f1cc822",
        "msg" : "pySim-shell: allow checking of APDU responses",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-shell.py"
        ],
        "commitId" : "daa1c74047bb3155b3340bf216fbca8c514c2ddd",
        "timestamp" : 1730716085000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "pySim-shell: fix reset command for no-profile mode\u000a\u000aThere are situations where no card profile can be determined. In this case no\u000aRuntimeState will be present. This is in particular the case when pySim-shell\u000ais used on a card that is not provisioned/initialized yet. In those cases we\u000ahave to go the direct route and reset the card directly.\u000a\u000aRelated: OS#6367\u000aChange-Id: I27bf9fdb131d8bdeba07f4dfd2b76b38f9bfdd17\u000a",
        "date" : "2024-11-04 11:28:05 +0100",
        "id" : "daa1c74047bb3155b3340bf216fbca8c514c2ddd",
        "msg" : "pySim-shell: fix reset command for no-profile mode",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/app.py",
          "tests/pySim-shell_test/utils.py",
          "pySim-shell.py"
        ],
        "commitId" : "ec30022b1a6e5f3a87822eba2e6616a792130707",
        "timestamp" : 1730728473000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "pySim-shell: add new commandline option \"--skip-card-init\"\u000a\u000aby default pySim-shell does all kinds of probing and file selection\u000aon startup. This is to determine the card type and to find a suitable\u000acard profile. However, in case the card is non yet provisioned this\u000aprobing may cause a error messages and even might upset the cards\u000ainternal state. So let's have a commandline option thrugh which we\u000acan instruct pySim-shell to skip any initialization and to give us\u000aa prompt immediately, so that we can enter custom APDUs\u000a\u000aRelated: OS#6367\u000aChange-Id: I1d8a57de201fe7ad7cbcbc6f72969ea8521e821d\u000a",
        "date" : "2024-11-04 14:54:33 +0100",
        "id" : "ec30022b1a6e5f3a87822eba2e6616a792130707",
        "msg" : "pySim-shell: add new commandline option \"--skip-card-init\"",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/app.py"
          },
          {
            "editType" : "edit",
            "file" : "tests/pySim-shell_test/utils.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tests/pySim-shell_test/utils.py"
        ],
        "commitId" : "30c59fce42714ac122bfa003d87f30c4908e641c",
        "timestamp" : 1730728876000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "pySim-shell_test/utils: treat cmd2 error \"not a recognized command... as exception\u000a\u000aWhen a pySim-shell command is not recognized, cmd2 prints \"xyz is not a\u000arecognized command, alias, or macro.\" This string is a normal print out\u000aand not an exception, but during tests, it may point out a severe problem\u000aand therefore it should be tread like an exception.\u000a\u000aRelated: OS#6367\u000aChange-Id: I17be6af1547b31170622e17b9cfb9c492597670d\u000a",
        "date" : "2024-11-04 15:01:16 +0100",
        "id" : "30c59fce42714ac122bfa003d87f30c4908e641c",
        "msg" : "pySim-shell_test/utils: treat cmd2 error \"not a recognized command... as",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "tests/pySim-shell_test/utils.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "docs/osmo-smdpp.rst"
        ],
        "commitId" : "b845aab4733f6f89a6e396dca125dac6aa7a39e5",
        "timestamp" : 1731923330000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "docs/osmo-smdpp: fix markup\u000a\u000aChange-Id: I4a0ed6fb2eedf1892835c43d304a53c995f028c8\u000a",
        "date" : "2024-11-18 10:48:50 +0100",
        "id" : "b845aab4733f6f89a6e396dca125dac6aa7a39e5",
        "msg" : "docs/osmo-smdpp: fix markup",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "docs/osmo-smdpp.rst"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "docs/osmo-smdpp.rst"
        ],
        "commitId" : "3ef2c40951d61d491baccef58e0ff63631a62c89",
        "timestamp" : 1731923342000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "docs/osmo-smdpp: fix typo\u000a\u000aChange-Id: I9978c5e02c1affe95a3b72d63e88965d7af5303e\u000a",
        "date" : "2024-11-18 10:49:02 +0100",
        "id" : "3ef2c40951d61d491baccef58e0ff63631a62c89",
        "msg" : "docs/osmo-smdpp: fix typo",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "docs/osmo-smdpp.rst"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "docs/legacy.rst"
        ],
        "commitId" : "4aaccf8751be15e4969bea1f680993cc1f1e4933",
        "timestamp" : 1731923360000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "docs/legacy: remove unused '::' paragraph.\u000a\u000aChange-Id: If51564665d3793d9108053ffeb97d81ae93ced51\u000a",
        "date" : "2024-11-18 10:49:20 +0100",
        "id" : "4aaccf8751be15e4969bea1f680993cc1f1e4933",
        "msg" : "docs/legacy: remove unused '::' paragraph.",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "docs/legacy.rst"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "docs/osmo-smdpp.rst"
        ],
        "commitId" : "90881a2fff739e1d6ade9924730d8eff93026f39",
        "timestamp" : 1731923365000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "docs/osmo-smdpp: restructure subsection \"osmo-smdpp\"\u000a\u000aSphinx is complaining about a duplicate label \"osmo-smdpp\". Apparantly\u000abecause we use this label twices as section headline. The subsection\u000a\"osmo-smdpp\" in \"Running osmo-smdpp\" talks about the commandline and the\u000asupplementary files that osmo-smdpp needs to run. Let's split the two\u000atopics into two different sections.\u000a\u000aChange-Id: I8bc4979160a00d36a03b9cd10679562a08c2c55c\u000a",
        "date" : "2024-11-18 10:49:25 +0100",
        "id" : "90881a2fff739e1d6ade9924730d8eff93026f39",
        "msg" : "docs/osmo-smdpp: restructure subsection \"osmo-smdpp\"",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "docs/osmo-smdpp.rst"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/global_platform/scp.py"
        ],
        "commitId" : "f951c56449bdf49152bca7cf4b8ca6c21637ea16",
        "timestamp" : 1732010148000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "global_platform/scp: refactor _wrap_cmd_apdu\u000a\u000aThe _wrap_cmd_apdu methods for SCP02 and SCP03 are a bit hard to read. Let's\u000arefactor them so that it is easier to understand what happens. In particular\u000athat one can not have encryption (cenc) without signing (cmac)\u000a\u000aRelated: OS#6367\u000aChange-Id: I4c5650337779a4bd1f98673650c6c3cb526d518b\u000a",
        "date" : "2024-11-19 09:55:48 +0000",
        "id" : "f951c56449bdf49152bca7cf4b8ca6c21637ea16",
        "msg" : "global_platform/scp: refactor _wrap_cmd_apdu",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/global_platform/scp.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/transport/__init__.py",
          "tests/pySim-shell_test/apdu/test_apdu.script",
          "pySim/utils.py",
          "tests/pySim-shell_test/apdu/test_apdu_legacy_scp02.template",
          "tests/unittests/test_globalplatform.py",
          "tests/unittests/test_utils.py",
          "tests/pySim-shell_test/apdu/test_apdu_scp02.template",
          "pySim/transport/calypso.py",
          "pySim-read.py",
          "pySim/euicc.py",
          "pySim/transport/modem_atcmd.py",
          "pySim/transport/serial.py",
          "pySim/commands.py",
          "tests/pySim-shell_test/apdu/test_apdu_legacy_scp03.template",
          "pySim/global_platform/__init__.py",
          "pySim/transport/pcsc.py",
          "tests/pySim-shell_test/apdu/test.py",
          "tests/pySim-shell_test/config.yaml",
          "tests/pySim-shell_test/lchan/test.ok",
          "pySim-trace.py",
          "tests/pySim-shell_test/apdu/__init__.py",
          "pySim/global_platform/scp.py",
          "tests/pySim-shell_test/apdu/test_apdu_scp03.template",
          "tests/pySim-shell_test/apdu/test_apdu_legacy.script",
          "pySim-shell.py"
        ],
        "commitId" : "852eff54df65b076c4db11a2220cff678ab416f8",
        "timestamp" : 1732010186000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "pySim/transport add support for T=1 protocol and fix APDU/TPDU layer conflicts\u000a\u000aETSI TS 102 221, section 7.3 specifies that UICCs (and eUICCs) may support two\u000adifferent transport protocols: T=0 or T=1 or both. The spec also says that the\u000aterminal must support both protocols.\u000a\u000aThis patch adds the necessary functionality to support the T=1 protocol\u000aalongside the T=0 protocol. However, this also means that we have to sharpen\u000athe lines between APDUs and TPDUs.\u000a\u000aAs this patch also touches the low level interface to readers it was also\u000amanually tested with a classic serial reader. Calypso and AT command readers\u000awere not tested.\u000a\u000aChange-Id: I8b56d7804a2b4c392f43f8540e0b6e70001a8970\u000aRelated: OS#6367\u000a",
        "date" : "2024-11-19 10:56:26 +0100",
        "id" : "852eff54df65b076c4db11a2220cff678ab416f8",
        "msg" : "pySim/transport add support for T=1 protocol and fix APDU/TPDU layer",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/global_platform/scp.py"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/apdu/test_apdu_legacy_scp03.template"
          },
          {
            "editType" : "edit",
            "file" : "tests/unittests/test_globalplatform.py"
          },
          {
            "editType" : "edit",
            "file" : "tests/pySim-shell_test/config.yaml"
          },
          {
            "editType" : "edit",
            "file" : "tests/pySim-shell_test/lchan/test.ok"
          },
          {
            "editType" : "edit",
            "file" : "pySim/utils.py"
          },
          {
            "editType" : "edit",
            "file" : "tests/unittests/test_utils.py"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/apdu/test.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/__init__.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/modem_atcmd.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/calypso.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/euicc.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/pcsc.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/apdu/test_apdu_scp02.template"
          },
          {
            "editType" : "edit",
            "file" : "pySim/global_platform/__init__.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim-trace.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/commands.py"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/apdu/test_apdu_legacy_scp02.template"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/apdu/test_apdu_scp03.template"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/apdu/__init__.py"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/apdu/test_apdu_legacy.script"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/serial.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim-read.py"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/apdu/test_apdu.script"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tests/pySim-shell_test/card_init/test.py",
          "tests/pySim-shell_test/card_init/__init__.py",
          "tests/pySim-shell_test/card_init/test_card_init.script"
        ],
        "commitId" : "385d4407da37ae2ebc0022478f2b988004d0db48",
        "timestamp" : 1732010186000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "pySim-shell_test: add new testcase for card initialization\u000a\u000aThe card initialization normally takes place automatically. Nearly all\u000atestcases implicitly cover this code-path. However, it is also possible\u000ato skip the card initialization and do it at some later point. This is\u000acommonly the case for unprovisioned card that require some custom APDUs\u000ain a basic initialization step. When this step is done one would use\u000athe \"equip\" command to level up to the full featured mode. This patch\u000aadds a testcase for this scenario\u000a\u000aRelated: OS#6367\u000aChange-Id: I01a03fa07d8c62164453bd707c5943288ff1a972\u000a",
        "date" : "2024-11-19 10:56:26 +0100",
        "id" : "385d4407da37ae2ebc0022478f2b988004d0db48",
        "msg" : "pySim-shell_test: add new testcase for card initialization",
        "paths" : [
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/card_init/test_card_init.script"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/card_init/__init__.py"
          },
          {
            "editType" : "add",
            "file" : "tests/pySim-shell_test/card_init/test.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "docs/remote-access.rst",
          "docs/shell.rst"
        ],
        "commitId" : "de8cc322f1734497dd7fa34421219e486adb13b9",
        "timestamp" : 1732010186000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "docs: add topic about remote UICC/eUICC access\u000a\u000aWith osmo-remsim and Android APDU proxy we have two powerful solutions to\u000aallow remote acces to UICC/eUICC cards. Let's add a section where we give\u000aa brief overview about those solutions, so that pySim-shell users get\u000aawre of them.\u000a\u000aRelated: OS#6367\u000aChange-Id: I73de4de2e5d4a01d6d91989ee684cbdb680de8ef\u000a",
        "date" : "2024-11-19 10:56:26 +0100",
        "id" : "de8cc322f1734497dd7fa34421219e486adb13b9",
        "msg" : "docs: add topic about remote UICC/eUICC access",
        "paths" : [
          {
            "editType" : "add",
            "file" : "docs/remote-access.rst"
          },
          {
            "editType" : "edit",
            "file" : "docs/shell.rst"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "599845394ed48f8101bb25bf1c99ec5945049256",
        "timestamp" : 1732287685000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "esim.saip: Fix parsing/generating fillPattern + repeatPattern\u000a\u000aSo far we only thought of default filling coming from a template.\u000aHowever, filling can happen from the Fcp, and we need to properly parse\u000aand [re-]encode that information.\u000a\u000aChange-Id: Iff339cbe841112a01c9c617f43b0e69df2521b51\u000aRelated: OS#6643\u000a",
        "date" : "2024-11-22 16:01:25 +0100",
        "id" : "599845394ed48f8101bb25bf1c99ec5945049256",
        "msg" : "esim.saip: Fix parsing/generating fillPattern + repeatPattern",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "118624d256f914553dae307e1ca760d3c5758687",
        "timestamp" : 1732287718000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.esim.saip: Treat \"Readable and Updateable when deactivated\" flag\u000a\u000aThere's a second flag hidden in the TS 102 222 \"Special File\u000aInformation\"; let's parse + re-encode it properly.\u000a\u000aChange-Id: I7644d265f746c662b64f7156b3be08a01e3a97aa\u000aRelated: OS#6643\u000a",
        "date" : "2024-11-22 16:01:58 +0100",
        "id" : "118624d256f914553dae307e1ca760d3c5758687",
        "msg" : "pySim.esim.saip: Treat \"Readable and Updateable when deactivated\" flag",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "6046102cbbc22d33dbaa29572a4d2d084013ebb9",
        "timestamp" : 1732287718000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "esim.saip: Compute number of records from efFileSize and record_len\u000a\u000aIf we know the efFileSize and record_len, but Fcp doesn't contain\u000athe number of records, we can simply compute it.\u000a\u000aChange-Id: I0cc8e7241e37ee23df00c2622422904e7ccdca77\u000a",
        "date" : "2024-11-22 16:01:58 +0100",
        "id" : "6046102cbbc22d33dbaa29572a4d2d084013ebb9",
        "msg" : "esim.saip: Compute number of records from efFileSize and record_len",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_102_222.py",
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "779092b0cd46b493faa6a40d2ecfb9d1df659750",
        "timestamp" : 1732287838000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "esim.saip: Fix computation of file content\u000a\u000aWhen generating the file content (body), we need to proceed in the\u000afollowing order:\u000a\u000a1a) If FCP contains fillPattern/repeatPattern, compute file content from those\u000a\u000a1b) If FCP doesn't contain fillPattern/repeatPattern but template\u000a    exists, compute file content from template\u000a\u000a2)  Apply any fillFileConten / fillFileOffset from the SAIP File on top\u000a    of the above\u000a\u000aChange-Id: I822bb5fbec11a3be35910a496af7168458fd949c\u000aCloses: OS#6642\u000a",
        "date" : "2024-11-22 16:03:58 +0100",
        "id" : "779092b0cd46b493faa6a40d2ecfb9d1df659750",
        "msg" : "esim.saip: Fix computation of file content",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_102_222.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "93237f4407fc80e63ec1f6fafbfe374028a1b777",
        "timestamp" : 1732291166000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "[cosmetic] esim.saip: Fix various typos in comments/docs/messages\u000a\u000aChange-Id: I4fc603634a0f2b53e432a77f05e811a38ba065c2\u000a",
        "date" : "2024-11-22 16:59:26 +0100",
        "id" : "93237f4407fc80e63ec1f6fafbfe374028a1b777",
        "msg" : "[cosmetic] esim.saip: Fix various typos in comments/docs/messages",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/bsp.py",
          "pySim/esim/x509_cert.py",
          "pySim/esim/http_json_api.py",
          "pySim/esim/saip/personalization.py"
        ],
        "commitId" : "5354fc22d0ff03672727916587836fa007c15aee",
        "timestamp" : 1732291470000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "[cosmetic] esim: Fix various typos in comments/messages/docs\u000a\u000aChange-Id: I806c7a37951e72027ab9346169a3f8fe241f2c46\u000a",
        "date" : "2024-11-22 17:04:30 +0100",
        "id" : "5354fc22d0ff03672727916587836fa007c15aee",
        "msg" : "[cosmetic] esim: Fix various typos in comments/messages/docs",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/x509_cert.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/esim/http_json_api.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/personalization.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/esim/bsp.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "34423337608c56db3c83cda0b0c372e38aa1c01e",
        "timestamp" : 1732304964000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "esim.saip: New methods for inserting ProfileElement into sequence\u000a\u000aProfileElements.insert_after_pe() is a convenience method to insert\u000aa new PE after an existing one in the sequence.  This is a frequent\u000atask as there are strict ordering requirements in the SAIP format.\u000a\u000aChange-Id: I4424926127b4867931c2157e9340bacd2682ff0c\u000a",
        "date" : "2024-11-22 20:49:24 +0100",
        "id" : "34423337608c56db3c83cda0b0c372e38aa1c01e",
        "msg" : "esim.saip: New methods for inserting ProfileElement into sequence",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "0516e4c47ae07ad35dfad5eb5aed1fd26f43602b",
        "timestamp" : 1732305418000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "esim.saip.File: Re-compute file_size when changing body\u000a\u000aIf the API user modifies the size of the body, we need to check if we\u000aneed to re-compute the file_size attribute which is later encoded into\u000athe fileDescriptor.  The size obviously must be large enough to fit the\u000abody.  Let's do this implicitly by introducing a setter for File.body\u000a\u000aChange-Id: I1a908504b845b7c90f31294faf2a6e988bdd8049\u000a",
        "date" : "2024-11-22 20:56:58 +0100",
        "id" : "0516e4c47ae07ad35dfad5eb5aed1fd26f43602b",
        "msg" : "esim.saip.File: Re-compute file_size when changing body",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "0f1ffd20efe9a3b34ed5288bd725ec83beeac555",
        "timestamp" : 1732305559000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "esim.saip.File: Proper ARR conversion of template (into) to file (bytes)\u000a\u000aThe encoding of the access rule reference is different in FileTemplate\u000avs File, let's make sure we properly convert it when instantiating a\u000aFile from a FileTemplate.\u000a\u000aChange-Id: Ibb8afb85cc0006bc5c59230ebf28b2c0c1a8a8ed\u000a",
        "date" : "2024-11-22 20:59:19 +0100",
        "id" : "0f1ffd20efe9a3b34ed5288bd725ec83beeac555",
        "msg" : "esim.saip.File: Proper ARR conversion of template (into) to file (bytes)",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "9ac4ff3229edb34e9956f4da84ece64a4a5d70ba",
        "timestamp" : 1732305647000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "esim.saip.File: Suppress encoding attributes that are like template\u000a\u000aThe point of the SAIP template mechanism is to reduce the size of the\u000aencoded profile.  Therefore, our encoder in the to_fileDescriptor()\u000amethod should suppress generating attributes if their value is identical\u000ato that of the template (if any).\u000a\u000aChange-Id: I337ee6c7e882ec711bece17b7a0def9da36b0ad7\u000a",
        "date" : "2024-11-22 21:00:47 +0100",
        "id" : "9ac4ff3229edb34e9956f4da84ece64a4a5d70ba",
        "msg" : "esim.saip.File: Suppress encoding attributes that are like template",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "9d7caef810813ad4d747e71f6e85f75d5a06bfe0",
        "timestamp" : 1732305755000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "esim.saip.FsProfileElement: Add create_file() method\u000a\u000aSo far we mainly created File() instances when parsing existing\u000aprofiles.  However, sometimes we want to programmatically create Files\u000aand we should offer a convenience helper to do so, rather than asking\u000aAPI users to worry about low-level details.\u000a\u000aChange-Id: I0817819af40f3d0dc0c3d2b91039c5748dd31ee2\u000a",
        "date" : "2024-11-22 21:02:35 +0100",
        "id" : "9d7caef810813ad4d747e71f6e85f75d5a06bfe0",
        "msg" : "esim.saip.FsProfileElement: Add create_file() method",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "0bb8b44ea828de58dfb25ec6325197b3b46654d4",
        "timestamp" : 1732372992000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "esim.saip.ProfileElementUSIM: Fix IMSI decode if [only] template based\u000a\u000aIn case the fileDescriptor of EF.IMSI is purely template based and only\u000athe file content is given in the actual profile, we must pass a template\u000areference to the File() constructor before we can read the IMSI.\u000a\u000aThis fixes the following exception for some profiles:\u000a\u0009ValueError: File(ef-imsi): No fileDescriptor found in tuple, and none set by template before\u000a\u000aChange-Id: I14157a7b62ccd9b5b42de9b8060f2ebc5f91ebb3\u000a",
        "date" : "2024-11-23 15:43:12 +0100",
        "id" : "0bb8b44ea828de58dfb25ec6325197b3b46654d4",
        "msg" : "esim.saip.ProfileElementUSIM: Fix IMSI decode if [only] template based",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "docs/index.rst",
          "docs/sim-rest.rst"
        ],
        "commitId" : "d1ddb1e3520bc56428beded8a3cdaab7b6b1bdc2",
        "timestamp" : 1732562996000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "docs: Add documentation about contrib/sim-rest-{server,client}\u000a\u000aThose programs have been around since 2021 but we never had any\u000adocumentation here. Let's fix that.\u000a\u000aChange-Id: I7c471cac9500db063a0c8f5c5eb7b6861b3234ed\u000a",
        "date" : "2024-11-25 20:29:56 +0100",
        "id" : "d1ddb1e3520bc56428beded8a3cdaab7b6b1bdc2",
        "msg" : "docs: Add documentation about contrib/sim-rest-{server,client}",
        "paths" : [
          {
            "editType" : "add",
            "file" : "docs/sim-rest.rst"
          },
          {
            "editType" : "edit",
            "file" : "docs/index.rst"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "contrib/esim-qrcode-gen.py"
        ],
        "commitId" : "73c76e02ce65008522dfe0fccd27441fa1361b91",
        "timestamp" : 1732562999000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "contrib/esim-qrcode.py: Small command line tool to encode eSIM QR codes\u000a\u000aChange-Id: I7983de79937124cc258efd459c51f812f5fa79cb\u000a",
        "date" : "2024-11-25 20:29:59 +0100",
        "id" : "73c76e02ce65008522dfe0fccd27441fa1361b91",
        "msg" : "contrib/esim-qrcode.py: Small command line tool to encode eSIM QR codes",
        "paths" : [
          {
            "editType" : "add",
            "file" : "contrib/esim-qrcode-gen.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "docs/suci-keytool.rst",
          "docs/index.rst",
          "contrib/suci-keytool.py"
        ],
        "commitId" : "1be2e9b7132c529f73b23d78a9b2aba262bb17b8",
        "timestamp" : 1732562999000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "contrib/suci-keytool.py: Convenience tool for SUCI key generation\u000a\u000aThis adds a small utility program that can be used for generating\u000akeys used for SUCI in 5G SA networks, as well as for dumping them\u000ain a format that's compatible with what is needed on the USIM.\u000a\u000aChange-Id: I9e92bbba7f700e160ea9c58da5f23fa4c31d40c6\u000a",
        "date" : "2024-11-25 20:29:59 +0100",
        "id" : "1be2e9b7132c529f73b23d78a9b2aba262bb17b8",
        "msg" : "contrib/suci-keytool.py: Convenience tool for SUCI key generation",
        "paths" : [
          {
            "editType" : "add",
            "file" : "contrib/suci-keytool.py"
          },
          {
            "editType" : "add",
            "file" : "docs/suci-keytool.rst"
          },
          {
            "editType" : "edit",
            "file" : "docs/index.rst"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "contrib/es2p_client.py"
        ],
        "commitId" : "708a45bcee7154738aa8519b18833ad6b5a2fa46",
        "timestamp" : 1732562999000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "es2p_client: Print the activation code after confirmOrder success\u000a\u000aChange-Id: I92608ff0cdc35b184edff0c656221644ba36f257\u000a",
        "date" : "2024-11-25 20:29:59 +0100",
        "id" : "708a45bcee7154738aa8519b18833ad6b5a2fa46",
        "msg" : "es2p_client: Print the activation code after confirmOrder success",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "contrib/es2p_client.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "docs/shell.rst"
        ],
        "commitId" : "2debf5dc4be459ae12e173906e01ca033a5ea79c",
        "timestamp" : 1732652696000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "docs/shell: Fix documentation for eUICC ISD-R specific commands\u000a\u000aBack in January 2024 in change 7ba09f9392c8023842a7b5576936cb21ff85c6c0\u000awe migrate dthe commands from 'class ADF_ISDR' to CardApplicationISDR\u000awithout updating the sphinx-argparse references in the documentation.\u000a\u000aLet's fix that, making the syntax reference for those commands re-appear\u000ain the documentation.\u000a\u000aChange-Id: I1d7e2d1a5dfbdcc11b1fdb3e89845787f7cddbfc\u000a",
        "date" : "2024-11-26 21:24:56 +0100",
        "id" : "2debf5dc4be459ae12e173906e01ca033a5ea79c",
        "msg" : "docs/shell: Fix documentation for eUICC ISD-R specific commands",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "docs/shell.rst"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_51_011.py",
          "pySim/ts_31_102.py"
        ],
        "commitId" : "ceed99ad3c1ba511f8a07a017863653756e7275d",
        "timestamp" : 1732692153000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/jean-pierre.marcotte.1",
          "fullName" : "jean-pierre.marcotte.1"
        },
        "authorEmail" : "jean-pierre.marcotte.1@ens.etsmtl.ca",
        "comment" : "Fixing 3-digit MNC PLMN Encoding/Decoding tests expected values for EF_OPL and EF_ePDGSelection.\u000a\u000aRelated: pyosmocom.git I3811b227d629bd4e051a480c9622967e31f8a376\u000aChange-Id: Ib2b586cb570dbe74a617c45c0fca276b08bb075e\u000a",
        "date" : "2024-11-27 07:22:33 +0000",
        "id" : "ceed99ad3c1ba511f8a07a017863653756e7275d",
        "msg" : "Fixing 3-digit MNC PLMN Encoding/Decoding tests expected values for",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_51_011.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_102.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_31_102.py"
        ],
        "commitId" : "45d1b4339399d617e12a05522cb214a7bbbb8508",
        "timestamp" : 1732698471000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "ts_31_102: fix testcase for EF_ePDGSelection\u000a\u000athe testcase EF_ePDGSelection has a wrong testvector in the plmn field.\u000aThis test vector is accepted because there is a complementary error in\u000apyosmocom. However, the root problem got fixed (see depends), which means\u000athat the test vector of EF_ePDGSelection now needs to be updated.\u000a\u000aDepends: pyosmocom.git: I3811b227d629bd4e051a480c9622967e31f8a376\u000aChange-Id: I96fd4c13c8e58ef33ddf9e3124617b1b59b9b2c1\u000aRelated: OS#6598\u000a",
        "date" : "2024-11-27 10:07:51 +0100",
        "id" : "45d1b4339399d617e12a05522cb214a7bbbb8508",
        "msg" : "ts_31_102: fix testcase for EF_ePDGSelection",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_102.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-shell.py"
        ],
        "commitId" : "9f9e931378e00a3395af0cf8a4ae7f6992b15e37",
        "timestamp" : 1732714898000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "pySim-shell: reset card in method equip\u000a\u000aWhen the equip method is running, all kinds of states in pySim-shell are reset.\u000aTo be sure that the card state is also reset (normally this is the case because\u000ausually init_card is called before equip), we should send an explicit reset to\u000athe card as well.\u000a\u000aRelated: OS#6640\u000aChange-Id: I622a2df2c9184841f72abd18483bfbfd00b2f464\u000a",
        "date" : "2024-11-27 14:41:38 +0100",
        "id" : "9f9e931378e00a3395af0cf8a4ae7f6992b15e37",
        "msg" : "pySim-shell: reset card in method equip",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-shell.py",
          "pySim/runtime.py"
        ],
        "commitId" : "67c0fff15b0da7a00f5bd1cdb0eaa2a1c01359f3",
        "timestamp" : 1732714898000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "pySim-shell: change Prompt character to \"#\" after \"verify_adm\"\u000a\u000aLet's change the prompt from \">\" to \"#\" when the user gains admin\u000aprivilegs using verify_adm.\u000a\u000aRelated: OS#6640\u000aChange-Id: I957b9df7b5069b6fce5bf958c94e8ffda833c77f\u000a",
        "date" : "2024-11-27 14:41:38 +0100",
        "id" : "67c0fff15b0da7a00f5bd1cdb0eaa2a1c01359f3",
        "msg" : "pySim-shell: change Prompt character to \"#\" after \"verify_adm\"",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/runtime.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "README.md"
        ],
        "commitId" : "16920aeacd467b80e39a3dd90520de69754fc005",
        "timestamp" : 1733416414000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "README.md update / re-wording\u000a\u000aLet's give a better description of what the project is all about, and\u000adifferentiate reading/exploring any SIM from writing/updating a special\u000aprogrammable one where you know the ADM credentials.\u000a\u000aChange-Id: Ied2a9626594e9735d92d4eabe6c6b90f92aa2909\u000a",
        "date" : "2024-12-05 16:33:34 +0000",
        "id" : "16920aeacd467b80e39a3dd90520de69754fc005",
        "msg" : "README.md update / re-wording",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "README.md"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ara_m.py"
        ],
        "commitId" : "8711bd89b0a3230375c1e77e044bf2772fb02bf6",
        "timestamp" : 1733502820000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "ara_m: fix spec reference.\u000a\u000athere are multiple references to a specification \"SEID\". As it seems this is\u000aa reference to the GlobalPlatform \"Secure Element Access Control\" spec, which\u000ahas the document reference \"GPD_SPE_013\". Let's use \"GPD_SPE_013\" to referene\u000athe spec.\u000a\u000aRelated: SYS#6681\u000aChange-Id: I77895f1b84126563380ce89aa07a3b448d8784a3\u000a",
        "date" : "2024-12-06 17:33:40 +0100",
        "id" : "8711bd89b0a3230375c1e77e044bf2772fb02bf6",
        "msg" : "ara_m: fix spec reference.",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ara_m.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tests/pySim-shell_test/ara_m/adf_ara-m.script.ok",
          "tests/pySim-shell_test/ara_m/test.script",
          "pySim/ara_m.py",
          "tests/pySim-shell_test/ara_m/adf_ara-m.cfg.ok"
        ],
        "commitId" : "25319c5184dcabe31a57685e487a541300ebca41",
        "timestamp" : 1733911904000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "ara_m fix export of AID-REF-DO (empty)\u000a\u000aGPD_SPE_013 Table 6-3 defines two types of AID-REF-DO objects (both\u000aare fully independed TLV IEs with the same name). The version with\u000atag '4F' identifies an SE application. It may contain an AID prefix\u000aor even be of length 0 in case the rule should apply to all SE\u000aapplications. Then there is the version with tag 'C0', which must\u000aalways have length 0 and serves a flag to apply the rule to the\u000aimplicitly selected SE application. Technically both are completely\u000adifferent things, so we must also treat them separately in the\u000apySim-shell code.\u000a\u000aRelated: OS#6681\u000aChange-Id: I771d5e860b12215280e3d0a8c314ce843fe0d6a2\u000a",
        "date" : "2024-12-11 11:11:44 +0100",
        "id" : "25319c5184dcabe31a57685e487a541300ebca41",
        "msg" : "ara_m fix export of AID-REF-DO (empty)",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ara_m.py"
          },
          {
            "editType" : "edit",
            "file" : "tests/pySim-shell_test/ara_m/adf_ara-m.script.ok"
          },
          {
            "editType" : "edit",
            "file" : "tests/pySim-shell_test/ara_m/test.script"
          },
          {
            "editType" : "edit",
            "file" : "tests/pySim-shell_test/ara_m/adf_ara-m.cfg.ok"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/javacard.py"
        ],
        "commitId" : "9df5e2f17152d17594560e9b9b0754d36cfeb2e3",
        "timestamp" : 1734627906000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "javacard, cosmetic: fix sourcecode fromatting and improve docstring\u000a\u000aThe line with TAGS is longer than 120 columns and there is some\u000acomment that should be moved to the python docstring.\u000a\u000aRelated: OS#6679\u000aChange-Id: I1d02098320cfbe17a0eb1bfdcf3bc85034cc8e20\u000a",
        "date" : "2024-12-19 18:05:06 +0100",
        "id" : "9df5e2f17152d17594560e9b9b0754d36cfeb2e3",
        "msg" : "javacard, cosmetic: fix sourcecode fromatting and improve docstring",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/javacard.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/global_platform/__init__.py"
        ],
        "commitId" : "6287db48552634117f1560ad110cac2a4898019e",
        "timestamp" : 1734628134000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "global_platform: remove unused code\u000a\u000aThis commented out part is not needed anymore.\u000a\u000aRelated: OS#6679\u000aChange-Id: If1de0218f841159789ac86f6a13740c1cbd0a57a\u000a",
        "date" : "2024-12-19 18:08:54 +0100",
        "id" : "6287db48552634117f1560ad110cac2a4898019e",
        "msg" : "global_platform: remove unused code",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/global_platform/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/global_platform/__init__.py"
        ],
        "commitId" : "2a833b480a644a33a3a322dd5a87a22f4ff2f828",
        "timestamp" : 1734629218000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "global_platform: fix command \"delete\"\u000a\u000aThe delete command formats a TPDU, not APDU, which leads to warning messages\u000a\u000aRelated: OS#6679\u000aChange-Id: Id04c89acbd4f449cb974d3cb05024f11dba4684e\u000a",
        "date" : "2024-12-19 18:26:58 +0100",
        "id" : "2a833b480a644a33a3a322dd5a87a22f4ff2f828",
        "msg" : "global_platform: fix command \"delete\"",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/global_platform/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/global_platform/__init__.py"
        ],
        "commitId" : "6d2e3853b4120cbb0f8589cd0a84c399b28fcd38",
        "timestamp" : 1734706457000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "global_platform: add spec reference to help of --install-parameters\u000a\u000aRelated: OS#6679\u000aChange-Id: I7e8174d469e09ad130d2866663a65bdeb4afc35a\u000a",
        "date" : "2024-12-20 15:54:17 +0100",
        "id" : "6d2e3853b4120cbb0f8589cd0a84c399b28fcd38",
        "msg" : "global_platform: add spec reference to help of --install-parameters",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/global_platform/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tests/unittests/test_javacard.py",
          "tests/unittests/test_javacard.cap",
          "pySim/javacard.py"
        ],
        "commitId" : "712946eddb9eedce30b44276d7bd75f40c9a69b9",
        "timestamp" : 1736159114000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "javacard: add parser for JAVA-card CAP file format\u000a\u000aTo install JAVA-card applets we need to be able to extract the executeable\u000aloadfile and the AIDs of the applet and the loadfile. This patch adds the\u000aparser and related unittests.\u000a\u000aRelated: OS#6679\u000aChange-Id: I581483ccb9d8a254fcecc995fec3c811c5cf38eb\u000a",
        "date" : "2025-01-06 11:25:14 +0100",
        "id" : "712946eddb9eedce30b44276d7bd75f40c9a69b9",
        "msg" : "javacard: add parser for JAVA-card CAP file format",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/javacard.py"
          },
          {
            "editType" : "add",
            "file" : "tests/unittests/test_javacard.py"
          },
          {
            "editType" : "add",
            "file" : "tests/unittests/test_javacard.cap"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/cards.py"
        ],
        "commitId" : "14d6e68ff796320a76bcf5a66559891c0b8202be",
        "timestamp" : 1736688710000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "cards: Avoid exception seen with (some) GSM-R SIM cards\u000a\u000aSome old cards are classic SIM and not based on UICCs.  Such cards\u000ado not offer the capability of selecting applications.  Let's avoid\u000arunning into an exception by providing dummy methods that simply fail\u000afor each AID selection.\u000a\u000aChange-Id: Ib3457496380c0c5096052ad7799970ee620dee33\u000aCloses: OS#6691\u000a",
        "date" : "2025-01-12 14:31:50 +0100",
        "id" : "14d6e68ff796320a76bcf5a66559891c0b8202be",
        "msg" : "cards: Avoid exception seen with (some) GSM-R SIM cards",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/cards.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/global_platform/scp.py",
          "pySim/global_platform/__init__.py"
        ],
        "commitId" : "f688d28107aadf24b18694df96307457816db142",
        "timestamp" : 1736949766000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "global_platform: fix usage of the Key Version Number (kvn)\u000a\u000aThe kvn parameter is used to select a keyset when establishin a secure channel.\u000aAt the moment this is a mandatory parameter and it must be within a certain\u000arange.\u000a\u000aHowever GPC_SPE_034 explicitly defines a reserved kvn value 0, that always\u000arefers to the first available key. That effectively makes it an optional\u000aparameter and the commandline interface should have the --key-ver parameter\u000aas an optional parameter.\u000a\u000aThe ranges also have to be extended to allow 0 as kvn value. We also have to\u000aput a range to support the sysmoUSIM-SJS1, which uses kvn value 1, which is\u000aa non standard value.\u000a\u000aRelated: OS#6679\u000aChange-Id: I42be2438c7f199b238f2ec7a9434cec5393210a7\u000a",
        "date" : "2025-01-15 15:02:46 +0100",
        "id" : "f688d28107aadf24b18694df96307457816db142",
        "msg" : "global_platform: fix usage of the Key Version Number (kvn)",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/global_platform/scp.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/global_platform/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "setup.py",
          "requirements.txt",
          "pySim/global_platform/__init__.py",
          "docs/shell.rst"
        ],
        "commitId" : "a0071b32ffac2239d6a653e85afb813092aedb88",
        "timestamp" : 1737556929000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "global_platform: LOAD and INSTALL [for load] support\u000a\u000aIn this patch we add the commands \"install_for_load\" and \"load\".\u000a\u000aDepends: pyosmocom.git I86df064fa41db85923eeb0d83cc399504fdd4488\u000aChange-Id: I924aaeecbb3a72bdb65eefbff6135e4e9570579e\u000aRelated: OS#6679\u000a",
        "date" : "2025-01-22 15:42:09 +0100",
        "id" : "a0071b32ffac2239d6a653e85afb813092aedb88",
        "msg" : "global_platform: LOAD and INSTALL [for load] support",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "docs/shell.rst"
          },
          {
            "editType" : "edit",
            "file" : "requirements.txt"
          },
          {
            "editType" : "edit",
            "file" : "pySim/global_platform/__init__.py"
          },
          {
            "editType" : "edit",
            "file" : "setup.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/global_platform/__init__.py",
          "tests/unittests/test_globalplatform.py",
          "docs/cap-tutorial.rst",
          "docs/shell.rst",
          "pySim/global_platform/install_param.py"
        ],
        "commitId" : "15140aae444378b55fb683d4477162bbef79ff43",
        "timestamp" : 1737560792000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "global_platform: add new command \"install_cap\"\u000a\u000aInstalling JAVA-card applets from a CAP file is a multi step process, which is\u000adifficult when done manually. Fortunately it is easy to automate the process,\u000aso let's add a dedicated command for that.\u000a\u000aChange-Id: I6cbd37f0fad5579b20e83c27349bd5acc129e6d0\u000aRelated: OS#6679\u000a",
        "date" : "2025-01-22 16:46:32 +0100",
        "id" : "15140aae444378b55fb683d4477162bbef79ff43",
        "msg" : "global_platform: add new command \"install_cap\"",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "docs/shell.rst"
          },
          {
            "editType" : "edit",
            "file" : "pySim/global_platform/__init__.py"
          },
          {
            "editType" : "add",
            "file" : "pySim/global_platform/install_param.py"
          },
          {
            "editType" : "edit",
            "file" : "tests/unittests/test_globalplatform.py"
          },
          {
            "editType" : "add",
            "file" : "docs/cap-tutorial.rst"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/legacy/cards.py",
          "pySim/sysmocom_sja2.py"
        ],
        "commitId" : "d871e4696f70e747bc4a6a04f35fd0b0141ceb5b",
        "timestamp" : 1738146414000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "ATR: use lowercase hex strings without spaces as ATR constants\u000a\u000aThe ATR constants are the only hex string constants where the hex\u000abytes digits are separated with spaces. Also the hex digits are in\u000alowercase. Let's use a lowercase string without spaces here like\u000awe do in many other code locations.\u000a\u000aRelated: OS#6322\u000aChange-Id: I95118115b02523ed262a2fbe4369ace3996cd8f5\u000a",
        "date" : "2025-01-29 11:26:54 +0100",
        "id" : "d871e4696f70e747bc4a6a04f35fd0b0141ceb5b",
        "msg" : "ATR: use lowercase hex strings without spaces as ATR constants",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/legacy/cards.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/sysmocom_sja2.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/legacy/cards.py",
          "pySim-shell.py",
          "pySim/transport/pcsc.py",
          "pySim/transport/serial.py",
          "pySim/filesystem.py",
          "pySim/runtime.py"
        ],
        "commitId" : "08ba187fd446db422a2bebbd4a9b2564096cace2",
        "timestamp" : 1738152053000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "ATR: align get_atr() return value type\u000a\u000atype annotations claimed the return type was Hexstr, but in reality\u000ait was a list of integers.  Let's fix that.\u000a\u000aChange-Id: I01b247dad40ec986cf199302f8e92d16848bd499\u000aCloses: OS#6322\u000a",
        "date" : "2025-01-29 13:00:53 +0100",
        "id" : "08ba187fd446db422a2bebbd4a9b2564096cace2",
        "msg" : "ATR: align get_atr() return value type",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/legacy/cards.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/serial.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/filesystem.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/pcsc.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/runtime.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/transport/calypso.py",
          "pySim/transport/modem_atcmd.py",
          "pySim/transport/__init__.py"
        ],
        "commitId" : "edcd62435d0777ad798e44b4613eff8332030d14",
        "timestamp" : 1738154144000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "pySim/transport: add abstract get_atr method to LinkBase\u000a\u000aThe implementations that inheret from the LinkBase class are expected to\u000aimplement a get_atr method. This method is mandatory, since it is one of\u000athe most basic functionalities of pySim to display an ATR. Also the ATR\u000ais sometimes needed to distinguish between different card models.\u000a\u000aThe modem_atcmd and calypso implementation completely lack the get_atr\u000amethod. Apparantly it is not possible to get an ATR in those\u000aenvironments, so lets add a dummy method there.\u000a\u000aRelated: OS#6322\u000aChange-Id: I4fc020ca45658af78e495a5c1b985213f83cbb50\u000a",
        "date" : "2025-01-29 13:35:44 +0100",
        "id" : "edcd62435d0777ad798e44b4613eff8332030d14",
        "msg" : "pySim/transport: add abstract get_atr method to LinkBase",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/transport/modem_atcmd.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/__init__.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/calypso.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          ".gitignore"
        ],
        "commitId" : "8a61498ba6b0a497be82a33f5b26482f5b3159f9",
        "timestamp" : 1738976384000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/nhofmeyr",
          "fullName" : "nhofmeyr"
        },
        "authorEmail" : "nhofmeyr@sysmocom.de",
        "comment" : ".gitignore: dist subdir, may be created by pip\u000a\u000aChange-Id: Ib23a687845842bd25d83f87aa00ae0c278abc842\u000a",
        "date" : "2025-02-08 01:59:44 +0100",
        "id" : "8a61498ba6b0a497be82a33f5b26482f5b3159f9",
        "msg" : ".gitignore: dist subdir, may be created by pip",
        "paths" : [
          {
            "editType" : "edit",
            "file" : ".gitignore"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "setup.py"
        ],
        "commitId" : "30e40ae520d9c133448541aa93d3c51d675d4a7e",
        "timestamp" : 1738976538000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/nhofmeyr",
          "fullName" : "nhofmeyr"
        },
        "authorEmail" : "nhofmeyr@sysmocom.de",
        "comment" : "setup.py: install esim.asn1 resources, install esim.saip\u000a\u000aThese changes are necessary to successfully run\u000a./tests/unittests/test_esim_saip.py with a pySim installed via\u000a'pip install'.\u000a\u000aFor example:\u000a\u000a   virtualenv venv\u000a   source venv/bin/activate\u000a   git clone ssh://gerrit.osmocom.org:29418/pysim\u000a   pip install pysim/\u000a   cd pysim\u000a   ./tests/unittests/test_esim_saip.py\u000a\u000aBefore this patch, that would result first in package pySim.esim.saip\u000abeing unknown (not installed at all), and when that is added to\u000asetup.py, in this error:\u000a\u000a\u0009Traceback (most recent call last):\u000a\u0009  File \"/home/moi/osmo-dev/src/pysim/tests/unittests/./test_esim_saip.py\", line 23, in <module>\u000a\u0009    from pySim.esim.saip import *\u000a\u0009  File \"/home/moi/s/esim/sysmo_esim_mgr/venv/lib/python3.13/site-packages/pySim/esim/saip/__init__.py\", line 41, in <module>\u000a\u0009    asn1 = compile_asn1_subdir('saip')\u000a\u0009  File \"/home/moi/s/esim/sysmo_esim_mgr/venv/lib/python3.13/site-packages/pySim/esim/__init__.py\", line 56, in compile_asn1_subdir\u000a\u0009    for i in resources.files('pySim.esim').joinpath('asn1').joinpath(subdir_name).iterdir():\u000a\u0009\u0009     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^\u000a\u0009  File \"/usr/lib/python3.13/pathlib/_local.py\", line 577, in iterdir\u000a\u0009    with os.scandir(root_dir) as scandir_it:\u000a\u0009\u0009 ~~~~~~~~~~^^^^^^^^^^\u000a\u0009FileNotFoundError: [Errno 2] No such file or directory: '/home/moi/s/esim/sysmo_esim_mgr/venv/lib/python3.13/site-packages/pySim/esim/asn1/saip'\u000a\u000aAfter this patch, the test completes successfully.\u000a\u000a\u0009......\u000a\u0009----------------------------------------------------------------------\u000a\u0009Ran 6 tests in 0.067s\u000a\u000a\u0009OK\u000a\u000aRelated: sysmocom's eSIM manager product that is currently in\u000adevelopment needs to fully use pySim.esim.saip, ideally from a regular\u000a'pip install', and not from using the pySim source tree directly.\u000a\u000aRelated: SYS#6768\u000aChange-Id: I0d7d6962a308eccca589a42c22546d508ff686f5\u000a",
        "date" : "2025-02-08 02:02:18 +0100",
        "id" : "30e40ae520d9c133448541aa93d3c51d675d4a7e",
        "msg" : "setup.py: install esim.asn1 resources, install esim.saip",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "setup.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/euicc.py",
          "docs/shell.rst"
        ],
        "commitId" : "de91b0dc976e9de131974e014ce309a359c5d5b3",
        "timestamp" : 1739532761000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "euicc: Add euicc_memory_reset shell command\u000a\u000aThis implements the ES10c eUICC Memory Reset procedure\u000a\u000aChange-Id: Ib462f5b7de3e500e51c0f3d6e2b9b0c2d3ba7e20\u000a",
        "date" : "2025-02-14 12:32:41 +0100",
        "id" : "de91b0dc976e9de131974e014ce309a359c5d5b3",
        "msg" : "euicc: Add euicc_memory_reset shell command",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "docs/shell.rst"
          },
          {
            "editType" : "edit",
            "file" : "pySim/euicc.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim-shell.py"
        ],
        "commitId" : "c4a6b8b3e794dce6dd6b79b9fdbc76d93a48c122",
        "timestamp" : 1740491749000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "pySim-shell: obey quit command in startup commands+scripts\u000a\u000aStartup scripts are executed using the cmd2 provided onecmd_plus_hooks\u000amethod. This method can run arbitrary commands, which also includes\u000athe command \"run_scrit\" that we use to execute startup scripts.\u000a\u000aWhen a script executes a quit command, or when someone issues a quit\u000acommand using the --execute-command or the command argument, then\u000athis commands is executed. However a quit command won't actually quit\u000athe process. All it does is to change the return code of\u000aapp.onecmd_plus_hooks (see [1]). So we must evaluate the return code\u000aand take care of the quitting ourselves.\u000a\u000a[1] https://cmd2.readthedocs.io/en/0.9.15/api/cmd.html#cmd2.cmd2.Cmd.onecmd_plus_hooks\u000a\u000aRelated: OS#6731\u000aChange-Id: Ic6e9c54cdb6955d65011af3eb5a025eee5da4143\u000a",
        "date" : "2025-02-25 14:55:49 +0100",
        "id" : "c4a6b8b3e794dce6dd6b79b9fdbc76d93a48c122",
        "msg" : "pySim-shell: obey quit command in startup commands+scripts",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "docs/osmo-smdpp.rst"
        ],
        "commitId" : "80a5dd1cf6bae63b83005d0f99664dbe7a23701c",
        "timestamp" : 1740867476000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/neels",
          "fullName" : "Neels Hofmeyr"
        },
        "authorEmail" : "nhofmeyr@sysmocom.de",
        "comment" : "docs/osmo-smdpp.rst: fix typo apostrophe\u000a\u000aChange-Id: I32b18a61301fc2784675fa8acbeadb996ebcd821\u000a",
        "date" : "2025-03-01 23:17:56 +0100",
        "id" : "80a5dd1cf6bae63b83005d0f99664dbe7a23701c",
        "msg" : "docs/osmo-smdpp.rst: fix typo apostrophe",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "docs/osmo-smdpp.rst"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "docs/osmo-smdpp.rst",
          "osmo-smdpp.py"
        ],
        "commitId" : "1d962ec8c8cfe235ad1aafe6e67081bf3f86649d",
        "timestamp" : 1740867476000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/neels",
          "fullName" : "Neels Hofmeyr"
        },
        "authorEmail" : "nhofmeyr@sysmocom.de",
        "comment" : "osmo-smdpp.py: enable --host and --port cmdline args (and document)\u000a\u000aChange-Id: Ic98dac1e1e713d74c3f8052c5bbeb44445aa8ab4\u000a",
        "date" : "2025-03-01 23:17:56 +0100",
        "id" : "1d962ec8c8cfe235ad1aafe6e67081bf3f86649d",
        "msg" : "osmo-smdpp.py: enable --host and --port cmdline args (and document)",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "osmo-smdpp.py"
          },
          {
            "editType" : "edit",
            "file" : "docs/osmo-smdpp.rst"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "smdpp-data/certs/DPtls/CERT_S_SM_DP_TLS_NIST.pem"
        ],
        "commitId" : "15df7cbf884f5db55c274a0951b577ce071ec7c2",
        "timestamp" : 1740867476000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/neels",
          "fullName" : "Neels Hofmeyr"
        },
        "authorEmail" : "nhofmeyr@sysmocom.de",
        "comment" : "add PEM cert as used in docs/osmo-smdpp.rst\u000a\u000aAdd PEM version of smdpp-data/certs/DPtls/CERT_S_SM_DP_TLS_NIST.der\u000a\u000aA CERT_S_SM_DP_TLS_NIST.pem file is referenced in docs/osmo-smdpp.rst --\u000anginx apparently cannot use DER certs, so it is convenient for beginners\u000aif the example from the docs just works without having to know that:\u000a\u000aThe added file was produced using\u000a\u000a    openssl x509 -inform DER -in CERT_S_SM_DP_TLS_NIST.der -outform PEM -out CERT_S_SM_DP_TLS_NIST.pem\u000a\u000aChange-Id: I41ba6ebacb71df0eb8a248c0c3c9ccd709718d74\u000a",
        "date" : "2025-03-01 23:17:56 +0100",
        "id" : "15df7cbf884f5db55c274a0951b577ce071ec7c2",
        "msg" : "add PEM cert as used in docs/osmo-smdpp.rst",
        "paths" : [
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPtls/CERT_S_SM_DP_TLS_NIST.pem"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          ".gitignore"
        ],
        "commitId" : "9e8143723dfa63d8d4a2a1db8a59c84b7bfdf95c",
        "timestamp" : 1740867477000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/neels",
          "fullName" : "Neels Hofmeyr"
        },
        "authorEmail" : "nhofmeyr@sysmocom.de",
        "comment" : ".gitignore tags (from ctags)\u000a\u000aChange-Id: I1ae374e687b885399e0abfa39fcd750d944ae7ce\u000a",
        "date" : "2025-03-01 23:17:57 +0100",
        "id" : "9e8143723dfa63d8d4a2a1db8a59c84b7bfdf95c",
        "msg" : ".gitignore tags (from ctags)",
        "paths" : [
          {
            "editType" : "edit",
            "file" : ".gitignore"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          ".gitignore"
        ],
        "commitId" : "e91488d21fff96b5b23670aa9f6a0583807f8a57",
        "timestamp" : 1740867477000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/neels",
          "fullName" : "Neels Hofmeyr"
        },
        "authorEmail" : "nhofmeyr@sysmocom.de",
        "comment" : ".gitignore: smdpp-data/sm-dp-sessions from running osmo-smdpp.py\u000a\u000aChange-Id: I02a4ad4bc8e612e64111b16bc11c8c3d4dd41c45\u000a",
        "date" : "2025-03-01 23:17:57 +0100",
        "id" : "e91488d21fff96b5b23670aa9f6a0583807f8a57",
        "msg" : ".gitignore: smdpp-data/sm-dp-sessions from running osmo-smdpp.py",
        "paths" : [
          {
            "editType" : "edit",
            "file" : ".gitignore"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/personalization.py"
        ],
        "commitId" : "19e1330ce8856cc6e0e28aeed1da20dc0fe4efa8",
        "timestamp" : 1741379214000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/neels",
          "fullName" : "Neels Hofmeyr"
        },
        "authorEmail" : "nhofmeyr@sysmocom.de",
        "comment" : "pylint: personalization.py: fix E1135: permitted_len unsupported-membership-test\u000a\u000apre-empt this from coming up in patch\u000aI60ea8fd11fb438ec90ddb08b17b658cbb789c051:\u000a\u000aE1135: Value 'self.permitted_len' doesn't support membership test (unsupported-membership-test) pickermitted_len\u000a\u000aChange-Id: I0343f8dbbffefb4237a1cb4dd40b576f16111073\u000a",
        "date" : "2025-03-07 21:26:54 +0100",
        "id" : "19e1330ce8856cc6e0e28aeed1da20dc0fe4efa8",
        "msg" : "pylint: personalization.py: fix E1135: permitted_len",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/personalization.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ota.py"
        ],
        "commitId" : "cabb8edd53a0676902176f904e53ba7bb608f03b",
        "timestamp" : 1741379221000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/neels",
          "fullName" : "Neels Hofmeyr"
        },
        "authorEmail" : "nhofmeyr@sysmocom.de",
        "comment" : "pylint: ota.py: fix E0606 possibly-used-before-assignment\u000a\u000a************* Module pySim.ota\u000apySim/ota.py:430:24: E0606: Possibly using variable 'cpl' before assignment (possibly-used-before-assignment)\u000a\u000aChange-Id: Ibbae851e458bbe7426a788b0784d553753c1056f\u000a",
        "date" : "2025-03-07 21:27:01 +0100",
        "id" : "cabb8edd53a0676902176f904e53ba7bb608f03b",
        "msg" : "pylint: ota.py: fix E0606 possibly-used-before-assignment",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ota.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/filesystem.py"
        ],
        "commitId" : "74be2e202fd8c503eb00a870519fdf5c14b39fb7",
        "timestamp" : 1741633148000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "filesystem: do not decode short TransRecEF records\u000a\u000aA TransRecEF is based on a TransparentEF. This means that a TransRecEF\u000ais basically normal TransparentEF that holds a record oriented data\u000astructure. This also requires that the total length of the TransRecEF\u000ais a multiple of the record length of the data structure that is stored\u000ain it. When this is not the case, the last record will be cut short and\u000athe decoding will fail. We should guard against this case.\u000a\u000aRelated: OS#6598\u000aChange-Id: Ib1dc4d7ce306f1f0b080bb4b6abc36e72431d3fa\u000a",
        "date" : "2025-03-10 18:59:08 +0000",
        "id" : "74be2e202fd8c503eb00a870519fdf5c14b39fb7",
        "msg" : "filesystem: do not decode short TransRecEF records",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/filesystem.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/es8p.py"
        ],
        "commitId" : "8da8b20f58f2fedbc0412a6741b12dbb2772cada",
        "timestamp" : 1741634180000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "es8p: fix typo\u000a\u000aChange-Id: I241efe0c7ceab190b7729a6d88101501ca37652e\u000a",
        "date" : "2025-03-10 19:16:20 +0000",
        "id" : "8da8b20f58f2fedbc0412a6741b12dbb2772cada",
        "msg" : "es8p: fix typo",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/es8p.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/commands.py"
        ],
        "commitId" : "f57f6a95a5fae4246c0a65bf92ced951e803df07",
        "timestamp" : 1743149591000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim/commands: Fix envelope command APDU case after T=1 support\u000a\u000aWhen we merged I8b56d7804a2b4c392f43f8540e0b6e70001a8970 for T=1\u000asupport, the ENVELOPE C-APDU was not adjusted to reflect the correct\u000acase.  ENVELOPE expects a response and hence needs a Le byte present.\u000a\u000aThis avoids below related message when performing e.g. OTA via SMS\u000a\u000a  Warning: received unexpected response data, incorrect APDU-case (3, should be 4, missing Le field?)!\u000a\u000aChange-Id: Ice12675e02aa5438cf9f069f8fcc296c64aabc5a\u000aRelated: OS#6367\u000a",
        "date" : "2025-03-28 09:13:11 +0100",
        "id" : "f57f6a95a5fae4246c0a65bf92ced951e803df07",
        "msg" : "pySim/commands: Fix envelope command APDU case after T=1 support",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/commands.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/transport/__init__.py"
        ],
        "commitId" : "701e011e14f9353af2648f11f136127f5ff1ce12",
        "timestamp" : 1743149591000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "[cosmetic] pySim.transport: Fix spelling/typos in comment\u000a\u000aChange-Id: Ia20cc2439bf00c1b6479f36c05514945ac4faf71\u000a",
        "date" : "2025-03-28 09:13:11 +0100",
        "id" : "701e011e14f9353af2648f11f136127f5ff1ce12",
        "msg" : "[cosmetic] pySim.transport: Fix spelling/typos in comment",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/transport/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "contrib/saip-tool.py"
        ],
        "commitId" : "02a7a2139fb23c7a6beb6728fefdd21fd7034da9",
        "timestamp" : 1743168330000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "saip-tool: add function to write PE sequence\u000a\u000aTo prevent code duplication and to make the implementation simpler,\u000alet's add a function that takes care of writing the PE sequnece\u000ato an output file.\u000a\u000aChange-Id: I38733422270f5b9c18187b7f247b84bf21f9121b\u000a",
        "date" : "2025-03-28 13:25:30 +0000",
        "id" : "02a7a2139fb23c7a6beb6728fefdd21fd7034da9",
        "msg" : "saip-tool: add function to write PE sequence",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "contrib/saip-tool.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "contrib/saip-tool.py"
        ],
        "commitId" : "2b3b2c2a3be1f30bbd9fab8f5fc24675411c5e9c",
        "timestamp" : 1743168895000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "saip-tool: add option to extact profile elements to file\u000a\u000aIn some cases it may be helpful to extract a single profile element\u000afrom the sequence to a dedicated file.\u000a\u000aChange-Id: I77a80bfaf8970660a84fa61f7e08f404ffc4c2da\u000a",
        "date" : "2025-03-28 14:34:55 +0100",
        "id" : "2b3b2c2a3be1f30bbd9fab8f5fc24675411c5e9c",
        "msg" : "saip-tool: add option to extact profile elements to file",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "contrib/saip-tool.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "contrib/saip-tool.py"
        ],
        "commitId" : "dc2b9574c95c6f59f7bb2ede7c11cbc3c781399c",
        "timestamp" : 1743168940000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "saip-tool: allow removing of profile elements by type\u000a\u000aAt the moment it is only possible to remove profile elements by their identification\u000anumber. However, there may be cases where we want to remove all profile elements of\u000aa certain type at once (e.g. when removing all applications).\u000a\u000aChange-Id: I92f9f9d5b4382242963f1b3ded814a0d013c4808\u000a",
        "date" : "2025-03-28 14:35:40 +0100",
        "id" : "dc2b9574c95c6f59f7bb2ede7c11cbc3c781399c",
        "msg" : "saip-tool: allow removing of profile elements by type",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "contrib/saip-tool.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "contrib/saip-tool.py",
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "40e795a82523ab31a92965423497240f56968cc1",
        "timestamp" : 1743416844000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "saip-tool: add ProfileElement class for application PE\u000a\u000aThe application profile element has no ProfileElement class yet, so\u000alet's create a ProfileElementApplication class and move the existing\u000aextract-apps code into a method of ProfileElementApplication.\u000a\u000aChange-Id: Iaa43036d388fbf1714c53cab1fc21092c4667a21\u000a",
        "date" : "2025-03-31 12:27:24 +0200",
        "id" : "40e795a82523ab31a92965423497240f56968cc1",
        "msg" : "saip-tool: add ProfileElement class for application PE",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          },
          {
            "editType" : "edit",
            "file" : "contrib/saip-tool.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/cat.py",
          "requirements.txt",
          "pySim/sms.py",
          "docs/smpp2sim.rst",
          "docs/index.rst",
          "setup.py",
          "pySim-smpp2sim.py"
        ],
        "commitId" : "a2bfd397badd6bddff66d0a59a96e13cf4f4c9e1",
        "timestamp" : 1744136058000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim-smpp2sim.py: Simulate SMSC+CN+RAN+UE for OTA testing\u000a\u000aThe pySim-smpp2sim.py program exposes two interfaces:\u000a* SMPP server-side port, so external programs can rx/tx SMS\u000a* APDU interface towards the SIM card\u000a\u000aIt therefore emulates the SMSC, Core Network, RAND and UE parts\u000athat would normally be encountered in an OTA setup.\u000a\u000aChange-Id: Ie5bae9d823bca6f6c658bd455303f63bace2258c\u000a",
        "date" : "2025-04-08 18:14:18 +0000",
        "id" : "a2bfd397badd6bddff66d0a59a96e13cf4f4c9e1",
        "msg" : "pySim-smpp2sim.py: Simulate SMSC+CN+RAN+UE for OTA testing",
        "paths" : [
          {
            "editType" : "add",
            "file" : "pySim-smpp2sim.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/cat.py"
          },
          {
            "editType" : "edit",
            "file" : "docs/index.rst"
          },
          {
            "editType" : "edit",
            "file" : "pySim/sms.py"
          },
          {
            "editType" : "edit",
            "file" : "requirements.txt"
          },
          {
            "editType" : "add",
            "file" : "docs/smpp2sim.rst"
          },
          {
            "editType" : "edit",
            "file" : "setup.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "contrib/saip-tool_example_extract-apps.sh",
          "docs/saip-tool.rst",
          "contrib/saip-tool_example_remove-app-inst.sh",
          "contrib/saip-tool.py",
          "pySim/esim/saip/__init__.py",
          "docs/index.rst",
          "contrib/saip-tool_example_add-app.sh",
          "contrib/saip-tool_example_remove-app.sh"
        ],
        "commitId" : "1dea0f39dcf5abf15fd65bba824a7cf8fe1581d9",
        "timestamp" : 1744628484000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "saip-tool: add features to add, remove and inspect application PEs\u000a\u000aThe PE-Application object is used to provision JAVA-card applications\u000ainto an eUICC during profile installation. Let's extend the SAIP-tool\u000aso that we are able to add, remove and inspect applications.\u000a\u000aChange-Id: I41db96f2f0ccc29c1725a92215ce6b17d87b76ce\u000a",
        "date" : "2025-04-14 11:01:24 +0000",
        "id" : "1dea0f39dcf5abf15fd65bba824a7cf8fe1581d9",
        "msg" : "saip-tool: add features to add, remove and inspect application PEs",
        "paths" : [
          {
            "editType" : "add",
            "file" : "contrib/saip-tool_example_extract-apps.sh"
          },
          {
            "editType" : "edit",
            "file" : "docs/index.rst"
          },
          {
            "editType" : "add",
            "file" : "contrib/saip-tool_example_remove-app.sh"
          },
          {
            "editType" : "add",
            "file" : "contrib/saip-tool_example_add-app.sh"
          },
          {
            "editType" : "add",
            "file" : "docs/saip-tool.rst"
          },
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          },
          {
            "editType" : "add",
            "file" : "contrib/saip-tool_example_remove-app-inst.sh"
          },
          {
            "editType" : "edit",
            "file" : "contrib/saip-tool.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "docs/shell.rst",
          "pySim/ara_m.py"
        ],
        "commitId" : "59faa02f9a746471bb8457788b1d6ffb02c3275c",
        "timestamp" : 1744629276000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "ara_m: add command to lock write access to the ARA-M rules.\u000a\u000aRecent versions of the ARA-M applet from Bertrand Martel can lock\u000athe write access to ARA-M rules. Let's add a command for that and\u000asome documentation.\u000a\u000aRelated: SYS#7245\u000aChange-Id: I71581a0c9f146f9a0921093d9b53b053b4a8946c\u000a",
        "date" : "2025-04-14 11:14:36 +0000",
        "id" : "59faa02f9a746471bb8457788b1d6ffb02c3275c",
        "msg" : "ara_m: add command to lock write access to the ARA-M rules.",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ara_m.py"
          },
          {
            "editType" : "edit",
            "file" : "docs/shell.rst"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "contrib/saip-tool.py",
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "d5da431fd457244d39446ca435898aac415534a7",
        "timestamp" : 1744792515000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "saip-tool: add commandline option to edit mandatory services list\u000a\u000aChange-Id: I120b98d4b0942c26674bc1365c5711101ec95235\u000a",
        "date" : "2025-04-16 10:35:15 +0200",
        "id" : "d5da431fd457244d39446ca435898aac415534a7",
        "msg" : "saip-tool: add commandline option to edit mandatory services list",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "contrib/saip-tool.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "docs/card-key-provider.rst"
        ],
        "commitId" : "08e6336fc925215f18660f947839c99d6438a9a4",
        "timestamp" : 1745437039000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/fixeria",
          "fullName" : "Vadim Yanitskiy"
        },
        "authorEmail" : "vyanitskiy@sysmocom.de",
        "comment" : "doc/card-key-provider: fix WARNING: Title underline too short\u000a\u000aChange-Id: I29fda8350de75c4e7c0020fa4dce4cd0e5defda7\u000a",
        "date" : "2025-04-24 02:37:19 +0700",
        "id" : "08e6336fc925215f18660f947839c99d6438a9a4",
        "msg" : "doc/card-key-provider: fix WARNING: Title underline too short",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "docs/card-key-provider.rst"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/filesystem.py"
        ],
        "commitId" : "aace546900e810d25dac113e42bd428d2d09b506",
        "timestamp" : 1745437827000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/fixeria",
          "fullName" : "Vadim Yanitskiy"
        },
        "authorEmail" : "vyanitskiy@sysmocom.de",
        "comment" : "filesystem: fix WARNING: Block quote ends without a blank line\u000a\u000aUse the 'r' (raw) qualifier to avoid rendering '\\n' as the actual\u000aline break in the auto-generated documentation.\u000a\u000aChange-Id: Ie7f59685a78534eb2c43ec4bc39685d3fd264778\u000a",
        "date" : "2025-04-24 02:50:27 +0700",
        "id" : "aace546900e810d25dac113e42bd428d2d09b506",
        "msg" : "filesystem: fix WARNING: Block quote ends without a blank line",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/filesystem.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "docs/saip-tool.rst"
        ],
        "commitId" : "fbe6d02ce36c0d42fb970f6d17fc6b0e02ac375e",
        "timestamp" : 1745438730000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/fixeria",
          "fullName" : "Vadim Yanitskiy"
        },
        "authorEmail" : "vyanitskiy@sysmocom.de",
        "comment" : "docs/saip-tool: fix ERROR: Unexpected indentation\u000a\u000aAccording to [1], the literal block must be indented (and, like all\u000aparagraphs, separated from the surrounding ones by blank lines).\u000a\u000a[1] https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html#literal-blocks\u000a\u000aWhile at it, fix tabs-vs-spaces: use 2 spaces like in other places.\u000a\u000aChange-Id: If548bf66339433c1f3f9e2a557821e808c6afa26\u000a",
        "date" : "2025-04-24 03:05:30 +0700",
        "id" : "fbe6d02ce36c0d42fb970f6d17fc6b0e02ac375e",
        "msg" : "docs/saip-tool: fix ERROR: Unexpected indentation",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "docs/saip-tool.rst"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/filesystem.py"
        ],
        "commitId" : "d838a95c2a60d63d49111083591fbe6c8c179b17",
        "timestamp" : 1745502426000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "edit_{binary,record}_decoded: Support hex-decode of bytes\u000a\u000aWe've created + used osmocom.utils.JsonEncoder as an encoder class\u000afor json.{dump,dumps} for quite some time.  However, we missed to\u000ause this decoder class from the edit_{binary,record}_decoded commands\u000ain the pySim-shell VTY.\u000a\u000aChange-Id: I158e028f9920d8085cd20ea022be2437c64ad700\u000aRelated: OS#6774\u000a",
        "date" : "2025-04-24 13:47:06 +0000",
        "id" : "d838a95c2a60d63d49111083591fbe6c8c179b17",
        "msg" : "edit_{binary,record}_decoded: Support hex-decode of bytes",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/filesystem.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "smdpp-data/certs/DPtls/CERT_S_SM_DP_TLS_NIST.pem"
        ],
        "commitId" : "19f3759306abd1a835c79a77c0bd83490c3f9156",
        "timestamp" : 1745502426000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "osmo-smdpp: Renew SGP.26 TLS certificate for SM-DP+\u000a\u000aThe SGP.26 v3.0 certificate had expired on July 11, 2024. Let's replace\u000ait with a cert of 10 year validity period to facilitate uninterrupted testing\u000awith osmo-smdpp.\u000a\u000a@@ -1,12 +1,12 @@\u000a Certificate:\u000a     Data:\u000a         Version: 3 (0x2)\u000a-        Serial Number: 9 (0x9)\u000a+        Serial Number: 10 (0xa)\u000a         Signature Algorithm: ecdsa-with-SHA256\u000a         Issuer: CN=Test CI, OU=TESTCERT, O=RSPTEST, C=IT\u000a         Validity\u000a-            Not Before: Jun  9 19:04:42 2023 GMT\u000a-            Not After : Jul 11 19:04:42 2024 GMT\u000a+            Not Before: Apr 23 15:23:05 2025 GMT\u000a+            Not After : Apr 21 15:23:05 2035 GMT\u000a         Subject: O=ACME, CN=testsmdpplus1.example.com\u000a         Subject Public Key Info:\u000a             Public Key Algorithm: id-ecPublicKey\u000a\u000aChange-Id: I6f67186b9b1b9cc81bfb0699a9d3984d08be8821\u000a",
        "date" : "2025-04-24 13:47:06 +0000",
        "id" : "19f3759306abd1a835c79a77c0bd83490c3f9156",
        "msg" : "osmo-smdpp: Renew SGP.26 TLS certificate for SM-DP+",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "smdpp-data/certs/DPtls/CERT_S_SM_DP_TLS_NIST.pem"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_31_103.py",
          "pySim/gsm_r.py",
          "pySim/global_platform/http.py",
          "pySim/ara_m.py",
          "setup.py",
          "pySim/iso7816_4.py",
          "pySim/ota.py",
          "pySim/apdu/__init__.py",
          "pySim/cat.py",
          "pySim/ts_31_103_shared.py",
          "pySim/global_platform/scp.py",
          "requirements.txt",
          "pySim/apdu/ts_31_102.py",
          "pySim/sms.py",
          "pySim/sysmocom_sja2.py"
        ],
        "commitId" : "949c2a2d579943f5286e1f4505be0835f149eab6",
        "timestamp" : 1745825572000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "Use osmocom.construct.{Bytes,GreedyBytes} for hexstring input support\u000a\u000aThe upstream construct.{Bytes,GreedyBytes} only support bytes/bytearray\u000ainput data for the encoder, while the [newly-created]\u000aosmocom.construct.{Bytes,GreedyBytes} support alternatively hex-string input.\u000a\u000aThis is important in the context of encoding construct-based types from\u000aJSON, where our osmocom.utils.JsonEncoder will automatically convert any\u000abytes to hex-string, while re-encoding those hex-strings will fail prior\u000ato this patch.\u000a\u000aChange-Id: I1c8df6350c68aa408ec96ff6cd1e405ceb1a4fbb\u000aCloses: OS#6774\u000a",
        "date" : "2025-04-28 09:32:52 +0200",
        "id" : "949c2a2d579943f5286e1f4505be0835f149eab6",
        "msg" : "Use osmocom.construct.{Bytes,GreedyBytes} for hexstring input support",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/sysmocom_sja2.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_103.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/global_platform/http.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/cat.py"
          },
          {
            "editType" : "edit",
            "file" : "setup.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/iso7816_4.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_103_shared.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/apdu/ts_31_102.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/apdu/__init__.py"
          },
          {
            "editType" : "edit",
            "file" : "requirements.txt"
          },
          {
            "editType" : "edit",
            "file" : "pySim/global_platform/scp.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ara_m.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/gsm_r.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/sms.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ota.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "contrib/jenkins.sh"
        ],
        "commitId" : "004b06eab1d89ba2b29d7de9b7747cc2cdd0c8fd",
        "timestamp" : 1746043136000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/fixeria",
          "fullName" : "Vadim Yanitskiy"
        },
        "authorEmail" : "vyanitskiy@sysmocom.de",
        "comment" : "jenkins.sh: workaround for 'usage: build.py' in docs\u000a\u000aRecent versions of cmd2 have changed how the 'prog' attribute is\u000aautomatically set for ArgumentParser instances.  As a result, we\u000aare now seeing an unexpected 'build.py' artifact appearing in\u000athe generated documentation.\u000a\u000aLet's use an older release of cmd2, which retains the old expected\u000abehavior.  Use it specifically for building documentation.\u000a\u000aChange-Id: Ifbad35adc5e9d3141acfd024d7dee2a25f1cb62e\u000aRelated: https://github.com/python-cmd2/cmd2/issues/1414\u000aRelated: OS#6776\u000a",
        "date" : "2025-05-01 02:58:56 +0700",
        "id" : "004b06eab1d89ba2b29d7de9b7747cc2cdd0c8fd",
        "msg" : "jenkins.sh: workaround for 'usage: build.py' in docs",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "contrib/jenkins.sh"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "docs/library-esim.rst",
          "docs/index.rst"
        ],
        "commitId" : "89070a7c67abbf0b2a4b647eacfd2c59ed7b9671",
        "timestamp" : 1746560626000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "docs: Build the pySim.esim library documentation\u000a\u000a... we added doc-strings but missed to actually render them in the\u000amanual so far.\u000a\u000aChange-Id: Iff2baca86376e68898a8af0252906f802ffa79eb\u000a",
        "date" : "2025-05-06 21:43:46 +0200",
        "id" : "89070a7c67abbf0b2a4b647eacfd2c59ed7b9671",
        "msg" : "docs: Build the pySim.esim library documentation",
        "paths" : [
          {
            "editType" : "add",
            "file" : "docs/library-esim.rst"
          },
          {
            "editType" : "edit",
            "file" : "docs/index.rst"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/rsp.py",
          "pySim/esim/saip/oid.py",
          "pySim/esim/__init__.py",
          "pySim/esim/saip/validation.py",
          "pySim/esim/bsp.py",
          "pySim/esim/saip/__init__.py",
          "pySim/esim/saip/templates.py",
          "pySim/esim/x509_cert.py",
          "pySim/esim/es8p.py",
          "pySim/esim/saip/personalization.py"
        ],
        "commitId" : "e37cdbcd3e66d5ab833136e19b86ad36265ab593",
        "timestamp" : 1746607847000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "docs: Better python doc-strings for better pySim.esim manual\u000a\u000aChange-Id: I7be6264c665a2a25105681bb5e72d0f6715bbef8\u000a",
        "date" : "2025-05-07 10:50:47 +0200",
        "id" : "e37cdbcd3e66d5ab833136e19b86ad36265ab593",
        "msg" : "docs: Better python doc-strings for better pySim.esim manual",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/x509_cert.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/esim/__init__.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/esim/bsp.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/personalization.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/esim/es8p.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/esim/rsp.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/templates.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/oid.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/validation.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_31_103.py",
          "pySim/ts_102_310.py",
          "pySim/gsm_r.py",
          "pySim/global_platform/__init__.py",
          "pySim/ts_31_102.py",
          "tests/unittests/test_utils.py",
          "pySim/ts_51_011.py",
          "pySim/euicc.py",
          "pySim/cat.py",
          "pySim/cdma_ruim.py",
          "pySim/ts_31_103_shared.py",
          "pySim/sms.py",
          "pySim/ts_102_221.py",
          "pySim/sysmocom_sja2.py",
          "pySim/global_platform/install_param.py"
        ],
        "commitId" : "c7c48718ba3637e29fc6a7af4e2e39ba0679bb8d",
        "timestamp" : 1746639354000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "Get rid of [now] superfluous HexAdapter\u000a\u000aWith the introduction of using osmocom.construct.{Bytes,GreedyBytes}\u000ain Change-Id I1c8df6350c68aa408ec96ff6cd1e405ceb1a4fbb we don't have a\u000aneed for wrapping each instance of Bytes or GreedyBytes into a\u000aHexAdapter anymore.  The osmocom.construct.{Bytes,GreedyBytes} will\u000aautomatically perform the related hex-string-to-bytes conversion if\u000aneeded - and during printing we have osmocom.utils.JsonEncoder that\u000amakes sure to convert any bytes type to a hex-string.\u000a\u000aChange-Id: I9c77e420c314f5e74458628dc4e767eab6d97123\u000a",
        "date" : "2025-05-07 19:35:54 +0200",
        "id" : "c7c48718ba3637e29fc6a7af4e2e39ba0679bb8d",
        "msg" : "Get rid of [now] superfluous HexAdapter",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/sysmocom_sja2.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/global_platform/install_param.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_102_310.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/sms.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/cat.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/gsm_r.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_102_221.py"
          },
          {
            "editType" : "edit",
            "file" : "tests/unittests/test_utils.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_51_011.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/cdma_ruim.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/global_platform/__init__.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/euicc.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_103.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_102.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_103_shared.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "setup.py"
        ],
        "commitId" : "7fe7bff3d8e08bfd71f5884792765e7ca1047945",
        "timestamp" : 1750073863000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/ewild",
          "fullName" : "ewild"
        },
        "authorEmail" : "ewild@sysmocom.de",
        "comment" : "smdpp: optional deps\u000a\u000aWorks locally, too:\u000a$ pip install -e \".[smdpp]\"\u000a\u000aChange-Id: If69b2bd5f8bc604443108c942c17eba9c22f4053\u000a",
        "date" : "2025-06-16 13:37:43 +0200",
        "id" : "7fe7bff3d8e08bfd71f5884792765e7ca1047945",
        "msg" : "smdpp: optional deps",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "setup.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "smdpp-data/certs/DPtls/CERT_S_SM_DP_TLS_NIST.pem",
          "smdpp-data/certs/DPtls/Old_TLS_Validity/Expired 2024/CERT_S_SM_DP2_TLS.der",
          "smdpp-data/certs/DPtls/CERT_S_SM_DP2_TLS.der",
          "smdpp-data/certs/DPtls/Old_TLS_Validity/Expired 2024/CERT_S_SM_DP8_TLS.der",
          "smdpp-data/certs/DPtls/CERT_S_SM_DP4_TLS.der",
          "smdpp-data/certs/DPtls/Old_TLS_Validity/Expired 2024/CERT_S_SM_DP4_TLS.der",
          "smdpp-data/certs/DPtls/Old_TLS_Validity/Expired 2024/CERT_S_SM_DP_TLS_NIST.der",
          "smdpp-data/certs/DPtls/CERT_S_SM_DP8_TLS.der",
          "smdpp-data/certs/DPtls/CERT_S_SM_DP_TLS_BRP.der",
          "smdpp-data/certs/DPtls/CERT_S_SM_DP_TLS_NIST.der",
          "smdpp-data/certs/DPtls/Old_TLS_Validity/Expired 2024/CERT_S_SM_DP_TLS_BRP.der"
        ],
        "commitId" : "9572cbdb6132984c24dff1af0ca6bd5321b88380",
        "timestamp" : 1750508373000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/hoernchen",
          "fullName" : "benispeter"
        },
        "authorEmail" : "ewild@sysmocom.de",
        "comment" : "smdpp: update certs\u000a\u000aTLS will expire again:\u000a$ find . -iname \"CERT*NIST*der\" | xargs -ti  openssl x509 -in {} -inform DER -noout -checkend $((24*3600*90))\u000a...\u000aopenssl x509 -in ./smdpp-data/generated/DPtls/CERT_S_SM_DP_TLS_NIST.der -inform DER -noout -checkend 7776000\u000aCertificate will expire\u000a...\u000a\u000aGrabbed from SGP.26_v1.5_Certificates_18_07_2024.zip available at\u000ahttps://www.gsma.com/solutions-and-impact/technologies/esim/gsma_resources/sgp-26-test-certificate-definition-v1-5/\u000a\u000aChange-Id: I25442d6f55a385019bba1e47ad3d795120f850ad\u000a",
        "date" : "2025-06-21 12:19:33 +0000",
        "id" : "9572cbdb6132984c24dff1af0ca6bd5321b88380",
        "msg" : "smdpp: update certs",
        "paths" : [
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPtls/Old_TLS_Validity/Expired 2024/CERT_S_SM_DP2_TLS.der"
          },
          {
            "editType" : "edit",
            "file" : "smdpp-data/certs/DPtls/CERT_S_SM_DP_TLS_BRP.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPtls/Old_TLS_Validity/Expired 2024/CERT_S_SM_DP8_TLS.der"
          },
          {
            "editType" : "edit",
            "file" : "smdpp-data/certs/DPtls/CERT_S_SM_DP_TLS_NIST.der"
          },
          {
            "editType" : "edit",
            "file" : "smdpp-data/certs/DPtls/CERT_S_SM_DP_TLS_NIST.pem"
          },
          {
            "editType" : "edit",
            "file" : "smdpp-data/certs/DPtls/CERT_S_SM_DP4_TLS.der"
          },
          {
            "editType" : "edit",
            "file" : "smdpp-data/certs/DPtls/CERT_S_SM_DP2_TLS.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPtls/Old_TLS_Validity/Expired 2024/CERT_S_SM_DP4_TLS.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPtls/Old_TLS_Validity/Expired 2024/CERT_S_SM_DP_TLS_BRP.der"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPtls/Old_TLS_Validity/Expired 2024/CERT_S_SM_DP_TLS_NIST.der"
          },
          {
            "editType" : "edit",
            "file" : "smdpp-data/certs/DPtls/CERT_S_SM_DP8_TLS.der"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "osmo-smdpp.py"
        ],
        "commitId" : "5316f2b1cc9c2d3f04edc681b0dbc86dfb2d54bb",
        "timestamp" : 1750508382000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/hoernchen",
          "fullName" : "benispeter"
        },
        "authorEmail" : "ewild@sysmocom.de",
        "comment" : "smdpp: verify request headers\u000a\u000aChange-Id: Ic1221bcb87a9975a013ab356266d3cb76d9241f1\u000a",
        "date" : "2025-06-21 12:19:42 +0000",
        "id" : "5316f2b1cc9c2d3f04edc681b0dbc86dfb2d54bb",
        "msg" : "smdpp: verify request headers",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "osmo-smdpp.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "osmo-smdpp.py"
        ],
        "commitId" : "5969901be524f30ae872ad60ad523b933ccb09ad",
        "timestamp" : 1750511918000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "smdpp: Verify EID is within permitted range of EUM certificate\u000a\u000aChange-Id: Ice704548cb62f14943927b5295007db13c807031\u000a",
        "date" : "2025-06-21 13:18:38 +0000",
        "id" : "5969901be524f30ae872ad60ad523b933ccb09ad",
        "msg" : "smdpp: Verify EID is within permitted range of EUM certificate",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "osmo-smdpp.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "osmo-smdpp.py"
        ],
        "commitId" : "79805d1dd75b5da780e2be9491ebbfdf8481d58d",
        "timestamp" : 1750839762000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/ewild",
          "fullName" : "ewild"
        },
        "authorEmail" : "ewild@sysmocom.de",
        "comment" : "smdpp: reorder imports\u000a\u000aChange-Id: Ib72089fb75d71f0d33c9ea17e5491dd52558f532\u000a",
        "date" : "2025-06-25 10:22:42 +0200",
        "id" : "79805d1dd75b5da780e2be9491ebbfdf8481d58d",
        "msg" : "smdpp: reorder imports",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "osmo-smdpp.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "osmo-smdpp.py",
          "contrib/generate_smdpp_certs.py",
          ".gitignore",
          "smdpp-data/certs/DPtls/CERT_S_SM_DP_TLS_BRP.pem",
          "smdpp-data/sm-dp-sessions-NIST",
          "smdpp-data/sm-dp-sessions-BRP"
        ],
        "commitId" : "ccefc98160303b149d8ef78ec55ecd04430a8384",
        "timestamp" : 1750839762000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/ewild",
          "fullName" : "ewild"
        },
        "authorEmail" : "ewild@sysmocom.de",
        "comment" : "smdpp: add proper tls support, cert generation FOR TESTING\u000a\u000aIf TLS is enabled (default) it will automagically generate missing pem files + dh params.\u000a\u000aA faithful reproduction of the certs found in SGP.26_v1.5_Certificates_18_07_2024.zip available at\u000ahttps://www.gsma.com/solutions-and-impact/technologies/esim/gsma_resources/sgp-26-test-certificate-definition-v1-5/\u000acan be generated by running contrib/generate_certs.py. This allows adjusting the expiry dates, CA flag,\u000aand other parameters FOR TESTING. Certs can be used by the smdpp by running\u000a$ python -u osmo-smdpp.py -c generated\u000a\u000aChange-Id: I84b2666422b8ff565620f3827ef4d4d7635a21be\u000a",
        "date" : "2025-06-25 10:22:42 +0200",
        "id" : "ccefc98160303b149d8ef78ec55ecd04430a8384",
        "msg" : "smdpp: add proper tls support, cert generation FOR TESTING",
        "paths" : [
          {
            "editType" : "add",
            "file" : "smdpp-data/certs/DPtls/CERT_S_SM_DP_TLS_BRP.pem"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/sm-dp-sessions-NIST"
          },
          {
            "editType" : "edit",
            "file" : ".gitignore"
          },
          {
            "editType" : "add",
            "file" : "smdpp-data/sm-dp-sessions-BRP"
          },
          {
            "editType" : "add",
            "file" : "contrib/generate_smdpp_certs.py"
          },
          {
            "editType" : "edit",
            "file" : "osmo-smdpp.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "smdpp-data/sm-dp-sessions-NIST",
          "smdpp-data/sm-dp-sessions-BRP",
          ".gitignore"
        ],
        "commitId" : "3c1a59640c6433d451bf29d22b9ca85e408b88be",
        "timestamp" : 1755255841000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/ewild",
          "fullName" : "ewild"
        },
        "authorEmail" : "ewild@sysmocom.de",
        "comment" : "smdp: clean up accidental commited trash\u000a\u000aand update gitinore to ensure this does not happen again\u000a\u000aChange-Id: Ieeb2da3bdb006b08e2f82bfc3b5252f4abf4420b\u000a",
        "date" : "2025-08-15 13:04:01 +0200",
        "id" : "3c1a59640c6433d451bf29d22b9ca85e408b88be",
        "msg" : "smdp: clean up accidental commited trash",
        "paths" : [
          {
            "editType" : "delete",
            "file" : "smdpp-data/sm-dp-sessions-BRP"
          },
          {
            "editType" : "delete",
            "file" : "smdpp-data/sm-dp-sessions-NIST"
          },
          {
            "editType" : "edit",
            "file" : ".gitignore"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "osmo-smdpp.py",
          "pySim/esim/es8p.py",
          "pySim/esim/bsp.py"
        ],
        "commitId" : "0b1d3c85fd8cb249ac692a3b61879d622ac01815",
        "timestamp" : 1755255842000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/ewild",
          "fullName" : "ewild"
        },
        "authorEmail" : "ewild@sysmocom.de",
        "comment" : "smdpp: less verbose by default\u000a\u000aThose data blobs are huge.\u000a\u000aChange-Id: I04a72b8f52417862d4dcba1f0743700dd942ef49\u000a",
        "date" : "2025-08-15 13:04:02 +0200",
        "id" : "0b1d3c85fd8cb249ac692a3b61879d622ac01815",
        "msg" : "smdpp: less verbose by default",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/bsp.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/esim/es8p.py"
          },
          {
            "editType" : "edit",
            "file" : "osmo-smdpp.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/x509_cert.py"
        ],
        "commitId" : "7798ea9c5c2091814ad59d2e77e179c453f88bcd",
        "timestamp" : 1755255842000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/ewild",
          "fullName" : "ewild"
        },
        "authorEmail" : "ewild@sysmocom.de",
        "comment" : "x509 cert: fix weird cert check\u000a\u000aChange-Id: I18beab0e1b24579724704c4141a2c457b2d4cf99\u000a",
        "date" : "2025-08-15 13:04:02 +0200",
        "id" : "7798ea9c5c2091814ad59d2e77e179c453f88bcd",
        "msg" : "x509 cert: fix weird cert check",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/x509_cert.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "osmo-smdpp.py"
        ],
        "commitId" : "70fedb5a46eabe969734bc4408e418577223e49a",
        "timestamp" : 1755255842000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/ewild",
          "fullName" : "ewild"
        },
        "authorEmail" : "ewild@sysmocom.de",
        "comment" : "smdpp: verify cert chain\u000a\u000aChange-Id: I1e4e4b1b032dc6a8b7d15bd80d533a50fe0cff15\u000a",
        "date" : "2025-08-15 13:04:02 +0200",
        "id" : "70fedb5a46eabe969734bc4408e418577223e49a",
        "msg" : "smdpp: verify cert chain",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "osmo-smdpp.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "osmo-smdpp.py",
          ".gitignore"
        ],
        "commitId" : "cb7d5aa3a7f96370760fd94a39d8c0819cfe379d",
        "timestamp" : 1755255842000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/ewild",
          "fullName" : "ewild"
        },
        "authorEmail" : "ewild@sysmocom.de",
        "comment" : "smdpp: add proper brp cert support\u000a\u000aChange-Id: I6906732f7d193a9c2234075f4a82df5e0ed46100\u000a",
        "date" : "2025-08-15 13:04:02 +0200",
        "id" : "cb7d5aa3a7f96370760fd94a39d8c0819cfe379d",
        "msg" : "smdpp: add proper brp cert support",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "osmo-smdpp.py"
          },
          {
            "editType" : "edit",
            "file" : ".gitignore"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "osmo-smdpp.py"
        ],
        "commitId" : "6aed97d6c8945ec73f2fa4be0c375ec98c72866d",
        "timestamp" : 1755255842000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/ewild",
          "fullName" : "ewild"
        },
        "authorEmail" : "ewild@sysmocom.de",
        "comment" : "smdpp: fix asn1tool OBJECT IDENTIFIER decoding\u000a\u000aWhile at it make the linter happy.\u000aThe feature to ignore blocks is making slow progress:\u000ahttps://github.com/astral-sh/ruff/issues/3711#\u000a\u000aChange-Id: Ic678e6c4a4c1a01de87a8dce26f4a5e452e8562a\u000a",
        "date" : "2025-08-15 13:04:02 +0200",
        "id" : "6aed97d6c8945ec73f2fa4be0c375ec98c72866d",
        "msg" : "smdpp: fix asn1tool OBJECT IDENTIFIER decoding",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "osmo-smdpp.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/rsp.py",
          "osmo-smdpp.py"
        ],
        "commitId" : "6cffb31b427edc29862f2316b7d817aa4dddb6ba",
        "timestamp" : 1755255842000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/ewild",
          "fullName" : "ewild"
        },
        "authorEmail" : "ewild@sysmocom.de",
        "comment" : "memory backed ephermal session store for easy concurrent runs\u000a\u000aChange-Id: I05bfd6ff471ccf1c8c2b5f2b748b9d4125ddd4f7\u000a",
        "date" : "2025-08-15 13:04:02 +0200",
        "id" : "6cffb31b427edc29862f2316b7d817aa4dddb6ba",
        "msg" : "memory backed ephermal session store for easy concurrent runs",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "osmo-smdpp.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/esim/rsp.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "smdpp-data/certs/DPtls/CERT_S_SM_DP_TLS_NIST.pem",
          "smdpp-data/certs/DPtls/CERT_S_SM_DP2_TLS.der",
          "smdpp-data/certs/DPtls/CERT_S_SM_DP_TLS_BRP.pem",
          "smdpp-data/certs/DPtls/CERT_S_SM_DP4_TLS.der",
          "smdpp-data/certs/DPtls/CERT_S_SM_DP8_TLS.der",
          "smdpp-data/certs/DPtls/CERT_S_SM_DP_TLS_NIST.der",
          "smdpp-data/certs/DPtls/CERT_S_SM_DP_TLS_BRP.der"
        ],
        "commitId" : "b4a12ecc1402f7a0975d32abb87477fe8ab6a0ee",
        "timestamp" : 1755788072000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/hoernchen",
          "fullName" : "benispeter"
        },
        "authorEmail" : "ewild@sysmocom.de",
        "comment" : "smdp: update tls certs\u000a\u000aOld expired today, new from https://www.gsma.com/solutions-and-impact/technologies/esim/wp-content/uploads/2021/07/SGP.26_v1.5-17-July-2025_files_v3.zip\u000a\u000aChange-Id: I585efe3360a0aac2a49a79d5fef2789dea2b169d\u000a",
        "date" : "2025-08-21 14:54:32 +0000",
        "id" : "b4a12ecc1402f7a0975d32abb87477fe8ab6a0ee",
        "msg" : "smdp: update tls certs",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "smdpp-data/certs/DPtls/CERT_S_SM_DP4_TLS.der"
          },
          {
            "editType" : "edit",
            "file" : "smdpp-data/certs/DPtls/CERT_S_SM_DP_TLS_NIST.der"
          },
          {
            "editType" : "edit",
            "file" : "smdpp-data/certs/DPtls/CERT_S_SM_DP_TLS_BRP.der"
          },
          {
            "editType" : "edit",
            "file" : "smdpp-data/certs/DPtls/CERT_S_SM_DP_TLS_BRP.pem"
          },
          {
            "editType" : "edit",
            "file" : "smdpp-data/certs/DPtls/CERT_S_SM_DP_TLS_NIST.pem"
          },
          {
            "editType" : "edit",
            "file" : "smdpp-data/certs/DPtls/CERT_S_SM_DP8_TLS.der"
          },
          {
            "editType" : "edit",
            "file" : "smdpp-data/certs/DPtls/CERT_S_SM_DP2_TLS.der"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "contrib/jenkins.sh",
          "requirements.txt"
        ],
        "commitId" : "076fec267ae7d7ab40f05b8415a8bf8084184e16",
        "timestamp" : 1756297873000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/osmith",
          "fullName" : "Oliver Smith"
        },
        "authorEmail" : "osmith@sysmocom.de",
        "comment" : "requirements: set cmd2>=2.6.2,<3.0\u000a\u000aRemove the previous workaround that set cmd2==2.4.3 in jenkins.sh. The\u000abug this worked around has been fixed in 2.6.2.\u000a\u000a3.0 will break unless we use some new additional decorator.\u000a\u000aRelated: OS#6776\u000aChange-Id: I4ba65ed486247c5670313b75f43a242d264df14b\u000a",
        "date" : "2025-08-27 14:31:13 +0200",
        "id" : "076fec267ae7d7ab40f05b8415a8bf8084184e16",
        "msg" : "requirements: set cmd2>=2.6.2,<3.0",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "contrib/jenkins.sh"
          },
          {
            "editType" : "edit",
            "file" : "requirements.txt"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "docs/conf.py"
        ],
        "commitId" : "10fe0e3aaeed857744819f487d1be7fbe270faf8",
        "timestamp" : 1756297873000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/osmith",
          "fullName" : "Oliver Smith"
        },
        "authorEmail" : "osmith@sysmocom.de",
        "comment" : "docs: fix authors line exceeding the page\u000a\u000aFix that the authors get cut off as they exceed the page in the PDF\u000aversion. This can currently be seen here:\u000ahttps://downloads.osmocom.org/docs/pysim/master/osmopysim-usermanual.pdf\u000a\u000aChange-Id: Iacbba6c2f74bf2b9f96057e71bde017a11f703a8\u000a",
        "date" : "2025-08-27 14:31:13 +0200",
        "id" : "10fe0e3aaeed857744819f487d1be7fbe270faf8",
        "msg" : "docs: fix authors line exceeding the page",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "docs/conf.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/cards.py",
          "pySim/runtime.py"
        ],
        "commitId" : "4dddcf932a28297963aab0ef15ba2fcc1485f3a2",
        "timestamp" : 1756417464000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "Make sure to select MF before probing for files/Addons\u000a\u000aChange-Id: I685367c282f57a8856668a3172a9391a5bbcf2e2\u000a",
        "date" : "2025-08-28 21:44:24 +0000",
        "id" : "4dddcf932a28297963aab0ef15ba2fcc1485f3a2",
        "msg" : "Make sure to select MF before probing for files/Addons",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/cards.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/runtime.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/utils.py",
          "pySim/filesystem.py"
        ],
        "commitId" : "caa955b3ac77d0cdb801a6ad143464dfd021d2cd",
        "timestamp" : 1756417464000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "Identify cards by Historical bytes of ATR\u000a\u000a- try to identify the CardModel by just comparing the Historical Bytes if matching by Whole ATR failed\u000a- add decompose ATR code from pyscard-contrib\u000a\u000aRelated: OS#6837\u000aChange-Id: Id7555e42290d232a0e0efc47e7d97575007d846f\u000a",
        "date" : "2025-08-28 21:44:24 +0000",
        "id" : "caa955b3ac77d0cdb801a6ad143464dfd021d2cd",
        "msg" : "Identify cards by Historical bytes of ATR",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/filesystem.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/utils.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "docs/suci-keytool.rst"
        ],
        "commitId" : "92841f2cd5f65aec0dfa3ad7a7643605c54abf3a",
        "timestamp" : 1757005047000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "docs/suci-keytool.rst: spelling fix\u000a\u000aChange-Id: Idb45086d9d5963072fbc97835d551e2f78ad847f\u000a",
        "date" : "2025-09-04 18:57:27 +0200",
        "id" : "92841f2cd5f65aec0dfa3ad7a7643605c54abf3a",
        "msg" : "docs/suci-keytool.rst: spelling fix",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "docs/suci-keytool.rst"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/bsp.py"
        ],
        "commitId" : "5d2e2ee259b19e836a056bf8c8e7c9d33032f77f",
        "timestamp" : 1758726276000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "bsp: fix maxpayloadsize\u000a\u000aChange-Id: I08f544877b79681ad1f758a1ca31c292eae9f868\u000a",
        "date" : "2025-09-24 15:04:36 +0000",
        "id" : "5d2e2ee259b19e836a056bf8c8e7c9d33032f77f",
        "msg" : "bsp: fix maxpayloadsize",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/bsp.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/legacy/cards.py",
          "pySim/global_platform/uicc.py",
          "pySim/transport/__init__.py",
          "pySim/esim/http_json_api.py",
          "docs/osmo-smdpp.rst",
          "pySim/utils.py",
          "contrib/es2p_client.py",
          "pySim/card_key_provider.py",
          "pySim/esim/saip/__init__.py",
          "pySim-prog.py",
          "contrib/es9p_client.py",
          "pySim/ts_51_011.py",
          "contrib/saip-tool_example_add-app.sh",
          "pySim-read.py",
          "pySim/esim/es9p.py",
          "pySim/cat.py",
          "docs/suci-tutorial.rst",
          "pySim/legacy/utils.py",
          "pySim/esim/saip/validation.py",
          "docs/legacy.rst",
          "contrib/saip-tool.py",
          "pySim/commands.py",
          "osmo-smdpp.py",
          "pySim/profile.py",
          "docs/sim-rest.rst",
          "pySim-smpp2sim.py",
          "pySim/esim/rsp.py",
          "pySim/ts_31_102.py",
          "pySim/global_platform/__init__.py",
          "pySim/secure_channel.py",
          "pySim/ara_m.py",
          "pySim-trace.py",
          "pySim/javacard.py",
          "pySim/ts_31_103_shared.py",
          "pySim-shell.py",
          "contrib/unber.py",
          "pySim/filesystem.py",
          "pySim/runtime.py",
          "pySim/esim/es2p.py"
        ],
        "commitId" : "4ee99c18cd6c18ff6e8c71096a1f58901962acc8",
        "timestamp" : 1758736757000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "Fix typos\u000a\u000aFound via `codespell -S tests -L ist,adn,ciph,ue,ot,readd,te,oce,tye`\u000a\u000aChange-Id: I00a72e4f479dcef88f7d1058ce53edd0129d336a\u000a",
        "date" : "2025-09-24 17:59:17 +0000",
        "id" : "4ee99c18cd6c18ff6e8c71096a1f58901962acc8",
        "msg" : "Fix typos",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/http_json_api.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim-shell.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ara_m.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/commands.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_102.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/esim/rsp.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_51_011.py"
          },
          {
            "editType" : "edit",
            "file" : "docs/osmo-smdpp.rst"
          },
          {
            "editType" : "edit",
            "file" : "osmo-smdpp.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/ts_31_103_shared.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/global_platform/uicc.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/legacy/cards.py"
          },
          {
            "editType" : "edit",
            "file" : "contrib/unber.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/secure_channel.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/esim/es2p.py"
          },
          {
            "editType" : "edit",
            "file" : "docs/legacy.rst"
          },
          {
            "editType" : "edit",
            "file" : "pySim/cat.py"
          },
          {
            "editType" : "edit",
            "file" : "docs/suci-tutorial.rst"
          },
          {
            "editType" : "edit",
            "file" : "pySim/card_key_provider.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim-smpp2sim.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/filesystem.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/legacy/utils.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/runtime.py"
          },
          {
            "editType" : "edit",
            "file" : "contrib/es9p_client.py"
          },
          {
            "editType" : "edit",
            "file" : "contrib/saip-tool_example_add-app.sh"
          },
          {
            "editType" : "edit",
            "file" : "pySim-read.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/esim/es9p.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim-prog.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/utils.py"
          },
          {
            "editType" : "edit",
            "file" : "docs/sim-rest.rst"
          },
          {
            "editType" : "edit",
            "file" : "pySim/profile.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim-trace.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/validation.py"
          },
          {
            "editType" : "edit",
            "file" : "contrib/es2p_client.py"
          },
          {
            "editType" : "edit",
            "file" : "contrib/saip-tool.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/javacard.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/transport/__init__.py"
          },
          {
            "editType" : "edit",
            "file" : "pySim/global_platform/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/esim/saip/__init__.py"
        ],
        "commitId" : "947154639c9ac57da76fbc6235818df4c93e2ec3",
        "timestamp" : 1758736757000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "pySim.esim.saip.FsNodeADF: Fix __str__ method\u000a\u000aIt's quite common for a FsNodeADF to not have a df_name, so we need\u000ato guard against that during stringification to avoid an exception.\u000a\u000aChange-Id: I919d7c46575e0ebcdf3b979347a5cdd1a9feb294\u000a",
        "date" : "2025-09-24 17:59:17 +0000",
        "id" : "947154639c9ac57da76fbc6235818df4c93e2ec3",
        "msg" : "pySim.esim.saip.FsNodeADF: Fix __str__ method",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/esim/saip/__init__.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "contrib/es9p_client.py",
          "pyproject.toml",
          "osmo-smdpp.py"
        ],
        "commitId" : "e4ea1c997348370ba1d7415bfd926ac873b58c87",
        "timestamp" : 1759388703000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/osmith",
          "fullName" : "Oliver Smith"
        },
        "authorEmail" : "osmith@sysmocom.de",
        "comment" : "Pass pylint 3.3.4 from debian trixie\u000a\u000a************* Module osmo-smdpp\u000aosmo-smdpp.py:657:72: E0606: Possibly using variable 'iccid_str' before assignment (possibly-used-before-assignment)\u000a\u000a=> False-positive: code paths that don't set iccid_str raise an error, so\u000a   this shouldn't be a problem.\u000a\u000a************* Module pySim-smpp2sim\u000apySim-smpp2sim.py:427:4: E1101: Module 'twisted.internet.reactor' has no 'run' member (no-member)\u000a\u000a=> False-positive: pylint doesn't recognize dynamically set attributes\u000a\u000a************* Module es9p_client\u000acontrib/es9p_client.py:126:11: E0606: Possibly using variable 'opts' before assignment (possibly-used-before-assignment)\u000a\u000a=> Real bug, should be \"self.opts\"\u000a\u000aChange-Id: Id042ba0944b58d98d27e1222ac373c7206158a91\u000a",
        "date" : "2025-10-02 09:05:03 +0200",
        "id" : "e4ea1c997348370ba1d7415bfd926ac873b58c87",
        "msg" : "Pass pylint 3.3.4 from debian trixie",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "contrib/es9p_client.py"
          },
          {
            "editType" : "edit",
            "file" : "osmo-smdpp.py"
          },
          {
            "editType" : "edit",
            "file" : "pyproject.toml"
          }
        ]
      }
    ],
    "kind" : "git"
  },
  "culprits" : [
    {
      "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/fixeria",
      "fullName" : "Vadim Yanitskiy"
    },
    {
      "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/osmith",
      "fullName" : "Oliver Smith"
    },
    {
      "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/ewild",
      "fullName" : "ewild"
    },
    {
      "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/jean-pierre.marcotte.1",
      "fullName" : "jean-pierre.marcotte.1"
    },
    {
      "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/osmocom",
      "fullName" : "icecream"
    },
    {
      "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
      "fullName" : "laforge"
    },
    {
      "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
      "fullName" : "pmaier@sysmocom.de"
    },
    {
      "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/flokli",
      "fullName" : "flokli"
    },
    {
      "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/neels",
      "fullName" : "Neels Hofmeyr"
    },
    {
      "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/nhofmeyr",
      "fullName" : "nhofmeyr"
    },
    {
      "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/hoernchen",
      "fullName" : "benispeter"
    }
  ],
  "runs" : [
    {
      "number" : 1816,
      "url" : "https://jenkins.osmocom.org/jenkins/job/master-pysim/JOB_TYPE=docs,a1=default,a3=default,a4=default,label=osmocom-master/1816/"
    },
    {
      "number" : 1816,
      "url" : "https://jenkins.osmocom.org/jenkins/job/master-pysim/JOB_TYPE=pylint,a1=default,a3=default,a4=default,label=osmocom-master/1816/"
    },
    {
      "number" : 1816,
      "url" : "https://jenkins.osmocom.org/jenkins/job/master-pysim/JOB_TYPE=test,a1=default,a3=default,a4=default,label=simtester/1816/"
    }
  ]
}