diff --git a/ci-scripts/Jenkinsfile-GitLab-Container b/ci-scripts/Jenkinsfile-GitLab-Container
index c22e6fabec717bc8f889846ee04c4cc3bcee9916..b37c9d4f4b30e08177ae58f6e5f497486b605b2b 100644
--- a/ci-scripts/Jenkinsfile-GitLab-Container
+++ b/ci-scripts/Jenkinsfile-GitLab-Container
@@ -278,6 +278,26 @@ pipeline {
             }
           }
         }
+        stage ("SA B200 Sanity Check") {
+          when { expression {doMandatoryTests} }
+          steps {
+            script {
+              triggerSlaveJob ('RAN-SA-B200-Module-SABOX-Container', 'Test-SA-B200')
+            }
+          }
+          post {
+            always {
+              script {
+                finalizeSlaveJob('RAN-SA-B200-Module-SABOX-Container')
+              }
+            }
+            failure {
+              script {
+                currentBuild.result = 'FAILURE'
+              }
+            }
+          }
+        }
         stage ("Test OAI NR UE - OAI gNB - TDD - Band 78 - N300") {
           when { expression {doMandatoryTests} }
           steps {
diff --git a/ci-scripts/Jenkinsfile-push-registry b/ci-scripts/Jenkinsfile-push-registry
index bc1a80ba614fc3554e4c9c1d00bd508acd06d551..feb1807c9122fd96565a63e9ab60ebd157086d66 100644
--- a/ci-scripts/Jenkinsfile-push-registry
+++ b/ci-scripts/Jenkinsfile-push-registry
@@ -66,7 +66,7 @@ pipeline {
           withCredentials([
             [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.DH_Credentials}", usernameVariable: 'DH_Username', passwordVariable: 'DH_Password']
           ]) {
-            def listOfImages = ["oai-enb", "oai-gnb", "oai-lte-ue", "oai-nr-ue"]
+            def listOfImages = ["oai-enb", "oai-gnb", "oai-lte-ue", "oai-nr-ue", "proxy"]
             sh "docker login -u ${DH_Username} -p ${DH_Password} > /dev/null 2>&1"
             listOfImages.eachWithIndex { item, iindex ->
               sh "docker image tag ${item}:develop ${DH_Account}/${item}:develop"
diff --git a/ci-scripts/Jenkinsfile-tmp-multi-enb b/ci-scripts/Jenkinsfile-tmp-multi-enb
index c3b825ec0622c0faed979706840eb15a9a3a3687..fb523169201794ead2598b7911999913c7665421 100644
--- a/ci-scripts/Jenkinsfile-tmp-multi-enb
+++ b/ci-scripts/Jenkinsfile-tmp-multi-enb
@@ -36,6 +36,9 @@ def testStageName = params.pipelineTestStageName
 // Name of the phone resource
 def ciSmartPhoneResource = params.smartphonesResource
 
+// Name of the phone resource
+def ciEpcResource = params.epcResource
+
 // Global Parameters. Normally they should be populated when the master job
 // triggers the slave job with parameters
 def eNB_Repository
@@ -51,7 +54,7 @@ pipeline {
     options {
         disableConcurrentBuilds()
         ansiColor('xterm')
-        lock (ciSmartPhoneResource)
+        lock(extra: [[resource: ciEpcResource]], resource: ciSmartPhoneResource)
     }
     stages {
         stage ("Verify Parameters") {
@@ -216,6 +219,76 @@ pipeline {
                 }
             }
         }
+        stage ("Terminate") {
+            parallel {
+                stage('Terminate UE') {
+                    // Bypassing this stage if there are no abd server defined
+                    when {
+                      expression { params.ADB_IPAddress != "none" }
+                    }
+                    steps {
+                        echo '\u2705 \u001B[32mTerminate UE\u001B[0m'
+                        withCredentials([
+                            [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.ADB_Credentials}", usernameVariable: 'ADB_Username', passwordVariable: 'ADB_Password']
+                        ]) {
+                            sh "python3 ci-scripts/main.py --mode=TerminateUE --ADBIPAddress=${params.ADB_IPAddress} --ADBUserName=${ADB_Username} --ADBPassword=${ADB_Password}"
+                        }
+                    }
+                }
+                stage('Terminate eNB') {
+                    steps {
+                        echo '\u2705 \u001B[32mTerminate eNB\u001B[0m'
+                        withCredentials([
+                            [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.eNB_Credentials}", usernameVariable: 'eNB_Username', passwordVariable: 'eNB_Password']
+                        ]) {
+                            sh "python3 ci-scripts/main.py --mode=TerminateeNB --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password}"
+                        }
+                    }
+                }
+                stage('Terminate SPGW') {
+                    // Bypassing this stage if EPC server is not defined
+                    when {
+                      expression { params.EPC_IPAddress != "none" }
+                    }
+                    steps {
+                        echo '\u2705 \u001B[32mTerminate SPGW\u001B[0m'
+                        withCredentials([
+                            [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password']
+                        ]) {
+                            sh "python3 ci-scripts/main.py --mode=TerminateSPGW --EPCIPAddress=${params.EPC_IPAddress} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCType=${params.EPC_Type} --EPCSourceCodePath=${params.EPC_SourceCodePath}"
+                        }
+                    }
+                }
+                stage('Terminate MME') {
+                    // Bypassing this stage if EPC server is not defined
+                    when {
+                      expression { params.EPC_IPAddress != "none" }
+                    }
+                    steps {
+                        echo '\u2705 \u001B[32mTerminate MME\u001B[0m'
+                        withCredentials([
+                            [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password']
+                        ]) {
+                            sh "python3 ci-scripts/main.py --mode=TerminateMME --EPCIPAddress=${params.EPC_IPAddress} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCType=${params.EPC_Type} --EPCSourceCodePath=${params.EPC_SourceCodePath}"
+                        }
+                    }
+                }
+                stage('Terminate HSS') {
+                    // Bypassing this stage if EPC server is not defined
+                    when {
+                      expression { params.EPC_IPAddress != "none" }
+                    }
+                    steps {
+                        echo '\u2705 \u001B[32mTerminate HSS\u001B[0m'
+                        withCredentials([
+                            [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password']
+                        ]) {
+                            sh "python3 ci-scripts/main.py --mode=TerminateHSS --EPCIPAddress=${params.EPC_IPAddress} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCType=${params.EPC_Type} --EPCSourceCodePath=${params.EPC_SourceCodePath}"
+                        }
+                    }
+                }
+            }
+        }
         stage('Log Collection') {
             parallel {
                 stage('Log Collection (eNB - Build)') {
@@ -242,7 +315,7 @@ pipeline {
                              [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.eNB_Credentials}", usernameVariable: 'eNB_Username', passwordVariable: 'eNB_Password']
                         ]) {
                             echo '\u2705 \u001B[32mLog Collection (eNB - Run)\u001B[0m'
-                            sh "python3 ci-scripts/main.py --mode=LogCollecteNB --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password} --eNBSourceCodePath=${params.eNB_SourceCodePath}"
+                            sh "python3 ci-scripts/main.py --mode=LogCollecteNB --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password} --eNBSourceCodePath=${params.eNB_SourceCodePath} --BuildId=${env.BUILD_ID}"
 
                             echo '\u2705 \u001B[32mLog Transfer (eNB - Run)\u001B[0m'
                             sh "sshpass -p \'${eNB_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${eNB_Username}@${params.eNB_IPAddress}:${eNB_SourceCodePath}/cmake_targets/enb.log.zip ./enb.log.${env.BUILD_ID}.zip || true"
@@ -259,6 +332,116 @@ pipeline {
                         }
                     }
                 }
+                stage('Log Collection (SPGW)') {
+                    // Bypassing this stage if EPC server is not defined
+                    when {
+                      expression { params.EPC_IPAddress != "none" }
+                    }
+                    steps {
+                        withCredentials([
+                             [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password']
+                        ]) {
+                            echo '\u2705 \u001B[32mLog Collection (SPGW)\u001B[0m'
+                            sh "python3 ci-scripts/main.py --mode=LogCollectSPGW --EPCIPAddress=${params.EPC_IPAddress} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCSourceCodePath=${params.EPC_SourceCodePath} --EPCType=${params.EPC_Type}"
+
+                            echo '\u2705 \u001B[32mLog Transfer (SPGW)\u001B[0m'
+                            sh "sshpass -p \'${EPC_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${EPC_Username}@${params.EPC_IPAddress}:${EPC_SourceCodePath}/scripts/spgw.log.zip ./spgw.log.${env.BUILD_ID}.zip || true"
+                        }
+                        script {
+                            if(fileExists("spgw.log.${env.BUILD_ID}.zip")) {
+                                archiveArtifacts "spgw.log.${env.BUILD_ID}.zip"
+                            }
+                        }
+                    }
+                }
+                stage('Log Collection (MME)') {
+                    // Bypassing this stage if EPC server is not defined
+                    when {
+                      expression { params.EPC_IPAddress != "none" }
+                    }
+                    steps {
+                        withCredentials([
+                             [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password']
+                        ]) {
+                            echo '\u2705 \u001B[32mLog Collection (MME)\u001B[0m'
+                            sh "python3 ci-scripts/main.py --mode=LogCollectMME --EPCIPAddress=${params.EPC_IPAddress} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCSourceCodePath=${params.EPC_SourceCodePath} --EPCType=${params.EPC_Type}"
+
+                            echo '\u2705 \u001B[32mLog Transfer (MME)\u001B[0m'
+                            sh "sshpass -p \'${EPC_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${EPC_Username}@${params.EPC_IPAddress}:${EPC_SourceCodePath}/scripts/mme.log.zip ./mme.log.${env.BUILD_ID}.zip || true"
+                        }
+                        script {
+                            if(fileExists("mme.log.${env.BUILD_ID}.zip")) {
+                                archiveArtifacts "mme.log.${env.BUILD_ID}.zip"
+                            }
+                        }
+                    }
+                }
+                stage('Log Collection (HSS)') {
+                    // Bypassing this stage if EPC server is not defined
+                    when {
+                      expression { params.EPC_IPAddress != "none" }
+                    }
+                    steps {
+                        withCredentials([
+                             [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password']
+                        ]) {
+                            echo '\u2705 \u001B[32mLog Collection (HSS)\u001B[0m'
+                            sh "python3 ci-scripts/main.py --mode=LogCollectHSS --EPCIPAddress=${params.EPC_IPAddress} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCSourceCodePath=${params.EPC_SourceCodePath} --EPCType=${params.EPC_Type}"
+
+                            echo '\u2705 \u001B[32mLog Transfer (HSS)\u001B[0m'
+                            sh "sshpass -p \'${EPC_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${EPC_Username}@${params.EPC_IPAddress}:${EPC_SourceCodePath}/scripts/hss.log.zip ./hss.log.${env.BUILD_ID}.zip || true"
+                        }
+                        script {
+                            if(fileExists("hss.log.${env.BUILD_ID}.zip")) {
+                                archiveArtifacts "hss.log.${env.BUILD_ID}.zip"
+                            }
+                        }
+                    }
+                }
+                stage('Log Collection (Ping)') {
+                    // Bypassing this stage if EPC server is not defined
+                    when {
+                      expression { params.EPC_IPAddress != "none" }
+                    }
+                    steps {
+                        withCredentials([
+                             [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password']
+                        ]) {
+                            echo '\u2705 \u001B[32mLog Collection (Ping)\u001B[0m'
+                            sh "python3 ci-scripts/main.py --mode=LogCollectPing --EPCIPAddress=${params.EPC_IPAddress} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCSourceCodePath=${params.EPC_SourceCodePath} --EPCType=${params.EPC_Type}"
+
+                            echo '\u2705 \u001B[32mLog Transfer (Ping)\u001B[0m'
+                            sh "sshpass -p \'${EPC_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${EPC_Username}@${params.EPC_IPAddress}:${EPC_SourceCodePath}/scripts/ping.log.zip ./ping.log.${env.BUILD_ID}.zip || true"
+                        }
+                        script {
+                            if(fileExists("ping.log.${env.BUILD_ID}.zip")) {
+                                archiveArtifacts "ping.log.${env.BUILD_ID}.zip"
+                            }
+                        }
+                    }
+                }
+                stage('Log Collection (Iperf)') {
+                    // Bypassing this stage if EPC server is not defined
+                    when {
+                      expression { params.EPC_IPAddress != "none" }
+                    }
+                    steps {
+                        withCredentials([
+                             [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password']
+                        ]) {
+                            echo '\u2705 \u001B[32mLog Collection (Iperf)\u001B[0m'
+                            sh "python3 ci-scripts/main.py --mode=LogCollectIperf --EPCIPAddress=${params.EPC_IPAddress} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCSourceCodePath=${params.EPC_SourceCodePath} --EPCType=${params.EPC_Type}"
+
+                            echo '\u2705 \u001B[32mLog Transfer (Iperf)\u001B[0m'
+                            sh "sshpass -p \'${EPC_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${EPC_Username}@${params.EPC_IPAddress}:${EPC_SourceCodePath}/scripts/iperf.log.zip ./iperf.log.${env.BUILD_ID}.zip || true"
+                        }
+                        script {
+                            if(fileExists("iperf.log.${env.BUILD_ID}.zip")) {
+                                archiveArtifacts "iperf.log.${env.BUILD_ID}.zip"
+                            }
+                        }
+                    }
+                }
             }
         }
     }
diff --git a/ci-scripts/Jenkinsfile-trig-nsa b/ci-scripts/Jenkinsfile-trig-nsa
index 772b34231aba9fdb97803ec7f016e4a3b388e5a9..8e81b75e58e33ab2bf2963522371d86792b4332e 100644
--- a/ci-scripts/Jenkinsfile-trig-nsa
+++ b/ci-scripts/Jenkinsfile-trig-nsa
@@ -20,6 +20,9 @@
  *      contact@openairinterface.org
  */
 
+// necessary for reading JSON
+import groovy.json.JsonSlurper
+
 // Template Jenkins Declarative Pipeline script to run Test w/ RF HW
 
 // Location of the python executor node shall be in the same subnet as the others servers
@@ -37,12 +40,12 @@ pipeline {
     stages {
         stage ("Launcher") {
             steps {
-                script {     
-                    //retrieve MR that are opened nd with tag NSA             
-                    MR_LIST= sh returnStdout: true, script: 'curl --silent "https://gitlab.eurecom.fr/api/v4/projects/oai%2Fopenairinterface5g/merge_requests?state=opened&per_page=100&labels=NSA" | jq ".[].iid" || true '
-                    echo "List of selected MR:\n${MR_LIST}" 
-                    def MR_ARRAY = MR_LIST.split('\n') 
-                    //for every selected MR, retrieve the branch name and the latest commit              
+                script {
+                    // retrieve MR that are opened nd with tag NSA
+                    MR_LIST = sh returnStdout: true, script: 'curl --silent "https://gitlab.eurecom.fr/api/v4/projects/oai%2Fopenairinterface5g/merge_requests?state=opened&per_page=100&labels=NSA" | jq -cj "[.[].iid]"'
+                    echo "List of selected MRs: ${MR_LIST.trim()}"
+                    def MR_ARRAY = new JsonSlurper().parseText(MR_LIST.trim())
+                    // for every selected MR, retrieve the branch name and the latest commit
                     for (MR in MR_ARRAY) {
                         SRC_BRANCH=sh returnStdout: true, script: """curl --silent "https://gitlab.eurecom.fr/api/v4/projects/oai%2Fopenairinterface5g/merge_requests/${MR}" | jq ".source_branch" || true """
                         SRC_BRANCH=SRC_BRANCH.trim()
@@ -113,6 +116,21 @@ pipeline {
                         GitPostArgs += jobName + ' ' + build_url + ' ' + build_id + ' ' + jobResult + ' '
                         echo GitPostArgs
 
+                        //calling SA-AmariS
+                        jobName = "RAN-SA-AmariS-CN5G"
+                        jobStatus =  build job: jobName, wait : true, propagate : false, parameters: [
+                            string(name: 'eNB_MR', value: String.valueOf(MR)),
+                            string(name: 'eNB_Branch', value: String.valueOf(SRC_BRANCH)),
+                            string(name: 'eNB_CommitID', value: String.valueOf(COMMIT_ID)),
+                            string(name: 'eNB_TargetBranch', value: String.valueOf(TARGET_BRANCH)),
+                            booleanParam(name: 'eNB_mergeRequest', value: Boolean.valueOf(ALLOW_MERGE))
+                        ]
+                        jobResult = jobStatus.getResult()
+                        build_url = jobStatus.getAbsoluteUrl()
+                        build_id = jobStatus.getNumber().toString()
+                        GitPostArgs += jobName + ' ' + build_url + ' ' + build_id + ' ' + jobResult + ' '
+                        echo GitPostArgs
+
                         //calling OAIUE N310-X300
                         jobName = "RAN-SA-OAIUE-N310-X300-CN5G"
                         jobStatus =  build job: jobName, wait : true, propagate : false, parameters: [
diff --git a/ci-scripts/checkCodingFormattingRules.sh b/ci-scripts/checkCodingFormattingRules.sh
index a805f765dfb9b4ca7c6e3cf481a9f0784c08d722..c29941cade3d2464f591ed3a5873341bacb63a4c 100755
--- a/ci-scripts/checkCodingFormattingRules.sh
+++ b/ci-scripts/checkCodingFormattingRules.sh
@@ -59,7 +59,7 @@ if [ $# -eq 0 ]
 then
     echo " ---- Checking the whole repository ----"
     echo ""
-    NB_FILES_TO_FORMAT=`astyle --dry-run --options=ci-scripts/astyle-options.txt --recursive *.c *.h | grep -c Formatted || true`
+    NB_FILES_TO_FORMAT=`astyle --dry-run --options=ci-scripts/astyle-options.txt --recursive --exclude=ci-scripts --exclude=cmake_targets *.c *.h | grep -c Formatted || true`
     echo "Nb Files that do NOT follow OAI rules: $NB_FILES_TO_FORMAT"
     echo $NB_FILES_TO_FORMAT > ./oai_rules_result.txt
 
@@ -136,7 +136,7 @@ fi
 # Merge request scenario
 
 MERGE_COMMMIT=`git log -n1 --pretty=format:%H`
-TARGET_INIT_COMMIT=`cat .git/refs/remotes/origin/$TARGET_BRANCH`
+TARGET_INIT_COMMIT=`git log -n1 --pretty=format:%H origin/$TARGET_BRANCH`
 
 echo " ---- Checking the modified files by the merge request ----"
 echo ""
diff --git a/ci-scripts/ci_ueinfra.yaml b/ci-scripts/ci_ueinfra.yaml
index b888f6bb59fc0257c9d402e18a0e86178d4d2537..76ebaf0f975ee69b25519a8ed134f24bcfc6c298 100644
--- a/ci-scripts/ci_ueinfra.yaml
+++ b/ci-scripts/ci_ueinfra.yaml
@@ -50,12 +50,12 @@ amarisoft_ue_1:
   WakeupScript : none
   DetachScript : none
   #end 
-  Cmd : /root/NV17-12-21/ue/lteue 
+  Cmd : /root/NV18-06-2022/ue/lteue
   Config : /root/NV17-12-21/ue/config/oaicicd-ue-Ping-SATest.cfg 
   Duration : 60
   Ping : /tmp/test_ue1.log
   UELog : /tmp/ue1.log
-  HostIPAddress : 192.168.18.89
+  HostIPAddress : 172.21.16.144
   HostUsername : root
   HostPassword : toor 
   HostSourceCodePath : /tmp
@@ -71,7 +71,7 @@ amarisoft_ue_2:
   WakeupScript : none
   DetachScript : none
   #end 
-  Cmd : /root/NV17-12-21/ue/lteue 
+  Cmd : /root/NV18-06-2022/ue/lteue
   Config : /root/NV17-12-21/ue/config/xxxxxxx.cfg #to be updated for an other scenario 
   Duration : 60
   Ping :
diff --git a/ci-scripts/cls_containerize.py b/ci-scripts/cls_containerize.py
index 259db7bffe61f1789a20161eeb4d6ce73ac6bc60..8f992689e207ece7bec91aa328a32e6d448d37f1 100644
--- a/ci-scripts/cls_containerize.py
+++ b/ci-scripts/cls_containerize.py
@@ -74,6 +74,7 @@ class Containerize():
 		self.eNB2SourceCodePath = ''
 		self.forcedWorkspaceCleanup = False
 		self.imageKind = ''
+		self.proxyCommit = None
 		self.eNB_instance = 0
 		self.eNB_serverId = ['', '', '']
 		self.yamlPath = ['', '', '']
@@ -421,6 +422,124 @@ class Containerize():
 			HTML.CreateHtmlTabFooter(False)
 			sys.exit(1)
 
+	def BuildProxy(self, HTML):
+		if self.ranRepository == '' or self.ranBranch == '' or self.ranCommitID == '':
+			HELP.GenericHelp(CONST.Version)
+			sys.exit('Insufficient Parameter')
+		if self.eNB_serverId[self.eNB_instance] == '0':
+			lIpAddr = self.eNBIPAddress
+			lUserName = self.eNBUserName
+			lPassWord = self.eNBPassword
+			lSourcePath = self.eNBSourceCodePath
+		elif self.eNB_serverId[self.eNB_instance] == '1':
+			lIpAddr = self.eNB1IPAddress
+			lUserName = self.eNB1UserName
+			lPassWord = self.eNB1Password
+			lSourcePath = self.eNB1SourceCodePath
+		elif self.eNB_serverId[self.eNB_instance] == '2':
+			lIpAddr = self.eNB2IPAddress
+			lUserName = self.eNB2UserName
+			lPassWord = self.eNB2Password
+			lSourcePath = self.eNB2SourceCodePath
+		if lIpAddr == '' or lUserName == '' or lPassWord == '' or lSourcePath == '':
+			HELP.GenericHelp(CONST.Version)
+			sys.exit('Insufficient Parameter')
+		if self.proxyCommit is None:
+			HELP.GenericHelp(CONST.Version)
+			sys.exit('Insufficient Parameter (need proxyCommit for proxy build)')
+		logging.debug('Building on server: ' + lIpAddr)
+		mySSH = SSH.SSHConnection()
+		mySSH.open(lIpAddr, lUserName, lPassWord)
+
+		# Check that we are on Ubuntu
+		mySSH.command('hostnamectl', '\$', 5)
+		result = re.search('Ubuntu',  mySSH.getBefore())
+		self.host = result.group(0)
+		if self.host != 'Ubuntu':
+			logging.error('\u001B[1m Can build proxy only on Ubuntu server\u001B[0m')
+			mySSH.close()
+			sys.exit(1)
+
+		self.cli = 'docker'
+		self.cliBuildOptions = '--no-cache'
+
+		# Workaround for some servers, we need to erase completely the workspace
+		if self.forcedWorkspaceCleanup:
+			mySSH.command('echo ' + lPassWord + ' | sudo -S rm -Rf ' + lSourcePath, '\$', 15)
+
+		oldRanCommidID = self.ranCommitID
+		oldRanRepository = self.ranRepository
+		oldRanAllowMerge = self.ranAllowMerge
+		self.ranCommitID = self.proxyCommit
+		self.ranRepository = 'https://github.com/EpiSci/oai-lte-5g-multi-ue-proxy.git'
+		self.ranAllowMerge = False
+		self._createWorkspace(mySSH, lPassWord, lSourcePath)
+		# to prevent accidentally overwriting data that might be used later
+		self.ranCommitID = oldRanCommidID
+		self.ranRepository = oldRanRepository
+		self.ranAllowMerge = oldRanAllowMerge
+
+		# Let's remove any previous run artifacts if still there
+		mySSH.command(self.cli + ' image prune --force', '\$', 30)
+		# Remove any previous proxy image
+		mySSH.command(self.cli + ' image rm oai-lte-multi-ue-proxy:latest || true', '\$', 30)
+
+		tag = self.proxyCommit
+		logging.debug('building L2sim proxy image for tag ' + tag)
+		# check if the corresponding proxy image with tag exists. If not, build it
+		mySSH.command(self.cli + ' image inspect --format=\'Size = {{.Size}} bytes\' proxy:' + tag, '\$', 5)
+		buildProxy = mySSH.getBefore().count('o such image') != 0
+		if buildProxy:
+			mySSH.command(self.cli + ' build ' + self.cliBuildOptions + ' --target oai-lte-multi-ue-proxy --tag proxy:' + tag + ' --file docker/Dockerfile.ubuntu18.04 . > cmake_targets/log/proxy-build.log 2>&1', '\$', 180)
+			# Note: at this point, OAI images are flattened, but we cannot do this
+			# here, as the flatten script is not in the proxy repo
+			mySSH.command(self.cli + ' image inspect --format=\'Size = {{.Size}} bytes\' proxy:' + tag, '\$', 5)
+			if mySSH.getBefore().count('o such image') != 0:
+				logging.error('\u001B[1m Build of L2sim proxy failed\u001B[0m')
+				mySSH.close()
+				HTML.CreateHtmlTestRow('commit ' + tag, 'KO', CONST.ALL_PROCESSES_OK)
+				HTML.CreateHtmlTabFooter(False)
+				sys.exit(1)
+		else:
+			logging.debug('L2sim proxy image for tag ' + tag + ' already exists, skipping build')
+
+		# retag the build images to that we pick it up later
+		mySSH.command('docker image tag proxy:' + tag + ' oai-lte-multi-ue-proxy:latest', '\$', 5)
+
+		# no merge: is a push to develop, tag the image so we can push it to the registry
+		if not self.ranAllowMerge:
+			mySSH.command('docker image tag proxy:' + tag + ' proxy:develop', '\$', 5)
+
+		# we assume that the host on which this is built will also run the proxy. The proxy
+		# currently requires the following command, and the docker-compose up mechanism of
+		# the CI does not allow to run arbitrary commands. Note that the following actually
+		# belongs to the deployment, not the build of the proxy...
+		logging.warning('the following command belongs to deployment, but no mechanism exists to exec it there!')
+		mySSH.command('sudo ifconfig lo: 127.0.0.2 netmask 255.0.0.0 up', '\$', 5)
+
+		# Analyzing the logs
+		if buildProxy:
+			self.testCase_id = HTML.testCase_id
+			mySSH.command('cd ' + lSourcePath + '/cmake_targets', '\$', 5)
+			mySSH.command('mkdir -p proxy_build_log_' + self.testCase_id, '\$', 5)
+			mySSH.command('mv log/* ' + 'proxy_build_log_' + self.testCase_id, '\$', 5)
+			if (os.path.isfile('./proxy_build_log_' + self.testCase_id + '.zip')):
+				os.remove('./proxy_build_log_' + self.testCase_id + '.zip')
+			if (os.path.isdir('./proxy_build_log_' + self.testCase_id)):
+				shutil.rmtree('./proxy_build_log_' + self.testCase_id)
+			mySSH.command('zip -r -qq proxy_build_log_' + self.testCase_id + '.zip proxy_build_log_' + self.testCase_id, '\$', 5)
+			mySSH.copyin(lIpAddr, lUserName, lPassWord, lSourcePath + '/cmake_targets/build_log_' + self.testCase_id + '.zip', '.')
+			# don't delete such that we might recover the zips
+			#mySSH.command('rm -f build_log_' + self.testCase_id + '.zip','\$', 5)
+
+		# Cleaning any created tmp volume
+		mySSH.command(self.cli + ' volume prune --force || true','\$', 15)
+		mySSH.close()
+
+		logging.info('\u001B[1m Building L2sim Proxy Image Pass\u001B[0m')
+		HTML.CreateHtmlTestRow('commit ' + tag, 'OK', CONST.ALL_PROCESSES_OK)
+		HTML.CreateHtmlNextTabHeaderTestRow(self.collectInfo, self.allImagesSize)
+
 	def Copy_Image_to_Test_Server(self, HTML):
 		imageTag = 'develop'
 		if (self.ranAllowMerge):
@@ -567,8 +686,10 @@ class Containerize():
 		if status:
 			HTML.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
 		else:
+			self.exitStatus = 1
 			HTML.CreateHtmlTestRow('N/A', 'KO', CONST.ALL_PROCESSES_OK)
 
+
 	def UndeployObject(self, HTML, RAN):
 		if self.eNB_serverId[self.eNB_instance] == '0':
 			lIpAddr = self.eNBIPAddress
@@ -588,7 +709,7 @@ class Containerize():
 		if lIpAddr == '' or lUserName == '' or lPassWord == '' or lSourcePath == '':
 			HELP.GenericHelp(CONST.Version)
 			sys.exit('Insufficient Parameter')
-		logging.debug('\u001B[1m Deploying OAI Object on server: ' + lIpAddr + '\u001B[0m')
+		logging.debug('\u001B[1m Undeploying OAI Object from server: ' + lIpAddr + '\u001B[0m')
 		mySSH = SSH.SSHConnection()
 		mySSH.open(lIpAddr, lUserName, lPassWord)
 		mySSH.command('cd ' + lSourcePath + '/' + self.yamlPath[self.eNB_instance], '\$', 5)
diff --git a/ci-scripts/cls_physim.py b/ci-scripts/cls_physim.py
index ecd8f63af121561c3d004b2f2a0bef9443b71bf4..0342333c060818bc7bfcf846eeb89650a5fbf442 100644
--- a/ci-scripts/cls_physim.py
+++ b/ci-scripts/cls_physim.py
@@ -168,7 +168,7 @@ class PhySim:
 
 		mySSH.close()
 		#check build status and update HTML object
-		lHTML = html.HTMLManagement()
+		lHTML = cls_oai_html.HTMLManagement()
 		lHTML=self.__CheckBuild_PhySim(htmlObj,constObj)
 		return lHTML
 
@@ -186,6 +186,6 @@ class PhySim:
 		mySSH.command(self.__workSpacePath+'ran_build/build/ldpctest ' + self.runargs + ' >> '+self.__runLogFile, '\$', 30)
 		mySSH.close()
 		#return updated HTML to main
-		lHTML = html.HTMLManagement()
+		lHTML = cls_oai_html.HTMLManagement()
 		lHTML=self.__CheckResults_PhySim(htmlObj,constObj,testcase_id)
 		return lHTML
diff --git a/ci-scripts/cls_static_code_analysis.py b/ci-scripts/cls_static_code_analysis.py
index d6796ad414e1577e0c9d233e322e46f570f8838f..5b45b48ba67bd0454716428cf89d29cddcf16a97 100644
--- a/ci-scripts/cls_static_code_analysis.py
+++ b/ci-scripts/cls_static_code_analysis.py
@@ -37,6 +37,7 @@ import logging
 import os
 from pathlib import Path
 import time
+from multiprocessing import Process, Lock, SimpleQueue
 
 #-----------------------------------------------------------
 # OAI Testing modules
@@ -237,3 +238,205 @@ class StaticCodeAnalysis():
 
 		return 0
 
+	def LicenceAndFormattingCheck(self, HTML):
+		if self.ranRepository == '' or self.ranBranch == '' or self.ranCommitID == '':
+			HELP.GenericHelp(CONST.Version)
+			sys.exit('Insufficient Parameter')
+		lIpAddr = self.eNBIPAddress
+		lUserName = self.eNBUserName
+		lPassWord = self.eNBPassword
+		lSourcePath = self.eNBSourceCodePath
+
+		if lIpAddr == '' or lUserName == '' or lPassWord == '' or lSourcePath == '':
+			HELP.GenericHelp(CONST.Version)
+			sys.exit('Insufficient Parameter')
+		logging.debug('Building on server: ' + lIpAddr)
+		mySSH = SSH.SSHConnection()
+		mySSH.open(lIpAddr, lUserName, lPassWord)
+
+		self.testCase_id = HTML.testCase_id
+
+		# on RedHat/CentOS .git extension is mandatory
+		result = re.search('([a-zA-Z0-9\:\-\.\/])+\.git', self.ranRepository)
+		if result is not None:
+			full_ran_repo_name = self.ranRepository.replace('git/', 'git')
+		else:
+			full_ran_repo_name = self.ranRepository + '.git'
+		mySSH.command('mkdir -p ' + lSourcePath, '\$', 5)
+		mySSH.command('cd ' + lSourcePath, '\$', 5)
+		mySSH.command('if [ ! -e .git ]; then stdbuf -o0 git clone ' + full_ran_repo_name + ' .; else stdbuf -o0 git fetch --prune; fi', '\$', 600)
+		# Raphael: here add a check if git clone or git fetch went smoothly
+		mySSH.command('git config user.email "jenkins@openairinterface.org"', '\$', 5)
+		mySSH.command('git config user.name "OAI Jenkins"', '\$', 5)
+
+		mySSH.command('echo ' + lPassWord + ' | sudo -S git clean -x -d -ff', '\$', 30)
+		mySSH.command('mkdir -p cmake_targets/log', '\$', 5)
+		# if the commit ID is provided use it to point to it
+		if self.ranCommitID != '':
+			mySSH.command('git checkout -f ' + self.ranCommitID, '\$', 30)
+		# if the branch is not develop, then it is a merge request and we need to do
+		# the potential merge. Note that merge conflicts should already been checked earlier
+		argToPass = ''
+		if (self.ranAllowMerge):
+			argToPass = '--build-arg MERGE_REQUEST=true --build-arg SRC_BRANCH=' + self.ranBranch
+			if self.ranTargetBranch == '':
+				if (self.ranBranch != 'develop') and (self.ranBranch != 'origin/develop'):
+					mySSH.command('git merge --ff origin/develop -m "Temporary merge for CI"', '\$', 5)
+					argToPass += ' --build-arg TARGET_BRANCH=develop '
+			else:
+				logging.debug('Merging with the target branch: ' + self.ranTargetBranch)
+				mySSH.command('git merge --ff origin/' + self.ranTargetBranch + ' -m "Temporary merge for CI"', '\$', 5)
+				argToPass += ' --build-arg TARGET_BRANCH=' + self.ranTargetBranch + ' '
+
+		mySSH.command('docker image rm oai-formatting-check:latest || true', '\$', 60)
+		mySSH.command('docker build --target oai-formatting-check --tag oai-formatting-check:latest ' + argToPass + '--file ci-scripts/docker/Dockerfile.formatting.bionic . > cmake_targets/log/oai-formatting-check.txt 2>&1', '\$', 600)
+
+		mySSH.command('docker image rm oai-formatting-check:latest || true', '\$', 60)
+		mySSH.command('docker image prune --force', '\$', 60)
+		mySSH.command('docker volume prune --force', '\$', 60)
+
+		# Analyzing the logs
+		mySSH.command('cd ' + lSourcePath + '/cmake_targets', '\$', 5)
+		mySSH.command('mkdir -p build_log_' + self.testCase_id, '\$', 5)
+		mySSH.command('mv log/* ' + 'build_log_' + self.testCase_id, '\$', 5)
+		mySSH.close()
+
+		mySSH.copyin(lIpAddr, lUserName, lPassWord, lSourcePath + '/cmake_targets/build_log_' + self.testCase_id + '/*', '.')
+
+		finalStatus = 0
+		if (os.path.isfile('./oai-formatting-check.txt')):
+			analyzed = False
+			nbFilesNotFormatted = 0
+			listFiles = False
+			listFilesNotFormatted = []
+			circularHeaderDependency = False
+			circularHeaderDependencyFiles = []
+			gnuGplLicence = False
+			gnuGplLicenceFiles = []
+			suspectLicence = False
+			suspectLicenceFiles = []
+			with open('./oai-formatting-check.txt', 'r') as logfile:
+				for line in logfile:
+					ret = re.search('./ci-scripts/checkCodingFormattingRules.sh', str(line))
+					if ret is not None:
+						analyzed = True
+					if analyzed:
+						ret = re.search('Nb Files that do NOT follow OAI rules: (?P<nb_errors>[0-9\.]+)', str(line))
+						if ret is not None:
+							nbFilesNotFormatted = int(ret.group('nb_errors'))
+
+						if re.search('=== Files not properly formatted ===', str(line)) is not None:
+							listFiles = True
+						if listFiles:
+							if re.search('Removing intermediate container', str(line)) is not None:
+								listFiles = False
+							elif re.search('Running in|Files not properly formatted', str(line)) is not None:
+								pass
+							else:
+								listFilesNotFormatted.append(str(line).strip())
+
+						if re.search('=== Files with incorrect define protection ===', str(line)) is not None:
+							circularHeaderDependency = True
+						if circularHeaderDependency:
+							if re.search('Removing intermediate container', str(line)) is not None:
+								circularHeaderDependency = False
+							elif re.search('Running in|Files with incorrect define protection', str(line)) is not None:
+								pass
+							else:
+								circularHeaderDependencyFiles.append(str(line).strip())
+
+						if re.search('=== Files with a GNU GPL licence Banner ===', str(line)) is not None:
+							gnuGplLicence = True
+						if gnuGplLicence:
+							if re.search('Removing intermediate container', str(line)) is not None:
+								gnuGplLicence = False
+							elif re.search('Running in|Files with a GNU GPL licence Banner', str(line)) is not None:
+								pass
+							else:
+								gnuGplLicenceFiles.append(str(line).strip())
+
+						if re.search('=== Files with a suspect Banner ===', str(line)) is not None:
+							suspectLicence = True
+						if suspectLicence:
+							if re.search('Removing intermediate container', str(line)) is not None:
+								suspectLicence = False
+							elif re.search('Running in|Files with a suspect Banner', str(line)) is not None:
+								pass
+							else:
+								suspectLicenceFiles.append(str(line).strip())
+
+				logfile.close()
+			if analyzed:
+				logging.debug('files not formatted properly: ' + str(nbFilesNotFormatted))
+				if nbFilesNotFormatted == 0:
+					HTML.CreateHtmlTestRow('File(s) Format', 'OK', CONST.ALL_PROCESSES_OK)
+				else:
+					html_queue = SimpleQueue()
+					html_cell = '<pre style="background-color:white">\n'
+					html_cell += 'Number of files not following OAI Rules: ' + str(nbFilesNotFormatted) + '\n'
+					for nFile in listFilesNotFormatted:
+						html_cell += str(nFile).strip() + '\n'
+					html_cell += '</pre>'
+					html_queue.put(html_cell)
+					HTML.CreateHtmlTestRowQueue('File(s) Format', 'KO', 1, html_queue)
+					del(html_cell)
+					del(html_queue)
+
+				logging.debug('header files not respecting the circular dependency protection: ' + str(len(circularHeaderDependencyFiles)))
+				if len(circularHeaderDependencyFiles) == 0:
+					HTML.CreateHtmlTestRow('Header Circular Dependency', 'OK', CONST.ALL_PROCESSES_OK)
+				else:
+					html_queue = SimpleQueue()
+					html_cell = '<pre style="background-color:white">\n'
+					html_cell += 'Number of files not respecting: ' + str(len(circularHeaderDependencyFiles)) + '\n'
+					for nFile in circularHeaderDependencyFiles:
+						html_cell += str(nFile).strip() + '\n'
+					html_cell += '</pre>'
+					html_queue.put(html_cell)
+					HTML.CreateHtmlTestRowQueue('Header Circular Dependency', 'KO', 1, html_queue)
+					del(html_cell)
+					del(html_queue)
+					finalStatus = -1
+
+				logging.debug('files with a GNU GPL license: ' + str(len(gnuGplLicenceFiles)))
+				if len(gnuGplLicenceFiles) == 0:
+					HTML.CreateHtmlTestRow('Files w/ GNU GPL License', 'OK', CONST.ALL_PROCESSES_OK)
+				else:
+					html_queue = SimpleQueue()
+					html_cell = '<pre style="background-color:white">\n'
+					html_cell += 'Number of files not respecting: ' + str(len(gnuGplLicenceFiles)) + '\n'
+					for nFile in gnuGplLicenceFiles:
+						html_cell += str(nFile).strip() + '\n'
+					html_cell += '</pre>'
+					html_queue.put(html_cell)
+					HTML.CreateHtmlTestRowQueue('Files w/ GNU GPL License', 'KO', 1, html_queue)
+					del(html_cell)
+					del(html_queue)
+					finalStatus = -1
+
+				logging.debug('files with a suspect license: ' + str(len(suspectLicenceFiles)))
+				if len(suspectLicenceFiles) == 0:
+					HTML.CreateHtmlTestRow('Files with suspect license', 'OK', CONST.ALL_PROCESSES_OK)
+				else:
+					html_queue = SimpleQueue()
+					html_cell = '<pre style="background-color:white">\n'
+					html_cell += 'Number of files not respecting: ' + str(len(suspectLicenceFiles)) + '\n'
+					for nFile in suspectLicenceFiles:
+						html_cell += str(nFile).strip() + '\n'
+					html_cell += '</pre>'
+					html_queue.put(html_cell)
+					HTML.CreateHtmlTestRowQueue('Files with suspect license', 'KO', 1, html_queue)
+					del(html_cell)
+					del(html_queue)
+					finalStatus = -1
+
+			else:
+				finalStatus = -1
+				HTML.htmleNBFailureMsg = 'Could not fully analyze oai-formatting-check.txt file'
+				HTML.CreateHtmlTestRow('N/A', 'KO', CONST.ENB_PROCESS_NOLOGFILE_TO_ANALYZE)
+		else:
+			finalStatus = -1
+			HTML.htmleNBFailureMsg = 'Could not access oai-formatting-check.txt file'
+			HTML.CreateHtmlTestRow('N/A', 'KO', CONST.ENB_PROCESS_NOLOGFILE_TO_ANALYZE)
+
+		return finalStatus
diff --git a/ci-scripts/conf_files/benetel-5g.conf b/ci-scripts/conf_files/benetel-5g.conf
index 8f3b03fddc52948faeabdb00de9826daaeb21c96..3b872e56e96dfe18b7e7ee23c07fbef07985eb78 100644
--- a/ci-scripts/conf_files/benetel-5g.conf
+++ b/ci-scripts/conf_files/benetel-5g.conf
@@ -21,8 +21,6 @@ gNBs =
 
     ////////// Physical parameters:
 
-    ssb_SubcarrierOffset                                      = 31; //0;
-
     servingCellConfigCommon = (
     {
  #spCellConfigCommon
diff --git a/ci-scripts/conf_files/episci/episci_gnb.band78.sa.fr1.106PRB.usrpn310.conf b/ci-scripts/conf_files/episci/episci_gnb.band78.sa.fr1.106PRB.usrpn310.conf
index 51ffb1d5cd2bb59f7818b390564b51278ec21ab7..a648db0efece1d80a10b665495cbee2453d2a5b9 100644
--- a/ci-scripts/conf_files/episci/episci_gnb.band78.sa.fr1.106PRB.usrpn310.conf
+++ b/ci-scripts/conf_files/episci/episci_gnb.band78.sa.fr1.106PRB.usrpn310.conf
@@ -32,7 +32,6 @@ gNBs =
 
     ////////// Physical parameters:
 
-    ssb_SubcarrierOffset                                      = 0;
     min_rxtxtime = 6;
      pdcch_ConfigSIB1 = (
       {
diff --git a/ci-scripts/conf_files/episci/episci_rcc.band78.tm1.106PRB.nfapi.conf b/ci-scripts/conf_files/episci/episci_rcc.band78.tm1.106PRB.nfapi.conf
index eac0b746336cdd9901d1ae5a73e862843c05048b..0db6ac9036b143ae162b2e573006b5778dbb2832 100644
--- a/ci-scripts/conf_files/episci/episci_rcc.band78.tm1.106PRB.nfapi.conf
+++ b/ci-scripts/conf_files/episci/episci_rcc.band78.tm1.106PRB.nfapi.conf
@@ -21,7 +21,6 @@ gNBs =
 
     ////////// Physical parameters:
 
-    ssb_SubcarrierOffset                                      = 31; //0;
     min_rxtxtime = 6;
 
      pdcch_ConfigSIB1 = (
diff --git a/ci-scripts/conf_files/episci/proxy_gnb.band78.sa.fr1.106PRB.usrpn310.conf b/ci-scripts/conf_files/episci/proxy_gnb.band78.sa.fr1.106PRB.usrpn310.conf
index f80ce3751a93ed88e88c9fe95f1083c02052a454..84cb18d435f613576d80afd25b07e0c0939f0c90 100644
--- a/ci-scripts/conf_files/episci/proxy_gnb.band78.sa.fr1.106PRB.usrpn310.conf
+++ b/ci-scripts/conf_files/episci/proxy_gnb.band78.sa.fr1.106PRB.usrpn310.conf
@@ -32,7 +32,6 @@ gNBs =
 
     ////////// Physical parameters:
 
-    ssb_SubcarrierOffset                                      = 0;
     min_rxtxtime = 6;
 
      pdcch_ConfigSIB1 = (
diff --git a/ci-scripts/conf_files/episci/proxy_rcc.band78.tm1.106PRB.nfapi.conf b/ci-scripts/conf_files/episci/proxy_rcc.band78.tm1.106PRB.nfapi.conf
index f61039ff17349fe8b7abca2109e6d491f1ab2e85..270ad7584578c938b41254d62a72abaedf7729dc 100644
--- a/ci-scripts/conf_files/episci/proxy_rcc.band78.tm1.106PRB.nfapi.conf
+++ b/ci-scripts/conf_files/episci/proxy_rcc.band78.tm1.106PRB.nfapi.conf
@@ -21,7 +21,6 @@ gNBs =
 
     ////////// Physical parameters:
 
-    ssb_SubcarrierOffset                                      = 0;
     min_rxtxtime = 6;
 	
     servingCellConfigCommon = (
diff --git a/ci-scripts/conf_files/gNB_SA_CU.conf b/ci-scripts/conf_files/gNB_SA_CU.conf
index 9d64ae1976f9ab49720ba9aa338f97af2c69404a..f6d3e8575a7e2c58ea841a196f38fba733fb6678 100644
--- a/ci-scripts/conf_files/gNB_SA_CU.conf
+++ b/ci-scripts/conf_files/gNB_SA_CU.conf
@@ -44,7 +44,6 @@ gNBs =
     local_s_portd   = 2152;
     remote_s_portc  = 500;
     remote_s_portd  = 2152;
-    ssb_SubcarrierOffset                                      = 0;
     min_rxtxtime                                              = 6;
 
      pdcch_ConfigSIB1 = (
diff --git a/ci-scripts/conf_files/gNB_SA_DU.conf b/ci-scripts/conf_files/gNB_SA_DU.conf
index f95bdf91aee97e2c4c02f8b89db251622bacaf0c..4309c13dd395a172e589e66b4efc469e585fbf04 100644
--- a/ci-scripts/conf_files/gNB_SA_DU.conf
+++ b/ci-scripts/conf_files/gNB_SA_DU.conf
@@ -36,7 +36,6 @@ gNBs =
 
     ////////// Physical parameters:
 
-    ssb_SubcarrierOffset                                      = 0;
     min_rxtxtime                                              = 6;
 
     pdcch_ConfigSIB1 = (
diff --git a/ci-scripts/conf_files/gNB_SA_n78_106PRB.2x2_usrpn310.conf b/ci-scripts/conf_files/gNB_SA_n78_106PRB.2x2_usrpn310.conf
index d6edc092865e9247b94e09491d85a0d2f9af3a54..49383072ed12e2fc36921bef6623b99c7dec415d 100644
--- a/ci-scripts/conf_files/gNB_SA_n78_106PRB.2x2_usrpn310.conf
+++ b/ci-scripts/conf_files/gNB_SA_n78_106PRB.2x2_usrpn310.conf
@@ -37,8 +37,7 @@ gNBs =
 
     ////////// Physical parameters:
 
-    ssb_SubcarrierOffset                                      = 0;
-    pdsch_AntennaPorts_N1                                     = 2;
+    pdsch_AntennaPorts_XP                                     = 2;
     pusch_AntennaPorts                                        = 2;
 
     pdcch_ConfigSIB1 = (
diff --git a/ci-scripts/conf_files/gNB_SA_n78_133PRB.2x2_usrpn310.conf b/ci-scripts/conf_files/gNB_SA_n78_133PRB.2x2_usrpn310.conf
index 7f4b11c35d8a598c8462050b8521ee3b611a32cf..610485fc9245fa2407a6ad79ce94474751f3a4c6 100644
--- a/ci-scripts/conf_files/gNB_SA_n78_133PRB.2x2_usrpn310.conf
+++ b/ci-scripts/conf_files/gNB_SA_n78_133PRB.2x2_usrpn310.conf
@@ -38,8 +38,7 @@ gNBs =
 
     ////////// Physical parameters:
 
-    ssb_SubcarrierOffset                                      = 0;
-    pdsch_AntennaPorts_N1                                     = 2;
+    pdsch_AntennaPorts_XP                                     = 2;
     pusch_AntennaPorts                                        = 2;
 
     pdcch_ConfigSIB1 = (
diff --git a/ci-scripts/conf_files/gnb.band261.tm1.32PRB.usrpn300.conf b/ci-scripts/conf_files/gnb.band261.tm1.32PRB.usrpn300.conf
index dcb3dd89b76fccd7eb91ca2b2d97f9d0c362377a..24ec8f17f8d1b7a92e80af13371ba90266bb3a68 100644
--- a/ci-scripts/conf_files/gnb.band261.tm1.32PRB.usrpn300.conf
+++ b/ci-scripts/conf_files/gnb.band261.tm1.32PRB.usrpn300.conf
@@ -21,7 +21,6 @@ gNBs =
 
     ////////// Physical parameters:
 
-    ssb_SubcarrierOffset                                      = 0;
     min_rxtxtime                                              = 6;
 	
     servingCellConfigCommon = (
diff --git a/ci-scripts/conf_files/gnb.band66.tm1.106PRB.usrpn300.conf b/ci-scripts/conf_files/gnb.band66.tm1.106PRB.usrpn300.conf
index 1019ec75ade5bb36558e7bb49bcfae9e0ffb6002..b3c7d7d1da5556e29143354918f0ed8647457627 100644
--- a/ci-scripts/conf_files/gnb.band66.tm1.106PRB.usrpn300.conf
+++ b/ci-scripts/conf_files/gnb.band66.tm1.106PRB.usrpn300.conf
@@ -21,7 +21,6 @@ gNBs =
 
     ////////// Physical parameters:
 
-    ssb_SubcarrierOffset                                      = 0;
     min_rxtxtime                                              = 6;
 
     servingCellConfigCommon = (
diff --git a/ci-scripts/conf_files/gnb.band78.nsa_2x2.106PRB.usrpn310.conf b/ci-scripts/conf_files/gnb.band78.nsa_2x2.106PRB.usrpn310.conf
index fa7c1905385be2d9420a39de8a2c02fc309aab36..c668601c063d0b8ea870b2fc372fdbbf2d5985f0 100644
--- a/ci-scripts/conf_files/gnb.band78.nsa_2x2.106PRB.usrpn310.conf
+++ b/ci-scripts/conf_files/gnb.band78.nsa_2x2.106PRB.usrpn310.conf
@@ -19,8 +19,7 @@ gNBs =
 
     ////////// Physical parameters:
 
-    ssb_SubcarrierOffset                                      = 31; //0;
-    pdsch_AntennaPorts_N1                                     = 2;
+    pdsch_AntennaPorts_XP                                     = 2;
     pusch_AntennaPorts                                        = 2;
     ul_prbblacklist                                           = "51,52,53,54"
 
diff --git a/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.asue.conf b/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.asue.conf
index 5e6b3fb217b52c512dc8e17e6ca6fb1acb81ec2f..92c3a7a2e985d00df2daa03ee6b8c035f699b76c 100644
--- a/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.asue.conf
+++ b/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.asue.conf
@@ -41,7 +41,6 @@ gNBs =
 
     ////////// Physical parameters:
 
-    ssb_SubcarrierOffset                                      = 0;
     pusch_AntennaPorts                                        = 2;
     ul_prbblacklist                                           = "51,52,53,54"
     do_SRS                                                    = 1;
diff --git a/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.conf b/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.conf
index 8489008300de5b4e7bff0a389f43be46a94b4ae8..672713d5042adafadefcbf583ef23fa264618ca7 100644
--- a/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.conf
+++ b/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.conf
@@ -37,8 +37,7 @@ gNBs =
 
     ////////// Physical parameters:
 
-    ssb_SubcarrierOffset                                      = 0;
-    pdsch_AntennaPorts_N1                                     = 2;
+    pdsch_AntennaPorts_XP                                     = 2;
     pusch_AntennaPorts                                        = 2;
     ul_prbblacklist                                           = "51,52,53,54"
     do_SRS                                                    = 1;
diff --git a/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.ddsuu.2x2.usrpn310.conf b/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.ddsuu.2x2.usrpn310.conf
index 18ca7b5d1e8e31cf2f1abe3416b70a0a49bb5382..5bd8b26e054674aaa58eaa6138fd4708a4580028 100644
--- a/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.ddsuu.2x2.usrpn310.conf
+++ b/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.ddsuu.2x2.usrpn310.conf
@@ -37,7 +37,6 @@ gNBs =
 
     ////////// Physical parameters:
 
-    ssb_SubcarrierOffset                                      = 0;
     pusch_AntennaPorts                                        = 2;
     ul_prbblacklist                                           = "51,52,53,54"
     do_SRS                                                    = 1;
diff --git a/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.usrpn310.conf b/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.usrpn310.conf
index 9e1f499f0342d00c41a66786e6a2e3763f689c28..e1264bd069e5bc9b9699a842d616ae85897f1f9a 100644
--- a/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.usrpn310.conf
+++ b/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.usrpn310.conf
@@ -37,7 +37,6 @@ gNBs =
 
     ////////// Physical parameters:
 
-    ssb_SubcarrierOffset                                      = 0;
     #pusch_TargetSNRx10                                        = 200;
     #pucch_TargetSNRx10                                        = 200;
     ul_prbblacklist                                           = "51,52,53,54"
diff --git a/ci-scripts/conf_files/gnb.band78.sa.fr1.162PRB.2x2.usrpn310.conf b/ci-scripts/conf_files/gnb.band78.sa.fr1.162PRB.2x2.usrpn310.conf
index ce63578dd3740c2308550a1544ae2ea32701ca2f..f92242138c7b41ae473654e4cbde273ae503b4ab 100644
--- a/ci-scripts/conf_files/gnb.band78.sa.fr1.162PRB.2x2.usrpn310.conf
+++ b/ci-scripts/conf_files/gnb.band78.sa.fr1.162PRB.2x2.usrpn310.conf
@@ -37,8 +37,7 @@ gNBs =
 
     ////////// Physical parameters:
 
-    ssb_SubcarrierOffset                                      = 0;
-    pdsch_AntennaPorts_N1                                     = 2;
+    pdsch_AntennaPorts_XP                                     = 2;
     pusch_AntennaPorts                                        = 2;
     #pusch_TargetSNRx10                                        = 200;
     #pucch_TargetSNRx10                                        = 200;
diff --git a/ci-scripts/conf_files/gnb.band78.tm1.106PRB.usrpn300.conf b/ci-scripts/conf_files/gnb.band78.tm1.106PRB.usrpn300.conf
index 0c7508039856bb00cff9b70ad7a8eb96d4266589..9334f2cf5918de0caae334c7bc07ebb0202f7718 100644
--- a/ci-scripts/conf_files/gnb.band78.tm1.106PRB.usrpn300.conf
+++ b/ci-scripts/conf_files/gnb.band78.tm1.106PRB.usrpn300.conf
@@ -21,7 +21,6 @@ gNBs =
 
     ////////// Physical parameters:
 
-    ssb_SubcarrierOffset = 0;
     min_rxtxtime = 6;
 
     servingCellConfigCommon = (
@@ -219,7 +218,7 @@ RUs = (
          ## beamforming 4x4 matrix:
          #bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff];
 
-         sdr_addrs = "addr=192.168.10.2,second_addr=192.168.20.2,mgmt_addr=192.168.18.85";
+         sdr_addrs = "addr=192.168.10.2,second_addr=192.168.20.2";
     }
 );  
 
diff --git a/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf b/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf
index f3515d388248d851fe8bbcffbf2bec39883e42ce..cd3ab6278e03d207e1426d11351ffe8c81c9f653 100644
--- a/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf
+++ b/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf
@@ -19,7 +19,6 @@ gNBs =
 
     ////////// Physical parameters:
 
-    ssb_SubcarrierOffset                                      = 31; //0;
  
     servingCellConfigCommon = (
     {
diff --git a/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpn310.conf b/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpn310.conf
index 8f480d375717f5af5ea711ab5102bd93e9fbe080..371753eccc301bde31f96a1394ebb310c65d73c8 100644
--- a/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpn310.conf
+++ b/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpn310.conf
@@ -20,7 +20,6 @@ gNBs =
 
     ////////// Physical parameters:
 
-    ssb_SubcarrierOffset                                      = 31; //0;
     min_rxtxtime = 6;
  
     servingCellConfigCommon = (
diff --git a/ci-scripts/conf_files/gnb.sa.band66.fr1.106PRB.usrpn300.conf b/ci-scripts/conf_files/gnb.sa.band66.fr1.106PRB.usrpn300.conf
index b78ca916f3c7983e8a3ee6ad06a9b5ca19152964..197e1d211cd58e743b621c4aed167483e559749f 100644
--- a/ci-scripts/conf_files/gnb.sa.band66.fr1.106PRB.usrpn300.conf
+++ b/ci-scripts/conf_files/gnb.sa.band66.fr1.106PRB.usrpn300.conf
@@ -32,7 +32,6 @@ gNBs =
 
     ////////// Physical parameters:
 
-    ssb_SubcarrierOffset                                      = 0;
     min_rxtxtime                                              = 6;
 
      pdcch_ConfigSIB1 = (
diff --git a/ci-scripts/conf_files/gnb.sa.band78.fr1.106PRB.usrpb210.conf b/ci-scripts/conf_files/gnb.sa.band78.fr1.106PRB.usrpb210.conf
new file mode 100644
index 0000000000000000000000000000000000000000..2a6053ab461fab1c726d38605212bc6983e66724
--- /dev/null
+++ b/ci-scripts/conf_files/gnb.sa.band78.fr1.106PRB.usrpb210.conf
@@ -0,0 +1,344 @@
+Active_gNBs = ( "gNB-OAI");
+# Asn1_verbosity, choice in: none, info, annoying
+Asn1_verbosity = "none";
+
+gNBs =
+(
+ {
+    ////////// Identification parameters:
+    gNB_ID    =  0xe00;
+    gNB_name  =  "gNB-OAI";
+
+    // Tracking area code, 0x0000 and 0xfffe are reserved values
+    tracking_area_code  =  1;
+    plmn_list = ({
+                  mcc = 222;
+                  mnc = 01;
+                  mnc_length = 2;
+                  snssaiList = (
+                    {
+                      sst = 1;
+                      #sd  = 0x1; // 0 false, else true
+                    }
+                  );
+
+                  });
+
+    nr_cellid = 12345678L;
+
+    ////////// Physical parameters:
+
+    min_rxtxtime                                              = 2;
+    do_CSIRS                                                  = 1;
+    do_SRS                                                    = 1;
+
+     pdcch_ConfigSIB1 = (
+      {
+        controlResourceSetZero = 12;
+        searchSpaceZero = 0;
+      }
+      );
+
+    servingCellConfigCommon = (
+    {
+ #spCellConfigCommon
+
+      physCellId                                                    = 0;
+
+#  downlinkConfigCommon
+    #frequencyInfoDL
+      # this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP)
+      absoluteFrequencySSB                                             = 641280;
+      dl_frequencyBand                                                 = 78;
+      # this is 3600 MHz
+      dl_absoluteFrequencyPointA                                       = 640008;
+      #scs-SpecificCarrierList
+        dl_offstToCarrier                                              = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        dl_subcarrierSpacing                                           = 1;
+        dl_carrierBandwidth                                            = 106;
+     #initialDownlinkBWP
+      #genericParameters
+        # this is RBstart=27,L=48 (275*(L-1))+RBstart
+        initialDLBWPlocationAndBandwidth                               = 28875; # 6366 12925 12956 28875 12952
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        initialDLBWPsubcarrierSpacing                                   = 1;
+      #pdcch-ConfigCommon
+        initialDLBWPcontrolResourceSetZero                              = 12;
+        initialDLBWPsearchSpaceZero                                     = 0;
+
+  #uplinkConfigCommon
+     #frequencyInfoUL
+      ul_frequencyBand                                              = 78;
+      #scs-SpecificCarrierList
+      ul_offstToCarrier                                             = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      ul_subcarrierSpacing                                          = 1;
+      ul_carrierBandwidth                                           = 106;
+      pMax                                                          = 20;
+     #initialUplinkBWP
+      #genericParameters
+        initialULBWPlocationAndBandwidth                            = 28875;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        initialULBWPsubcarrierSpacing                               = 1;
+      #rach-ConfigCommon
+        #rach-ConfigGeneric
+          prach_ConfigurationIndex                                  = 98;
+#prach_msg1_FDM
+#0 = one, 1=two, 2=four, 3=eight
+          prach_msg1_FDM                                            = 0;
+          prach_msg1_FrequencyStart                                 = 0;
+          zeroCorrelationZoneConfig                                 = 13;
+          preambleReceivedTargetPower                               = -96;
+#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
+          preambleTransMax                                          = 6;
+#powerRampingStep
+# 0=dB0,1=dB2,2=dB4,3=dB6
+        powerRampingStep                                            = 1;
+#ra_ReponseWindow
+#1,2,4,8,10,20,40,80
+        ra_ResponseWindow                                           = 4;
+#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
+#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
+        ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR                = 4;
+#oneHalf (0..15) 4,8,12,16,...60,64
+        ssb_perRACH_OccasionAndCB_PreamblesPerSSB                   = 14;
+#ra_ContentionResolutionTimer
+#(0..7) 8,16,24,32,40,48,56,64
+        ra_ContentionResolutionTimer                                = 7;
+        rsrp_ThresholdSSB                                           = 19;
+#prach-RootSequenceIndex_PR
+#1 = 839, 2 = 139
+        prach_RootSequenceIndex_PR                                  = 2;
+        prach_RootSequenceIndex                                     = 1;
+        # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
+        #
+        msg1_SubcarrierSpacing                                      = 1,
+# restrictedSetConfig
+# 0=unrestricted, 1=restricted type A, 2=restricted type B
+        restrictedSetConfig                                         = 0,
+
+        msg3_DeltaPreamble                                          = 1;
+        p0_NominalWithGrant                                         =-90;
+
+# pucch-ConfigCommon setup :
+# pucchGroupHopping
+# 0 = neither, 1= group hopping, 2=sequence hopping
+        pucchGroupHopping                                           = 0;
+        hoppingId                                                   = 40;
+        p0_nominal                                                  = -90;
+# ssb_PositionsInBurs_BitmapPR
+# 1=short, 2=medium, 3=long
+      ssb_PositionsInBurst_PR                                       = 2;
+      ssb_PositionsInBurst_Bitmap                                   = 1;
+
+# ssb_periodicityServingCell
+# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
+      ssb_periodicityServingCell                                    = 2;
+
+# dmrs_TypeA_position
+# 0 = pos2, 1 = pos3
+      dmrs_TypeA_Position                                           = 0;
+
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      subcarrierSpacing                                             = 1;
+
+
+  #tdd-UL-DL-ConfigurationCommon
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      referenceSubcarrierSpacing                                    = 1;
+      # pattern1
+      # dl_UL_TransmissionPeriodicity
+      # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
+      dl_UL_TransmissionPeriodicity                                 = 6;
+      nrofDownlinkSlots                                             = 7;
+      nrofDownlinkSymbols                                           = 6;
+      nrofUplinkSlots                                               = 2;
+      nrofUplinkSymbols                                             = 4;
+
+      ssPBCH_BlockPower                                             = -25;
+  }
+
+  );
+
+# Dedicated Serving Cell Configuration
+servingCellConfigDedicated = ({
+  # BWP-Downlink
+    # BWP 1 Configuration
+      dl_bwp-Id_1 = 1;
+      dl_bwp1_locationAndBandwidth = 28875; // RBstart=0, L=106 (40 MHz BW)
+      # subcarrierSpacing
+      # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      dl_bwp1_subcarrierSpacing = 1;
+
+    # BWP 2 Configuration
+      dl_bwp-Id_2 = 2;
+      dl_bwp2_locationAndBandwidth = 13750; // RBstart=0, L=51 (20 MHz BW)
+      # subcarrierSpacing
+      # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      dl_bwp2_subcarrierSpacing = 1;
+
+    # BWP 3 Configuration
+      dl_bwp-Id_3 = 3;
+      dl_bwp3_locationAndBandwidth = 6325; // RBstart=0, L=24 (10 MHz BW)
+      # subcarrierSpacing
+      # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      dl_bwp3_subcarrierSpacing = 1;
+
+    firstActiveDownlinkBWP-Id = 1;  #BWP-Id
+    defaultDownlinkBWP-Id     = 1;  #BWP-Id
+
+    # bwp-InactivityTimer                 ENUMERATED {ms2, ms3, ms4, ms5, ms6, ms8, ms10, ms20, ms30,
+    #                                                ms40,ms50, ms60, ms80,ms100, ms200,ms300, ms500,
+    #                                                ms750, ms1280, ms1920, ms2560, spare10, spare9, spare8,
+    #                                                spare7, spare6, spare5, spare4, spare3, spare2, spare1 }
+
+  # UplinkConfig
+    # BWP-Uplink
+      # BWP 1 Configuration
+        ul_bwp-Id_1 = 1;
+        ul_bwp1_locationAndBandwidth = 28875; // RBstart=0, L=106 (40 MHz BW)
+        # subcarrierSpacing
+        # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        ul_bwp1_subcarrierSpacing = 1;
+
+      # BWP 2 Configuration
+        ul_bwp-Id_2 = 2;
+        ul_bwp2_locationAndBandwidth = 13750; // RBstart=0, L=51 (20 MHz BW)
+        # subcarrierSpacing
+        # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        ul_bwp2_subcarrierSpacing = 1;
+
+      # BWP 3 Configuration
+        ul_bwp-Id_3 = 3;
+        ul_bwp3_locationAndBandwidth = 6325; // RBstart=0, L=24 (10 MHz BW)
+        # subcarrierSpacing
+        # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        ul_bwp3_subcarrierSpacing = 1;
+
+      firstActiveUplinkBWP-Id = 1;  #BWP-Id
+  }
+);
+
+    # ------- SCTP definitions
+    SCTP :
+    {
+        # Number of streams to use in input/output
+        SCTP_INSTREAMS  = 2;
+        SCTP_OUTSTREAMS = 2;
+    };
+
+
+    ////////// AMF parameters:
+    amf_ip_address      = ( { ipv4       = "172.21.16.136";
+                              ipv6       = "192:168:30::17";
+                              active     = "yes";
+                              preference = "ipv4";
+                            }
+                          );
+
+
+    NETWORK_INTERFACES :
+    {
+        GNB_INTERFACE_NAME_FOR_NG_AMF            = "demo-oai";
+        GNB_IPV4_ADDRESS_FOR_NG_AMF              = "172.21.16.137/24";
+        GNB_INTERFACE_NAME_FOR_NGU               = "demo-oai";
+        GNB_IPV4_ADDRESS_FOR_NGU                 = "172.21.16.137/24";
+        GNB_PORT_FOR_S1U                         = 2152; # Spec 2152
+    };
+
+  }
+);
+
+MACRLCs = (
+{
+  num_cc                      = 1;
+  tr_s_preference             = "local_L1";
+  tr_n_preference             = "local_RRC";
+  pusch_TargetSNRx10          = 200;
+  pucch_TargetSNRx10          = 200;
+  ulsch_max_frame_inactivity  = 0;
+}
+);
+
+L1s = (
+{
+  num_cc = 1;
+  tr_n_preference       = "local_mac";
+  prach_dtx_threshold   = 120;
+  pucch0_dtx_threshold  = 100;
+  ofdm_offset_divisor   = 8; #set this to UINT_MAX for offset 0
+}
+);
+
+RUs = (
+{
+  local_rf       = "yes"
+  nb_tx          = 1
+  nb_rx          = 1
+  att_tx         = 10;
+  att_rx         = 10;
+  bands          = [78];
+  max_pdschReferenceSignalPower = -27;
+  max_rxgain                    = 114;
+  eNB_instances  = [0];
+  #beamforming 1x4 matrix:
+  bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000];
+  clock_src = "internal";
+}
+);
+
+THREAD_STRUCT = (
+{
+  #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+  parallel_config    = "PARALLEL_SINGLE_THREAD";
+  #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+  worker_config      = "WORKER_ENABLE";
+}
+);
+
+rfsimulator :
+{
+  serveraddr = "server";
+  serverport = "4043";
+  options = (); #("saviq"); or/and "chanmod"
+  modelname = "AWGN";
+  IQfile = "/tmp/rfsimulator.iqs";
+};
+
+security = {
+  # preferred ciphering algorithms
+  # the first one of the list that an UE supports in chosen
+  # valid values: nea0, nea1, nea2, nea3
+  ciphering_algorithms = ( "nea0" );
+
+  # preferred integrity algorithms
+  # the first one of the list that an UE supports in chosen
+  # valid values: nia0, nia1, nia2, nia3
+  integrity_algorithms = ( "nia2", "nia0" );
+
+  # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
+  # what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
+  drb_ciphering = "yes";
+  drb_integrity = "no";
+};
+
+log_config :
+{
+  global_log_level                      ="info";
+  hw_log_level                          ="info";
+  phy_log_level                         ="info";
+  mac_log_level                         ="info";
+  rlc_log_level                         ="info";
+  pdcp_log_level                        ="info";
+  rrc_log_level                         ="info";
+  ngap_log_level                        ="debug";
+  f1ap_log_level                        ="debug";
+};
+
diff --git a/ci-scripts/conf_files/gnb.sa.band78.fr1.24PRB.usrpb210.conf b/ci-scripts/conf_files/gnb.sa.band78.fr1.24PRB.usrpb210.conf
index bd3076a014cc9d75098288ca4c0cca05cb8b0d29..ad1471339a249a39b5308b122f7b864a7b4db5c3 100644
--- a/ci-scripts/conf_files/gnb.sa.band78.fr1.24PRB.usrpb210.conf
+++ b/ci-scripts/conf_files/gnb.sa.band78.fr1.24PRB.usrpb210.conf
@@ -32,9 +32,6 @@ gNBs =
 
     ////////// Physical parameters:
 
-    ssb_SubcarrierOffset                                      = 0;
-    pdsch_AntennaPorts                                        = 1;
-    pusch_AntennaPorts                                        = 1;
     sib1_tda                                                  = 15;
     min_rxtxtime = 6;
 
diff --git a/ci-scripts/datalog_rt_stats.2x2.yaml b/ci-scripts/datalog_rt_stats.2x2.yaml
index a93ef6aa8c879cee167e27360709511a1233ac97..eccde746cc773bba350961a45ce4bbb8ea1c2d4c 100644
--- a/ci-scripts/datalog_rt_stats.2x2.yaml
+++ b/ci-scripts/datalog_rt_stats.2x2.yaml
@@ -16,7 +16,7 @@ Ref :
   L1 Rx processing : 175.0
   PUSCH inner-receiver : 100.0
   PUSCH decoding : 180.0 
-  DL & UL scheduling timing stats : 37.0
+  DL & UL scheduling timing : 37.0
   UL Indication : 38.0
 Threshold :
   feprx : 1.25
@@ -28,5 +28,5 @@ Threshold :
   L1 Rx processing : 1.25
   PUSCH inner-receiver : 1.25
   PUSCH decoding : 1.25
-  DL & UL scheduling timing stats : 1.25
+  DL & UL scheduling timing : 1.25
   UL Indication : 1.25
diff --git a/ci-scripts/datalog_rt_stats.default.yaml b/ci-scripts/datalog_rt_stats.default.yaml
index 02a90c86f4e2fd7b97b408cebc89f122256e44ef..97591a766dcd1cc8a18a831b0a48d6c481695473 100644
--- a/ci-scripts/datalog_rt_stats.default.yaml
+++ b/ci-scripts/datalog_rt_stats.default.yaml
@@ -15,8 +15,9 @@ Ref :
   DLSCH encoding : 230.0
   L1 Rx processing : 175.0
   PUSCH inner-receiver : 100.0
-  PUSCH decoding : 180.0 
-  DL & UL scheduling timing stats : 37.0
+  #PUSCH decoding : 180.0
+  PUSCH decoding : 240.0
+  DL & UL scheduling timing : 37.0
   UL Indication : 38.0
 Threshold :
   feprx : 1.25
@@ -28,5 +29,5 @@ Threshold :
   L1 Rx processing : 1.25
   PUSCH inner-receiver : 1.25
   PUSCH decoding : 1.25
-  DL & UL scheduling timing stats : 1.25
+  DL & UL scheduling timing : 1.25
   UL Indication : 1.25
diff --git a/ci-scripts/docker/Dockerfile.formatting.bionic b/ci-scripts/docker/Dockerfile.formatting.bionic
new file mode 100644
index 0000000000000000000000000000000000000000..01417a3bdb3c68385cac0141a971d7ab90002c21
--- /dev/null
+++ b/ci-scripts/docker/Dockerfile.formatting.bionic
@@ -0,0 +1,31 @@
+FROM ubuntu:bionic AS oai-formatting-check
+
+ARG MERGE_REQUEST
+ARG SRC_BRANCH
+ARG TARGET_BRANCH
+ENV DEBIAN_FRONTEND=noninteractive
+
+RUN apt-get update && \
+    DEBIAN_FRONTEND=noninteractive apt-get upgrade --yes && \
+    DEBIAN_FRONTEND=noninteractive apt-get install --yes \
+       astyle \
+       gawk \
+       git
+
+WORKDIR /oai-ran
+COPY . .
+
+RUN /bin/bash -c "if [[ -v MERGE_REQUEST ]]; then echo 'Source Branch = $SRC_BRANCH'; echo 'Target Branch = $TARGET_BRANCH'; else echo 'Push to develop'; fi"
+RUN /bin/bash -c "if [[ -v MERGE_REQUEST ]]; then ./ci-scripts/checkCodingFormattingRules.sh --src-branch $SRC_BRANCH --target-branch $TARGET_BRANCH; else ./ci-scripts/checkCodingFormattingRules.sh; fi"
+
+RUN echo "=== Files not properly formatted ===" && \
+    /bin/bash -c "if [[ -f oai_rules_result_list.txt ]]; then cat oai_rules_result_list.txt; fi"
+
+RUN echo "=== Files with incorrect define protection ===" && \
+   /bin/bash -c "if [[ -f header-files-w-incorrect-define.txt ]]; then cat header-files-w-incorrect-define.txt; fi"
+
+RUN echo "=== Files with a GNU GPL licence Banner ===" && \
+   /bin/bash -c "if [[ -f files-w-gnu-gpl-license-banner.txt ]]; then cat files-w-gnu-gpl-license-banner.txt; fi"
+
+RUN echo "=== Files with a suspect Banner ===" && \
+  /bin/bash -c "if [[ -f files-w-suspect-banner.txt ]]; then cat files-w-suspect-banner.txt; fi"
diff --git a/ci-scripts/epc.py b/ci-scripts/epc.py
index 0fc37d4ead75759dfacecc3474be9e956afe1dc4..9113d29ac9b6b6e367ebf15327c600117b2ddd8e 100644
--- a/ci-scripts/epc.py
+++ b/ci-scripts/epc.py
@@ -255,16 +255,19 @@ class EPCManagement():
 			mySSH.command('mkdir -p ' + self.SourceCodePath + '/scripts', '\$', 5)
 			mySSH.command('cd /opt/oai-cn5g-fed-v1.3/docker-compose', '\$', 5)
 			mySSH.command('python3 ./core-network.py '+self.cfgDeploy, '\$', 60)
-			time.sleep(2)
-			mySSH.command('docker-compose -p 5gcn ps -a', '\$', 60)
+			if re.search('start-mini-as-ue', self.cfgDeploy):
+				dFile = 'docker-compose-mini-nrf-asue.yaml'
+			else:
+				dFile = 'docker-compose-mini-nrf.yaml'
+			mySSH.command('docker-compose -p 5gcn -f ' + dFile + ' ps -a', '\$', 60)
 			if mySSH.getBefore().count('Up (healthy)') != 6:
 				logging.error('Not all container healthy')
 			else:
-				logging.debug('OK')
-			mySSH.command('docker-compose config | grep --colour=never image', '\$', 10)
+				logging.debug('OK --> all containers are healthy')
+			mySSH.command('docker-compose -p 5gcn -f ' + dFile + ' config | grep --colour=never image', '\$', 10)
 			listOfImages = mySSH.getBefore()
 			for imageLine in listOfImages.split('\\r\\n'):
-				res1 = re.search('image: (?P<name>[a-zA-Z0-9\-]+):(?P<tag>[a-zA-Z0-9\-]+)', str(imageLine))
+				res1 = re.search('image: (?P<name>[a-zA-Z0-9\-/]+):(?P<tag>[a-zA-Z0-9\-]+)', str(imageLine))
 				res2 = re.search('mysql', str(imageLine))
 				if res1 is not None and res2 is None:
 					html_cell += res1.group('name') + ':' + res1.group('tag') + ' '
@@ -308,6 +311,8 @@ class EPCManagement():
 				tmp = str(response[0],'utf-8')
 				self.MmeIPAddress = tmp.rstrip()
 				logging.debug('AMF IP Address ' + self.MmeIPAddress)
+			else:
+				logging.error('no container with name oai-amf found, could not retrieve AMF IP address')
 			mySSH.close()
 
 	def CheckHSSProcess(self, status_queue):
@@ -536,7 +541,7 @@ class EPCManagement():
 			mySSH.command('python3 ./core-network.py '+self.cfgUnDeploy, '\$', 60)
 			mySSH.command('docker volume prune --force || true', '\$', 60)
 			time.sleep(2)
-			mySSH.command('tshark -r /tmp/oai-cn5g.pcap | egrep --colour=never "Tracking area update" ','\$', 30)
+			mySSH.command('tshark -r /tmp/oai-cn5g-v1.3.pcap | egrep --colour=never "Tracking area update" ','\$', 30)
 			result = re.search('Tracking area update request', mySSH.getBefore())
 			if result is not None:
 				message = 'UE requested ' + str(mySSH.getBefore().count('Tracking area update request')) + 'Tracking area update request(s)'
@@ -830,8 +835,8 @@ class EPCManagement():
 				mySSH.command('zip mme.log.zip mme_check_run.*', '\$', 60)
 		elif re.match('OAICN5G', self.Type, re.IGNORECASE):
 			mySSH.command('cd ' + self.SourceCodePath + '/logs','\$', 5)
-			mySSH.command('cp -f /tmp/oai-cn5g.pcap .','\$', 30)
-			mySSH.command('zip mme.log.zip oai-amf.log oai-nrf.log oai-cn5g.pcap','\$', 30)
+			mySSH.command('cp -f /tmp/oai-cn5g-v1.3.pcap .','\$', 30)
+			mySSH.command('zip mme.log.zip oai-amf.log oai-nrf.log oai-cn5g*.pcap','\$', 30)
 			mySSH.command('mv mme.log.zip ' + self.SourceCodePath + '/scripts','\$', 30)
 		elif re.match('OAI', self.Type, re.IGNORECASE) or re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE):
 			mySSH.command('zip mme.log.zip mme*.log', '\$', 60)
diff --git a/ci-scripts/main.py b/ci-scripts/main.py
index 03947bdfc968c83f83eed43a6f0ab05212b6c218..baed6a6011981f13d8f1885c78065836cb8967f1 100644
--- a/ci-scripts/main.py
+++ b/ci-scripts/main.py
@@ -102,7 +102,7 @@ def AssignParams(params_dict):
 
 
 def GetParametersFromXML(action):
-	if action == 'Build_eNB' or action == 'Build_Image':
+	if action == 'Build_eNB' or action == 'Build_Image' or action == 'Build_Proxy':
 		RAN.Build_eNB_args=test.findtext('Build_eNB_args')
 		CONTAINERS.imageKind=test.findtext('kind')
 		forced_workspace_cleanup = test.findtext('forced_workspace_cleanup')
@@ -138,6 +138,9 @@ def GetParametersFromXML(action):
 				RAN.backgroundBuild=True
 			else:
 				RAN.backgroundBuild=False
+		proxy_commit = test.findtext('proxy_commit')
+		if proxy_commit is not None:
+			CONTAINERS.proxyCommit = proxy_commit
 
 	elif action == 'WaitEndBuild_eNB':
 		RAN.Build_eNB_args=test.findtext('Build_eNB_args')
@@ -799,7 +802,7 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
 	HTML.startTime=int(round(time.time() * 1000))
 	while CiTestObj.FailReportCnt < CiTestObj.repeatCounts[0] and RAN.prematureExit:
 		RAN.prematureExit=False
-		# At every iteratin of the retry loop, a separator will be added
+		# At every iteration of the retry loop, a separator will be added
 		# pass CiTestObj.FailReportCnt as parameter of HTML.CreateHtmlRetrySeparator
 		HTML.CreateHtmlRetrySeparator(CiTestObj.FailReportCnt)
 		for test_case_id in todo_tests:
@@ -915,14 +918,22 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
 					HTML=ldpc.Run_PhySim(HTML,CONST,id)
 				elif action == 'Build_Image':
 					CONTAINERS.BuildImage(HTML)
+				elif action == 'Build_Proxy':
+					CONTAINERS.BuildProxy(HTML)
 				elif action == 'Copy_Image_to_Test':
 					CONTAINERS.Copy_Image_to_Test_Server(HTML)
 				elif action == 'Deploy_Object':
 					CONTAINERS.DeployObject(HTML, EPC)
+					if CONTAINERS.exitStatus==1:
+						RAN.prematureExit = True
 				elif action == 'Undeploy_Object':
 					CONTAINERS.UndeployObject(HTML, RAN)
 				elif action == 'Cppcheck_Analysis':
 					SCA.CppCheckAnalysis(HTML)
+				elif action == 'LicenceAndFormattingCheck':
+					ret = SCA.LicenceAndFormattingCheck(HTML)
+					if ret != 0:
+						RAN.prematureExit = True
 				elif action == 'Deploy_Run_PhySim':
 					PHYSIM.Deploy_PhySim(HTML, RAN)
 				elif action == 'DeployGenObject':
diff --git a/ci-scripts/ran.py b/ci-scripts/ran.py
index 97c5b9696ee0d32dd7164e73103ffde2f69e782e..680763d247dbac6a152913c13c3379f8eef66bda 100644
--- a/ci-scripts/ran.py
+++ b/ci-scripts/ran.py
@@ -383,17 +383,19 @@ class RANManagement():
 
 
 		# If tracer options is on, running tshark on EPC side and capture traffic b/ EPC and eNB
-		localEpcIpAddr = EPC.IPAddress
-		localEpcUserName = EPC.UserName
-		localEpcPassword = EPC.Password
-		mySSH.open(localEpcIpAddr, localEpcUserName, localEpcPassword)
-		eth_interface = 'any'
-		fltr = 'sctp'
-		logging.debug('\u001B[1m Launching tshark on interface ' + eth_interface + ' with filter "' + fltr + '"\u001B[0m')
-		self.epcPcapFile = 'enb_' + self.testCase_id + '_s1log.pcap'
-		mySSH.command('echo ' + localEpcPassword + ' | sudo -S rm -f /tmp/' + self.epcPcapFile , '\$', 5)
-		mySSH.command('echo $USER; nohup sudo tshark -f "host ' + lIpAddr +'" -i ' + eth_interface + ' -f "' + fltr + '" -w /tmp/' + self.epcPcapFile + ' > /tmp/tshark.log 2>&1 &', localEpcUserName, 5)
-		mySSH.close()
+		if EPC.IPAddress != "none":
+			localEpcIpAddr = EPC.IPAddress
+			localEpcUserName = EPC.UserName
+			localEpcPassword = EPC.Password
+			mySSH.open(localEpcIpAddr, localEpcUserName, localEpcPassword)
+			eth_interface = 'any'
+			fltr = 'sctp'
+			logging.debug('\u001B[1m Launching tshark on interface ' + eth_interface + ' with filter "' + fltr + '"\u001B[0m')
+			self.epcPcapFile = 'enb_' + self.testCase_id + '_s1log.pcap'
+			mySSH.command('echo ' + localEpcPassword + ' | sudo -S rm -f /tmp/' + self.epcPcapFile , '\$', 5)
+			mySSH.command('echo $USER; nohup sudo tshark -f "host ' + lIpAddr +'" -i ' + eth_interface + ' -f "' + fltr + '" -w /tmp/' + self.epcPcapFile + ' > /tmp/tshark.log 2>&1 &', localEpcUserName, 5)
+			mySSH.close()
+
 		mySSH.open(lIpAddr, lUserName, lPassWord)
 		mySSH.command('cd ' + lSourcePath, '\$', 5)
 		# Initialize_eNB_args usually start with -O and followed by the location in repository
diff --git a/ci-scripts/ran_dashboard/Hdashboard.py b/ci-scripts/ran_dashboard/Hdashboard.py
index 1b65c7af4f0b78d2b8b2c1680857bf9ef7362e0f..bfa07557bdea40a92bd5bd001315b0fe35e829f2 100644
--- a/ci-scripts/ran_dashboard/Hdashboard.py
+++ b/ci-scripts/ran_dashboard/Hdashboard.py
@@ -528,15 +528,15 @@ class Dashboard:
             editable_mr = project.mergerequests.get(int(mr))
             mr_notes = editable_mr.notes.list(all=True)
 
-            body = '<a href="https://oaitestdashboard.s3.eu-west-1.amazonaws.com/MR'+mr+'/index.html">Consolidated Test Results</a><br>'+\
-                'Tested CommitID: ' + commit + '<br>'
+            body =  '[Consolidated Test Results](https://oaitestdashboard.s3.eu-west-1.amazonaws.com/MR'+mr+'/index.html)\\\n'
+            body += 'Tested CommitID: ' + commit
 
             for i in range(0,n_tests):
                 jobname = args[4*i]
                 buildurl = args[4*i+1]
                 buildid = args[4*i+2]
                 status = args[4*i+3]
-                body += jobname+', status is <b>'+status+'</b>, (<a href="'+buildurl+'">'+buildid+'</a>)<br>'
+                body += '\\\n' + jobname + ': **'+status+'** ([' + buildid + '](' + buildurl + '))'
 
             #create new note
             mr_note = editable_mr.notes.create({
diff --git a/ci-scripts/sshconnection.py b/ci-scripts/sshconnection.py
index dca3daa817ce8c1ab13cff291b29df605894092f..035da71426aa4a20b6d0bf5efc87fdbbdfacd229 100644
--- a/ci-scripts/sshconnection.py
+++ b/ci-scripts/sshconnection.py
@@ -60,7 +60,7 @@ class SSHConnection():
 		count = 0
 		connect_status = False
 		while count < 4:
-			self.ssh = pexpect.spawn('ssh -o PubkeyAuthentication=no {}@{}'.format(username,ipaddress))
+			self.ssh = pexpect.spawn('ssh -o PubkeyAuthentication=yes {}@{}'.format(username,ipaddress))
 			# Longer timeout at connection due to asterix slowness
 			self.ssh.timeout = 25
 			self.sshresponse = self.ssh.expect(['Are you sure you want to continue connecting (yes/no)?', 'password:', 'Last login', pexpect.EOF, pexpect.TIMEOUT])
@@ -84,14 +84,11 @@ class SSHConnection():
 				else:
 					logging.debug('self.sshresponse = ' + str(self.sshresponse))
 			elif self.sshresponse == 2:
-				# Checking if we are really on the remote client defined by its IP address
-				self.command('stdbuf -o0 ifconfig | egrep --color=never "inet addr:|inet "', prompt, 5)
-				result = re.search(str(ipaddress), str(self.ssh.before))
-				if result is None:
-					self.close()
-				else:
-					count = 10
-					connect_status = True
+				# We directly ended up on the remote server because of pubkey auth
+				count = 10
+				connect_status = True
+				# this expect() seems to be necessary to advance the read buffer until the prompt, or getBefore() will not return the last command
+				self.sshresponse = self.ssh.expect([prompt])
 			else:
 				# debug output
 				logging.debug(str(self.ssh.before))
@@ -272,4 +269,4 @@ class SSHConnection():
 			sys.exit('SCP failed')
 
 	def getBefore(self):
-		return str(self.ssh.before)
+		return self.ssh.before.decode('utf-8')
diff --git a/ci-scripts/stats_monitor_conf.yaml b/ci-scripts/stats_monitor_conf.yaml
index 9a2ececd1833b93072844d6668a8120ecb50a307..4e1f87ed176e2dd1350bd82eb0742a46924b2b81 100644
--- a/ci-scripts/stats_monitor_conf.yaml
+++ b/ci-scripts/stats_monitor_conf.yaml
@@ -25,7 +25,7 @@ gnb :
     L1 Rx processing:
     PUSCH inner-receiver:
     PUSCH decoding:
-    DL & UL scheduling timing stats:
+    DL & UL scheduling timing:
     UL Indication:
   graph : 
     page1:
@@ -45,5 +45,5 @@ gnb :
     page4:
       rt.PUSCH inner-receiver:
       rt.PUSCH decoding:
-      rt.DL & UL scheduling timing stats:
+      rt.DL & UL scheduling timing:
       rt.UL Indication:
diff --git a/ci-scripts/xml_class_list.yml b/ci-scripts/xml_class_list.yml
index d6f75191a8da8bc7818d9c7d55adc8b9aad5d21d..2c5f04b11fada246e667a2dcf74b5cd8b9c0dfb8 100755
--- a/ci-scripts/xml_class_list.yml
+++ b/ci-scripts/xml_class_list.yml
@@ -1,3 +1,4 @@
+  - Build_Proxy
   - Build_PhySim
   - Run_PhySim
   - Build_eNB
@@ -47,3 +48,4 @@
   - PingFromContainer
   - IperfFromContainer
   - StatsFromGenObject
+  - LicenceAndFormattingCheck
diff --git a/ci-scripts/xml_files/container_5g_l2sim_proxy.xml b/ci-scripts/xml_files/container_5g_l2sim_proxy.xml
new file mode 100644
index 0000000000000000000000000000000000000000..af1715d793669550b31871c5421620568aecb604
--- /dev/null
+++ b/ci-scripts/xml_files/container_5g_l2sim_proxy.xml
@@ -0,0 +1,42 @@
+<!--
+
+ Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The OpenAirInterface Software Alliance licenses this file to You under
+ the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.openairinterface.org/?page_id=698
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+ For more information about the OpenAirInterface (OAI) Software Alliance:
+      contact@openairinterface.org
+
+-->
+<testCaseList>
+        <htmlTabRef>l2sim-5gnr-proxy-build</htmlTabRef>
+        <htmlTabName>Build L2sim proxy image</htmlTabName>
+        <htmlTabIcon>wrench</htmlTabIcon>
+        <repeatCount>1</repeatCount>
+        <TestCaseRequestedList>
+ 000001
+        </TestCaseRequestedList>
+        <TestCaseExclusionList></TestCaseExclusionList>
+
+        <testCase id="000001">
+                <class>Build_Proxy</class>
+                <desc>Build L2sim Proxy Image</desc>
+                <eNB_instance>1</eNB_instance>
+                <eNB_serverId>1</eNB_serverId>
+                <forced_workspace_cleanup>True</forced_workspace_cleanup>
+                <proxy_commit>56cfdc0</proxy_commit>
+        </testCase>
+
+</testCaseList>
diff --git a/ci-scripts/xml_files/container_nsa_b200_quectel.xml b/ci-scripts/xml_files/container_nsa_b200_quectel.xml
index 47a939f63c51c18b395017a5ddb0411efff83beb..51e6668cf00380e90550fd6c13c56c793f1fda19 100644
--- a/ci-scripts/xml_files/container_nsa_b200_quectel.xml
+++ b/ci-scripts/xml_files/container_nsa_b200_quectel.xml
@@ -53,7 +53,6 @@
 		<class>Initialize_UE</class>
 		<desc>Initialize Quectel</desc>
 		<id>idefix</id>
-		<UE_Trace>yes</UE_Trace>
 	</testCase>
 
 
@@ -142,8 +141,8 @@
 		<iperf_args>-u -b 125M -t 60 -i 1 -fm</iperf_args>
 		<direction>DL</direction>
 		<id>idefix</id>
-		<iperf_packetloss_threshold>1</iperf_packetloss_threshold>
-		<iperf_bitrate_threshold>95</iperf_bitrate_threshold>
+		<iperf_packetloss_threshold>25</iperf_packetloss_threshold>
+		<iperf_bitrate_threshold>80</iperf_bitrate_threshold>
 		<iperf_profile>single-ue</iperf_profile>
 	</testCase>
 
diff --git a/ci-scripts/xml_files/container_sa_b200_quectel.xml b/ci-scripts/xml_files/container_sa_b200_quectel.xml
new file mode 100644
index 0000000000000000000000000000000000000000..7f0475629ded37ee311645c830ed0d85d913c082
--- /dev/null
+++ b/ci-scripts/xml_files/container_sa_b200_quectel.xml
@@ -0,0 +1,168 @@
+<!--
+
+ Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The OpenAirInterface Software Alliance licenses this file to You under
+ the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.openairinterface.org/?page_id=698
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+ For more information about the OpenAirInterface (OAI) Software Alliance:
+      contact@openairinterface.org
+
+-->
+<testCaseList>
+  <htmlTabRef>TEST-SA-FR1-B200</htmlTabRef>
+  <htmlTabName>SA SanityCheck with QUECTEL</htmlTabName>
+  <htmlTabIcon>tasks</htmlTabIcon>
+  <repeatCount>1</repeatCount>
+  <TestCaseRequestedList>
+    010002
+    030000
+    030101
+    000001
+    010000
+    000001
+    050000
+    050001
+    010002
+    000001
+    030201
+  </TestCaseRequestedList>
+    <!--
+ 070001
+ 070000
+ 070002
+ 050002
+ 050003
+    -->
+  <TestCaseExclusionList></TestCaseExclusionList>
+
+  <testCase id="010000">
+    <class>Initialize_UE</class>
+    <desc>Initialize Quectel</desc>
+    <id>idefix</id>
+  </testCase>
+
+
+  <testCase id="010002">
+    <class>Terminate_UE</class>
+    <desc>Terminate Quectel</desc>
+    <id>idefix</id>
+  </testCase>
+
+  <testCase id="030000">
+    <class>Copy_Image_to_Test</class>
+    <desc>Copy gNB image to test server</desc>
+    <image_name>oai-gnb</image_name>
+    <registry_svr_id>1</registry_svr_id>
+    <test_svr_id>0</test_svr_id>
+  </testCase>
+
+  <testCase id="030101">
+    <class>Deploy_Object</class>
+    <desc>Deploy gNB (TDD/Band78/40MHz/B200) in a container</desc>
+    <yaml_path>ci-scripts/yaml_files/sa_b200_gnb</yaml_path>
+    <eNB_instance>0</eNB_instance>
+    <eNB_serverId>0</eNB_serverId>
+  </testCase>
+
+  <testCase id="000001">
+    <class>IdleSleep</class>
+    <desc>Sleep</desc>
+    <idle_sleep_time_in_sec>5</idle_sleep_time_in_sec>
+  </testCase>
+
+  <testCase id="000002">
+    <class>IdleSleep</class>
+    <desc>Sleep</desc>
+    <idle_sleep_time_in_sec>20</idle_sleep_time_in_sec>
+  </testCase>
+
+
+  <testCase id="050000">
+    <class>Ping</class>
+    <desc>Ping: 20pings in 20sec</desc>
+    <id>idefix</id>
+    <ping_args>-c 20</ping_args>
+    <ping_packetloss_threshold>1</ping_packetloss_threshold>
+    <ping_rttavg_threshold>15</ping_rttavg_threshold>
+  </testCase>
+
+  <testCase id="050001">
+    <class>Ping</class>
+    <desc>Ping: 100pings in 20sec</desc>
+    <id>idefix</id>
+    <ping_args>-c 100 -i 0.2</ping_args>
+    <ping_packetloss_threshold>1</ping_packetloss_threshold>
+    <ping_rttavg_threshold>15</ping_rttavg_threshold>
+  </testCase>
+
+  <testCase id="050002">
+    <class>Ping</class>
+    <desc>Ping: 20pings in 20sec</desc>
+    <id>idefix</id>
+    <ping_args>-c 20</ping_args>
+    <ping_packetloss_threshold>1</ping_packetloss_threshold>
+    <ping_rttavg_threshold>15</ping_rttavg_threshold>
+  </testCase>
+
+  <testCase id="050003">
+    <class>Ping</class>
+    <desc>Ping: 100pings in 20sec</desc>
+    <id>idefix</id>
+    <ping_args>-c 100 -i 0.2</ping_args>
+    <ping_packetloss_threshold>1</ping_packetloss_threshold>
+    <ping_rttavg_threshold>15</ping_rttavg_threshold>
+  </testCase>
+
+  <testCase id="070000">
+    <class>Iperf</class>
+    <desc>iperf (DL/125Mbps/UDP)(60 sec)(single-ue profile)</desc>
+    <iperf_args>-u -b 125M -t 60 -i 1 -fm</iperf_args>
+    <direction>DL</direction>
+    <id>idefix</id>
+    <iperf_packetloss_threshold>25</iperf_packetloss_threshold>
+    <iperf_bitrate_threshold>80</iperf_bitrate_threshold>
+    <iperf_profile>single-ue</iperf_profile>
+  </testCase>
+
+  <testCase id="070001">
+    <class>Iperf</class>
+    <desc>iperf (UL/8Mbps/UDP)(60 sec)(single-ue profile)</desc>
+    <iperf_args>-u -b 8M -t 60 -i 1 -fm</iperf_args>
+    <direction>UL</direction>
+    <id>idefix</id>
+    <iperf_packetloss_threshold>1</iperf_packetloss_threshold>
+    <iperf_bitrate_threshold>95</iperf_bitrate_threshold>
+    <iperf_profile>single-ue</iperf_profile>
+  </testCase>
+
+  <testCase id="070002">
+    <class>Iperf</class>
+    <desc>iperf (BIDIR TCP)(10 sec)(single-ue profile)</desc>
+    <iperf_args>-t 10 --bidir</iperf_args>
+    <direction>BIDIR</direction>
+    <id>idefix</id>
+    <iperf_profile>single-ue</iperf_profile>
+  </testCase>
+
+  <testCase id="030201">
+    <class>Undeploy_Object</class>
+    <desc>Undeploy gNB</desc>
+    <yaml_path>ci-scripts/yaml_files/sa_b200_gnb</yaml_path>
+    <eNB_instance>0</eNB_instance>
+    <eNB_serverId>0</eNB_serverId>
+  </testCase>
+
+</testCaseList>
+
diff --git a/ci-scripts/xml_files/container_sa_b200_terminate.xml b/ci-scripts/xml_files/container_sa_b200_terminate.xml
new file mode 100644
index 0000000000000000000000000000000000000000..5a2b6bd4543d3183add1b67167f07fc37d2dd58e
--- /dev/null
+++ b/ci-scripts/xml_files/container_sa_b200_terminate.xml
@@ -0,0 +1,42 @@
+<!--
+
+ Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The OpenAirInterface Software Alliance licenses this file to You under
+ the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.openairinterface.org/?page_id=698
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+ For more information about the OpenAirInterface (OAI) Software Alliance:
+      contact@openairinterface.org
+
+-->
+<testCaseList>
+  <htmlTabRef>TEST-SA-FR1-B200-terminate</htmlTabRef>
+  <htmlTabName>SA tear-down in case of problem</htmlTabName>
+  <htmlTabIcon>tasks</htmlTabIcon>
+  <repeatCount>1</repeatCount>
+  <TestCaseRequestedList>
+  030201
+  </TestCaseRequestedList>
+  <TestCaseExclusionList></TestCaseExclusionList>
+
+  <testCase id="030201">
+    <class>Undeploy_Object</class>
+    <desc>Undeploy gNB</desc>
+    <yaml_path>ci-scripts/yaml_files/sa_b200_gnb</yaml_path>
+    <eNB_instance>1</eNB_instance>
+    <eNB_serverId>1</eNB_serverId>
+    <image_tag>sa-test</image_tag>
+  </testCase>
+
+</testCaseList>
diff --git a/ci-scripts/xml_files/formatting_check.xml b/ci-scripts/xml_files/formatting_check.xml
new file mode 100644
index 0000000000000000000000000000000000000000..bdf47af65d2b67fd92f003f8e1108f9b36eb63f3
--- /dev/null
+++ b/ci-scripts/xml_files/formatting_check.xml
@@ -0,0 +1,37 @@
+<!--
+
+ Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The OpenAirInterface Software Alliance licenses this file to You under
+ the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.openairinterface.org/?page_id=698
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+ For more information about the OpenAirInterface (OAI) Software Alliance:
+      contact@openairinterface.org
+
+-->
+<testCaseList>
+	<htmlTabRef>formatting-tab</htmlTabRef>
+	<htmlTabName>License and Formatting Checks</htmlTabName>
+	<htmlTabIcon>wrench</htmlTabIcon>
+	<TestCaseRequestedList>
+ 000002
+	</TestCaseRequestedList>
+	<TestCaseExclusionList></TestCaseExclusionList>
+
+	<testCase id="000002">
+		<class>LicenceAndFormattingCheck</class>
+		<desc>License and Formatting Checks</desc>
+	</testCase>
+
+</testCaseList>
diff --git a/ci-scripts/xml_files/fr1_5gc_closure.xml b/ci-scripts/xml_files/fr1_5gc_closure.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e5e57fa694bf75ac898cd8653c45c7ccab89cce6
--- /dev/null
+++ b/ci-scripts/xml_files/fr1_5gc_closure.xml
@@ -0,0 +1,37 @@
+<!--
+
+ Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The OpenAirInterface Software Alliance licenses this file to You under
+ the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.openairinterface.org/?page_id=698
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+ For more information about the OpenAirInterface (OAI) Software Alliance:
+      contact@openairinterface.org
+
+-->
+<testCaseList>
+	<htmlTabRef>5gc-closure</htmlTabRef>
+	<htmlTabName>5GC-Closure</htmlTabName>
+	<htmlTabIcon>log-out</htmlTabIcon>
+	<TestCaseRequestedList>
+060000
+	</TestCaseRequestedList>
+	<TestCaseExclusionList></TestCaseExclusionList>
+
+	<testCase id="060000">
+		<class>Terminate_5GCN</class>
+		<desc>Terminate 5GC</desc>
+	</testCase>
+
+</testCaseList>
diff --git a/ci-scripts/xml_files/fr1_5gc_start.xml b/ci-scripts/xml_files/fr1_5gc_start.xml
new file mode 100644
index 0000000000000000000000000000000000000000..8758b761cd139c511ec8ce93dc00f72b6935eb19
--- /dev/null
+++ b/ci-scripts/xml_files/fr1_5gc_start.xml
@@ -0,0 +1,38 @@
+<!--
+
+ Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The OpenAirInterface Software Alliance licenses this file to You under
+ the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.openairinterface.org/?page_id=698
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+ For more information about the OpenAirInterface (OAI) Software Alliance:
+      contact@openairinterface.org
+
+-->
+<testCaseList>
+	<htmlTabRef>5gc-start-tab</htmlTabRef>
+	<htmlTabName>5GC-Start</htmlTabName>
+	<htmlTabIcon>log-in</htmlTabIcon>
+	<TestCaseRequestedList>
+ 000100
+	</TestCaseRequestedList>
+	<TestCaseExclusionList>
+	</TestCaseExclusionList>
+
+	<testCase id="000100">
+		<class>Initialize_5GCN</class>
+		<desc>Initialize 5GC</desc>
+	</testCase>
+
+</testCaseList>
diff --git a/ci-scripts/xml_files/fr1_gnb_build.xml b/ci-scripts/xml_files/fr1_gnb_build.xml
index 13d85fccc4e6648af968dc8cff092ebd0d78eb41..1ddc5b56821df900f9768631a34523d0133045fb 100644
--- a/ci-scripts/xml_files/fr1_gnb_build.xml
+++ b/ci-scripts/xml_files/fr1_gnb_build.xml
@@ -32,7 +32,7 @@
 	<testCase id="000001">
 		<class>Build_eNB</class>
 		<desc>Build gNB</desc>
-		<Build_eNB_args>-w USRP -c --gNB --ninja</Build_eNB_args>
+		<Build_eNB_args>-w USRP -c --gNB --ninja --noavx512</Build_eNB_args>
 		<eNB_instance>0</eNB_instance>
 		<eNB_serverId>0</eNB_serverId>
 		<forced_workspace_cleanup>True</forced_workspace_cleanup>
diff --git a/ci-scripts/xml_files/fr1_multi_node_build.xml b/ci-scripts/xml_files/fr1_multi_node_build.xml
index 60bc734e65da9db4deb8a535051ce3ef41687430..2dbdfb2f9d3a3370c26f509680932a725e8bf3ed 100644
--- a/ci-scripts/xml_files/fr1_multi_node_build.xml
+++ b/ci-scripts/xml_files/fr1_multi_node_build.xml
@@ -50,7 +50,7 @@
 	<testCase id="000002">
 		<class>Build_eNB</class>
 		<desc>Build gNB</desc>
-		<Build_eNB_args>-w USRP -c --gNB --ninja</Build_eNB_args>
+		<Build_eNB_args>-w USRP -c --gNB --ninja --noavx512</Build_eNB_args>
 		<eNB_instance>1</eNB_instance>
 		<eNB_serverId>1</eNB_serverId>
 		<backgroundBuild>True</backgroundBuild>
diff --git a/ci-scripts/xml_files/fr1_nsa_2x2_quectel.xml b/ci-scripts/xml_files/fr1_nsa_2x2_quectel.xml
index 2ef2b7d7ce74f2ac6f7b5a4bce433fd35effbb9b..459a16c323799ecfa11e4e88296083d520d8aaea 100644
--- a/ci-scripts/xml_files/fr1_nsa_2x2_quectel.xml
+++ b/ci-scripts/xml_files/fr1_nsa_2x2_quectel.xml
@@ -26,6 +26,7 @@
 	<htmlTabIcon>tasks</htmlTabIcon>
 	<repeatCount>1</repeatCount>
 	<TestCaseRequestedList>
+ 010002
  030000
  040000
  000002
diff --git a/ci-scripts/xml_files/fr1_nsa_2x2_quectel_attach_detach.xml b/ci-scripts/xml_files/fr1_nsa_2x2_quectel_attach_detach.xml
index 335fe873a163afc0002ee94c663efcc1973b5e0d..c8e0659330d594028e2da1377a1b64befb61ec6e 100644
--- a/ci-scripts/xml_files/fr1_nsa_2x2_quectel_attach_detach.xml
+++ b/ci-scripts/xml_files/fr1_nsa_2x2_quectel_attach_detach.xml
@@ -26,6 +26,7 @@
 	<htmlTabIcon>tasks</htmlTabIcon>
 	<repeatCount>1</repeatCount>
 	<TestCaseRequestedList>
+ 010002
  031000
  041000
  000002
diff --git a/ci-scripts/xml_files/fr1_nsa_quectel.xml b/ci-scripts/xml_files/fr1_nsa_quectel.xml
index 0f8c90abdf12b0e97e9c5fc1b343f45dfa311757..c72c61c0a2895c6cbf7bf800c7b19b4329835702 100644
--- a/ci-scripts/xml_files/fr1_nsa_quectel.xml
+++ b/ci-scripts/xml_files/fr1_nsa_quectel.xml
@@ -26,6 +26,7 @@
 	<htmlTabIcon>tasks</htmlTabIcon>
 	<repeatCount>1</repeatCount>
 	<TestCaseRequestedList>
+ 010002
  030000
  040000
  000002
@@ -34,8 +35,8 @@
  050000
  050001
  000001
- 070003
- 070002
+ 070000
+ 070001
  000001
  050000
  050001
@@ -52,14 +53,12 @@
 		<UE_Trace>yes</UE_Trace>
 	</testCase>
 
-
 	<testCase id="010002">
 		<class>Terminate_UE</class>
 		<desc>Terminate Quectel</desc>
 		<id>idefix</id>
 	</testCase>
 
-
 	<testCase id="030000">
 		<class>Initialize_eNB</class>
 		<desc>Initialize eNB</desc>
@@ -70,7 +69,6 @@
 		<eNB_Trace>yes</eNB_Trace>
 	</testCase>
 
-
 	<testCase id="040000">
 		<class>Initialize_eNB</class>
 		<desc>Initialize gNB</desc>
@@ -92,7 +90,6 @@
 		<idle_sleep_time_in_sec>20</idle_sleep_time_in_sec>
 	</testCase>
 
-
 	<testCase id="050000">
 		<class>Ping</class>
 		<desc>Ping: 20pings in 20sec</desc>
@@ -112,39 +109,17 @@
 	</testCase>
 
 	<testCase id="070000">
-		<class>Iperf</class>
-		<desc>iperf (DL/30Mbps/UDP)(30 sec)(single-ue profile)</desc>
-		<iperf_args>-u -b 30M -t 30</iperf_args>
-		<direction>DL</direction>
-		<id>idefix</id>
-		<iperf_packetloss_threshold>1</iperf_packetloss_threshold>
-		<iperf_bitrate_threshold>95</iperf_bitrate_threshold>
-		<iperf_profile>single-ue</iperf_profile>
-	</testCase>
-
-	<testCase id="070001">
-		<class>Iperf</class>
-		<desc>iperf (DL/90Mbps/UDP)(30 sec)(single-ue profile)</desc>
-		<iperf_args>-u -b 90M -t 30</iperf_args>
-		<direction>DL</direction>
-		<id>idefix</id>
-		<iperf_packetloss_threshold>1</iperf_packetloss_threshold>
-		<iperf_bitrate_threshold>95</iperf_bitrate_threshold>
-		<iperf_profile>single-ue</iperf_profile>
-	</testCase>
-
-	<testCase id="070002">
 		<class>Iperf</class>
 		<desc>iperf (DL/125Mbps/UDP)(60 sec)(single-ue profile)</desc>
 		<iperf_args>-u -b 125M -t 60</iperf_args>
 		<direction>DL</direction>
 		<id>idefix</id>
-		<iperf_packetloss_threshold>1</iperf_packetloss_threshold>
-		<iperf_bitrate_threshold>95</iperf_bitrate_threshold>
+		<iperf_packetloss_threshold>25</iperf_packetloss_threshold>
+		<iperf_bitrate_threshold>80</iperf_bitrate_threshold>
 		<iperf_profile>single-ue</iperf_profile>
 	</testCase>
 
-	<testCase id="070003">
+	<testCase id="070001">
 		<class>Iperf</class>
 		<desc>iperf (UL/8Mbps/UDP)(60 sec)(single-ue profile)</desc>
 		<iperf_args>-u -b 8M -t 60</iperf_args>
@@ -155,7 +130,6 @@
 		<iperf_profile>single-ue</iperf_profile>
 	</testCase>
 
-
 	<testCase id="080000">
 		<class>Terminate_eNB</class>
 		<desc>Terminate eNB</desc>
diff --git a/ci-scripts/xml_files/fr1_sa_quectel.xml b/ci-scripts/xml_files/fr1_sa_quectel.xml
index 2b215479c24e69cefd4d833e08611b2939811d75..fd983d8835b15c63e1d64a1c2113e893334eb559 100644
--- a/ci-scripts/xml_files/fr1_sa_quectel.xml
+++ b/ci-scripts/xml_files/fr1_sa_quectel.xml
@@ -26,6 +26,7 @@
 	<htmlTabIcon>tasks</htmlTabIcon>
 	<repeatCount>1</repeatCount>
 	<TestCaseRequestedList>
+ 010002
  040000
  000002
  010000
diff --git a/ci-scripts/xml_files/fr1_sa_quectel_162prb.xml b/ci-scripts/xml_files/fr1_sa_quectel_162prb.xml
index 23eaccfcfd2d5fe6f9b4d82685b3b11e4e6b2459..f426bd6035416ac5aa7ae32feb663710d5b940db 100644
--- a/ci-scripts/xml_files/fr1_sa_quectel_162prb.xml
+++ b/ci-scripts/xml_files/fr1_sa_quectel_162prb.xml
@@ -26,6 +26,7 @@
 	<htmlTabIcon>tasks</htmlTabIcon>
 	<repeatCount>1</repeatCount>
 	<TestCaseRequestedList>
+ 010002
  042000
  000002
  010000
diff --git a/ci-scripts/xml_files/fr1_sa_quectel_stages.xml b/ci-scripts/xml_files/fr1_sa_quectel_stages.xml
index 603f3f919b47f0de104a4a5d0b7db8f8d117c84b..48a9b60e7dbe6512245e1627ab952323c70965cb 100644
--- a/ci-scripts/xml_files/fr1_sa_quectel_stages.xml
+++ b/ci-scripts/xml_files/fr1_sa_quectel_stages.xml
@@ -26,6 +26,7 @@
 	<htmlTabIcon>tasks</htmlTabIcon>
 	<repeatCount>1</repeatCount>
 	<TestCaseRequestedList>
+ 011002
  041000
  000002
  011000
diff --git a/ci-scripts/xml_files/gnb_phytest_usrp_run.xml b/ci-scripts/xml_files/gnb_phytest_usrp_run.xml
index 5705533ab483ac75021d4666ca04bcadf6f05a8c..e7eb651d507215857487f21a923cfa0da0f9b907 100644
--- a/ci-scripts/xml_files/gnb_phytest_usrp_run.xml
+++ b/ci-scripts/xml_files/gnb_phytest_usrp_run.xml
@@ -24,7 +24,7 @@
 	<htmlTabRef>gNB-PHY-Test</htmlTabRef>
 	<htmlTabName>Run-gNB-PHY-Test</htmlTabName>
 	<htmlTabIcon>tasks</htmlTabIcon>
-	<repeatCount>3</repeatCount>
+	<repeatCount>1</repeatCount>
 	<TestCaseRequestedList>
 090101 000001 090109
 	</TestCaseRequestedList>
@@ -33,7 +33,7 @@
 	<testCase id="090101">
 		<class>Initialize_eNB</class>
 		<desc>Initialize gNB USRP</desc>
-		<Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.tm1.106PRB.usrpn300.conf --phy-test -q -U 787200 -T 106 -t 28 -D 130175 -m 28 -M 106 --log_config.global_log_options level,nocolor,time</Initialize_eNB_args>
+		<Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.tm1.106PRB.usrpn300.conf --phy-test -q -U 787200 -T 106 -t 28 -D 130175 -m 28 -M 106 --usrp-tx-thread-config 1 --log_config.global_log_options level,nocolor,time</Initialize_eNB_args>
 		<air_interface>NR</air_interface>
 		<USRP_IPAddress>192.168.20.2</USRP_IPAddress>
 	</testCase>
diff --git a/ci-scripts/xml_files/gnb_usrp_build.xml b/ci-scripts/xml_files/gnb_usrp_build.xml
index 97f85c6a339e12edce0feaa9ca570aa4e07332b1..81c7d4e24ec4fc6b3e528ad782176f68495c7e29 100644
--- a/ci-scripts/xml_files/gnb_usrp_build.xml
+++ b/ci-scripts/xml_files/gnb_usrp_build.xml
@@ -34,7 +34,7 @@
 		<mode>TesteNB</mode>	
 		<class>Build_eNB</class>
 		<desc>Build gNB (USRP)</desc>
-		<Build_eNB_args>--gNB -w USRP --ninja --cmake-opt -DBoost_INCLUDE_DIR=/usr/include/boost169</Build_eNB_args>
+		<Build_eNB_args>--gNB -w USRP --ninja --cmake-opt -DBoost_INCLUDE_DIR=/usr/include/boost169 --noavx512</Build_eNB_args>
 		<forced_workspace_cleanup>True</forced_workspace_cleanup>
 	</testCase>
 
diff --git a/ci-scripts/xml_files/ldpc_gpu_test.xml b/ci-scripts/xml_files/ldpc_gpu_test.xml
index a0191fbd7683d4ac339c55ba63aa1f2475c39970..c17bc082d5bd719cf8ab8dee7f6baf662259a373 100644
--- a/ci-scripts/xml_files/ldpc_gpu_test.xml
+++ b/ci-scripts/xml_files/ldpc_gpu_test.xml
@@ -32,7 +32,7 @@
 	<testCase id="000001">
 		<class>Build_PhySim</class>
 		<desc>Build for physical simulator</desc>
-		<physim_build_args>--phy_simulators --ninja</physim_build_args>
+		<physim_build_args>--phy_simulators --ninja --noavx512</physim_build_args>
 		<forced_workspace_cleanup>FALSE</forced_workspace_cleanup>
 	</testCase>
 
diff --git a/ci-scripts/xml_files/lte_2x2_tm1_quectel.xml b/ci-scripts/xml_files/lte_2x2_tm1_quectel.xml
index 6aa53200c85ec8e484da718b6ae1dc8a25f5514d..b6388eede258d65028faf81ee2dfecfc78195c32 100644
--- a/ci-scripts/xml_files/lte_2x2_tm1_quectel.xml
+++ b/ci-scripts/xml_files/lte_2x2_tm1_quectel.xml
@@ -26,6 +26,7 @@
 	<htmlTabIcon>tasks</htmlTabIcon>
 	<repeatCount>1</repeatCount>
 	<TestCaseRequestedList>
+ 010002
  030000
  000002
  010000
@@ -88,7 +89,7 @@
 		<id>nrmodule2_quectel</id>
 		<ping_args>-c 20</ping_args>
 		<ping_packetloss_threshold>1</ping_packetloss_threshold>
-		<ping_rttavg_threshold>40</ping_rttavg_threshold>
+		<ping_rttavg_threshold>60</ping_rttavg_threshold>
 	</testCase>
 	<testCase id="050001">
 		<class>Ping</class>
@@ -96,7 +97,7 @@
 		<id>nrmodule2_quectel</id>
 		<ping_args>-c 100 -s 1024 -i 0,2</ping_args>
 		<ping_packetloss_threshold>1</ping_packetloss_threshold>
-		<ping_rttavg_threshold>40</ping_rttavg_threshold>
+		<ping_rttavg_threshold>60</ping_rttavg_threshold>
 	</testCase>
 
 
diff --git a/ci-scripts/xml_files/lte_2x2_tm2_quectel.xml b/ci-scripts/xml_files/lte_2x2_tm2_quectel.xml
index 84aa87aa235eaaa28d220111c8157b77616106e0..99c8f75e06f58aa58162f064769bbf0506359458 100644
--- a/ci-scripts/xml_files/lte_2x2_tm2_quectel.xml
+++ b/ci-scripts/xml_files/lte_2x2_tm2_quectel.xml
@@ -26,6 +26,7 @@
 	<htmlTabIcon>tasks</htmlTabIcon>
 	<repeatCount>1</repeatCount>
 	<TestCaseRequestedList>
+ 010002
  030001
  000002
  010000
@@ -88,7 +89,7 @@
 		<id>nrmodule2_quectel</id>
 		<ping_args>-c 20</ping_args>
 		<ping_packetloss_threshold>1</ping_packetloss_threshold>
-		<ping_rttavg_threshold>40</ping_rttavg_threshold>
+		<ping_rttavg_threshold>60</ping_rttavg_threshold>
 	</testCase>
 	<testCase id="050003">
 		<class>Ping</class>
@@ -96,7 +97,7 @@
 		<id>nrmodule2_quectel</id>
 		<ping_args>-c 100 -s 1024 -i 0,2</ping_args>
 		<ping_packetloss_threshold>1</ping_packetloss_threshold>
-		<ping_rttavg_threshold>40</ping_rttavg_threshold>
+		<ping_rttavg_threshold>60</ping_rttavg_threshold>
 	</testCase>
 
 
diff --git a/ci-scripts/yaml_files/sa_b200_gnb/docker-compose.yml b/ci-scripts/yaml_files/sa_b200_gnb/docker-compose.yml
new file mode 100644
index 0000000000000000000000000000000000000000..9ea52c12477a8436cd1a12cb991222a0321e950d
--- /dev/null
+++ b/ci-scripts/yaml_files/sa_b200_gnb/docker-compose.yml
@@ -0,0 +1,44 @@
+version: '3.8'
+
+services:
+    gnb_mono_tdd:
+        image: oai-gnb:latest
+        privileged: true
+        container_name: sa-b200-gnb
+        environment:
+            USE_SA_TDD_MONO_B2XX: 'yes'
+            USE_B2XX: 'yes'
+            GNB_NAME: gNB-in-docker
+            MCC: '222'
+            MNC: '01'
+            MNC_LENGTH: 2
+            TAC: 1
+            NSSAI_SST: 1
+            NSSAI_SD0: 1
+            AMF_IP_ADDRESS: 172.21.16.136
+            GNB_NGA_IF_NAME: eth0
+            GNB_NGA_IP_ADDRESS: 192.168.68.194
+            GNB_NGU_IF_NAME: eth0
+            GNB_NGU_IP_ADDRESS: 192.168.68.194
+            USE_ADDITIONAL_OPTIONS: --sa -E -q --RUs.[0].sdr_addrs serial=30C51D4 --continuous-tx --log_config.global_log_options level,nocolor,time,line_num,function
+        volumes:
+            - /dev:/dev
+        networks:
+            public_net:
+                ipv4_address: 192.168.68.194
+        #entrypoint: /bin/bash -c "sleep infinity"
+        healthcheck:
+            # pgrep does NOT work
+            test: /bin/bash -c "ps aux | grep -v grep | grep -c softmodem"
+            interval: 10s
+            timeout: 5s
+            retries: 5
+
+networks:
+    public_net:
+        name: sa-b200-gnb-net
+        ipam:
+            config:
+                - subnet: 192.168.68.192/26
+        driver_opts:
+            com.docker.network.bridge.name: "sa-gnb-net"
diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt
index 99d94b6a67236755e4ee88fbeec74b4568923761..2145376fcf5ef3b2f89608c15744b87b4cc67d76 100644
--- a/cmake_targets/CMakeLists.txt
+++ b/cmake_targets/CMakeLists.txt
@@ -203,17 +203,23 @@ if (CMAKE_SYSTEM_PROCESSOR STREQUAL "armv7l")
 else (CMAKE_SYSTEM_PROCESSOR STREQUAL "armv7l")
   if(EXISTS  "/proc/cpuinfo")
     file(STRINGS "/proc/cpuinfo" CPUINFO REGEX flags LIMIT_COUNT 1)
-    if (CPUINFO MATCHES "avx2")
-      set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -mavx2")
+    message("NOAVX512 is ${NOAVX512}")
+    if (CPUINFO MATCHES "avx512bw" AND "${NOAVX512}" STREQUAL "False")
+      set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -mavx512bw -march=skylake-avx512 -mtune=skylake-avx512 " )
       set(COMPILATION_AVX2 "True")
     else()
-      set(COMPILATION_AVX2 "False")
-    endif()
-    if (CPUINFO MATCHES "sse4_1")
-      set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -msse4.1 -mpclmul")
-    endif()
-    if (CPUINFO MATCHES "ssse3")
-      set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -mssse3")
+      if (CPUINFO MATCHES "avx2")
+        set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -mavx2")
+        set(COMPILATION_AVX2 "True")
+      else()
+        set(COMPILATION_AVX2 "False")
+      endif()
+      if (CPUINFO MATCHES "sse4_1")
+        set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -msse4.1 -mpclmul")
+      endif()
+      if (CPUINFO MATCHES "ssse3")
+        set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -mssse3")
+      endif()
     endif()
   else()
     Message("/proc/cpuinfo does not exit. We will use manual CPU flags")
@@ -224,11 +230,11 @@ set(C_FLAGS_PROCESSOR " ${C_FLAGS_PROCESSOR} ${CFLAGS_PROCESSOR_USER}")
 
 Message("C_FLAGS_PROCESSOR is ${C_FLAGS_PROCESSOR}")
 
-if (CMAKE_SYSTEM_PROCESSOR MATCHES "x86")
-  if ( (NOT( C_FLAGS_PROCESSOR MATCHES "ssse3")) OR (NOT( C_FLAGS_PROCESSOR MATCHES "msse4.1")) )
-    Message(FATAL_ERROR "For x86 Architecture, you must have following flags: -mssse3 -msse4.1. The current detected flags are: ${C_FLAGS_PROCESSOR}. You can pass the flags manually in build script, for example: ./build_oai --cflags_processor \"-mssse3 -msse4.1 -mavx2\" ")
-  endif()
-endif()
+#if (CMAKE_SYSTEM_PROCESSOR MATCHES "x86")
+#  if ( (NOT( C_FLAGS_PROCESSOR MATCHES "ssse3")) OR (NOT( C_FLAGS_PROCESSOR MATCHES "msse4.1")) )
+#    Message(FATAL_ERROR "For x86 Architecture, you must have following flags: -mssse3 -msse4.1. The current detected flags are: ${C_FLAGS_PROCESSOR}. You can pass the flags manually in build script, for example: ./build_oai --cflags_processor \"-mssse3 -msse4.1 -mavx2\" ")
+#  endif()
+#endif()
 
 #
 # add autotools definitions that were maybe used!
@@ -247,6 +253,28 @@ add_boolean_option(SANITIZE_ADDRESS False "enable the address sanitizer (ASan)")
 if (SANITIZE_ADDRESS)
   set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address -fno-omit-frame-pointer -fno-common")
   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fno-omit-frame-pointer -fno-common")
+  # There seems to be some incompatibility with pthread_create and the RT scheduler, which
+  # results in pthread_create hanging.
+  #
+  # When we switch from Ubuntu 16.04 to 18.04, we found that running with the address sanitizer,
+  # the pthread_create function calls were not working. The inital thought was that we were
+  # trying to create a thread that was not-blocking and would eventually crash the machine during
+  # the run. After more debugging, we found that we would never even start the thread. We narrowed
+  # down the first two instances of pthread_create in the gNB and NR UE to be sctp_eNB_task and
+  # one_thread, respectively. We found that adding sleeps, and various other pauses to the threads
+  # had not effect. From there, we found that if we add an abort(); prior to the thread loop, we
+  # do not execute that. This indicated to us that the problem is not likely to be a non-blocking
+  # thread, but perhaps and issue with pthread_create itself. From there we begain to research the
+  # issue on the web. See: https://github.com/google/sanitizers/issues/1125
+  #
+  # Google searching indicates this appears to be a problem since at least 2018. This could be something
+  # wrong in the pthread library, or something subtly wrong in this CMakeLists.txt. Use Ubuntu 20.04 instead.
+endif ()
+
+add_boolean_option(SANITIZE_UNDEFINED False "enable the undefined behavior sanitizer (UBSan)")
+if (SANITIZE_UNDEFINED)
+  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=undefined -fno-sanitize-recover=all")
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=undefined -fno-sanitize-recover=all")
 endif ()
 
 add_definitions("-DASN_DISABLE_OER_SUPPORT")
@@ -1410,8 +1438,11 @@ set(PHY_NR_CODINGIF
 )
 
 add_library(ldpc_orig MODULE ${PHY_LDPC_ORIG_SRC} )
+target_link_libraries(ldpc_orig PRIVATE ldpc_gen_HEADERS)
 add_library(ldpc_optim MODULE ${PHY_LDPC_OPTIM_SRC} )
+target_link_libraries(ldpc_optim PRIVATE ldpc_gen_HEADERS)
 add_library(ldpc_optim8seg MODULE ${PHY_LDPC_OPTIM8SEG_SRC} )
+target_link_libraries(ldpc_optim8seg PRIVATE ldpc_gen_HEADERS)
 add_library(ldpc_cl MODULE ${PHY_LDPC_CL_SRC} )
 target_link_libraries(ldpc_cl OpenCL)
 add_dependencies(ldpc_cl nrLDPC_decoder_kernels_CL)
@@ -1423,6 +1454,7 @@ if (CUDA_FOUND)
 endif (CUDA_FOUND)
 
 add_library(ldpc MODULE ${PHY_LDPC_OPTIM8SEGMULTI_SRC} )
+target_link_libraries(ldpc PRIVATE ldpc_gen_HEADERS)
 
 
 add_library(coding MODULE ${PHY_TURBOSRC} )
@@ -1568,9 +1600,10 @@ set(PHY_SRC_UE
 
   set(PHY_NR_SRC_COMMON
   ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_prach_common.c
-  ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c
+  ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_csi_rs.c
   ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_scrambling.c
   ${OPENAIR1_DIR}/PHY/NR_REFSIG/scrambling_luts.c
+  ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c
   )
 
   set(PHY_NR_SRC
@@ -1595,7 +1628,6 @@ set(PHY_SRC_UE
   ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
   ${OPENAIR1_DIR}/PHY/NR_REFSIG/ul_ref_seq_nr.c
   ${OPENAIR1_DIR}/PHY/NR_REFSIG/nr_dmrs_rx.c
-  ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_csi_rs.c
   ${OPENAIR1_DIR}/PHY/NR_REFSIG/nr_gold.c
   ${OPENAIR1_DIR}/PHY/NR_REFSIG/nr_gen_mod_table.c
   ${OPENAIR1_DIR}/PHY/NR_REFSIG/dmrs_nr.c
@@ -1643,6 +1675,7 @@ set(PHY_SRC_UE
   ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/dci_nr.c
   ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/dci_tools_nr.c
   ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/pucch_nr.c
+  ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/csi_rx.c
   ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_uci_tools_common.c
   ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c
   ${OPENAIR1_DIR}/PHY/NR_REFSIG/ul_ref_seq_nr.c
@@ -1804,7 +1837,15 @@ set(NR_PDCP_SRC
   ${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_timer_thread.c
   ${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_security_nea2.c
   ${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_integrity_nia2.c
+  ${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_integrity_nia1.c
   ${OPENAIR2_DIR}/LAYER2/nr_pdcp/asn1_utils.c
+  #hack: include these files to compile the nr phy simulators
+  #these files should not be here, will be removed at some point when the
+  #computation is done directly inside nr_pdcp_integrity_nia1.c instead
+  #of reusing code of osa_stream_eia.c
+  ${OPENAIR2_DIR}/UTIL/OSA/osa_stream_eia.c
+  ${OPENAIR2_DIR}/UTIL/OSA/osa_snow3g.c
+  ${OPENAIR2_DIR}/UTIL/OSA/osa_rijndael.c
   )
 
 set(NR_SDAP_SRC
@@ -1952,6 +1993,7 @@ set (MAC_SRC_UE
 
 set (MAC_NR_SRC_UE
   ${NR_UE_PHY_INTERFACE_DIR}/NR_IF_Module.c
+  ${NR_UE_PHY_INTERFACE_DIR}/NR_Packet_Drop.c
   ${NR_UE_MAC_DIR}/config_ue.c
   ${NR_UE_MAC_DIR}/mac_vars.c
   ${NR_UE_MAC_DIR}/main_ue_nr.c
@@ -2869,6 +2911,7 @@ target_link_libraries(ldpctest
 add_executable(nr_dlschsim
   ${OPENAIR1_DIR}/SIMULATION/NR_PHY/dlschsim.c
   ${OPENAIR_DIR}/common/utils/nr/nr_common.c
+  ${OPENAIR_DIR}/executables/softmodem-common.c
   ${T_SOURCE}
   ${SHLIB_LOADER_SOURCES}
   )
@@ -2892,6 +2935,7 @@ target_link_libraries(nr_pbchsim
 add_executable(nr_pucchsim
   ${OPENAIR1_DIR}/SIMULATION/NR_PHY/pucchsim.c
   ${OPENAIR_DIR}/common/utils/nr/nr_common.c
+  ${OPENAIR_DIR}/executables/softmodem-common.c
   ${T_SOURCE}
   ${SHLIB_LOADER_SOURCES}
   )
@@ -2936,6 +2980,7 @@ target_link_libraries(nr_prachsim
 add_executable(nr_ulschsim
   ${OPENAIR1_DIR}/SIMULATION/NR_PHY/ulschsim.c
   ${OPENAIR_DIR}/common/utils/nr/nr_common.c
+  ${OPENAIR_DIR}/executables/softmodem-common.c
   ${PHY_INTERFACE_DIR}/queue_t.c
   ${T_SOURCE}
   ${SHLIB_LOADER_SOURCES}
@@ -3177,3 +3222,4 @@ ADD_CUSTOM_TARGET(oarf
 )
 
 include (${OPENAIR_DIR}/common/utils/telnetsrv/telnetsrv_CMakeLists.txt)
+include(${OPENAIR1_DIR}/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/CMakeLists.txt)
diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml
index b55228bdc925b76486e8a8f689225b9c06e4754f..88654ac9b54dc53054038be6f5336141396502f4 100755
--- a/cmake_targets/autotests/test_case_list.xml
+++ b/cmake_targets/autotests/test_case_list.xml
@@ -1062,7 +1062,8 @@
                                    (Test3: PBCH-only, 217 PRB),
                                    (Test4: PBCH and synchronization, 217 RPB),
                                    (Test5: PBCH-only, 273 PRB),
-                                   (Test6: PBCH and synchronization, 273 PRB)</desc>
+                                   (Test6: PBCH and synchronization, 273 PRB),
+                                   (Test7: PBCH and synchronization, 106PBR, SSB SC OFFSET 6)</desc>
       <pre_compile_prog></pre_compile_prog>
       <compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</compile_prog>
       <compile_prog_args> --phy_simulators  -c </compile_prog_args>
@@ -1074,8 +1075,9 @@
                       -s-11 -S-8 -n10 -R217
                       -s-11 -S-8 -n10 -o8000 -I -R217
                       -s-11 -S-8 -n10 -R273
-                      -s-11 -S-8 -n10 -o8000 -I -R273</main_exec_args>
-      <tags>nr_pbchsim.test1 nr_pbchsim.test2 nr_pbchsim.test3 nr_pbchsim.test4 nr_pbchsim.test5 nr_pbchsim.test6</tags>
+                      -s-11 -S-8 -n10 -o8000 -I -R273
+                      -s-11 -S-8 -n10 -R106 -O6</main_exec_args>
+      <tags>nr_pbchsim.test1 nr_pbchsim.test2 nr_pbchsim.test3 nr_pbchsim.test4 nr_pbchsim.test5 nr_pbchsim.test6 nr_pbchsim.test7</tags>
       <search_expr_true>PBCH test OK</search_expr_true>
       <search_expr_false>segmentation fault|assertion|exiting|fatal</search_expr_false>
       <nruns>3</nruns>
@@ -1104,7 +1106,9 @@
                                  (Test19: Mapping type A, 3 DMRS Symbols),
                                  (Test20: Mapping type B, 4 DMRS Symbols),
                                  (Test21: 4x4 MIMO, 1 Layer),
-                                 (Test22: 4x4 MIMO, 2 Layers)</desc>
+                                 (Test22: 4x4 MIMO, 2 Layers),
+                                 (Test23: 25 PRBs, 15 kHz SCS)
+                                 (Test24: MCS 0, low SNR performance)</desc>
       <pre_compile_prog></pre_compile_prog>
       <compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</compile_prog>
       <compile_prog_args> --phy_simulators  -c </compile_prog_args>
@@ -1132,8 +1136,10 @@
                   -n100 -s2 -U 2 0 2
                   -n100 -s2 -U 2 1 3
                   -n10 -s20 -U 3 0 0 2 -gR -x1 -y4 -z4
-                  -n10 -s20 -U 3 0 0 2 -gR -x2 -y4 -z4</main_exec_args>
-      <tags>nr_dlsim.test1 nr_dlsim.test2 nr_dlsim.test3 nr_dlsim.test4 nr_dlsim.test5 nr_dlsim.test6 nr_dlsim.test7 nr_dlsim.test8 nr_dlsim.test9 nr_dlsim.test10 nr_dlsim.test11 nr_dlsim.test12 nr_dlsim.test13 nr_dlsim.test14 nr_dlsim.test15 nr_dlsim.test16 nr_dlsim.test17 nr_dlsim.test18 nr_dlsim.test19 nr_dlsim.test20 nr_dlsim.test21 nr_dlsim.test22</tags>
+                  -n10 -s20 -U 3 0 0 2 -gR -x2 -y4 -z4
+                  -n100 -m0 -e0 -R25 -b25 -i 2 1 0
+                  -n100 -e0 -t95 -S-1.0 -i 2 1 0</main_exec_args>
+      <tags>nr_dlsim.test1 nr_dlsim.test2 nr_dlsim.test3 nr_dlsim.test4 nr_dlsim.test5 nr_dlsim.test6 nr_dlsim.test7 nr_dlsim.test8 nr_dlsim.test9 nr_dlsim.test10 nr_dlsim.test11 nr_dlsim.test12 nr_dlsim.test13 nr_dlsim.test14 nr_dlsim.test15 nr_dlsim.test16 nr_dlsim.test17 nr_dlsim.test18 nr_dlsim.test19 nr_dlsim.test20 nr_dlsim.test21 nr_dlsim.test22 nr_dlsim.test23 nr_dlsim.test24</tags>
       <search_expr_true>PDSCH test OK</search_expr_true>
       <search_expr_false>segmentation fault|assertion|exiting|fatal</search_expr_false>
       <nruns>3</nruns>
@@ -1184,9 +1190,10 @@
     
     <testCase id="015108">
       <class>execution</class>
-      <desc>nr_ulschsim Test cases. (Test1: 106 PRB),
-                                    (Test2: 217 PRB),
-                                    (Test3: 273 PRB)</desc>
+      <desc>nr_ulschsim Test cases. (Test1: 106 PRBs),
+                                    (Test2: 217 PRBs),
+                                    (Test3: 273 PRBs)
+                                    (Test4: 106 PRBs 4-layer MIMO)</desc>
       <pre_compile_prog></pre_compile_prog>
       <compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</compile_prog>
       <compile_prog_args> --phy_simulators  -c </compile_prog_args>
@@ -1195,8 +1202,9 @@
       <main_exec> $OPENAIR_DIR/targets/bin/nr_ulschsim.Rel15</main_exec>
       <main_exec_args>-R 106 -m9 -s13 -n100
                       -R 217 -m15 -s15 -n100
-                      -R 273 -m19 -s20 -n100</main_exec_args>
-      <tags>nr_ulschsim.test1 nr_ulschsim.test2 nr_ulschsim.test3</tags>
+                      -R 273 -m19 -s20 -n100
+                      -R 106 -m9 -s13 -n100 -y4 -z4 -W4</main_exec_args>
+      <tags>nr_ulschsim.test1 nr_ulschsim.test2 nr_ulschsim.test3 nr_ulschsim.test4</tags>
       <search_expr_true>PUSCH test OK</search_expr_true>
       <search_expr_false>segmentation fault|assertion|exiting|fatal</search_expr_false>
       <nruns>3</nruns>
@@ -1304,7 +1312,14 @@
                                  (Test12: SC-FDMA, 216 PRBs),
                                  (Test13: SC-FDMA, 273 PRBs),
                                  (Test14: SC-FDMA, 3 DMRS),
-                                 (Test15: MCS 16 50 PRBs 2 RX_Antenna)</desc>
+                                 (Test15: MCS 19 50 PRBs 2 RX_Antenna),
+                                 (Test16: MCS 9 106 PRBs MIMO 2 layers),
+                                 (Test17: MCS 9 106 PRBs MIMO 4 layers),
+                                 (Test18: 25 PRBs, 15 kHz SCS),
+                                 (Test19: 3GPP G-FR1-A4-13 2 RX Antennas Requirements Test),
+                                 (Test20: 3GPP G-FR1-A4-13 4 RX Antennas Requirements Test),
+                                 (Test21: 3GPP G-FR1-A4-13 8 RX Antennas Requirements Test),
+                                 (Test22: MCS 0, low SNR performance)</desc>
       <pre_compile_prog></pre_compile_prog>
       <compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</compile_prog>
       <compile_prog_args> --phy_simulators  -c </compile_prog_args>
@@ -1316,18 +1331,24 @@
                       -n100 -m28 -s20
                       -n100 -m9 -R217 -r217 -s5
                       -n100 -m9 -R273 -r273 -s5
-                      -n100 -s5 -U 2 0 1
-                      -n100 -s5 -T 2 1 2 -U 2 0 2
-                      -n100 -s5 -T 2 2 2 -U 2 1 2
-                      -n100 -s5 -a4 -b8 -T 2 1 2 -U 2 1 3
+                      -n100 -s5 -U 4 0 1 1 1
+                      -n100 -s5 -T 2 1 2 -U 4 0 2 1 1
+                      -n100 -s5 -T 2 2 2 -U 4 1 2 1 1
+                      -n100 -s5 -a4 -b8 -T 2 1 2 -U 4 1 3 1 1
                       -n100 -s5 -Z
                       -n100 -s5 -Z -r75
                       -n50 -s5 -Z -r216 -R217
                       -n50 -s5 -Z -r270 -R273
-                      -n100 -s5 -Z -U 2 0 2
-                      -n100 -m16 -s10 -z2</main_exec_args>
-
-      <tags>nr_ulsim.test1 nr_ulsim.test2 nr_ulsim.test3 nr_ulsim.test4 nr_ulsim.test5 nr_ulsim.test6 nr_ulsim.test7 nr_ulsim.test8 nr_ulsim.test9 nr_ulsim.test10 nr_ulsim.test11 nr_ulsim.test12 nr_ulsim.test13 nr_ulsim.test14 nr_ulsim.test15</tags>
+                      -n100 -s5 -Z -U 4 0 2 1 2
+                      -n100 -m19 -s10 -S15 -z2
+                      -n100 -m9 -r106 -s10 -W2 -y2 -z2
+                      -n100 -m9 -r106 -s20 -W4 -y4 -z4
+                      -n100 -u0 -m0 -R25 -r25 -i 2 1 0
+                      -m16 -r106 -s8.8 -S9.4 -z2 -n200 -U 4 1 1 1 2 -gI -b14 -t70 -I15 -i 2 1 0
+                      -m16 -r106 -s5.4 -S6 -z4 -n200 -U 4 1 1 1 2 -gI -b14 -t70 -I15 -i 2 1 0
+                      -m16 -r106 -s3.4 -S3.8 -z8 -n200 -U 4 1 1 1 2 -gI -b14 -t70 -I15 -i 2 1 0
+                      -n100 -m0 -S -0.6 -i 2 1 0</main_exec_args>
+      <tags>nr_ulsim.test1 nr_ulsim.test2 nr_ulsim.test3 nr_ulsim.test4 nr_ulsim.test5 nr_ulsim.test6 nr_ulsim.test7 nr_ulsim.test8 nr_ulsim.test9 nr_ulsim.test10 nr_ulsim.test11 nr_ulsim.test12 nr_ulsim.test13 nr_ulsim.test14 nr_ulsim.test15 nr_ulsim.test16 nr_ulsim.test17 nr_ulsim.test18 nr_ulsim.test19 nr_ulsim.test20 nr_ulsim.test21 nr_ulsim.test22</tags>
       <search_expr_true>PUSCH test OK</search_expr_true>
       <search_expr_false>segmentation fault|assertion|exiting|fatal</search_expr_false>
       <nruns>3</nruns>
@@ -1338,10 +1359,11 @@
       <desc>nr_prachsim Test cases. (Test1: 30kHz SCS, 106 PRBs, Prach format A2),
                                     (Test2: 30kHz SCS, 217 PRBs, Prach format A2),
                                     (Test3: 30kHz SCS, 273 PRBs, Prach format A2),
-				    (Test4: 30kHz SCS, 106 PRBs, Prach format 0),
+                                    (Test4: 30kHz SCS, 106 PRBs, Prach format 0),
                                     (Test5: 120kHz SCS, 32 PRBs, Prach format A2),
                                     (Test6: 120kHz SCS, 66 PRBs, Prach format A2),
-                                    (Test7: 120kHz SCS, 66 PRBs, High Speed Enabled)</desc>
+                                    (Test7: 120kHz SCS, 66 PRBs, High Speed Enabled),
+                                    (Test8: 15kHz SCS, 25 PRBs)</desc>
       <pre_compile_prog></pre_compile_prog>
       <compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</compile_prog>
       <compile_prog_args> --phy_simulators -c </compile_prog_args>
@@ -1351,11 +1373,12 @@
       <main_exec_args>-a -s -30 -n 100 -p 63 -R 106
                       -a -s -30 -n 100 -p 63 -R 217
                       -a -s -30 -n 100 -p 63 -R 273
-		      -a -s -30 -n 100 -p 63 -R 106 -c 4
-		      -a -s -30 -n 100 -p 32 -R 32 -m 3 -c52 
-		      -a -s -30 -n 100 -p 32 -R 66 -m 3 -c52
-          -a -s -30 -n 100 -R 66 -m 3 -c52 -H</main_exec_args>
-      <tags>nr_prachsim.test1 nr_prachsim.test2 nr_prachsim.test3 nr_prachsim.test4 nr_prachsim.test5 nr_prachsim.test6 nr_prachsim.test7</tags>
+                      -a -s -30 -n 100 -p 63 -R 106 -c 4
+                      -a -s -30 -n 100 -p 32 -R 32 -m 3 -c52
+                      -a -s -30 -n 100 -p 32 -R 66 -m 3 -c52
+                      -a -s -30 -n 100 -R 66 -m 3 -c52 -H
+                      -a -s -30 -n 100 -p 99 -R 25 -m 0</main_exec_args>
+      <tags>nr_prachsim.test1 nr_prachsim.test2 nr_prachsim.test3 nr_prachsim.test4 nr_prachsim.test5 nr_prachsim.test6 nr_prachsim.test7 nr_prachsim.test8</tags>
       <search_expr_true>PRACH test OK</search_expr_true>
       <search_expr_false>segmentation fault|assertion|exiting|fatal</search_expr_false>
       <nruns>3</nruns>
diff --git a/cmake_targets/build_oai b/cmake_targets/build_oai
index 5cafb95cba61913ec9535bfcdb9aef9ddb5a79b3..16a0d559dd76fa568f5492065cc7cc544eaf74e7 100755
--- a/cmake_targets/build_oai
+++ b/cmake_targets/build_oai
@@ -55,6 +55,7 @@ BUILD_COVERITY_SCAN=0
 DISABLE_HARDWARE_DEPENDENCY="False"
 CMAKE_BUILD_TYPE="RelWithDebInfo"
 CMAKE_CMD="$CMAKE"
+NOAVX512="False"
 BUILD_ECLIPSE=0
 NR="False"
 OPTIONAL_LIBRARIES="telnetsrv enbscope uescope nrscope"
@@ -164,12 +165,18 @@ Options:
    Build optional shared library, <libraries> can be one or several of $OPTIONAL_LIBRARIES or \"all\"
 --usrp-recplay
    Build for I/Q record-playback modes
+--noavx512
+   Build without AVX512 if it is present on CPU
 -k | --skip-shared-libraries
    Skip build for shared libraries to reduce compilation time when building frequently for debugging purposes
 --ninja
   Tell cmake to use the Ninja build system. Without, will generate make files
+--sanitize
+  Shortcut for usage of --sanitize-address --sanitize-undefined
 --sanitize-address | -fsanitize=address
-   Enable the address sanitizer on all targets
+  Enable the address sanitizer on all targets
+--sanitize-undefined | -fsanitize=undefined
+  Enable the undefined behavior sanitizer on all targets
 --ittiSIM
   Makes the itti simulator
 -h | --help
@@ -436,6 +443,10 @@ function main() {
               fi
             fi
             shift 2;;		
+        --noavx512)
+            NOAVX512="True"
+            echo_info "Disabling AVX512"
+            shift 1;;
         -k | --skip-shared-libraries)
             SKIP_SHARED_LIB_FLAG="True"
             echo_info "Skipping build of shared libraries, rfsimulator and transport protocol libraries"
@@ -444,9 +455,16 @@ function main() {
             CMAKE_CMD="$CMAKE_CMD -GNinja"
             MAKE_CMD=ninja
             shift;;
+        --sanitize)
+            CMAKE_CMD="$CMAKE_CMD -DSANITIZE_ADDRESS=True -DSANITIZE_UNDEFINED=True"
+            shift;;
         --sanitize-address | -fsanitize=address)
+            grep -sq "Ubuntu 18.04" /etc/os-release && echo_error "Bug in OS with this option, see CMakeLists.txt"
             CMAKE_CMD="$CMAKE_CMD -DSANITIZE_ADDRESS=True"
             shift;;
+        --sanitize-undefined | -fundefined=address)
+            CMAKE_CMD="$CMAKE_CMD -DSANITIZE_UNDEFINED=True"
+            shift;;
         --ittiSIM)
             ittiSIM=1
             CMAKE_CMD="$CMAKE_CMD -DITTI_SIM=True"
@@ -624,6 +642,7 @@ function main() {
   cd  $DIR/$BUILD_DIR/build
   if [[ ${#CMAKE_C_FLAGS[@]} > 0 ]]; then CMAKE_CMD="$CMAKE_CMD -DCMAKE_C_FLAGS=\"${CMAKE_C_FLAGS[*]}\""; fi
   if [[ ${#CMAKE_CXX_FLAGS[@]} > 0 ]]; then CMAKE_CMD="$CMAKE_CMD -DCMAKE_CXX_FLAGS=\"${CMAKE_CXX_FLAGS[*]}\""; fi
+  CMAKE_CMD="$CMAKE_CMD -DNOAVX512=\"${NOAVX512[*]}\""
   echo_info "running $CMAKE_CMD"
   eval $CMAKE_CMD ../..
   
@@ -713,11 +732,11 @@ function main() {
 	# simlist="ldpctest"
     for f in $simlist ; do
       compilations \
-        ran_build $f \
+        $BUILD_DIR $f \
 	    $f $dbin/$f.$REL
     done
     compilations \
-      ran_build coding \
+      $BUILD_DIR coding \
       libcoding.so $dbin/libcoding.so
   fi
 
@@ -729,7 +748,7 @@ function main() {
     simlist="secu_knas_encrypt_eia1 secu_kenb aes128_ctr_encrypt aes128_ctr_decrypt secu_knas_encrypt_eea2 secu_knas secu_knas_encrypt_eea1 kdf aes128_cmac_encrypt secu_knas_encrypt_eia2"
     for f in $simlist ; do
       compilations \
-	    ran_build test_$f \
+	    $BUILD_DIR test_$f \
 	    test_$f $dbin/test_$f.$REL
     done
   fi
diff --git a/cmake_targets/tools/build_helper b/cmake_targets/tools/build_helper
index 554f3ccfe52958d125007b82e8d5c7d4ac9e08b0..d35f90fcce20a1f9c66e3470c013d1f0b65bcac8 100755
--- a/cmake_targets/tools/build_helper
+++ b/cmake_targets/tools/build_helper
@@ -109,6 +109,7 @@ check_supported_distribution() {
         "ubuntu18.04") return 0 ;;
         "ubuntu16.04") return 0 ;;
         "fedora35")    return 0 ;;
+        "fedora36")    return 0 ;;
         "rhel7")       return 0 ;;
         "rhel7.6")     return 0 ;;
         "rhel7.7")     return 0 ;;
@@ -196,8 +197,8 @@ check_warnings() {
 #argument:
 #    $1: log file
 check_errors() {
-  #we look for 'warning:' in the compilation log file
-  error_count=`grep "error:" "$1" | wc -l`
+  #we look for 'error:' in the compilation log file
+  error_count=`grep -c "error:" "$1"`
   if [ $error_count -gt 0 ]; then
     echo_error "ERROR: $error_count error. See $1"
   fi
@@ -381,7 +382,7 @@ check_install_usrp_uhd_driver(){
         $SUDO apt-get remove libuhd3.14.1 -y || true
         $SUDO apt-get remove libuhd3.15.0 -y || true
         local distribution=$(get_distribution_release)
-        if [[ "$distribution" == "ubuntu18.04" ]]; then
+        if [[ "$distribution" == "ubuntu18.04" || "$distribution" == "ubuntu20.04" || "$distribution" == "ubuntu22.04" ]]; then
             $SUDO apt-get remove libuhd4.0.0 -y || true
             $SUDO apt-get remove libuhd4.1.0 -y || true
         fi
@@ -410,13 +411,15 @@ check_install_usrp_uhd_driver(){
             x=$((x + 1))
         done
         $SUDO apt-get update
-        $SUDO apt-get -y install  python python-tk libboost-all-dev libusb-1.0-0-dev
-        if [[ "$distribution" == "ubuntu16.04" ]]; then
+        $SUDO apt-get -y install python-tk libboost-all-dev libusb-1.0-0-dev
+        case "$(get_distribution_release)" in
+          "ubuntu16.04")
             $SUDO apt-get -y install libuhd-dev libuhd3.15.0 uhd-host
-        fi
-        if [[ "$distribution" == "ubuntu18.04" ]]; then
-            $SUDO apt-get -y install libuhd-dev libuhd4.1.0 uhd-host
-        fi
+            ;;
+          "ubuntu18.04" | "ubuntu20.04" | "ubuntu22.04")
+            $SUDO apt-get -y install libuhd-dev libuhd4.2.0 uhd-host
+            ;;
+        esac
     elif [[ "$OS_BASEDISTRO" == "fedora" ]]; then
         if [ $IS_CONTAINER -eq 0 ]
         then
@@ -621,7 +624,6 @@ check_install_additional_tools (){
         android-tools-adb \
 	wvdial \
         sshpass \
-        nscd \
         bc \
         ntp"
   elif [[ "$OS_DISTRO" == "rhel" ]] || [[ "$OS_DISTRO" == "centos" ]]; then
@@ -646,7 +648,6 @@ check_install_additional_tools (){
       wvdial \
       numpy \
       sshpass \
-      nscd \
       python2-paramiko \
       python-pyroute2 \
       python-netifaces \
@@ -674,7 +675,6 @@ check_install_additional_tools (){
       wvdial \
       python-numpy \
       sshpass \
-      nscd \
       python-paramiko \
       python-pyroute2 \
       python-netifaces \
diff --git a/common/utils/nr/nr_common.c b/common/utils/nr/nr_common.c
index 0aeeaf3afdd497fce65eaba91d5c0c14408a7990..6add03c324db9f3d6903cd341c425511f47f5500 100644
--- a/common/utils/nr/nr_common.c
+++ b/common/utils/nr/nr_common.c
@@ -191,65 +191,17 @@ int PRBalloc_to_locationandbandwidth(int NPRB,int RBstart) {
   return(PRBalloc_to_locationandbandwidth0(NPRB,RBstart,275));
 }
 
-/// Target code rate tables indexed by Imcs
-/* TS 38.214 table 5.1.3.1-1 - MCS index table 1 for PDSCH */
-uint16_t nr_target_code_rate_table1[29] = {120, 157, 193, 251, 308, 379, 449, 526, 602, 679, 340, 378, 434, 490, 553, \
-                                            616, 658, 438, 466, 517, 567, 616, 666, 719, 772, 822, 873, 910, 948};
-
-/* TS 38.214 table 5.1.3.1-2 - MCS index table 2 for PDSCH */
-// Imcs values 20 and 26 have been multiplied by 2 to avoid the floating point
-uint16_t nr_target_code_rate_table2[28] = {120, 193, 308, 449, 602, 378, 434, 490, 553, 616, 658, 466, 517, 567, \
-                                            616, 666, 719, 772, 822, 873, 1365, 711, 754, 797, 841, 885, 1833, 948};
-
-/* TS 38.214 table 5.1.3.1-3 - MCS index table 3 for PDSCH */
-uint16_t nr_target_code_rate_table3[29] = {30, 40, 50, 64, 78, 99, 120, 157, 193, 251, 308, 379, 449, 526, 602, 340, \
-                                            378, 434, 490, 553, 616, 438, 466, 517, 567, 616, 666, 719, 772};
-
-uint16_t nr_tbs_table[93] = {24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120, 128, 136, 144, 152, 160, 168, 176, 184, 192, 208, 224, 240, 256, 272, 288, 304, 320, \
-                              336, 352, 368, 384, 408, 432, 456, 480, 504, 528, 552, 576, 608, 640, 672, 704, 736, 768, 808, 848, 888, 928, 984, 1032, 1064, 1128, 1160, 1192, 1224, 1256, \
-                              1288, 1320, 1352, 1416, 1480, 1544, 1608, 1672, 1736, 1800, 1864, 1928, 2024, 2088, 2152, 2216, 2280, 2408, 2472, 2536, 2600, 2664, 2728, 2792, 2856, 2976, \
-                              3104, 3240, 3368, 3496, 3624, 3752, 3824};
-
-uint8_t nr_get_Qm(uint8_t Imcs, uint8_t table_idx) {
-  switch(table_idx) {
-    case 1:
-      return (((Imcs<10)||(Imcs==29))?2:((Imcs<17)||(Imcs==30))?4:((Imcs<29)||(Imcs==31))?6:-1);
-    break;
-
-    case 2:
-      return (((Imcs<5)||(Imcs==28))?2:((Imcs<11)||(Imcs==29))?4:((Imcs<20)||(Imcs==30))?6:((Imcs<28)||(Imcs==31))?8:-1);
-    break;
-
-    case 3:
-      return (((Imcs<15)||(Imcs==29))?2:((Imcs<21)||(Imcs==30))?4:((Imcs<29)||(Imcs==31))?6:-1);
-    break;
-
-    default:
-      AssertFatal(0, "Invalid MCS table index %d (expected in range [1,3])\n", table_idx);
-      return(0);
-      break;
-  }
-}
+int cce_to_reg_interleaving(const int R, int k, int n_shift, const int C, int L, const int N_regs) {
 
-uint32_t nr_get_code_rate(uint8_t Imcs, uint8_t table_idx) {
-  switch(table_idx) {
-    case 1:
-      return (nr_target_code_rate_table1[Imcs]);
-    break;
-
-    case 2:
-      return (nr_target_code_rate_table2[Imcs]);
-    break;
-
-    case 3:
-      return (nr_target_code_rate_table3[Imcs]);
-    break;
-
-    default:
-      AssertFatal(0, "Invalid MCS table index %d (expected in range [1,3])\n", table_idx);
-      return(0);
-      break;
+  int f;  // interleaving function
+  if(R==0)
+    f = k;
+  else {
+    int c = k/R;
+     int r = k%R;
+     f = (r*C + c + n_shift)%(N_regs/L);
   }
+  return f;
 }
 
 void get_coreset_rballoc(uint8_t *FreqDomainResource,int *n_rb,int *rb_offset) {
@@ -503,7 +455,6 @@ int get_nr_table_idx(int nr_bandP, uint8_t scs_index) {
   return i;
 }
 
-
 int get_subband_size(int NPRB,int size) {
   // implements table  5.2.1.4-2 from 36.214
   //
diff --git a/common/utils/nr/nr_common.h b/common/utils/nr/nr_common.h
index a09532a56523cfd5cdcd0ce05865294da4b3b8d5..5f7f670ce92938f058410d0f698f61e9fde2fa8e 100644
--- a/common/utils/nr/nr_common.h
+++ b/common/utils/nr/nr_common.h
@@ -57,7 +57,7 @@ static inline int get_num_dmrs(uint16_t dmrs_mask ) {
   return(num_dmrs);
 }
 
-
+int cce_to_reg_interleaving(const int R, int k, int n_shift, const int C, int L, const int N_regs);
 int get_SLIV(uint8_t S, uint8_t L);
 void get_coreset_rballoc(uint8_t *FreqDomainResource,int *n_rb,int *rb_offset);
 uint16_t config_bandwidth(int mu, int nb_rb, int nr_band);
@@ -69,12 +69,6 @@ int NRRIV2BW(int locationAndBandwidth,int N_RB);
 int NRRIV2PRBOFFSET(int locationAndBandwidth,int N_RB);
 int PRBalloc_to_locationandbandwidth0(int NPRB,int RBstart,int BWPsize);
 int PRBalloc_to_locationandbandwidth(int NPRB,int RBstart);
-extern uint16_t nr_target_code_rate_table1[29];
-extern uint16_t nr_target_code_rate_table2[28];
-extern uint16_t nr_target_code_rate_table3[29];
-extern uint16_t nr_tbs_table[93];
-uint8_t nr_get_Qm(uint8_t Imcs, uint8_t table_idx);
-uint32_t nr_get_code_rate(uint8_t Imcs, uint8_t table_idx);
 int get_subband_size(int NPRB,int size);
 void SLIV2SL(int SLIV,int *S,int *L);
 int get_dmrs_port(int nl, uint16_t dmrs_ports);
diff --git a/common/utils/ocp_itti/intertask_interface.cpp b/common/utils/ocp_itti/intertask_interface.cpp
index 44fae9f78884e9b5d47ce0226bfb76eca6aae7d5..43001ec95b2f3a549365583fa2540c06649e55ce 100644
--- a/common/utils/ocp_itti/intertask_interface.cpp
+++ b/common/utils/ocp_itti/intertask_interface.cpp
@@ -450,6 +450,7 @@ extern "C" {
   void itti_wait_tasks_end(void) {
     shutting_down = false;
     signal(SIGTERM, catch_sigterm);
+    //signal(SIGINT, catch_sigterm);
     while (! shutting_down)
     {
       sleep(24 * 3600);
diff --git a/common/utils/threadPool/thread-pool.h b/common/utils/threadPool/thread-pool.h
index d06f2195ee7921c40cfef5f5e5a1a5acf3885e3c..e448117385a932318358d578e83499c5632853cf 100644
--- a/common/utils/threadPool/thread-pool.h
+++ b/common/utils/threadPool/thread-pool.h
@@ -80,7 +80,7 @@ static inline notifiedFIFO_elt_t *newNotifiedFIFO_elt(int size,
     notifiedFIFO_t *reponseFifo,
     void (*processingFunc)(void *)) {
   notifiedFIFO_elt_t *ret;
-  AssertFatal( NULL != (ret=(notifiedFIFO_elt_t *) malloc(sizeof(notifiedFIFO_elt_t)+size+32)), "");
+  AssertFatal( NULL != (ret=(notifiedFIFO_elt_t *) calloc(1, sizeof(notifiedFIFO_elt_t)+size+32)), "");
   ret->next=NULL;
   ret->key=key;
   ret->reponseFifo=reponseFifo;
diff --git a/common/utils/time_meas.c b/common/utils/time_meas.c
index df2bfd64de32b6c8b97c3450170e2ff5f9cc71a5..9d1215b5e5b255e979401dc2fa8089c2bd903bcb 100644
--- a/common/utils/time_meas.c
+++ b/common/utils/time_meas.c
@@ -111,13 +111,15 @@ void print_meas(time_stats_t *ts,
   }
 }
 
-int print_meas_log(time_stats_t *ts,
-                const char *name,
-                time_stats_t *total_exec_time,
-                time_stats_t *sf_exec_time,
-                char *output)
+size_t print_meas_log(time_stats_t *ts,
+                      const char *name,
+                      time_stats_t *total_exec_time,
+                      time_stats_t *sf_exec_time,
+                      char *output,
+                      size_t outputlen)
 {
-  int stroff = 0;
+  const char *begin = output;
+  const char *end = output + outputlen;
   static int first_time = 0;
   static double cpu_freq_GHz = 0.0;
 
@@ -128,30 +130,49 @@ int print_meas_log(time_stats_t *ts,
     first_time=1;
 
     if ((total_exec_time == NULL) || (sf_exec_time== NULL))
-      stroff += sprintf(output, "%25s  %25s  %25s  %25s %25s %6f\n","Name","Total","Per Trials",   "Num Trials","CPU_F_GHz", cpu_freq_GHz);
+      output += snprintf(output,
+                         end - output,
+                         "%25s  %25s  %25s  %25s %25s %6f\n",
+                         "Name",
+                         "Total",
+                         "Per Trials",
+                         "Num Trials",
+                         "CPU_F_GHz",
+                         cpu_freq_GHz);
     else
-      stroff += sprintf(output+stroff, "%25s  %25s  %25s  %20s %15s %6f\n","Name","Total","Average/Frame","Trials",    "CPU_F_GHz", cpu_freq_GHz);
+      output += snprintf(output,
+                         end - output,
+                         "%25s  %25s  %25s  %20s %15s %6f\n",
+                         "Name",
+                         "Total",
+                         "Average/Frame",
+                         "Trials",
+                         "CPU_F_GHz",
+                         cpu_freq_GHz);
   }
 
   if (ts->trials>0) {
-    //printf("%20s: total: %10.3f ms, average: %10.3f us (%10d trials)\n", name, ts->diff/cpu_freq_GHz/1000000.0, ts->diff/ts->trials/cpu_freq_GHz/1000.0, ts->trials);
     if ((total_exec_time == NULL) || (sf_exec_time== NULL)) {
-      stroff += sprintf(output+stroff, "%25s:  %15.3f us; %15d; %15.3f us;\n",
-              name,
-              (ts->diff/ts->trials/cpu_freq_GHz/1000.0),
-              ts->trials,
-              ts->max/cpu_freq_GHz/1000.0);
+      output += snprintf(output,
+                         end - output,
+                         "%25s:  %15.3f us; %15d; %15.3f us;\n",
+                         name,
+                         ts->diff / ts->trials / cpu_freq_GHz / 1000.0,
+                         ts->trials,
+                         ts->max / cpu_freq_GHz / 1000.0);
     } else {
-      stroff += sprintf(output+stroff, "%25s:  %15.3f ms (%5.2f%%); %15.3f us (%5.2f%%); %15d;\n",
-              name,
-              (ts->diff/cpu_freq_GHz/1000000.0),
-              ((ts->diff/cpu_freq_GHz/1000000.0)/(total_exec_time->diff/cpu_freq_GHz/1000000.0))*100,  // percentage
-              (ts->diff/ts->trials/cpu_freq_GHz/1000.0),
-              ((ts->diff/ts->trials/cpu_freq_GHz/1000.0)/(sf_exec_time->diff/sf_exec_time->trials/cpu_freq_GHz/1000.0))*100,  // percentage
-              ts->trials);
+      output += snprintf(output,
+                         end - output,
+                         "%25s:  %15.3f ms (%5.2f%%); %15.3f us (%5.2f%%); %15d;\n",
+                         name,
+                         ts->diff / cpu_freq_GHz / 1000000.0,
+                         ((ts->diff / cpu_freq_GHz / 1000000.0) / (total_exec_time->diff / cpu_freq_GHz / 1000000.0))*100,  // percentage
+                         ts->diff / ts->trials / cpu_freq_GHz / 1000.0,
+                         ((ts->diff / ts->trials / cpu_freq_GHz / 1000.0) / (sf_exec_time->diff / sf_exec_time->trials / cpu_freq_GHz / 1000.0)) * 100,  // percentage
+                         ts->trials);
     }
   }
-  return stroff;
+  return output - begin;
 }
 
 double get_time_meas_us(time_stats_t *ts)
diff --git a/common/utils/time_meas.h b/common/utils/time_meas.h
index 382dd7455a0e4a5d44146b4c6054c971071d7809..eb81d09434cefab1879c28aad1c286eaee15d45a 100644
--- a/common/utils/time_meas.h
+++ b/common/utils/time_meas.h
@@ -62,7 +62,7 @@ typedef struct time_stats {
   oai_cputime_t in;          /*!< \brief time at measure starting point */
   oai_cputime_t diff;        /*!< \brief average difference between time at starting point and time at endpoint*/
   oai_cputime_t p_time;      /*!< \brief absolute process duration */
-  oai_cputime_t diff_square; /*!< \brief process duration square */
+  double diff_square;        /*!< \brief process duration square */
   oai_cputime_t max;         /*!< \brief maximum difference between time at starting point and time at endpoint*/
   int trials;                /*!< \brief number of start point - end point iterations */
   int meas_flag;             /*!< \brief 1: stop_meas not called (consecutive calls of start_meas) */
@@ -83,7 +83,12 @@ static inline void stop_meas(time_stats_t *ts) __attribute__((always_inline));
 
 void print_meas_now(time_stats_t *ts, const char *name, FILE *file_name);
 void print_meas(time_stats_t *ts, const char *name, time_stats_t *total_exec_time, time_stats_t *sf_exec_time);
-int print_meas_log(time_stats_t *ts, const char *name, time_stats_t *total_exec_time, time_stats_t *sf_exec_time, char *output);
+size_t print_meas_log(time_stats_t *ts,
+                      const char *name,
+                      time_stats_t *total_exec_time,
+                      time_stats_t *sf_exec_time,
+                      char *output,
+                      size_t outputlen);
 double get_time_meas_us(time_stats_t *ts);
 double get_cpu_freq_GHz(void);
 
@@ -151,7 +156,7 @@ static inline void stop_meas(time_stats_t *ts) {
     ts->diff += (out-ts->in);
     /// process duration is the difference between two clock points
     ts->p_time = (out-ts->in);
-    ts->diff_square += (out-ts->in)*(out-ts->in);
+    ts->diff_square += ((double)out-ts->in)*((double)out-ts->in);
 
     if ((out-ts->in) > ts->max)
       ts->max = out-ts->in;
diff --git a/doc/BUILD.md b/doc/BUILD.md
index a52ce98cb53f7df132d6b55d64902b32fb7c1036..70d69f5afde23705a7f055e636ef9d61f467d7ba 100644
--- a/doc/BUILD.md
+++ b/doc/BUILD.md
@@ -193,6 +193,7 @@ Using the help option of the build script you can get the list of available opti
 | --UE                                                        | maintained and tested in CI                 | build `lte-uesoftmodem` the LTE UE                           |
 | --gNB                                                       | maintained and tested in CI                 | build `nr-softmodem` the 5G gNodeB                           |
 | --nrUE                                                      | maintained and tested in CI                 | build `nr-uesoftmodem` the 5G UE                             |
+| --arch-native                                               | maintained                                  | build with native architecture optimization                  |
 | --usrp-recplay                                              | deprecated                                  | use the USRP configuration parameters to use the record player. |
 | --build-lib                                                 | maintained                                  | build  optional shared library(ies), which can then be loaded at run time via command line option. Use the --help option to get the list of supported optional libraries. `all` can be used to build all available optional libraries. |
 | --UE-conf-nvram                                             | maintained                                  | Specifies the path to the input file used by the conf2uedata utility. defaults to [openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf](../openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf) |
diff --git a/doc/FEATURE_SET.md b/doc/FEATURE_SET.md
index a289c6d17eb491005f037b05f8037e72d9b606c8..5db6e44d8d2f788375f05649f033a0de2d95be02 100644
--- a/doc/FEATURE_SET.md
+++ b/doc/FEATURE_SET.md
@@ -332,6 +332,9 @@ The following features are valid for the gNB and the 5G-NR UE.
   - evalution of RSRP report
   - evaluation of CQI report
 - MAC scheduling of SR reception
+- Bandwidth part (BWP) operation
+  - Handle multiple dedicated BWPs
+  - BWP switching through RRCReconfiguration method
 
 **gNB RLC**
 - Send/Receive operations according to 38.322 Rel.16
@@ -437,6 +440,10 @@ The following features are valid for the gNB and the 5G-NR UE.
    - PTRS support
    - Support for 1, 2 and 4 RX antennas
    - Support for up to 2 layers (currently limited to DMRS configuration type 2)
+* Measurements based on NR-CSIRS
+    - RI, PMI and CQI computation
+    - Support for 1 and 2 RX antennas
+    - Support for up to 2 layers
 *  NR-PUSCH (including Segmentation, LDPC encoding, rate matching, scrambling, modulation, RB mapping, etc).
    - PUSCH mapping type A and B
    - DMRS configuration type 1 and 2
@@ -485,14 +492,19 @@ The following features are valid for the gNB and the 5G-NR UE.
 * UCI processing
    - ACK/NACK processing
    - Triggering periodic SR
-   - CSI measurement reporting (SSB RSRP only)
-* DLSH scheduler
+   - CSI measurement reporting
+* DLSCH scheduler
    - Configuration of fapi PDU according to DCI
    - HARQ procedures
 * ULSCH scheduler
    - Configuration of fapi PDU according to DCI
+* NR-CSIRS scheduler
+  - Scheduling of NR-CSIRS reception
+  - Fill UCI for CSI measurement reporting
 * Scheduler procedures for SRS transmission
    - Periodic SRS transmission
+* Bandwidth part (BWP) operation
+   - Operation in configured dedicated BWP through RRCSetup or RRCReconfiguration
 
 
 **UE RLC**
diff --git a/doc/NR_SA_CN5G_gNB_B210_COTS_UE_Tutorial.md b/doc/NR_SA_CN5G_gNB_B210_COTS_UE_Tutorial.md
new file mode 100644
index 0000000000000000000000000000000000000000..fc0700c6994dad76ed073bcece7326693fe43b23
--- /dev/null
+++ b/doc/NR_SA_CN5G_gNB_B210_COTS_UE_Tutorial.md
@@ -0,0 +1,227 @@
+<table style="border-collapse: collapse; border: none;">
+  <tr style="border-collapse: collapse; border: none;">
+    <td style="border-collapse: collapse; border: none;">
+      <a href="http://www.openairinterface.org/">
+         <img src="./images/oai_final_logo.png" alt="" border=3 height=50 width=150>
+         </img>
+      </a>
+    </td>
+    <td style="border-collapse: collapse; border: none; vertical-align: center;">
+      <b><font size = "5">OAI 5G SA tutorial</font></b>
+    </td>
+  </tr>
+</table>
+
+**TABLE OF CONTENTS**
+
+1. [Scenario](#1-scenario)
+2. [OAI CN5G](#2-oai-cn5g)
+    1. [OAI CN5G pre-requisites](#21-oai-cn5g-pre-requisites)
+    2. [OAI CN5G Setup](#22-oai-cn5g-setup)
+    3. [OAI CN5G Configuration files](#23-oai-cn5g-configuration-files)
+    4. [SIM Card](#24-sim-card)
+3. [OAI gNB](#3-oai-gnb)
+    1. [OAI gNB pre-requisites](#31-oai-gnb-pre-requisites)
+    2. [Build OAI gNB](#32-build-oai-gnb)
+4. [Run OAI CN5G and OAI gNB with USRP B210](#4-run-oai-cn5g-and-oai-gnb-with-usrp-b210)
+    1. [Run OAI CN5G](#41-run-oai-cn5g)
+    2. [Run OAI gNB](#42-run-oai-gnb)
+5. [Testing with QUECTEL RM500Q](#5-testing-with-quectel-rm500q)
+    1. [Setup QUECTEL](#51-setup-quectel)
+    2. [Ping test](#52-ping-test)
+    3. [Downlink iPerf test](#53-downlink-iperf-test)
+
+
+# 1. Scenario
+In this tutorial we describe how to configure and run a 5G end-to-end setup with OAI CN5G, OAI gNB and COTS UE.
+
+Minimum hardware requirements:
+- Laptop/Desktop/Server for OAI CN5G and OAI gNB
+    - Operating System: [Ubuntu 20.04.4 LTS](https://releases.ubuntu.com/20.04.4/ubuntu-20.04.4-desktop-amd64.iso)
+    - CPU: 8 cores x86_64 @ 3.5 GHz
+    - RAM: 32 GB
+- Laptop for UE
+    - Operating System: Microsoft Windows 10 x64
+    - CPU: 4 cores x86_64
+    - RAM: 8 GB
+    - Windows driver for Quectel MUST be equal or higher than version **2.2.4**
+- [USRP B210](https://www.ettus.com/all-products/ub210-kit/)
+- Quectel RM500Q
+    - Module, M.2 to USB adapter, antennas and SIM card
+    - Firmware version of Quectel MUST be equal or higher than **RM500QGLABR11A06M4G**
+
+
+# 2. OAI CN5G
+
+## 2.1 OAI CN5G pre-requisites
+
+```bash
+sudo apt install -y git net-tools putty
+
+sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
+curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
+sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu  $(lsb_release -cs)  stable"
+sudo apt update
+sudo apt install -y docker docker-ce
+
+# Add your username to the docker group, otherwise you will have to run in sudo mode.
+sudo usermod -a -G docker $(whoami)
+reboot
+
+# https://docs.docker.com/compose/install/
+sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
+sudo chmod +x /usr/local/bin/docker-compose
+```
+
+## 2.2 OAI CN5G Setup
+
+```bash
+# Git oai-cn5g-fed repository
+git clone https://gitlab.eurecom.fr/oai/cn5g/oai-cn5g-fed.git ~/oai-cn5g-fed
+
+# Pull docker images
+docker pull oaisoftwarealliance/oai-amf:develop
+docker pull oaisoftwarealliance/oai-nrf:develop
+docker pull oaisoftwarealliance/oai-smf:develop
+docker pull oaisoftwarealliance/oai-udr:develop
+docker pull oaisoftwarealliance/oai-udm:develop
+docker pull oaisoftwarealliance/oai-ausf:develop
+docker pull oaisoftwarealliance/oai-spgwu-tiny:develop
+docker pull oaisoftwarealliance/trf-gen-cn5g:latest
+
+# Tag docker images
+docker image tag oaisoftwarealliance/oai-amf:develop oai-amf:develop
+docker image tag oaisoftwarealliance/oai-nrf:develop oai-nrf:develop
+docker image tag oaisoftwarealliance/oai-smf:develop oai-smf:develop
+docker image tag oaisoftwarealliance/oai-udr:develop oai-udr:develop
+docker image tag oaisoftwarealliance/oai-udm:develop oai-udm:develop
+docker image tag oaisoftwarealliance/oai-ausf:develop oai-ausf:develop
+docker image tag oaisoftwarealliance/oai-spgwu-tiny:develop oai-spgwu-tiny:develop
+docker image tag oaisoftwarealliance/trf-gen-cn5g:latest trf-gen-cn5g:latest
+```
+
+## 2.3 OAI CN5G Configuration files
+Download and copy configuration files:
+- Copy [docker-compose-basic-nrf.yaml](tutorial_resources/docker-compose-basic-nrf.yaml) to `~/oai-cn5g-fed/docker-compose`
+- Copy [oai_db.sql](tutorial_resources/oai_db.sql) to `~/oai-cn5g-fed/docker-compose/database`
+
+Change permissions on oai_db.sql to prevent mysql permission denied error:
+```bash
+chmod 644 ~/oai-cn5g-fed/docker-compose/database/oai_db.sql
+```
+
+## 2.4 SIM Card
+Program SIM Card with [Open Cells Project](https://open-cells.com/) application [uicc-v2.6](https://open-cells.com/d5138782a8739209ec5760865b1e53b0/uicc-v2.6.tgz).
+
+```bash
+sudo ./program_uicc --adm 12345678 --imsi 208990000000001 --isdn 00000001 --acc 0001 --key fec86ba6eb707ed08905757b1bb44b8f --opc C42449363BBAD02B66D16BC975D77CC1 -spn "OpenAirInterface" --authenticate
+```
+
+
+# 3. OAI gNB
+
+## 3.1 OAI gNB pre-requisites
+
+### Build UHD from source
+```bash
+sudo apt install -y libboost-all-dev libusb-1.0-0-dev doxygen python3-docutils python3-mako python3-numpy python3-requests python3-ruamel.yaml python3-setuptools cmake build-essential
+
+git clone https://github.com/EttusResearch/uhd.git ~/uhd
+cd ~/uhd
+git checkout v4.0.0.0
+cd host
+mkdir build
+cd build
+cmake ../
+make -j 4
+make test # This step is optional
+sudo make install
+sudo ldconfig
+sudo uhd_images_downloader
+```
+
+## 3.2 Build OAI gNB
+
+```bash
+# Get openairinterface5g source code
+git clone https://gitlab.eurecom.fr/oai/openairinterface5g.git ~/openairinterface5g
+cd ~/openairinterface5g
+git checkout develop
+
+# Install dependencies in Ubuntu 20.04
+cd ~/openairinterface5g
+source oaienv
+cd cmake_targets
+./build_oai -I
+
+# Build OAI gNB
+cd ~/openairinterface5g
+source oaienv
+cd cmake_targets
+./build_oai -w USRP --nrUE --gNB --build-lib all -c
+```
+
+
+# 4. Run OAI CN5G and OAI gNB with USRP B210
+
+## 4.1 Run OAI CN5G
+
+```bash
+cd ~/oai-cn5g-fed/docker-compose
+python3 core-network.py --type start-basic --scenario 1
+```
+
+## 4.2 Run OAI gNB
+
+```bash
+cd ~/openairinterface5g
+source oaienv
+cd cmake_targets/ran_build/build
+sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf --sa -E --continuous-tx
+```
+
+Make sure that during USRP initialization, it shows that USB 3 is used.
+
+# 5. Testing with Quectel RM500Q
+
+## 5.1 Setup Quectel
+With [PuTTY](https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe), send the following AT commands to the module using a serial interface (ex: COM2) at 115200 bps:
+```bash
+# MUST be sent at least once everytime there is a firmware upgrade!
+AT+QMBNCFG="Select","ROW_Commercial"
+AT+QMBNCFG="AutoSel",0
+AT+CFUN=1,1
+AT+CGDCONT=1
+AT+CGDCONT=2
+AT+CGDCONT=3
+AT+CGDCONT=1,"IP","oai"
+
+# (Optional, debug only, AT commands) Activate PDP context, retrieve IP address and test with ping
+AT+CGACT=1,1
+AT+CGPADDR=1
+AT+QPING=1,"openairinterface.org"
+```
+
+## 5.2 Ping test
+- UE host
+```bash
+ping 192.168.70.135 -n 1000 -S 12.1.1.2
+```
+- CN5G host
+```bash
+docker exec -it oai-ext-dn ping 12.1.1.2
+```
+
+## 5.3 Downlink iPerf test
+- UE host
+    - Download iPerf for Microsoft Windows from [here](https://iperf.fr/download/windows/iperf-2.0.9-win64.zip).
+    - Extract to Desktop and run with Command Prompt:
+```bash
+cd C:\Users\User\Desktop\iPerf\iperf-2.0.9-win64\iperf-2.0.9-win64
+iperf -s -u -i 1 -B 12.1.1.2
+```
+
+- CN5G host
+```bash
+docker exec -it oai-ext-dn iperf -u -t 86400 -i 1 -fk -B 192.168.70.135 -b 125M -c 12.1.1.2
+```
diff --git a/doc/NR_SA_CN5G_gNB_N300_COTS_UE_Tutorial.md b/doc/NR_SA_CN5G_gNB_N300_COTS_UE_Tutorial.md
new file mode 100644
index 0000000000000000000000000000000000000000..d68057fd084e452be4619fdf8e1d7d1929751ca3
--- /dev/null
+++ b/doc/NR_SA_CN5G_gNB_N300_COTS_UE_Tutorial.md
@@ -0,0 +1,244 @@
+<table style="border-collapse: collapse; border: none;">
+  <tr style="border-collapse: collapse; border: none;">
+    <td style="border-collapse: collapse; border: none;">
+      <a href="http://www.openairinterface.org/">
+         <img src="./images/oai_final_logo.png" alt="" border=3 height=50 width=150>
+         </img>
+      </a>
+    </td>
+    <td style="border-collapse: collapse; border: none; vertical-align: center;">
+      <b><font size = "5">OAI 5G SA tutorial</font></b>
+    </td>
+  </tr>
+</table>
+
+**TABLE OF CONTENTS**
+
+1. [Scenario](#1-scenario)
+2. [OAI CN5G](#2-oai-cn5g)
+    1. [OAI CN5G pre-requisites](#21-oai-cn5g-pre-requisites)
+    2. [OAI CN5G Setup](#22-oai-cn5g-setup)
+    3. [OAI CN5G Configuration files](#23-oai-cn5g-configuration-files)
+    4. [SIM Card](#24-sim-card)
+3. [OAI gNB](#3-oai-gnb)
+    1. [OAI gNB pre-requisites](#31-oai-gnb-pre-requisites)
+    2. [Build OAI gNB](#32-build-oai-gnb)
+    3. [N300 Ethernet Tuning](#33-n300-ethernet-tuning)
+4. [Run OAI CN5G and OAI gNB with USRP N300](#4-run-oai-cn5g-and-oai-gnb-with-usrp-n300)
+    1. [Run OAI CN5G](#41-run-oai-cn5g)
+    2. [Run OAI gNB](#42-run-oai-gnb)
+5. [Testing with QUECTEL RM500Q](#5-testing-with-quectel-rm500q)
+    1. [Setup QUECTEL](#51-setup-quectel)
+    2. [Ping test](#52-ping-test)
+    3. [Downlink iPerf test](#53-downlink-iperf-test)
+
+
+#  1. Scenario
+In this tutorial we describe how to configure and run a 5G end-to-end setup with OAI CN5G, OAI gNB and COTS UE.
+
+Minimum hardware requirements:
+- Laptop/Desktop/Server for OAI CN5G and OAI gNB
+    - Operating System: [Ubuntu 20.04.4 LTS](https://releases.ubuntu.com/20.04.4/ubuntu-20.04.4-desktop-amd64.iso)
+    - CPU: 8 cores x86_64 @ 3.5 GHz
+    - RAM: 32 GB
+- Laptop for UE
+    - Operating System: Microsoft Windows 10 x64
+    - CPU: 4 cores x86_64
+    - RAM: 8 GB
+    - Windows driver for Quectel MUST be equal or higher than version **2.2.4**
+- [USRP N300](https://www.ettus.com/all-products/USRP-N300/): Please identify the network interface(s) on which the N300 is connected.
+- Quectel RM500Q
+    - Module, M.2 to USB adapter, antennas and SIM card
+    - Firmware version of Quectel MUST be equal or higher than **RM500QGLABR11A06M4G**
+
+
+# 2. OAI CN5G
+
+## 2.1 OAI CN5G pre-requisites
+
+```bash
+sudo apt install -y git net-tools putty
+
+sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
+curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
+sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu  $(lsb_release -cs)  stable"
+sudo apt update
+sudo apt install -y docker docker-ce
+
+# Add your username to the docker group, otherwise you will have to run in sudo mode.
+sudo usermod -a -G docker $(whoami)
+reboot
+
+# https://docs.docker.com/compose/install/
+sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
+sudo chmod +x /usr/local/bin/docker-compose
+```
+
+## 2.2 OAI CN5G Setup
+
+```bash
+# Git oai-cn5g-fed repository
+git clone https://gitlab.eurecom.fr/oai/cn5g/oai-cn5g-fed.git ~/oai-cn5g-fed
+
+# Pull docker images
+docker pull oaisoftwarealliance/oai-amf:develop
+docker pull oaisoftwarealliance/oai-nrf:develop
+docker pull oaisoftwarealliance/oai-smf:develop
+docker pull oaisoftwarealliance/oai-udr:develop
+docker pull oaisoftwarealliance/oai-udm:develop
+docker pull oaisoftwarealliance/oai-ausf:develop
+docker pull oaisoftwarealliance/oai-spgwu-tiny:develop
+docker pull oaisoftwarealliance/trf-gen-cn5g:latest
+
+# Tag docker images
+docker image tag oaisoftwarealliance/oai-amf:develop oai-amf:develop
+docker image tag oaisoftwarealliance/oai-nrf:develop oai-nrf:develop
+docker image tag oaisoftwarealliance/oai-smf:develop oai-smf:develop
+docker image tag oaisoftwarealliance/oai-udr:develop oai-udr:develop
+docker image tag oaisoftwarealliance/oai-udm:develop oai-udm:develop
+docker image tag oaisoftwarealliance/oai-ausf:develop oai-ausf:develop
+docker image tag oaisoftwarealliance/oai-spgwu-tiny:develop oai-spgwu-tiny:develop
+docker image tag oaisoftwarealliance/trf-gen-cn5g:latest trf-gen-cn5g:latest
+```
+
+## 2.3 OAI CN5G Configuration files
+Download and copy configuration files:
+- Copy [docker-compose-basic-nrf.yaml](tutorial_resources/docker-compose-basic-nrf.yaml) to `~/oai-cn5g-fed/docker-compose`
+- Copy [oai_db.sql](tutorial_resources/oai_db.sql) to `~/oai-cn5g-fed/docker-compose/database`
+
+Change permissions on oai_db.sql to prevent mysql permission denied error:
+```bash
+chmod 644 ~/oai-cn5g-fed/docker-compose/database/oai_db.sql
+```
+
+## 2.4  SIM Card
+Program SIM Card with [Open Cells Project](https://open-cells.com/) application [uicc-v2.6](https://open-cells.com/d5138782a8739209ec5760865b1e53b0/uicc-v2.6.tgz).
+
+```bash
+sudo ./program_uicc --adm 12345678 --imsi 208990000000001 --isdn 00000001 --acc 0001 --key fec86ba6eb707ed08905757b1bb44b8f --opc C42449363BBAD02B66D16BC975D77CC1 -spn "OpenAirInterface" --authenticate
+```
+
+
+# 3. OAI gNB
+
+## 3.1 OAI gNB pre-requisites
+
+### Build UHD from source
+```bash
+sudo apt install -y libboost-all-dev libusb-1.0-0-dev doxygen python3-docutils python3-mako python3-numpy python3-requests python3-ruamel.yaml python3-setuptools cmake build-essential
+
+git clone https://github.com/EttusResearch/uhd.git ~/uhd
+cd ~/uhd
+git checkout v4.0.0.0
+cd host
+mkdir build
+cd build
+cmake ../
+make -j 4
+make test # This step is optional
+sudo make install
+sudo ldconfig
+sudo uhd_images_downloader
+```
+
+## 3.2 Build OAI gNB
+
+```bash
+# Get openairinterface5g source code
+git clone https://gitlab.eurecom.fr/oai/openairinterface5g.git ~/openairinterface5g
+cd ~/openairinterface5g
+git checkout develop
+
+# Install dependencies in Ubuntu 20.04
+cd ~/openairinterface5g
+source oaienv
+cd cmake_targets
+./build_oai -I
+
+# Build OAI gNB
+cd ~/openairinterface5g
+source oaienv
+cd cmake_targets
+./build_oai -w USRP --nrUE --gNB --build-lib all -c
+```
+
+## 3.3 N300 Ethernet Tuning
+
+Please also refer to the official [USRP Host Performance Tuning Tips and Tricks](https://kb.ettus.com/USRP_Host_Performance_Tuning_Tips_and_Tricks) tuning guide.
+
+The following steps are recommended. Please change the network interface(s) as required. Also, you should have 10Gbps interface(s): if you use two cables, you should have the XG interface. Refer to the [N300 Getting Started Guide](https://kb.ettus.com/USRP_N300/N310/N320/N321_Getting_Started_Guide) for more information.
+
+* Use an MTU of 9000: how to change this depends on the network management tool. In the case of Network Manager, this can be done from the GUI.
+* Increase the kernel socket buffer (also done by the USRP driver in OAI):
+  ```
+  sysctl -w net.core.rmem_max=8388608
+  sysctl -w net.core.wmem_max=8388608
+  sysctl -w net.core.rmem_default=65536
+  sysctl -w net.core.wmem_default=65536
+  ```
+* Increase Ethernet Ring Buffers: `sudo ethtool -G <ifname> rx 4096 tx 4096`
+* Disable hyper-threading in the BIOS
+* Disable KPTI Protections for Spectre/Meltdown for more performance. **This is a security risk.** Add `mitigations=off nosmt` in your grub config and update grub.
+
+# 4. Run OAI CN5G and OAI gNB with USRP N300
+
+## 4.1 Run OAI CN5G
+
+```bash
+cd ~/oai-cn5g-fed/docker-compose
+python3 core-network.py --type start-basic --scenario 1
+```
+
+## 4.2 Run OAI gNB
+
+```bash
+cd ~/openairinterface5g
+source oaienv
+cd cmake_targets/ran_build/build
+sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.162PRB.2x2.usrpn300.conf --sa --usrp-tx-thread-config 1
+```
+
+
+# 5. Testing with Quectel RM500Q
+
+## 5.1 Setup Quectel
+With [PuTTY](https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe), send the following AT commands to the module using a serial interface (ex: COM2) at 115200 bps:
+```bash
+# MUST be sent at least once everytime there is a firmware upgrade!
+AT+QMBNCFG="Select","ROW_Commercial"
+AT+QMBNCFG="AutoSel",0
+AT+CFUN=1,1
+AT+CGDCONT=1
+AT+CGDCONT=2
+AT+CGDCONT=3
+AT+CGDCONT=1,"IP","oai"
+
+# (Optional, debug only, AT commands) Activate PDP context, retrieve IP address and test with ping
+AT+CGACT=1,1
+AT+CGPADDR=1
+AT+QPING=1,"openairinterface.org"
+```
+
+## 5.2 Ping test
+- UE host
+```bash
+ping 192.168.70.135 -n 1000 -S 12.1.1.2
+```
+- CN5G host
+```bash
+docker exec -it oai-ext-dn ping 12.1.1.2
+```
+
+## 5.3 Downlink iPerf test
+- UE host
+    - Download iPerf for Microsoft Windows from [here](https://iperf.fr/download/windows/iperf-2.0.9-win64.zip).
+    - Extract to Desktop and run with Command Prompt:
+```bash
+cd C:\Users\User\Desktop\iPerf\iperf-2.0.9-win64\iperf-2.0.9-win64
+iperf -s -u -i 1 -B 12.1.1.2
+```
+
+- CN5G host
+```bash
+docker exec -it oai-ext-dn iperf -u -t 86400 -i 1 -fk -B 192.168.70.135 -b 200M -c 12.1.1.2
+```
diff --git a/doc/RUNMODEM.md b/doc/RUNMODEM.md
index 119027f16959e70a08e1656d218131d353dac3c6..2dc4fd2ff5f95c8f422affa65930087805de188a 100644
--- a/doc/RUNMODEM.md
+++ b/doc/RUNMODEM.md
@@ -207,7 +207,24 @@ UE on machine 2:
 
 `sudo ./nr-uesoftmodem --if_freq 2169080000 --if_freq_off -400000000`
 
+# MIMO configuration
 
+<table style="border-collapse: collapse; border: none;">
+  <tr style="border-collapse: collapse; border: none;">
+    <td style="border-collapse: collapse; border: none;">
+         <img src="./images/mimo_antenna_ports.png" alt="" border=3 height=100 width=300>
+         </img>
+    </td>
+  </tr>
+</table>
+
+This image shows an example of gNB 5G MIMO logical antenna port configuration. It has to be noted that logical antenna ports might not directly correspond to physical antenna ports and each logical antenna port might consist of a sub-array of antennas.
+
+The basic element is a dual-polarized antenna, therefore the minimal DL MIMO setup with two logical antenna ports would consist of two cross-polarized antenna elements. In a single panel configuration, as the one in the picture, this element can be repeated vertiacally and/or horizontally to form an equi-spaced 1D or 2D array. The values N1 and N2 represent the number of antenna ports in the two dimensions and the supported configurations are specified in Section 5.2.2.2.1 of TS 38.214.
+
+The DL logical antenna port configuration can be selected through configuration file. `pdsch_AntennaPorts_N1` can be used to set N1 parameter, `pdsch_AntennaPorts_N2` to set N2 and `pdsch_AntennaPorts_XP` to set the cross-polarization configuration (1 for single pol, 2 for cross-pol). To be noted that if XP is 1 but N1 and/or N2 are larger than 1, this would result in a non-standard configuration and the PMI selected would be the identity matrix regardless of CSI report. The default value for each of these parameters is 1.
+
+# Additional links
 
 [Selecting an alternative ldpc implementation at run time](../openair1/PHY/CODING/DOC/LDPCImplementation.md)
 
diff --git a/doc/RUN_NR_multiple_BWPs.md b/doc/RUN_NR_multiple_BWPs.md
new file mode 100644
index 0000000000000000000000000000000000000000..2c2c2fcf25b3aa6f5d1cb2f5cf181726bc346bd8
--- /dev/null
+++ b/doc/RUN_NR_multiple_BWPs.md
@@ -0,0 +1,51 @@
+# Procedure to add dedicated Bandwidth part (BWP)
+
+## Contributed by 5G Testbed IISc 
+
+### Developers: Abhijith A, Shruthi S
+
+# Terminology #
+
+## Bandwidth part (BWP) ##
+Bandwidth Part (BWP) is a set of contiguous Resource Blocks in the resource grid. 
+
+Parameters of a BWP are communicated to UE using RRC parameters: BWP-Downlink and BWP-Uplink. 
+
+A UE can be configured with a set of 4 BWPs in uplink (UL) and downlink (DL) direction (3GPP TS 38.331 Annex B.2 Description of BWP configuration options). But only 1 BWP can be active in UL and DL direction at a given time.
+
+# Procedure to run multiple dedicated BWPs #
+
+A maximum of 4 dedicated BWPs can be configured for a UE.
+
+To configure multiple BWPs, add the following parameters to the gNB configuration file under "servingCellConfigDedicated": 
+
+## Setup of the Configuration files ##
+```
+    firstActiveDownlinkBWP-Id = 1;  #BWP-Id
+    defaultDownlinkBWP-Id     = 1;  #BWP-Id
+    firstActiveUplinkBWP-Id   = 1;  #BWP-Id
+```
+
+Each dedicated BWP must have:
+```
+    # BWP 1 Configuration
+    dl_bwp-Id_1 = 1;
+    dl_bwp1_locationAndBandwidth = 28875; // RBstart=0, L=106 (40 MHz BW)
+    # subcarrierSpacing
+    # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+    dl_bwp1_subcarrierSpacing = 1;
+```   
+
+ Find these parameters in this configuration file: "targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf"
+     
+# Testing gNB and UE in RF simulator
+
+## gNB command:
+```
+    sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf --gNBs.[0].min_rxtxtime 6 --rfsim --sa
+```
+
+## UE command:
+```
+    sudo RFSIMULATOR=127.0.0.1 ./nr-uesoftmodem -r 106 --numerology 1 --band 78 -C 3619200000 --nokrnmod --rfsim --sa --uicc0.imsi 208990000000001
+```
\ No newline at end of file
diff --git a/doc/TESTBenches.md b/doc/TESTBenches.md
index 7365bc0f4c7df220fdf4a026b4cb8abecb89946f..c6a01f278d41becdfba7fcefa3713be97af469ce 100644
--- a/doc/TESTBenches.md
+++ b/doc/TESTBenches.md
@@ -1,45 +1,167 @@
 ## Table of Contents ##
 
-1.   [Legacy 1 Bench](#legacy-1-bench)
-2.   [Legacy 2 Bench](#legacy-2-bench)
-3.   [Next Bench for DEV](#next-bench-for-dev)
-4.   [Next Bench for CI](#next-bench-for-ci)
-5.   [Indoor Live Network Bench](#indoor-live-network-bench)
-6.   [Outdoor Live Network Bench](#outdoor-live-network-bench)
+1.   [Machines](#machines)
+2.   [Networked devices](#networked-devices)
+3.   [Testbenches](#testbenches)
+4.   [Pipelines](#pipelines)
+
+## Machines
 
-
-## Legacy 1 Bench
-
-**Purpose** : FDD Band 7 and Band 13, LTE-M  
-**Note** : Legacy1 and Legacy2 are duplicated so that they can run in parallel, thus avoiding a CI bottleneck  
-**Note** : Faraday Cages 1 and 2 are physically the same cage  
-
-![image info](./testbenches_doc_resources/legacy1.jpg)
-
-## Legacy 2 Bench
-
-**Purpose** : TDD Band 40, TM2 2xTX 2xRX  
-**Note** : CN can run in a container, could also run on Massive 
-
-![image info](./testbenches_doc_resources/legacy2.jpg)
-
-## Next Bench for DEV
-
-**Note** : Benetel CI can also run on this bench at night 
-
-![image info](./testbenches_doc_resources/next_dev.jpg)
-
-
-## Next Bench for CI
-
-**Note** : The current test running on Caracal could run on this bench with a N300/N300 setup  
-
-![image info](./testbenches_doc_resources/next_ci.jpg)
-
-## Indoor Live Network Bench
-
-![image info](./testbenches_doc_resources/indoor_live.jpg)
-
-## Outdoor Live Network Bench
-
-![image info](./testbenches_doc_resources/outdoor_live.jpg)
+| Machine       | IP address      | Lockable Resource     | Function           | Connected devices                                     |
+| ------------- | --------------- | --------------------- | ------------------ | ----------------------------------------------------- |
+| asterix       | 172.21.16.127   | CI-Asterix-Usage      | gNB (n78)          | 173.21.19.14                                          |
+| obelix        | 172.21.16.128   | CI-Obelix-Usage       | eNB (n40, n78), nrUE | 172.21.19.13, X300 (192.168.60.2), B200mini (30C51EB) |
+| porcepix      | 172.21.16.136   | CI-NSA-MiniBench      | Executor, EPC, 5GC | --                                                    |
+| nrmodule2     | 172.21.16.139   | CI-NSA-MiniBench      | Quectel            | Quectel module                                        |
+| nepes         | 172.21.16.137   | CI-NSA-MiniBench      | gNB (n78)          | B200mini (30C51D4)                                    |
+| caracal       | 172.21.16.132   | CI-Caracal            | gNB/phytest        | N300 (192.168.10.2)                                   |
+| idefix        | 172.21.16.135   | CI-NSA-MiniBench      | Quectel            | Quectel module                                        |
+| amariue       | 172.21.16.144   | CI-Amarisoft-UE-Usage | nrUE               | Amarisoft UE simulator                                |
+| bellatrix     | 192.168.117.115 | CI-RAN-VM-Deployment  | Executor           | --                                                    |
+| nano          | 192.168.12.62   | CI-Bench-1-Phones     | EPC, adb           | 2x COTS (adb)                                         |
+| hutch         | 192.168.12.19   | CI-Bench-1-Phones     | eNB (B7)           | B200mini (30C5239)                                    |
+| starsky       | 192.168.12.18   | CI-Bench-1-Phones     | eNB (B40)          | b200mini (30A3E3C)                                    |
+| carabe        | 192.168.12.211  | CI-Bench-2-OAI-Phone  | UE (B7UE)          | B200mini (30AE8C9)                                    |
+
+Note: The available resources, and their current usage, is indicated here:
+- [Lockable resources of jenkins-oai](https://jenkins-oai.eurecom.fr/lockable-resources/):
+  "New" Jenkins, i.e., with RAN-Container-Parent
+- [Lockable resources of open5glab jenkins](https://open5glab.eurecom.fr:8083/jenkins/lockable-resources/):
+  "Old" Jenkins, i.e., with RAN-CI-Develop
+
+## Networked devices
+
+| Type          | IP address (mgmt) |
+| ------------- | ----------------- |
+| USRP N310     | 172.21.19.14      |
+| USRP N310     | 172.21.19.13      |
+
+## Testbenches
+
+### OTA Testbench
+
+**Purpose**: Over-the-air 4G/5G (NSA/SA) tests
+
+Note: obelix and porcepix are both used in the OTA testbench and the 5G
+NSA/Faraday Cage testbench!
+
+![5G OTA Testbench](testbenches_doc_resources/5g-ota-bench.png)
+
+[PDF version](testbenches_doc_resources/5g-ota-bench.pdf) | [LaTeX/TikZ version](testbenches_doc_resources/5g-ota-bench.tex) if you want to modify to reflect your setup
+
+### 5G NSA/Faraday Cage Testbench
+
+**Purpose**: Faraday cage 5G tests
+
+Note: obelix and porcepix are both used in the OTA testbench and the 5G
+NSA/Faraday Cage testbench!
+
+![5G NSA/Faraday Cage Testbench](testbenches_doc_resources/5g-nsa-faraday-bench.png)
+
+[PDF version](testbenches_doc_resources/5g-nsa-faraday-bench.pdf) | [LaTeX/TikZ version](testbenches_doc_resources/5g-nsa-faraday-bench.tex) if you want to modify to reflect your setup
+
+### 4G Testbench(es)
+
+**Purpose**: 4G/LTE testbenches
+
+
+![4G Faraday Cage Testbench](testbenches_doc_resources/4g-faraday-bench.png)
+
+[PDF version](testbenches_doc_resources/4g-faraday-bench.pdf) | [LaTeX/TikZ version](testbenches_doc_resources/4g-faraday-bench.tex) if you want to modify to reflect your setup
+
+## Pipelines
+
+### [RAN-Container-Parent](https://jenkins-oai.eurecom.fr/job/RAN-Container-Parent/)
+
+**Purpose**: automatically triggered tests on MR creation or push, from Gitlab
+Webhook
+
+- [RAN-cppcheck](https://jenkins-oai.eurecom.fr/job/RAN-cppcheck/1664/)
+  - obelix
+  - performs static code analysis, currently not actively enforced
+- [RAN-gNB-nrUE-MONO-TDD-Band78-N300](https://jenkins-oai.eurecom.fr/job/RAN-gNB-nrUE-MONO-TDD-Band78-N300/)
+  - caracal + N310
+  - pure performance test through phy-test scheduler, see command line for more
+    details
+- [RAN-L2-Sim-Test-5G](https://jenkins-oai.eurecom.fr/job/RAN-L2-Sim-Test-5G/)
+  - obelix (gNB, 1x UE, OAI 5GC)
+  - L2simulator: skips physical layer and uses proxy between gNB and UE,
+    currently only ping
+- [RAN-NSA-B200-Module-LTEBOX-Container](https://jenkins-oai.eurecom.fr/job/RAN-NSA-B200-Module-LTEBOX-Container/)
+  - obelix + B200, nepes + B200, idefix + Quectel, porcepix w/ ltebox
+  - basic NSA test
+- [RAN-SA-B200-Module-SABOX-Container](https://jenkins-oai.eurecom.fr/job/RAN-SA-B200-Module-SABOX-Container/)
+  - obelix + B200, nepes + B200, idefix + Quectel, porcepix w/ sabox
+  - basic SA test (40 MHz TDD)
+- [RAN-PhySim-Cluster](https://jenkins-oai.eurecom.fr/job/RAN-PhySim-Cluster/)
+  - asterix (`Asterix-OC-oaicicd-session` resource), tests in OpenShift Cluster
+  - unitary simulators (`nr_dlsim`, etc.)
+- [RAN-RF-Sim-Test-4G](https://jenkins-oai.eurecom.fr/job/RAN-RF-Sim-Test-4G/)
+  - obelix (eNB, 1x UE, OAI EPC)
+  - uses RFsimulator, for FDD 5, 10, 20MHz with core, 5MHz noS1
+- [RAN-RF-Sim-Test-5G](https://jenkins-oai.eurecom.fr/job/RAN-RF-Sim-Test-5G/)
+  - obelix (gNB, 2x UE, OAI 5GC)
+  - uses RFsimulator, TDD 40MHz, FDD 40MHz, F1 split
+- [RAN-RHEL8-Image-Builder](https://jenkins-oai.eurecom.fr/job/RAN-RHEL8-Image-Builder/)
+  - asterix: RHEL 8 image build using podman
+- [RAN-Ubuntu18-Image-Builder](https://jenkins-oai.eurecom.fr/job/RAN-Ubuntu18-Image-Builder/)
+  - obelix: Ubuntu 18 image build using docker
+
+### [RAN-CI-NSA-Trigger](https://jenkins-oai.eurecom.fr/view/RAN/job/RAN-CI-NSA-Trigger/)
+
+**Purpose**: longer-running over-the-air LTE, NSA, and SA tests, triggered
+through cron job at midnight
+
+- [RAN-LTE-2x2-Module-OAIEPC](https://jenkins-oai.eurecom.fr/job/RAN-LTE-2x2-Module-OAIEPC/)
+  - obelix + N310, nrmodule2 + Quectel, porcepix w/ Magma EPC
+  - LTE 2x2 test with TM1 and TM2
+- [RAN-NSA-B200-Module-LTEBOX](https://jenkins-oai.eurecom.fr/job/RAN-NSA-B200-Module-LTEBOX/)
+  - obelix + B200 (eNB), nepes + B200 (gNB), idefix + Quectel, porcepix w/ ltebox
+  - Note: like [RAN-NSA-B200-Module-LTEBOX-Container](https://jenkins-oai.eurecom.fr/job/RAN-NSA-B200-Module-LTEBOX-Container/) above, but compiled/run from source
+- [RAN-NSA-2x2-Module-OAIEPC](https://jenkins-oai.eurecom.fr/job/RAN-NSA-2x2-Module-OAIEPC/)
+  - obelix + N310 (eNB), asterix + N310 (gNB), nrmodule2 + Quectel, porcepix w/ Magma EPC
+  - LTE 2x2 and NR 2x2 (non-standalone)
+- [RAN-SA-Module-CN5G](https://jenkins-oai.eurecom.fr/view/RAN/job/RAN-SA-Module-CN5G/)
+  - asterix + N310 (gNB), nrmodule2 + Quectel, porcepix w/ OAI 5GC
+  - NR 2x2 (standalone)
+- [RAN-SA-OAIUE-N310-X300-CN5G](https://jenkins-oai.eurecom.fr/job/RAN-SA-OAIUE-N310-X300-CN5G/)
+  - asterix + N310 (gNB), obelix + N310 or X300 (5G UE), porcepix w/ OAI 5GC
+  - OTA test with OAIUE using both N310 and X300
+- [RAN-SA-AmariS-CN5G](https://jenkins-oai.eurecom.fr/view/RAN/job/RAN-SA-AmariS-CN5G/)
+  - asterix + N310, amariue (1x UE), porcepix w/ OAI 5GC
+  - Amarisoft UE simulator: expected to be increased to more UEs
+
+### [RAN-CI-develop](https://open5glab.eurecom.fr:8083/jenkins/job/RAN-CI-develop/)
+
+**Purpose**: automatically triggered tests, mostly 4G, to be phased out and
+integrated into RAN-Container-Parent
+
+runs tests:
+- bellatrix: runs 4G/5G simulators directly (eNB + 1x UE + (opt.) OAI EPC, gNB + 1x UE in "noS1")
+
+triggers pipelines:
+- [eNB-CI-F1-FDD-Band7-B210](https://open5glab.eurecom.fr:8083/jenkins/job/eNB-CI-F1-FDD-Band7-B210/)
+  - hutch + B210, nano w/ ltebox + 2x UE
+  - tests 4G FDD with F1 split, 5MHz, 10MHz, 20MHz. 5MHz stable, rest known to
+    be unstable
+- [eNB-CI-FDD-Band7-B210](https://open5glab.eurecom.fr:8083/jenkins/job/eNB-CI-FDD-Band7-B210/)
+  - hutch + B210, nano w/ ltebox + 2x UE
+  - tests T tracer, information through FlexRAN, RRC inactivity timers,
+    inactivity timers + FlexRAN, different bandwidths
+- [eNB-CI-IF4p5-FDD-Band7-B210](https://open5glab.eurecom.fr:8083/jenkins/job/eNB-CI-IF4p5-FDD-Band7-B210/)
+  - hutch + B210, nano w/ ltebox + 2x UE
+  - tests IF4.5 split over bandwidths 5, 10, 20 MHz in Band 7
+- [eNB-CI-IF4p5-TDD-Band40-B210](https://open5glab.eurecom.fr:8083/jenkins/job/eNB-CI-IF4p5-TDD-Band40-B210/)
+  - starsky + B210, nano w/ ltebox + 2x UE
+  - tests IF4.5 split over bandwidths 5, 10, 20 MHz in Band 40
+- [eNB-CI-TDD-Band40-B210](https://open5glab.eurecom.fr:8083/jenkins/job/eNB-CI-TDD-Band40-B210/)
+  - starsky + B210, nano w/ ltebox + 2x UE
+  - T tracer, TM1 over bandwidths 5, 10, 20 MHz in Band 40, default scheduler
+    for 20 MHz
+- [eNB-UE-CI-MONO-FDD-Band7-B200](https://open5glab.eurecom.fr:8083/jenkins/job/eNB-UE-CI-MONO-FDD-Band7-B200/)
+  - hutch + B210 (eNB), carabe + B210 (4G UE), nano w/ ltebox
+  - tests OAI 4G for 5 MHz/TM1 with both CN and in noS1 model, MBMS; known to
+    be unstable
+- [UE-CI-FDD-Band20-B200](https://open5glab.eurecom.fr:8083/jenkins/job/UE-CI-FDD-Band20-B200/)
+  - starsky + B210 (sniffer)
+  - Sniff MIB + SIB1 of Orange, SFR
diff --git a/doc/TESTING_5GSA_setup.md b/doc/TESTING_5GSA_setup.md
index 9b27549df438ffda963222e04c23435aecbba53c..357c62c813993ab5adedaf3afb3685687ef45729 100644
--- a/doc/TESTING_5GSA_setup.md
+++ b/doc/TESTING_5GSA_setup.md
@@ -50,7 +50,7 @@ At the moment of writing this document interoperability with the following COTS
 ## 1.1  gNB build and configuration
 To get the code and build the gNB executable:
 
-### Ubuntu 18.04
+### Build gNB
 ```bash
     git clone https://gitlab.eurecom.fr/oai/openairinterface5g.git
     git checkout develop
@@ -61,42 +61,6 @@ To get the code and build the gNB executable:
     ./build_oai --gNB -w USRP
 ```
 
-### Ubuntu 20.04
-```bash
-    # Build UHD from source
-    # https://files.ettus.com/manual/page_build_guide.html
-    sudo apt-get install libboost-all-dev libusb-1.0-0-dev doxygen python3-docutils python3-mako python3-numpy python3-requests python3-ruamel.yaml python3-setuptools cmake build-essential
-    
-    git clone https://github.com/EttusResearch/uhd.git
-    cd uhd/host
-    mkdir build
-    cd build
-    cmake ../
-    make -j 4
-    make test # This step is optional
-    sudo make install
-    sudo ldconfig
-    sudo uhd_images_downloader
-
-
-    git clone https://gitlab.eurecom.fr/oai/openairinterface5g.git
-    git checkout develop
-    
-    # Install dependencies in Ubuntu 20.04
-    cd
-    cd openairinterface5g/
-    source oaienv
-    cd cmake_targets/
-    ./install_external_packages.ubuntu20
-    
-    # Build OAI gNB
-    cd
-    cd openairinterface5g/
-    source oaienv
-    cd cmake_targets/
-    ./build_oai --gNB -w USRP
-```
-
 A reference configuration file for the **monolithic** gNB is provided  [here](https://gitlab.eurecom.fr/oai/openairinterface5g/-/blob/develop/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf).     
 
 
diff --git a/doc/UL_MIMO.txt b/doc/UL_MIMO.txt
new file mode 100644
index 0000000000000000000000000000000000000000..c06bc78c4cbc5d0065b929ed260ca491288a0fc6
--- /dev/null
+++ b/doc/UL_MIMO.txt
@@ -0,0 +1,31 @@
+# how to build phy sim
+cd cmake_targets/
+sudo ./build_oai --phy_simulators -c
+
+cd phy_simulators/build/
+# ULSCH sim  
+# bit level validation                   
+# PUSCH encoding and decoding for 4 layers   2 CMD without data
+sudo ./nr_ulschsim -R 106 -m9 -s13 -n100 -y4 -z4 -W4
+
+# UL sim
+# Uplink chain validation  
+# PUSCH on UE side and gNB side,whole chain for PUSCH
+# No channel model on data domain signal
+# No cross-path connection
+# PMI = 0  is only unitary prcoding matrix
+sudo ./nr_ulsim -n100 -m9 -r106 -s13 -W4 -y4 -z4   
+
+# How to build rfsim
+sudo ./build_oai -c --gNB --nrUE -w SIMU
+
+# How to run with rfsim
+# 4x4 RANK 4
+sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.4layer.conf --rfsim --phy-test --l 2  --L 4
+sudo ./nr-uesoftmodem  --rfsim --phy-test --ue-nb-ant-rx 4 --ue-nb-ant-tx 4
+# 4x4 RANK 2
+sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.4layer.conf --rfsim --phy-test --l 2  --L 2
+sudo ./nr-uesoftmodem  --rfsim --phy-test --ue-nb-ant-rx 4 --ue-nb-ant-tx 4
+
+
+
diff --git a/doc/images/mimo_antenna_ports.png b/doc/images/mimo_antenna_ports.png
new file mode 100644
index 0000000000000000000000000000000000000000..ef91f4becc80fe6c09b55f202f9d8054368bd88c
Binary files /dev/null and b/doc/images/mimo_antenna_ports.png differ
diff --git a/doc/testbenches_doc_resources/4g-faraday-bench.pdf b/doc/testbenches_doc_resources/4g-faraday-bench.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..f6f7b078e67c61044004c70a92c729b14079cafc
Binary files /dev/null and b/doc/testbenches_doc_resources/4g-faraday-bench.pdf differ
diff --git a/doc/testbenches_doc_resources/4g-faraday-bench.png b/doc/testbenches_doc_resources/4g-faraday-bench.png
new file mode 100644
index 0000000000000000000000000000000000000000..598715a19347b8f8e277d38a7132331555978c55
Binary files /dev/null and b/doc/testbenches_doc_resources/4g-faraday-bench.png differ
diff --git a/doc/testbenches_doc_resources/4g-faraday-bench.tex b/doc/testbenches_doc_resources/4g-faraday-bench.tex
new file mode 100644
index 0000000000000000000000000000000000000000..6071c89947d5590806f8ac7a31a0fb287058fd9c
--- /dev/null
+++ b/doc/testbenches_doc_resources/4g-faraday-bench.tex
@@ -0,0 +1,59 @@
+\documentclass{standalone}
+
+\usepackage{tikz}
+\usetikzlibrary{backgrounds, positioning, shapes.symbols}
+\usepackage{helvet}
+\renewcommand*{\rmdefault}{\sfdefault}
+
+\begin{document}
+\begin{tikzpicture}
+  [
+    font=\footnotesize,
+    faraday/.style={minimum size=3cm, draw, dashed},
+    duplexer/.style={draw,fill=white},
+  ]
+
+  \node[faraday, label={[anchor=south west]above left:Faraday cage}] (faraday) {};
+
+  \node[above left=0cm and 2.8cm of faraday, label=above:hutch] (hutch)
+    {\includegraphics[width=1.2cm]{server}};
+  \node[right=0.3cm of hutch, label=above:B210] (b210h)
+    {\includegraphics[width=1.2cm]{b210}} edge (hutch);
+  \node[below left=0.35cm of faraday.north east] (anto)
+    {\includegraphics[width=0.3cm]{antenna}};
+  \draw (b210h) -| node [pos=0.25, duplexer] {B7} (anto);
+
+  \node[below left=0cm and 2.8cm of faraday, label=above:starsky] (starsky)
+    {\includegraphics[width=1.2cm]{server}};
+  \node[right=0.3cm of starsky, label=above:B210] (b210s)
+    {\includegraphics[width=1.2cm]{b210}} edge (starsky);
+  \draw (hutch) -- (b210h);
+  \node[above left=0.35cm of faraday.south east] (antn)
+    {\includegraphics[width=0.3cm]{antenna}};
+  \draw (b210s) -| node [pos=0.35, duplexer] {B40} (antn);
+  \node[below right=-0.2cm and 0.8cm of b210s] (antn2)
+    {\includegraphics[width=0.3cm]{antenna}};
+  \draw (b210s) -| (antn2);
+
+  \node[left=5cm of faraday, label=above:nano] (nano)
+    {\includegraphics[width=1.2cm]{server}};
+  \draw (hutch) -- (nano);
+  \draw (starsky) -- (nano);
+  \node[above right=0.0cm and 0.35cm of faraday.west] (phone1)
+    {\includegraphics[height=0.5cm]{phone}};
+  \node[below right=0.0cm and 0.35cm of faraday.west] (phone2)
+    {\includegraphics[height=0.5cm]{phone}};
+  \draw (nano) -- node[above] {USB/adb} +(5cm,0) |- (phone1);
+  \draw (nano) -- +(5cm,0) |- (phone2);
+
+  \node[right=1.5cm of faraday, label=above:B210] (b210c)
+    {\includegraphics[width=1.2cm]{b210}};
+  \node[left=.5cm of faraday.east] (antc)
+    {\includegraphics[width=0.3cm]{antenna}};
+  \draw (b210c) -- node [pos=0.35, duplexer] {B7UE} (antc);
+  \node[right=0.7cm of b210c, label=above:carabe] (carabe)
+    {\includegraphics[width=1.2cm]{server}}
+    edge (b210c);
+
+\end{tikzpicture}
+\end{document}
diff --git a/doc/testbenches_doc_resources/5g-nsa-faraday-bench.pdf b/doc/testbenches_doc_resources/5g-nsa-faraday-bench.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..1b921e64370954673e45ed70ff1643462f4774ed
Binary files /dev/null and b/doc/testbenches_doc_resources/5g-nsa-faraday-bench.pdf differ
diff --git a/doc/testbenches_doc_resources/5g-nsa-faraday-bench.png b/doc/testbenches_doc_resources/5g-nsa-faraday-bench.png
new file mode 100644
index 0000000000000000000000000000000000000000..006e6ab347d2dcd3283f5cdb59c65d1d1ba1ea8e
Binary files /dev/null and b/doc/testbenches_doc_resources/5g-nsa-faraday-bench.png differ
diff --git a/doc/testbenches_doc_resources/5g-nsa-faraday-bench.tex b/doc/testbenches_doc_resources/5g-nsa-faraday-bench.tex
new file mode 100644
index 0000000000000000000000000000000000000000..a9f12fe3df265a1b6aabaa46808747b87c247b30
--- /dev/null
+++ b/doc/testbenches_doc_resources/5g-nsa-faraday-bench.tex
@@ -0,0 +1,55 @@
+\documentclass{standalone}
+
+\usepackage{tikz}
+\usetikzlibrary{backgrounds, positioning, shapes.symbols}
+\usepackage{helvet}
+\renewcommand*{\rmdefault}{\sfdefault}
+
+\begin{document}
+\begin{tikzpicture}
+  [
+    font=\footnotesize,
+    faraday/.style={minimum size=3cm, draw, dashed},
+    duplexer/.style={draw,fill=white},
+  ]
+
+  \node[faraday, label={[anchor=south east]above right:Faraday cage}] (faraday) {};
+
+  \node[above left=0cm and 2.8cm of faraday, label=above:obelix] (obelix)
+    {\includegraphics[width=1.2cm]{server}};
+  \node[right=0.3cm of obelix, label=above:B200-mini] (b210o)
+    {\includegraphics[width=1.2cm]{b200-mini}} edge (obelix);
+  \node[below right=0.35cm of faraday.north west] (anto)
+    {\includegraphics[width=0.3cm]{antenna}};
+  \draw (b210o) -| node [pos=0.2, duplexer] {B7} (anto);
+
+  \node[below left=0cm and 2.8cm of faraday, label=above:nepes] (nepes)
+    {\includegraphics[width=1.2cm]{server}};
+  \node[right=0.3cm of nepes, label=above:B200-mini] (b210n)
+    {\includegraphics[width=1.2cm]{b200-mini}} edge (nepes);
+  \draw (obelix) -- (b210o);
+  \node[above right=0.35cm of faraday.south west] (antn)
+    {\includegraphics[width=0.3cm]{antenna}};
+  \draw (b210n) -| node [pos=0.2, duplexer] {n78} (antn);
+
+  \node[left=5cm of faraday, label=above:porcepix] (porcepix)
+    {\includegraphics[width=1.2cm]{server}};
+  \draw (obelix) -- (porcepix);
+  \draw (nepes) -- (porcepix);
+
+  \node[right=1.5cm of faraday, label=above:RM500Q-GL] (quectel)
+    {\includegraphics[height=1.2cm]{quectel}};
+  \node[above left=-0.1cm and 0.2cm of faraday.east] (aq2)
+    {\includegraphics[width=0.3cm]{antenna}} edge (quectel);
+  \node[above=-0.2cm of aq2] (aq1)
+    {\includegraphics[width=0.3cm]{antenna}} edge (quectel);
+  \node[below=-0.2cm of aq2] (aq3)
+    {\includegraphics[width=0.3cm]{antenna}} edge (quectel);
+  \node[below=-0.2cm of aq3]
+    {\includegraphics[width=0.3cm]{antenna}} edge (quectel);
+  \node[right=1cm of quectel, label=above:idefix] (idefix)
+    {\includegraphics[width=1.2cm]{server}}
+    edge (quectel);
+
+\end{tikzpicture}
+\end{document}
diff --git a/doc/testbenches_doc_resources/5g-ota-bench.pdf b/doc/testbenches_doc_resources/5g-ota-bench.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..121969030e64e03ac0e4fedc9ba4fc1c692de71c
Binary files /dev/null and b/doc/testbenches_doc_resources/5g-ota-bench.pdf differ
diff --git a/doc/testbenches_doc_resources/5g-ota-bench.png b/doc/testbenches_doc_resources/5g-ota-bench.png
new file mode 100644
index 0000000000000000000000000000000000000000..86ae6b2b6413025f922887d4e0a17c934acf0297
Binary files /dev/null and b/doc/testbenches_doc_resources/5g-ota-bench.png differ
diff --git a/doc/testbenches_doc_resources/5g-ota-bench.tex b/doc/testbenches_doc_resources/5g-ota-bench.tex
new file mode 100644
index 0000000000000000000000000000000000000000..c3a524fb0ae276564625f8fcdb128352957aa941
--- /dev/null
+++ b/doc/testbenches_doc_resources/5g-ota-bench.tex
@@ -0,0 +1,68 @@
+\documentclass{standalone}
+
+\usepackage{tikz}
+\usetikzlibrary{backgrounds, positioning, shapes.symbols}
+\usepackage{helvet}
+\renewcommand*{\rmdefault}{\sfdefault}
+
+\begin{document}
+\begin{tikzpicture}
+  [
+    font=\footnotesize,
+    faraday/.style={minimum size=3cm, draw, dashed},
+    duplexer/.style={draw,fill=white},
+  ]
+
+  \node[label=above:porcepix] (porcepix)
+    {\includegraphics[width=1.2cm]{server}};
+
+  \node[above right=1cm and 2cm of porcepix, label=above:asterix] (asterix)
+    {\includegraphics[width=1.2cm]{server}}
+    edge (porcepix);
+  \node[right=0.3cm of asterix, label=above:N310] (n310a)
+    {\includegraphics[width=1.5cm]{n310}} edge (asterix);
+  \node[right=.2cm of n310a, duplexer] (b78o) {n78} edge (n310a);
+  \node[below right=-0.1cm and 0.35cm of b78o.east] (anto1)
+    {\includegraphics[width=0.3cm]{antenna}} edge (b78o);
+  \node[above right=-0.1cm and 0.35cm of b78o.east] (anto2)
+    {\includegraphics[width=0.3cm]{antenna}} edge (b78o);
+
+  \node[right=2cm of porcepix, label=above:obelix] (obelix)
+    {\includegraphics[width=1.2cm]{server}}
+    edge (porcepix);
+  \node[above right=-0.5cm and 0.3cm of obelix, label=above:N310] (n310o)
+    {\includegraphics[width=1.5cm]{n310}} edge (obelix);
+  \node[right=.2cm of n310o, duplexer] (b78o) {n40} edge (n310o);
+  \node[below right=-0.1cm and 0.35cm of b78o.east] (anto1)
+    {\includegraphics[width=0.3cm]{antenna}} edge (b78o);
+  \node[above right=-0.1cm and 0.35cm of b78o.east] (anto2)
+    {\includegraphics[width=0.3cm]{antenna}} edge (b78o);
+  \node[below right=-0.5cm and 0.3cm of obelix, label=above:X310] (x310o)
+    {\includegraphics[width=1.5cm]{x310}} edge (obelix);
+  \node[right=.2cm of x310o, duplexer] (b78o) {n78} edge (x310o);
+  \node[below right=-0.1cm and 0.35cm of b78o.east] (anto1)
+    {\includegraphics[width=0.3cm]{antenna}} edge (b78o);
+  \node[above right=-0.1cm and 0.35cm of b78o.east] (anto2)
+    {\includegraphics[width=0.3cm]{antenna}} edge (b78o);
+
+  \node[above right=-1.3cm and 5.0cm of n310a.east, label=above:RM500Q-GL] (quectel)
+    {\includegraphics[height=1.2cm]{quectel}};
+  \node[above left=-0.1cm and 0.8cm of quectel.west] (aq2)
+    {\includegraphics[width=0.3cm]{antenna}} edge (quectel);
+  \node[above=-0.2cm of aq2] (aq1)
+    {\includegraphics[width=0.3cm]{antenna}} edge (quectel);
+  \node[below=-0.2cm of aq2] (aq3)
+    {\includegraphics[width=0.3cm]{antenna}} edge (quectel);
+  \node[below=-0.2cm of aq3]
+    {\includegraphics[width=0.3cm]{antenna}} edge (quectel);
+  \node[right=1cm of quectel, label=above:nrmodule2] (nrmodule2)
+    {\includegraphics[width=1.2cm]{server}}
+    edge (quectel);
+
+  \node[above right=-0.3cm and 5.0cm of x310o.east, label=above:amariue] (amariue)
+    {\includegraphics[height=1.2cm]{server}};
+  \node[left=0.8cm of amariue.west] (aa1)
+    {\includegraphics[width=0.3cm]{antenna}} edge (amariue);
+
+\end{tikzpicture}
+\end{document}
diff --git a/doc/testbenches_doc_resources/antenna.pdf b/doc/testbenches_doc_resources/antenna.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..0d48aa8ab9e17defba56fb89e6c7f36c6f3ec548
Binary files /dev/null and b/doc/testbenches_doc_resources/antenna.pdf differ
diff --git a/doc/testbenches_doc_resources/b200-mini.png b/doc/testbenches_doc_resources/b200-mini.png
new file mode 100644
index 0000000000000000000000000000000000000000..0355e45f1837b3ca5129566cb524af070ee06c5d
Binary files /dev/null and b/doc/testbenches_doc_resources/b200-mini.png differ
diff --git a/doc/testbenches_doc_resources/b210.jpg b/doc/testbenches_doc_resources/b210.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..23599b0b1f9cc6d25830ecb3bd12208351dac9da
Binary files /dev/null and b/doc/testbenches_doc_resources/b210.jpg differ
diff --git a/doc/testbenches_doc_resources/indoor_live.jpg b/doc/testbenches_doc_resources/indoor_live.jpg
deleted file mode 100755
index ce8b9cda4817796abf6fb87da43befe6090469be..0000000000000000000000000000000000000000
Binary files a/doc/testbenches_doc_resources/indoor_live.jpg and /dev/null differ
diff --git a/doc/testbenches_doc_resources/legacy1.jpg b/doc/testbenches_doc_resources/legacy1.jpg
deleted file mode 100755
index c3579df3e4a56521eff8f23df1dbca9ba9fd3a59..0000000000000000000000000000000000000000
Binary files a/doc/testbenches_doc_resources/legacy1.jpg and /dev/null differ
diff --git a/doc/testbenches_doc_resources/legacy2.jpg b/doc/testbenches_doc_resources/legacy2.jpg
deleted file mode 100755
index f40d167a2db2626f4be2a47fb82528cc9df5abae..0000000000000000000000000000000000000000
Binary files a/doc/testbenches_doc_resources/legacy2.jpg and /dev/null differ
diff --git a/doc/testbenches_doc_resources/n310.png b/doc/testbenches_doc_resources/n310.png
new file mode 100644
index 0000000000000000000000000000000000000000..7d6ead5718497c72f4fd972f3da5fd9fe95744d1
Binary files /dev/null and b/doc/testbenches_doc_resources/n310.png differ
diff --git a/doc/testbenches_doc_resources/next_ci.jpg b/doc/testbenches_doc_resources/next_ci.jpg
deleted file mode 100755
index 2d4111510c061b5d18ed1ae3097e3c6cc0040437..0000000000000000000000000000000000000000
Binary files a/doc/testbenches_doc_resources/next_ci.jpg and /dev/null differ
diff --git a/doc/testbenches_doc_resources/next_dev.jpg b/doc/testbenches_doc_resources/next_dev.jpg
deleted file mode 100755
index 72e9f63bf91cdb7fd47a44780126b7269bf0475f..0000000000000000000000000000000000000000
Binary files a/doc/testbenches_doc_resources/next_dev.jpg and /dev/null differ
diff --git a/doc/testbenches_doc_resources/outdoor_live.jpg b/doc/testbenches_doc_resources/outdoor_live.jpg
deleted file mode 100755
index eba44a3c00e7456c7d2d0cc12ea1e77db31ae10a..0000000000000000000000000000000000000000
Binary files a/doc/testbenches_doc_resources/outdoor_live.jpg and /dev/null differ
diff --git a/doc/testbenches_doc_resources/phone.pdf b/doc/testbenches_doc_resources/phone.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..4451c7af1ac6af3251edb72fada64e08384d23a6
Binary files /dev/null and b/doc/testbenches_doc_resources/phone.pdf differ
diff --git a/doc/testbenches_doc_resources/quectel.png b/doc/testbenches_doc_resources/quectel.png
new file mode 100644
index 0000000000000000000000000000000000000000..443e62dcb569996103380797afafbe382835298e
Binary files /dev/null and b/doc/testbenches_doc_resources/quectel.png differ
diff --git a/doc/testbenches_doc_resources/server.pdf b/doc/testbenches_doc_resources/server.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..6034fcf667018a2709804dc9bfa136a56aec281f
Binary files /dev/null and b/doc/testbenches_doc_resources/server.pdf differ
diff --git a/doc/testbenches_doc_resources/x310.jpg b/doc/testbenches_doc_resources/x310.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..3e14d30a15849d57cc30fb384024e825217fb50e
Binary files /dev/null and b/doc/testbenches_doc_resources/x310.jpg differ
diff --git a/doc/testing_gnb_w_cots_ue_resources/gnb.conf b/doc/testing_gnb_w_cots_ue_resources/gnb.conf
index c96d2074456e2db36880f9faadb10468d1d33dfd..206e1b4f02b3a357b54f4242546fc4a01473cec5 100755
--- a/doc/testing_gnb_w_cots_ue_resources/gnb.conf
+++ b/doc/testing_gnb_w_cots_ue_resources/gnb.conf
@@ -21,8 +21,6 @@ gNBs =
 
     ////////// Physical parameters:
 
-    ssb_SubcarrierOffset                                      = 31; //0;
-    pdsch_AntennaPorts                                        = 1;
 	
     servingCellConfigCommon = (
     {
diff --git a/doc/tutorial_resources/docker-compose-basic-nrf.yaml b/doc/tutorial_resources/docker-compose-basic-nrf.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..cd1e957ad8b09d7f4d490bd0af3c0dcd75e56fbd
--- /dev/null
+++ b/doc/tutorial_resources/docker-compose-basic-nrf.yaml
@@ -0,0 +1,360 @@
+version: '3.8'
+services:
+    mysql:
+        container_name: "mysql"
+        image: mysql:5.7
+        volumes:
+            - ./database/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
+            - ./healthscripts/mysql-healthcheck2.sh:/tmp/mysql-healthcheck.sh
+        environment:
+            - TZ=Europe/Paris
+            - MYSQL_DATABASE=oai_db
+            - MYSQL_USER=test
+            - MYSQL_PASSWORD=test
+            - MYSQL_ROOT_PASSWORD=linux
+        healthcheck:
+            test: /bin/bash -c "/tmp/mysql-healthcheck.sh"
+            interval: 10s
+            timeout: 5s
+            retries: 5
+        networks:
+            public_net:
+                ipv4_address: 192.168.70.131
+    oai-udr:
+        container_name: "oai-udr"
+        image: oai-udr:develop
+        environment:
+            - TZ=Europe/Paris
+            - INSTANCE=0
+            - PID_DIRECTORY=/var/run
+            - UDR_NAME=OAI_UDR
+            - UDR_INTERFACE_NAME_FOR_NUDR=eth0
+            - UDR_INTERFACE_PORT_FOR_NUDR=80
+            - UDR_INTERFACE_HTTP2_PORT_FOR_NUDR=8080
+            - USE_HTTP2=no
+            - UDR_API_VERSION=v1
+            - MYSQL_IPV4_ADDRESS=192.168.70.131
+            - MYSQL_USER=test
+            - MYSQL_PASS=test
+            - DB_CONNECTION_TIMEOUT=300 # Reset the connection to the DB after expiring the timeout (in second) currently can't be changed
+            - MYSQL_DB=oai_db
+            - WAIT_MYSQL=120
+            - USE_FQDN_DNS=yes
+            - REGISTER_NRF=yes
+            - NRF_IPV4_ADDRESS=192.168.70.130
+            - NRF_PORT=80
+            - NRF_API_VERSION=v1
+            - NRF_FQDN=oai-nrf
+        depends_on:
+            - mysql
+            - oai-nrf
+        networks:
+            public_net:
+                ipv4_address: 192.168.70.136
+        volumes:
+            - ./healthscripts/udr-healthcheck.sh:/openair-udr/bin/udr-healthcheck.sh
+        healthcheck:
+            test: /bin/bash -c "/openair-udr/bin/udr-healthcheck.sh"
+            interval: 10s
+            timeout: 5s
+            retries: 5
+    oai-udm:
+        container_name: "oai-udm"
+        image: oai-udm:develop
+        environment:
+            - TZ=Europe/Paris
+            - INSTANCE=0
+            - PID_DIRECTORY=/var/run
+            - UDM_NAME=OAI_UDM
+            - SBI_IF_NAME=eth0
+            - SBI_PORT=80
+            - SBI_HTTP2_PORT=8080
+            - USE_HTTP2=no
+            - UDM_VERSION_NB=v1
+            - USE_FQDN_DNS=yes
+            - UDR_IP_ADDRESS=192.168.70.136
+            - UDR_PORT=80
+            - UDR_VERSION_NB=v1
+            - UDR_FQDN=oai-udr
+            - REGISTER_NRF=yes
+            - NRF_IPV4_ADDRESS=192.168.70.130
+            - NRF_PORT=80
+            - NRF_API_VERSION=v1
+            - NRF_FQDN=oai-nrf
+        depends_on:
+            - oai-udr
+        networks:
+            public_net:
+                ipv4_address: 192.168.70.137
+        volumes:
+            - ./healthscripts/udm-healthcheck.sh:/openair-udm/bin/udm-healthcheck.sh
+        healthcheck:
+            test: /bin/bash -c "/openair-udm/bin/udm-healthcheck.sh"
+            interval: 10s
+            timeout: 5s
+            retries: 5
+    oai-ausf:
+        container_name: "oai-ausf"
+        image: oai-ausf:develop
+        environment:
+            - TZ=Europe/Paris
+            - INSTANCE_ID=0
+            - PID_DIR=/var/run
+            - AUSF_NAME=OAI_AUSF
+            - SBI_IF_NAME=eth0
+            - SBI_PORT=80
+            - USE_HTTP2
+            - SBI_HTTP2_PORT
+            - USE_FQDN_DNS=yes
+            - UDM_IP_ADDRESS=192.168.70.137
+            - UDM_PORT=80
+            - UDM_VERSION_NB=v1
+            - UDM_FQDN=oai-udm
+            - REGISTER_NRF=yes
+            - NRF_IPV4_ADDRESS=192.168.70.130
+            - NRF_PORT=80
+            - NRF_API_VERSION=v1
+            - NRF_FQDN=oai-nrf
+        depends_on:
+            - oai-udm
+        networks:
+            public_net:
+                ipv4_address: 192.168.70.138
+        volumes:
+            - ./healthscripts/ausf-healthcheck.sh:/openair-ausf/bin/ausf-healthcheck.sh
+        healthcheck:
+            test: /bin/bash -c "/openair-ausf/bin/ausf-healthcheck.sh"
+            interval: 10s
+            timeout: 5s
+            retries: 5
+    oai-nrf:
+        container_name: "oai-nrf"
+        image: oai-nrf:develop
+        environment:
+            - TZ=Europe/Paris
+            - NRF_INTERFACE_NAME_FOR_SBI=eth0
+            - NRF_INTERFACE_PORT_FOR_SBI=80
+            - NRF_INTERFACE_HTTP2_PORT_FOR_SBI=8080
+            - NRF_API_VERSION=v1
+            - INSTANCE=0
+            - PID_DIRECTORY=/var/run
+        networks:
+            public_net:
+                ipv4_address: 192.168.70.130
+        volumes:
+            - ./healthscripts/nrf-healthcheck.sh:/openair-nrf/bin/nrf-healthcheck.sh
+        healthcheck:
+            test: /bin/bash -c "/openair-nrf/bin/nrf-healthcheck.sh"
+            interval: 10s
+            timeout: 5s
+            retries: 5
+    oai-amf:
+        container_name: "oai-amf"
+        image: oai-amf:develop
+        environment:
+            - TZ=Europe/paris
+            - INSTANCE=0
+            - PID_DIRECTORY=/var/run
+            - MCC=208
+            - MNC=99
+            - REGION_ID=128
+            - AMF_SET_ID=1
+            - SERVED_GUAMI_MCC_0=208
+            - SERVED_GUAMI_MNC_0=99
+            - SERVED_GUAMI_REGION_ID_0=128
+            - SERVED_GUAMI_AMF_SET_ID_0=1
+            - SERVED_GUAMI_MCC_1=460
+            - SERVED_GUAMI_MNC_1=11
+            - SERVED_GUAMI_REGION_ID_1=10
+            - SERVED_GUAMI_AMF_SET_ID_1=1
+            - PLMN_SUPPORT_MCC=208
+            - PLMN_SUPPORT_MNC=99
+            - PLMN_SUPPORT_TAC=0x0001
+            - SST_0=1
+            - SD_0=0x1
+            - AMF_INTERFACE_NAME_FOR_NGAP=eth0
+            - AMF_INTERFACE_NAME_FOR_N11=eth0
+            - SMF_INSTANCE_ID_0=1
+            - SMF_FQDN_0=oai-smf
+            - SMF_IPV4_ADDR_0=192.168.70.133
+            - SMF_HTTP_VERSION_0=v1
+            - SELECTED_0=true
+            - SMF_INSTANCE_ID_1=2
+            - SMF_FQDN_1=oai-smf
+            - SMF_IPV4_ADDR_1=0.0.0.0
+            - SMF_HTTP_VERSION_1=v1
+            - SELECTED_1=false
+            - MYSQL_SERVER=192.168.70.131
+            - MYSQL_USER=root
+            - MYSQL_PASS=linux
+            - MYSQL_DB=oai_db
+            - OPERATOR_KEY=1006020f0a478bf6b699f15c062e42b3
+            - NRF_IPV4_ADDRESS=192.168.70.130
+            - NRF_PORT=80
+            - EXTERNAL_NRF=no
+            - NF_REGISTRATION=yes
+            - SMF_SELECTION=yes
+            - USE_FQDN_DNS=yes
+            - EXTERNAL_AUSF=yes
+            - EXTERNAL_UDM=no
+            - EXTERNAL_NSSF=no
+            - USE_HTTP2=no
+            - NRF_API_VERSION=v1
+            - NRF_FQDN=oai-nrf
+            - AUSF_IPV4_ADDRESS=192.168.70.138
+            - AUSF_PORT=80
+            - AUSF_API_VERSION=v1
+            - AUSF_FQDN=oai-ausf
+            - UDM_IPV4_ADDRESS=192.168.70.137
+            - UDM_PORT=80
+            - UDM_API_VERSION=v2
+            - UDM_FQDN=oai-udm
+        depends_on:
+            - mysql
+            - oai-nrf
+            - oai-ausf
+        volumes:
+            - ./healthscripts/amf-healthcheck.sh:/openair-amf/bin/amf-healthcheck.sh
+        healthcheck:
+            test: /bin/bash -c "/openair-amf/bin/amf-healthcheck.sh"
+            interval: 10s
+            timeout: 15s
+            retries: 5
+        networks:
+            public_net:
+                ipv4_address: 192.168.70.132
+    oai-smf:
+        container_name: "oai-smf"
+        image: oai-smf:develop
+        environment:
+            - TZ=Europe/Paris
+            - INSTANCE=0
+            - PID_DIRECTORY=/var/run
+            - SMF_INTERFACE_NAME_FOR_N4=eth0
+            - SMF_INTERFACE_NAME_FOR_SBI=eth0
+            - SMF_INTERFACE_PORT_FOR_SBI=80
+            - SMF_INTERFACE_HTTP2_PORT_FOR_SBI=9090
+            - SMF_API_VERSION=v1
+            - DEFAULT_DNS_IPV4_ADDRESS=8.8.8.8
+            - DEFAULT_DNS_SEC_IPV4_ADDRESS=4.4.4.4
+            - AMF_IPV4_ADDRESS=192.168.70.132
+            - AMF_PORT=80
+            - AMF_API_VERSION=v1
+            - AMF_FQDN=oai-amf
+            - UDM_IPV4_ADDRESS=192.168.70.137
+            - UDM_PORT=80
+            - UDM_API_VERSION=v2
+            - UDM_FQDN=oai-udm
+            - UPF_IPV4_ADDRESS=192.168.70.134
+            - UPF_FQDN_0=oai-spgwu
+            - NRF_IPV4_ADDRESS=192.168.70.130
+            - NRF_PORT=80
+            - NRF_API_VERSION=v1
+            - USE_LOCAL_SUBSCRIPTION_INFO=yes  #Set to yes if SMF uses local subscription information instead of from an UDM
+            - USE_NETWORK_INSTANCE=no  #Set yes if network instance is to be used for given UPF
+            - NRF_FQDN=oai-nrf
+            - REGISTER_NRF=yes
+            - DISCOVER_UPF=yes
+            - USE_FQDN_DNS=yes
+            - HTTP_VERSION=1        # Default: 1
+            - UE_MTU=1500
+            - DNN_NI0=oai
+            - TYPE0=IPv4
+            - DNN_RANGE0=12.1.1.2 - 12.1.1.253
+            - NSSAI_SST0=1
+            - NSSAI_SD0=0x1
+            - SESSION_AMBR_UL0=1000Mbps
+            - SESSION_AMBR_DL0=1000Mbps
+            - DEFAULT_CSCF_IPV4_ADDRESS=127.0.0.1  # only needed when ims is being used
+            - ENABLE_USAGE_REPORTING=no # Set yes if UE USAGE REPORTING is to be done at UPF
+        depends_on:
+            - oai-nrf
+            - oai-amf
+        volumes:
+            - ./healthscripts/smf-healthcheck.sh:/openair-smf/bin/smf-healthcheck.sh
+        healthcheck:
+            test: /bin/bash -c "/openair-smf/bin/smf-healthcheck.sh"
+            interval: 10s
+            timeout: 5s
+            retries: 5
+        networks:
+            public_net:
+                ipv4_address: 192.168.70.133
+    oai-spgwu:
+        container_name: "oai-spgwu"
+        image: oai-spgwu-tiny:develop
+        environment:
+            - TZ=Europe/Paris
+            - PID_DIRECTORY=/var/run
+            - SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP=eth0
+            - SGW_INTERFACE_NAME_FOR_SX=eth0
+            - PGW_INTERFACE_NAME_FOR_SGI=eth0
+            - NETWORK_UE_NAT_OPTION=yes
+            - NETWORK_UE_IP=12.1.1.0/24
+            - SPGWC0_IP_ADDRESS=192.168.70.133
+            - BYPASS_UL_PFCP_RULES=no
+            - MCC=208
+            - MNC=99
+            - MNC03=099
+            - TAC=1
+            - GW_ID=1
+            - THREAD_S1U_PRIO=80
+            - S1U_THREADS=8
+            - THREAD_SX_PRIO=81
+            - SX_THREADS=1
+            - THREAD_SGI_PRIO=80
+            - SGI_THREADS=8
+            - REALM=openairinterface.org
+            - ENABLE_5G_FEATURES=yes
+            - REGISTER_NRF=yes
+            - USE_FQDN_NRF=yes
+            - UPF_FQDN_5G=oai-spgwu
+            - NRF_IPV4_ADDRESS=192.168.70.130
+            - NRF_PORT=80
+            - NRF_API_VERSION=v1
+            - NRF_FQDN=oai-nrf
+            - NSSAI_SST_0=1
+            - NSSAI_SD_0=0x1
+            - DNN_0=oai
+        depends_on:
+            - oai-nrf
+            - oai-smf
+        cap_add:
+            - NET_ADMIN
+            - SYS_ADMIN
+        cap_drop:
+            - ALL
+        privileged: true
+        volumes:
+            - ./healthscripts/spgwu-healthcheck.sh:/openair-spgwu-tiny/bin/spgwu-healthcheck.sh
+        healthcheck:
+            test: /bin/bash -c "/openair-spgwu-tiny/bin/spgwu-healthcheck.sh"
+            interval: 10s
+            timeout: 5s
+            retries: 5
+        networks:
+            public_net:
+                ipv4_address: 192.168.70.134
+    oai-ext-dn:
+        image: trf-gen-cn5g:latest
+        privileged: true
+        container_name: oai-ext-dn
+        entrypoint: /bin/bash -c \
+              "ip route add 12.1.1.0/24 via 192.168.70.134 dev eth0; sleep infinity"
+        depends_on:
+            - oai-spgwu
+        networks:
+            public_net:
+                ipv4_address: 192.168.70.135
+networks:
+    # public_net:
+    #     external:
+    #         name: demo-oai-public-net
+    public_net:
+        driver: bridge
+        name: demo-oai-public-net
+        ipam:
+            config:
+                - subnet: 192.168.70.128/26
+        driver_opts:
+            com.docker.network.bridge.name: "demo-oai"
diff --git a/doc/tutorial_resources/oai_db.sql b/doc/tutorial_resources/oai_db.sql
new file mode 100644
index 0000000000000000000000000000000000000000..fb8f4b20edc1a81bda0d4f1bf89df18ab7ec782c
--- /dev/null
+++ b/doc/tutorial_resources/oai_db.sql
@@ -0,0 +1,328 @@
+-- phpMyAdmin SQL Dump
+-- version 5.1.0
+-- https://www.phpmyadmin.net/
+--
+-- Host: 172.16.200.10:3306
+-- Generation Time: Mar 22, 2021 at 10:31 AM
+-- Server version: 5.7.33
+-- PHP Version: 7.4.15
+
+SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
+START TRANSACTION;
+SET time_zone = "+00:00";
+
+
+/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
+/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
+/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
+/*!40101 SET NAMES utf8mb4 */;
+
+--
+-- Database: `oai_db`
+--
+
+-- --------------------------------------------------------
+
+--
+-- Table structure for table `AccessAndMobilitySubscriptionData`
+--
+
+CREATE TABLE `AccessAndMobilitySubscriptionData` (
+  `ueid` varchar(15) NOT NULL,
+  `servingPlmnid` varchar(15) NOT NULL,
+  `supportedFeatures` varchar(50) DEFAULT NULL,
+  `gpsis` json DEFAULT NULL,
+  `internalGroupIds` json DEFAULT NULL,
+  `sharedVnGroupDataIds` json DEFAULT NULL,
+  `subscribedUeAmbr` json DEFAULT NULL,
+  `nssai` json DEFAULT NULL,
+  `ratRestrictions` json DEFAULT NULL,
+  `forbiddenAreas` json DEFAULT NULL,
+  `serviceAreaRestriction` json DEFAULT NULL,
+  `coreNetworkTypeRestrictions` json DEFAULT NULL,
+  `rfspIndex` int(10) DEFAULT NULL,
+  `subsRegTimer` int(10) DEFAULT NULL,
+  `ueUsageType` int(10) DEFAULT NULL,
+  `mpsPriority` tinyint(1) DEFAULT NULL,
+  `mcsPriority` tinyint(1) DEFAULT NULL,
+  `activeTime` int(10) DEFAULT NULL,
+  `sorInfo` json DEFAULT NULL,
+  `sorInfoExpectInd` tinyint(1) DEFAULT NULL,
+  `sorafRetrieval` tinyint(1) DEFAULT NULL,
+  `sorUpdateIndicatorList` json DEFAULT NULL,
+  `upuInfo` json DEFAULT NULL,
+  `micoAllowed` tinyint(1) DEFAULT NULL,
+  `sharedAmDataIds` json DEFAULT NULL,
+  `odbPacketServices` json DEFAULT NULL,
+  `serviceGapTime` int(10) DEFAULT NULL,
+  `mdtUserConsent` json DEFAULT NULL,
+  `mdtConfiguration` json DEFAULT NULL,
+  `traceData` json DEFAULT NULL,
+  `cagData` json DEFAULT NULL,
+  `stnSr` varchar(50) DEFAULT NULL,
+  `cMsisdn` varchar(50) DEFAULT NULL,
+  `nbIoTUePriority` int(10) DEFAULT NULL,
+  `nssaiInclusionAllowed` tinyint(1) DEFAULT NULL,
+  `rgWirelineCharacteristics` varchar(50) DEFAULT NULL,
+  `ecRestrictionDataWb` json DEFAULT NULL,
+  `ecRestrictionDataNb` tinyint(1) DEFAULT NULL,
+  `expectedUeBehaviourList` json DEFAULT NULL,
+  `primaryRatRestrictions` json DEFAULT NULL,
+  `secondaryRatRestrictions` json DEFAULT NULL,
+  `edrxParametersList` json DEFAULT NULL,
+  `ptwParametersList` json DEFAULT NULL,
+  `iabOperationAllowed` tinyint(1) DEFAULT NULL,
+  `wirelineForbiddenAreas` json DEFAULT NULL,
+  `wirelineServiceAreaRestriction` json DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+-- --------------------------------------------------------
+
+--
+-- Table structure for table `Amf3GppAccessRegistration`
+--
+
+CREATE TABLE `Amf3GppAccessRegistration` (
+  `ueid` varchar(15) NOT NULL,
+  `amfInstanceId` varchar(50) NOT NULL,
+  `supportedFeatures` varchar(50) DEFAULT NULL,
+  `purgeFlag` tinyint(1) DEFAULT NULL,
+  `pei` varchar(50) DEFAULT NULL,
+  `imsVoPs` json DEFAULT NULL,
+  `deregCallbackUri` varchar(50) NOT NULL,
+  `amfServiceNameDereg` json DEFAULT NULL,
+  `pcscfRestorationCallbackUri` varchar(50) DEFAULT NULL,
+  `amfServiceNamePcscfRest` json DEFAULT NULL,
+  `initialRegistrationInd` tinyint(1) DEFAULT NULL,
+  `guami` json NOT NULL,
+  `backupAmfInfo` json DEFAULT NULL,
+  `drFlag` tinyint(1) DEFAULT NULL,
+  `ratType` json NOT NULL,
+  `urrpIndicator` tinyint(1) DEFAULT NULL,
+  `amfEeSubscriptionId` varchar(50) DEFAULT NULL,
+  `epsInterworkingInfo` json DEFAULT NULL,
+  `ueSrvccCapability` tinyint(1) DEFAULT NULL,
+  `registrationTime` varchar(50) DEFAULT NULL,
+  `vgmlcAddress` json DEFAULT NULL,
+  `contextInfo` json DEFAULT NULL,
+  `noEeSubscriptionInd` tinyint(1) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+-- --------------------------------------------------------
+
+--
+-- Table structure for table `AuthenticationStatus`
+--
+
+CREATE TABLE `AuthenticationStatus` (
+  `ueid` varchar(20) NOT NULL,
+  `nfInstanceId` varchar(50) NOT NULL,
+  `success` tinyint(1) NOT NULL,
+  `timeStamp` varchar(50) NOT NULL,
+  `authType` varchar(25) NOT NULL,
+  `servingNetworkName` varchar(50) NOT NULL,
+  `authRemovalInd` tinyint(1) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+-- --------------------------------------------------------
+
+--
+-- Table structure for table `AuthenticationSubscription`
+--
+
+CREATE TABLE `AuthenticationSubscription` (
+  `ueid` varchar(20) NOT NULL,
+  `authenticationMethod` varchar(25) NOT NULL,
+  `encPermanentKey` varchar(50) DEFAULT NULL,
+  `protectionParameterId` varchar(50) DEFAULT NULL,
+  `sequenceNumber` json DEFAULT NULL,
+  `authenticationManagementField` varchar(50) DEFAULT NULL,
+  `algorithmId` varchar(50) DEFAULT NULL,
+  `encOpcKey` varchar(50) DEFAULT NULL,
+  `encTopcKey` varchar(50) DEFAULT NULL,
+  `vectorGenerationInHss` tinyint(1) DEFAULT NULL,
+  `n5gcAuthMethod` varchar(15) DEFAULT NULL,
+  `rgAuthenticationInd` tinyint(1) DEFAULT NULL,
+  `supi` varchar(20) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `AuthenticationSubscription`
+--
+
+INSERT INTO `AuthenticationSubscription` (`ueid`, `authenticationMethod`, `encPermanentKey`, `protectionParameterId`, `sequenceNumber`, `authenticationManagementField`, `algorithmId`, `encOpcKey`, `encTopcKey`, `vectorGenerationInHss`, `n5gcAuthMethod`, `rgAuthenticationInd`, `supi`) VALUES
+    ('2089900007487', '5G_AKA', 'fec86ba6eb707ed08905757b1bb44b8f', 'fec86ba6eb707ed08905757b1bb44b8f', '{\"sqn\": \"000000000000\", \"sqnScheme\": \"NON_TIME_BASED\", \"lastIndexes\": {\"ausf\": 0}}', '8000', 'milenage', 'C42449363BBAD02B66D16BC975D77CC1', NULL, NULL, NULL, NULL, '2089900007487');
+INSERT INTO `AuthenticationSubscription` (`ueid`, `authenticationMethod`, `encPermanentKey`, `protectionParameterId`, `sequenceNumber`, `authenticationManagementField`, `algorithmId`, `encOpcKey`, `encTopcKey`, `vectorGenerationInHss`, `n5gcAuthMethod`, `rgAuthenticationInd`, `supi`) VALUES
+    ('208990000000001', '5G_AKA', 'fec86ba6eb707ed08905757b1bb44b8f', 'fec86ba6eb707ed08905757b1bb44b8f', '{\"sqn\": \"000000000000\", \"sqnScheme\": \"NON_TIME_BASED\", \"lastIndexes\": {\"ausf\": 0}}', '8000', 'milenage', 'C42449363BBAD02B66D16BC975D77CC1', NULL, NULL, NULL, NULL, '208990000000001');
+INSERT INTO `AuthenticationSubscription` (`ueid`, `authenticationMethod`, `encPermanentKey`, `protectionParameterId`, `sequenceNumber`, `authenticationManagementField`, `algorithmId`, `encOpcKey`, `encTopcKey`, `vectorGenerationInHss`, `n5gcAuthMethod`, `rgAuthenticationInd`, `supi`) VALUES
+    ('208990000000002', '5G_AKA', 'fec86ba6eb707ed08905757b1bb44b8f', 'fec86ba6eb707ed08905757b1bb44b8f', '{\"sqn\": \"000000000000\", \"sqnScheme\": \"NON_TIME_BASED\", \"lastIndexes\": {\"ausf\": 0}}', '8000', 'milenage', 'C42449363BBAD02B66D16BC975D77CC1', NULL, NULL, NULL, NULL, '208990000000002');
+INSERT INTO `AuthenticationSubscription` (`ueid`, `authenticationMethod`, `encPermanentKey`, `protectionParameterId`, `sequenceNumber`, `authenticationManagementField`, `algorithmId`, `encOpcKey`, `encTopcKey`, `vectorGenerationInHss`, `n5gcAuthMethod`, `rgAuthenticationInd`, `supi`) VALUES
+    ('208990000000003', '5G_AKA', 'fec86ba6eb707ed08905757b1bb44b8f', 'fec86ba6eb707ed08905757b1bb44b8f', '{\"sqn\": \"000000000000\", \"sqnScheme\": \"NON_TIME_BASED\", \"lastIndexes\": {\"ausf\": 0}}', '8000', 'milenage', 'C42449363BBAD02B66D16BC975D77CC1', NULL, NULL, NULL, NULL, '208990000000003');
+
+-- --------------------------------------------------------
+
+--
+-- Table structure for table `SdmSubscriptions`
+--
+
+CREATE TABLE `SdmSubscriptions` (
+  `ueid` varchar(15) NOT NULL,
+  `subsId` int(10) UNSIGNED NOT NULL,
+  `nfInstanceId` varchar(50) NOT NULL,
+  `implicitUnsubscribe` tinyint(1) DEFAULT NULL,
+  `expires` varchar(50) DEFAULT NULL,
+  `callbackReference` varchar(50) NOT NULL,
+  `amfServiceName` json DEFAULT NULL,
+  `monitoredResourceUris` json NOT NULL,
+  `singleNssai` json DEFAULT NULL,
+  `dnn` varchar(50) DEFAULT NULL,
+  `subscriptionId` varchar(50) DEFAULT NULL,
+  `plmnId` json DEFAULT NULL,
+  `immediateReport` tinyint(1) DEFAULT NULL,
+  `report` json DEFAULT NULL,
+  `supportedFeatures` varchar(50) DEFAULT NULL,
+  `contextInfo` json DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+-- --------------------------------------------------------
+
+--
+-- Table structure for table `SessionManagementSubscriptionData`
+--
+
+CREATE TABLE `SessionManagementSubscriptionData` (
+  `ueid` varchar(15) NOT NULL,
+  `servingPlmnid` varchar(15) NOT NULL,
+  `singleNssai` json NOT NULL,
+  `dnnConfigurations` json DEFAULT NULL,
+  `internalGroupIds` json DEFAULT NULL,
+  `sharedVnGroupDataIds` json DEFAULT NULL,
+  `sharedDnnConfigurationsId` varchar(50) DEFAULT NULL,
+  `odbPacketServices` json DEFAULT NULL,
+  `traceData` json DEFAULT NULL,
+  `sharedTraceDataId` varchar(50) DEFAULT NULL,
+  `expectedUeBehavioursList` json DEFAULT NULL,
+  `suggestedPacketNumDlList` json DEFAULT NULL,
+  `3gppChargingCharacteristics` varchar(50) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `SessionManagementSubscriptionData`
+--
+
+INSERT INTO `SessionManagementSubscriptionData` (`ueid`, `servingPlmnid`, `singleNssai`, `dnnConfigurations`) VALUES
+    ('2089900007487', '20899', '{\"sst\": 1, \"sd\": \"1\"}','{\"oai\":{\"pduSessionTypes\":{ \"defaultSessionType\": \"IPV4\"},\"sscModes\": {\"defaultSscMode\": \"SSC_MODE_1\"},\"5gQosProfile\": {\"5qi\": 6,\"arp\":{\"priorityLevel\": 1,\"preemptCap\": \"NOT_PREEMPT\",\"preemptVuln\":\"NOT_PREEMPTABLE\"},\"priorityLevel\":1},\"sessionAmbr\":{\"uplink\":\"1000Mbps\", \"downlink\":\"1000Mbps\"},\"staticIpAddress\":[{\"ipv4Addr\": \"12.1.1.2\"}]}}');
+INSERT INTO `SessionManagementSubscriptionData` (`ueid`, `servingPlmnid`, `singleNssai`, `dnnConfigurations`) VALUES
+    ('208990000000001', '20899', '{\"sst\": 1, \"sd\": \"1\"}','{\"oai\":{\"pduSessionTypes\":{ \"defaultSessionType\": \"IPV4\"},\"sscModes\": {\"defaultSscMode\": \"SSC_MODE_1\"},\"5gQosProfile\": {\"5qi\": 6,\"arp\":{\"priorityLevel\": 1,\"preemptCap\": \"NOT_PREEMPT\",\"preemptVuln\":\"NOT_PREEMPTABLE\"},\"priorityLevel\":1},\"sessionAmbr\":{\"uplink\":\"1000Mbps\", \"downlink\":\"1000Mbps\"},\"staticIpAddress\":[{\"ipv4Addr\": \"12.1.1.2\"}]}}');
+INSERT INTO `SessionManagementSubscriptionData` (`ueid`, `servingPlmnid`, `singleNssai`, `dnnConfigurations`) VALUES
+    ('208990000000002', '20899', '{\"sst\": 1, \"sd\": \"1\"}','{\"oai\":{\"pduSessionTypes\":{ \"defaultSessionType\": \"IPV4\"},\"sscModes\": {\"defaultSscMode\": \"SSC_MODE_1\"},\"5gQosProfile\": {\"5qi\": 6,\"arp\":{\"priorityLevel\": 1,\"preemptCap\": \"NOT_PREEMPT\",\"preemptVuln\":\"NOT_PREEMPTABLE\"},\"priorityLevel\":1},\"sessionAmbr\":{\"uplink\":\"1000Mbps\", \"downlink\":\"1000Mbps\"},\"staticIpAddress\":[{\"ipv4Addr\": \"12.1.1.3\"}]}}');
+INSERT INTO `SessionManagementSubscriptionData` (`ueid`, `servingPlmnid`, `singleNssai`, `dnnConfigurations`) VALUES
+    ('208990000000003', '20899', '{\"sst\": 1, \"sd\": \"1\"}','{\"oai\":{\"pduSessionTypes\":{ \"defaultSessionType\": \"IPV4\"},\"sscModes\": {\"defaultSscMode\": \"SSC_MODE_1\"},\"5gQosProfile\": {\"5qi\": 6,\"arp\":{\"priorityLevel\": 1,\"preemptCap\": \"NOT_PREEMPT\",\"preemptVuln\":\"NOT_PREEMPTABLE\"},\"priorityLevel\":1},\"sessionAmbr\":{\"uplink\":\"1000Mbps\", \"downlink\":\"1000Mbps\"},\"staticIpAddress\":[{\"ipv4Addr\": \"12.1.1.4\"}]}}');
+
+-- --------------------------------------------------------
+
+--
+-- Table structure for table `SmfRegistrations`
+--
+
+CREATE TABLE `SmfRegistrations` (
+  `ueid` varchar(15) NOT NULL,
+  `subpduSessionId` int(10) NOT NULL,
+  `smfInstanceId` varchar(50) NOT NULL,
+  `smfSetId` varchar(50) DEFAULT NULL,
+  `supportedFeatures` varchar(50) DEFAULT NULL,
+  `pduSessionId` int(10) NOT NULL,
+  `singleNssai` json NOT NULL,
+  `dnn` varchar(50) DEFAULT NULL,
+  `emergencyServices` tinyint(1) DEFAULT NULL,
+  `pcscfRestorationCallbackUri` varchar(50) DEFAULT NULL,
+  `plmnId` json NOT NULL,
+  `pgwFqdn` varchar(50) DEFAULT NULL,
+  `epdgInd` tinyint(1) DEFAULT NULL,
+  `deregCallbackUri` varchar(50) DEFAULT NULL,
+  `registrationReason` json DEFAULT NULL,
+  `registrationTime` varchar(50) DEFAULT NULL,
+  `contextInfo` json DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+-- --------------------------------------------------------
+
+--
+-- Table structure for table `SmfSelectionSubscriptionData`
+--
+
+CREATE TABLE `SmfSelectionSubscriptionData` (
+  `ueid` varchar(15) NOT NULL,
+  `servingPlmnid` varchar(15) NOT NULL,
+  `supportedFeatures` varchar(50) DEFAULT NULL,
+  `subscribedSnssaiInfos` json DEFAULT NULL,
+  `sharedSnssaiInfosId` varchar(50) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+--
+-- Indexes for dumped tables
+--
+
+--
+-- Indexes for table `AccessAndMobilitySubscriptionData`
+--
+ALTER TABLE `AccessAndMobilitySubscriptionData`
+  ADD PRIMARY KEY (`ueid`,`servingPlmnid`) USING BTREE;
+
+--
+-- Indexes for table `Amf3GppAccessRegistration`
+--
+ALTER TABLE `Amf3GppAccessRegistration`
+  ADD PRIMARY KEY (`ueid`);
+
+--
+-- Indexes for table `AuthenticationStatus`
+--
+ALTER TABLE `AuthenticationStatus`
+  ADD PRIMARY KEY (`ueid`);
+
+--
+-- Indexes for table `AuthenticationSubscription`
+--
+ALTER TABLE `AuthenticationSubscription`
+  ADD PRIMARY KEY (`ueid`);
+
+--
+-- Indexes for table `SdmSubscriptions`
+--
+ALTER TABLE `SdmSubscriptions`
+  ADD PRIMARY KEY (`subsId`,`ueid`) USING BTREE;
+
+--
+-- Indexes for table `SessionManagementSubscriptionData`
+--
+ALTER TABLE `SessionManagementSubscriptionData`
+  ADD PRIMARY KEY (`ueid`,`servingPlmnid`) USING BTREE;
+
+--
+-- Indexes for table `SmfRegistrations`
+--
+ALTER TABLE `SmfRegistrations`
+  ADD PRIMARY KEY (`ueid`,`subpduSessionId`) USING BTREE;
+
+--
+-- Indexes for table `SmfSelectionSubscriptionData`
+--
+ALTER TABLE `SmfSelectionSubscriptionData`
+  ADD PRIMARY KEY (`ueid`,`servingPlmnid`) USING BTREE;
+
+--
+-- AUTO_INCREMENT for dumped tables
+--
+
+--
+-- AUTO_INCREMENT for table `SdmSubscriptions`
+--
+ALTER TABLE `SdmSubscriptions`
+  MODIFY `subsId` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;
+COMMIT;
+
+/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
+/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
+/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
+
diff --git a/docker/Dockerfile.build.rhel8.2 b/docker/Dockerfile.build.rhel8.2
index 22486c5e68082826d47a67cd88c4c4ddcf471fb5..2664096a9bf38848ed310204de86652bcdef2f43 100644
--- a/docker/Dockerfile.build.rhel8.2
+++ b/docker/Dockerfile.build.rhel8.2
@@ -35,4 +35,4 @@ COPY . .
 RUN /bin/sh oaienv && \ 
     cd cmake_targets && \
     mkdir -p log && \
-    ./build_oai --eNB --gNB --RU --UE --nrUE --ninja --build-lib all -w USRP --verbose-ci
+    ./build_oai --eNB --gNB --RU --UE --nrUE --ninja --build-lib all -w USRP --verbose-ci --noavx512
diff --git a/docker/Dockerfile.build.ubuntu18 b/docker/Dockerfile.build.ubuntu18
index 3ba1e41442f6c653f22dc2a9dd62aae50e3af979..7809d56216bcdae0859f0dd6e9fcca4f226bfff6 100644
--- a/docker/Dockerfile.build.ubuntu18
+++ b/docker/Dockerfile.build.ubuntu18
@@ -35,4 +35,4 @@ COPY . .
 RUN /bin/sh oaienv && \
     cd cmake_targets && \
     mkdir -p log && \
-    ./build_oai --eNB --gNB --RU --UE --nrUE --ninja --build-lib all -w USRP --verbose-ci
+    ./build_oai --eNB --gNB --RU --UE --nrUE --ninja --build-lib all -w USRP --verbose-ci --noavx512
diff --git a/docker/Dockerfile.phySim.rhel8.2 b/docker/Dockerfile.phySim.rhel8.2
index 2627a9eafdf503e6e1abbcf346e7ea60ce0a7c49..b4eb9a1eebbf17ee4c482018f9cb72c2bb85da5c 100644
--- a/docker/Dockerfile.phySim.rhel8.2
+++ b/docker/Dockerfile.phySim.rhel8.2
@@ -38,7 +38,7 @@ RUN yum install -y libasan
 RUN /bin/sh oaienv && \ 
     cd cmake_targets && \
     mkdir -p log && \
-    ./build_oai --phy_simulators --ninja --verbose-ci --sanitize-address
+    ./build_oai --phy_simulators --ninja --verbose-ci --sanitize-address --noavx512
 
 #start from scratch for target executable
 FROM registry.access.redhat.com/ubi8/ubi:latest as oai-physim
diff --git a/docker/scripts/generateTemplate.py b/docker/scripts/generateTemplate.py
index 850bb535a52abd6bc08159d72e0593d78b03bc2d..ec8f32ec6e849c55643e856b07775d7cdffe9834 100644
--- a/docker/scripts/generateTemplate.py
+++ b/docker/scripts/generateTemplate.py
@@ -60,6 +60,7 @@ def main():
                              "rcc.band40.tm1.25PRB": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
                              "gnb.band78.tm1.fr1.106PRB.usrpb210.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
                              "gnb.band78.sa.fr1.106PRB.usrpn310.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
+                             "gnb.sa.band78.fr1.106PRB.usrpb210.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
                              "gnb.sa.band66.fr1.106PRB.usrpn300.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
                              "gNB_SA_CU.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
                              "gNB_SA_DU.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
diff --git a/docker/scripts/gnb_entrypoint.sh b/docker/scripts/gnb_entrypoint.sh
index dd6256609c8085aec0b6b0c68e63caa2fe61d601..ac0e0d4c8896a4d1aef218e072cfa016b87c74b2 100755
--- a/docker/scripts/gnb_entrypoint.sh
+++ b/docker/scripts/gnb_entrypoint.sh
@@ -10,6 +10,7 @@ THREAD_PARALLEL_CONFIG=${THREAD_PARALLEL_CONFIG:-PARALLEL_SINGLE_THREAD}
 
 if [[ -v USE_NSA_TDD_MONO ]]; then cp $PREFIX/etc/gnb.nsa.tdd.conf $PREFIX/etc/gnb.conf; fi
 if [[ -v USE_SA_TDD_MONO ]]; then cp $PREFIX/etc/gnb.sa.tdd.conf $PREFIX/etc/gnb.conf; fi
+if [[ -v USE_SA_TDD_MONO_B2XX ]]; then cp $PREFIX/etc/gnb.sa.tdd.b2xx.conf $PREFIX/etc/gnb.conf; fi
 if [[ -v USE_SA_FDD_MONO ]]; then cp $PREFIX/etc/gnb.sa.fdd.conf $PREFIX/etc/gnb.conf; fi
 if [[ -v USE_SA_CU ]]; then cp $PREFIX/etc/gnb.sa.cu.conf $PREFIX/etc/gnb.conf; fi
 if [[ -v USE_SA_TDD_CU ]]; then cp $PREFIX/etc/gnb.sa.du.tdd.conf $PREFIX/etc/gnb.conf; fi
diff --git a/docker/scripts/gnb_parameters.yaml b/docker/scripts/gnb_parameters.yaml
index d5942f2c9b4559d6db4b8e0eb76b1b7a01d27e53..420559ff3f758311222935f76a5e02f8b908934f 100644
--- a/docker/scripts/gnb_parameters.yaml
+++ b/docker/scripts/gnb_parameters.yaml
@@ -94,6 +94,36 @@
     - key: parallel_config
       env: "@THREAD_PARALLEL_CONFIG@"
 
+  - filePrefix: gnb.sa.band78.fr1.106PRB.usrpb210.conf
+    outputfilename: "gnb.sa.tdd.b2xx.conf"
+    config:
+    - key: Active_gNBs
+      env: "@GNB_NAME@"
+    - key: gNB_name
+      env: "@GNB_NAME@"
+    - key: mcc
+      env: "@MCC@"
+    - key: mnc
+      env: "@MNC@"
+    - key: mnc_length
+      env: "@MNC_LENGTH@"
+    - key: tracking_area_code
+      env: "@TAC@"
+    - key: sst
+      env: "@NSSAI_SST@"
+    - key: ipv4
+      env: "@AMF_IP_ADDRESS@"
+    - key: GNB_INTERFACE_NAME_FOR_NG_AMF
+      env: "@GNB_NGA_IF_NAME@"
+    - key: GNB_IPV4_ADDRESS_FOR_NG_AMF
+      env: "@GNB_NGA_IP_ADDRESS@"
+    - key: GNB_INTERFACE_NAME_FOR_NGU
+      env: "@GNB_NGU_IF_NAME@"
+    - key: GNB_IPV4_ADDRESS_FOR_NGU
+      env: "@GNB_NGU_IP_ADDRESS@"
+    - key: parallel_config
+      env: "@THREAD_PARALLEL_CONFIG@"
+
   - filePrefix: gnb.sa.band66.fr1.106PRB.usrpn300.conf
     outputfilename: "gnb.sa.fdd.conf"
     config:
diff --git a/executables/main-ocp.c b/executables/main-ocp.c
index c9388e179d167e9fef5da4a1908fa3e4ecd68445..5d949d5a287a1b10e11e12dc1540c7badca78c7b 100644
--- a/executables/main-ocp.c
+++ b/executables/main-ocp.c
@@ -173,7 +173,7 @@ void init_transport(PHY_VARS_eNB *eNB) {
   }
 
   for (int i=0; i<NUMBER_OF_ULSCH_MAX; i++) {
-    LOG_D(PHY,"Allocating Transport Channel Buffer for ULSCH, UE %d\n",i);
+    LOG_D(PHY,"Allocating Transport Channel Buffers for ULSCH, UE %d\n",i);
     AssertFatal((eNB->ulsch[1+i] = new_eNB_ulsch(MAX_TURBO_ITERATIONS,fp->N_RB_UL, 0)) != NULL,
                 "Can't get eNB ulsch structures\n");
     // this is the transmission mode for the signalling channels
diff --git a/executables/nr-gnb.c b/executables/nr-gnb.c
index 8ea7f167121c080d52a2ff4bd20d06f29cc4a7c9..bc3dccf4fa8c092024d8a79ba3523cf75f05c9a3 100644
--- a/executables/nr-gnb.c
+++ b/executables/nr-gnb.c
@@ -304,32 +304,36 @@ void rx_func(void *param) {
        );
 #endif
 }
-static void dump_L1_meas_stats(PHY_VARS_gNB *gNB, RU_t *ru, char *output) {
-  int stroff = 0;
-  stroff += print_meas_log(&gNB->phy_proc_tx, "L1 Tx processing", NULL, NULL, output);
-  stroff += print_meas_log(&gNB->dlsch_encoding_stats, "DLSCH encoding", NULL, NULL, output+stroff);
-  stroff += print_meas_log(&gNB->phy_proc_rx, "L1 Rx processing", NULL, NULL, output+stroff);
-  stroff += print_meas_log(&gNB->ul_indication_stats, "UL Indication", NULL, NULL, output+stroff);
-  stroff += print_meas_log(&gNB->rx_pusch_stats, "PUSCH inner-receiver", NULL, NULL, output+stroff);
-  stroff += print_meas_log(&gNB->ulsch_decoding_stats, "PUSCH decoding", NULL, NULL, output+stroff);
-  stroff += print_meas_log(&gNB->schedule_response_stats, "Schedule Response",NULL,NULL, output+stroff);
-  if (ru->feprx) stroff += print_meas_log(&ru->ofdm_demod_stats,"feprx",NULL,NULL, output+stroff);
+static size_t dump_L1_meas_stats(PHY_VARS_gNB *gNB, RU_t *ru, char *output, size_t outputlen) {
+  const char *begin = output;
+  const char *end = output + outputlen;
+  output += print_meas_log(&gNB->phy_proc_tx, "L1 Tx processing", NULL, NULL, output, end - output);
+  output += print_meas_log(&gNB->dlsch_encoding_stats, "DLSCH encoding", NULL, NULL, output, end - output);
+  output += print_meas_log(&gNB->phy_proc_rx, "L1 Rx processing", NULL, NULL, output, end - output);
+  output += print_meas_log(&gNB->ul_indication_stats, "UL Indication", NULL, NULL, output, end - output);
+  output += print_meas_log(&gNB->rx_pusch_stats, "PUSCH inner-receiver", NULL, NULL, output, end - output);
+  output += print_meas_log(&gNB->ulsch_decoding_stats, "PUSCH decoding", NULL, NULL, output, end - output);
+  output += print_meas_log(&gNB->schedule_response_stats, "Schedule Response", NULL, NULL, output, end - output);
+  if (ru->feprx)
+    output += print_meas_log(&ru->ofdm_demod_stats, "feprx", NULL, NULL, output, end - output);
 
   if (ru->feptx_ofdm) {
-    stroff += print_meas_log(&ru->precoding_stats,"feptx_prec",NULL,NULL, output+stroff);
-    stroff += print_meas_log(&ru->txdataF_copy_stats,"txdataF_copy",NULL,NULL, output+stroff);
-    stroff += print_meas_log(&ru->ofdm_mod_stats,"feptx_ofdm",NULL,NULL, output+stroff);
-    stroff += print_meas_log(&ru->ofdm_total_stats,"feptx_total",NULL,NULL, output+stroff);
+    output += print_meas_log(&ru->precoding_stats,"feptx_prec",NULL,NULL, output, end - output);
+    output += print_meas_log(&ru->txdataF_copy_stats,"txdataF_copy",NULL,NULL, output, end - output);
+    output += print_meas_log(&ru->ofdm_mod_stats,"feptx_ofdm",NULL,NULL, output, end - output);
+    output += print_meas_log(&ru->ofdm_total_stats,"feptx_total",NULL,NULL, output, end - output);
   }
 
-  if (ru->fh_north_asynch_in) stroff += print_meas_log(&ru->rx_fhaul,"rx_fhaul",NULL,NULL, output+stroff);
+  if (ru->fh_north_asynch_in)
+    output += print_meas_log(&ru->rx_fhaul,"rx_fhaul",NULL,NULL, output, end - output);
 
-  stroff += print_meas_log(&ru->tx_fhaul,"tx_fhaul",NULL,NULL, output+stroff);
+  output += print_meas_log(&ru->tx_fhaul,"tx_fhaul",NULL,NULL, output, end - output);
 
   if (ru->fh_north_out) {
-    stroff += print_meas_log(&ru->compression,"compression",NULL,NULL, output+stroff);
-    stroff += print_meas_log(&ru->transport,"transport",NULL,NULL, output+stroff);
+    output += print_meas_log(&ru->compression,"compression",NULL,NULL, output, end - output);
+    output += print_meas_log(&ru->transport,"transport",NULL,NULL, output, end - output);
   }
+  return output - begin;
 }
 
 void *nrL1_stats_thread(void *param) {
@@ -355,7 +359,7 @@ void *nrL1_stats_thread(void *param) {
     dump_nr_I0_stats(fd,gNB);
     dump_pdsch_stats(fd,gNB);
     dump_pusch_stats(fd,gNB);
-    dump_L1_meas_stats(gNB, ru, output);
+    dump_L1_meas_stats(gNB, ru, output, L1STATSSTRLEN);
     fprintf(fd,"%s\n",output);
     fflush(fd);
     fseek(fd,0,SEEK_SET);
@@ -380,7 +384,7 @@ void *tx_reorder_thread(void* param) {
     if (resL1Reserve) {
        resL1=resL1Reserve;
        if (((processingData_L1tx_t *)NotifiedFifoData(resL1))->slot != next_tx_slot) {
-         LOG_E(PHY,"order mistake");
+         LOG_E(PHY,"order mistake\n");
 	 resL1Reserve=NULL;
 	 resL1 = pullTpool(gNB->L1_tx_out, gNB->threadPool);
        }
@@ -462,7 +466,7 @@ void init_gNB_Tpool(int inst) {
     pushNotifiedFIFO(gNB->L1_tx_free,msgL1Tx); // to unblock the process in the beginning
   }
 
-  if (!get_softmodem_params()->emulate_l1) 
+  if ((!get_softmodem_params()->emulate_l1) && (!IS_SOFTMODEM_NOSTATS_BIT))
      threadCreate(&proc->L1_stats_thread,nrL1_stats_thread,(void*)gNB,"L1_stats",-1,OAI_PRIORITY_RT_LOW);
 
   threadCreate(&proc->pthread_tx_reorder, tx_reorder_thread, (void *)gNB, "thread_tx_reorder", -1, OAI_PRIORITY_RT_MAX);
@@ -600,7 +604,8 @@ void init_gNB(int single_thread_flag,int wait_for_sync) {
     gNB->UL_INFO.cqi_ind.cqi_raw_pdu_list = gNB->cqi_raw_pdu_list;*/
 
     gNB->prach_energy_counter = 0;
-    gNB->prb_interpolation = get_softmodem_params()->prb_interpolation;
+    gNB->chest_time = get_softmodem_params()->chest_time;
+    gNB->chest_freq = get_softmodem_params()->chest_freq;
   }
   
 
diff --git a/executables/nr-ru.c b/executables/nr-ru.c
index 78d02e8849cf2d1e0d450376a8790daa391cbbcb..b782209e4f84aec302e620cfc3ded66a495848d0 100644
--- a/executables/nr-ru.c
+++ b/executables/nr-ru.c
@@ -729,10 +729,17 @@ void tx_rf(RU_t *ru,int frame,int slot, uint64_t timestamp) {
 
       AssertFatal(txsymb>0,"illegal txsymb %d\n",txsymb);
 
-      if(slot%(fp->slots_per_subframe/2))
-        siglen = txsymb * (fp->ofdm_symbol_size + fp->nb_prefix_samples);
-      else
-        siglen = (fp->ofdm_symbol_size + fp->nb_prefix_samples0) + (txsymb - 1) * (fp->ofdm_symbol_size + fp->nb_prefix_samples);
+      if (fp->slots_per_subframe == 1) {
+        if (txsymb <= 7)
+          siglen = (fp->ofdm_symbol_size + fp->nb_prefix_samples0) + (txsymb - 1) * (fp->ofdm_symbol_size + fp->nb_prefix_samples);
+        else
+          siglen = 2 * (fp->ofdm_symbol_size + fp->nb_prefix_samples0) + (txsymb - 2) * (fp->ofdm_symbol_size + fp->nb_prefix_samples);
+      } else {
+        if(slot%(fp->slots_per_subframe/2))
+          siglen = txsymb * (fp->ofdm_symbol_size + fp->nb_prefix_samples);
+        else
+          siglen = (fp->ofdm_symbol_size + fp->nb_prefix_samples0) + (txsymb - 1) * (fp->ofdm_symbol_size + fp->nb_prefix_samples);
+      }
 
       //+ ru->end_of_burst_delay;
       flags = 3; // end of burst
@@ -1091,11 +1098,12 @@ void fill_rf_config(RU_t *ru, char *rf_config_file) {
     cfg->tx_gain[i] = ru->att_tx;
     cfg->rx_gain[i] = ru->max_rxgain-ru->att_rx;
     cfg->configFilename = rf_config_file;
-    LOG_I(PHY, "Channel %d: setting tx_gain offset %f, rx_gain offset %f, tx_freq %lu Hz, rx_freq %lu Hz\n",
+    LOG_I(PHY, "Channel %d: setting tx_gain offset %.0f, rx_gain offset %.0f, tx_freq %.0f Hz, rx_freq %.0f Hz, tune_offset %.0f Hz\n",
           i, cfg->tx_gain[i],
           cfg->rx_gain[i],
-          (unsigned long)cfg->tx_freq[i],
-          (unsigned long)cfg->rx_freq[i]);
+          cfg->tx_freq[i],
+          cfg->rx_freq[i],
+          cfg->tune_offset);
   }
 }
 
@@ -2103,6 +2111,8 @@ static void NRRCconfig_RU(void) {
         RC.ru[j]->openair0_cfg.time_source = internal;
       }
 
+      RC.ru[j]->openair0_cfg.tune_offset = get_softmodem_params()->tune_offset;
+
       if (strcmp(*(RUParamList.paramarray[j][RU_LOCAL_RF_IDX].strptr), "yes") == 0) {
         if ( !(config_isparamset(RUParamList.paramarray[j],RU_LOCAL_IF_NAME_IDX)) ) {
           RC.ru[j]->if_south                        = LOCAL_RF;
diff --git a/executables/nr-softmodem-common.h b/executables/nr-softmodem-common.h
index 6e36dcf6c7f749d7f18400ab655a304c726bb315..1e6c556acffb457ff8646e0c5e44c7f14b44d6a3 100644
--- a/executables/nr-softmodem-common.h
+++ b/executables/nr-softmodem-common.h
@@ -66,6 +66,7 @@
 #define CONFIG_HLP_ITTIL         "Generate ITTI analyzser logs (similar to wireshark logs but with more details)\n"
 #define CONFIG_HLP_DLMCS_PHYTEST "Set the downlink MCS for PHYTEST mode\n"
 #define CONFIG_HLP_DLNL_PHYTEST "Set the downlink nrOfLayers for PHYTEST mode\n"
+#define CONFIG_HLP_ULNL_PHYTEST "Set the uplink nrOfLayers for PHYTEST mode\n"
 #define CONFIG_HLP_STMON         "Enable processing timing measurement of lte softmodem on per subframe basis \n"
 #define CONFIG_HLP_MSLOTS        "Skip the missed slots/subframes \n"
 #define CONFIG_HLP_ULMCS_PHYTEST "Set the uplink MCS for PHYTEST mode\n"
diff --git a/executables/nr-softmodem.c b/executables/nr-softmodem.c
index 1c75d9a155ee99747a2b93b7dddd2b317c82949b..54345dc6b022cf4555dd81a49cdbe64c55831dee 100644
--- a/executables/nr-softmodem.c
+++ b/executables/nr-softmodem.c
@@ -839,10 +839,10 @@ int main( int argc, char **argv ) {
   }
 
   for (int inst = 0; inst < NB_RU; inst++) {
+    kill_NR_RU_proc(inst);
     nr_phy_free_RU(RC.ru[inst]);
   }
 
-  free_lte_top();
   pthread_cond_destroy(&sync_cond);
   pthread_mutex_destroy(&sync_mutex);
   pthread_cond_destroy(&nfapi_sync_cond);
diff --git a/executables/nr-softmodem.h b/executables/nr-softmodem.h
index 834e89b40390f242af8cb3936d79888a52667f2d..98087ea2bb2a412888848c192d4c8a7949f835b1 100644
--- a/executables/nr-softmodem.h
+++ b/executables/nr-softmodem.h
@@ -22,6 +22,7 @@
     {"E" ,                    CONFIG_HLP_TQFS,        PARAMFLAG_BOOL,   i8ptr:&threequarter_fs,             defintval:0,                   TYPE_INT8,   0},        \
     {"m" ,                    CONFIG_HLP_DLMCS_PHYTEST,0,               uptr:&target_dl_mcs,                defintval:0,                   TYPE_UINT,   0},        \
     {"l" ,                    CONFIG_HLP_DLNL_PHYTEST,0,                uptr:&target_dl_Nl,                 defintval:0,                   TYPE_UINT,   0},        \
+    {"L" ,                    CONFIG_HLP_ULNL_PHYTEST,0,                uptr:&target_ul_Nl,                 defintval:0,                   TYPE_UINT,   0},        \
     {"t" ,                    CONFIG_HLP_ULMCS_PHYTEST,0,               uptr:&target_ul_mcs,                defintval:0,                   TYPE_UINT,   0},        \
     {"M" ,                    CONFIG_HLP_DLBW_PHYTEST,0,                uptr:&target_dl_bw,                 defintval:0,                   TYPE_UINT,   0},        \
     {"T" ,                    CONFIG_HLP_ULBW_PHYTEST,0,                uptr:&target_ul_bw,                 defintval:0,                   TYPE_UINT,   0},        \
@@ -36,6 +37,7 @@
 extern threads_t threads;
 extern uint32_t target_dl_mcs;
 extern uint32_t target_dl_Nl;
+extern uint32_t target_ul_Nl;
 extern uint32_t target_ul_mcs;
 extern uint32_t target_dl_bw;
 extern uint32_t target_ul_bw;
@@ -57,9 +59,6 @@ extern void set_function_spec_param(RU_t *ru);
 
 extern void reset_opp_meas(void);
 extern void print_opp_meas(void);
-
-extern void init_fep_thread(PHY_VARS_gNB *);
-
 void init_gNB_afterRU(void);
 
 extern int stop_L1L2(module_id_t gnb_id);
diff --git a/executables/nr-ue.c b/executables/nr-ue.c
index 620e21ec1420ae33ccffd5c1355da806270cfa0c..85ec4e5e0c62276a852c8cabbd3a90488033c116 100644
--- a/executables/nr-ue.c
+++ b/executables/nr-ue.c
@@ -106,23 +106,24 @@ queue_t nr_rach_ind_queue;
 
 static void *NRUE_phy_stub_standalone_pnf_task(void *arg);
 
-static int dump_L1_UE_meas_stats(PHY_VARS_NR_UE *ue, char *output, int max_len)
+static size_t dump_L1_UE_meas_stats(PHY_VARS_NR_UE *ue, char *output, size_t max_len)
 {
-  int stroff = 0;
-  stroff += print_meas_log(&ue->phy_proc_tx, "L1 TX processing", NULL, NULL, output);
-  stroff += print_meas_log(&ue->ulsch_encoding_stats, "ULSCH encoding", NULL, NULL, output + stroff);
-  stroff += print_meas_log(&ue->phy_proc_rx[0], "L1 RX processing t0", NULL, NULL, output + stroff);
-  stroff += print_meas_log(&ue->phy_proc_rx[1], "L1 RX processing t1", NULL, NULL, output + stroff);
-  stroff += print_meas_log(&ue->ue_ul_indication_stats, "UL Indication", NULL, NULL, output + stroff);
-  stroff += print_meas_log(&ue->rx_pdsch_stats, "PDSCH receiver", NULL, NULL, output + stroff);
-  stroff += print_meas_log(&ue->dlsch_decoding_stats[0], "PDSCH decoding t0", NULL, NULL, output + stroff);
-  stroff += print_meas_log(&ue->dlsch_decoding_stats[1], "PDSCH decoding t1", NULL, NULL, output + stroff);
-  stroff += print_meas_log(&ue->dlsch_deinterleaving_stats, " -> Deinterleive", NULL, NULL, output + stroff);
-  stroff += print_meas_log(&ue->dlsch_rate_unmatching_stats, " -> Rate Unmatch", NULL, NULL, output + stroff);
-  stroff += print_meas_log(&ue->dlsch_ldpc_decoding_stats, " ->  LDPC Decode", NULL, NULL, output + stroff);
-  stroff += print_meas_log(&ue->dlsch_unscrambling_stats, "PDSCH unscrambling", NULL, NULL, output + stroff);
-  stroff += print_meas_log(&ue->dlsch_rx_pdcch_stats, "PDCCH handling", NULL, NULL, output + stroff);
-  return stroff;
+  const char *begin = output;
+  const char *end = output + max_len;
+  output += print_meas_log(&ue->phy_proc_tx, "L1 TX processing", NULL, NULL, output, end - output);
+  output += print_meas_log(&ue->ulsch_encoding_stats, "ULSCH encoding", NULL, NULL, output, end - output);
+  output += print_meas_log(&ue->phy_proc_rx[0], "L1 RX processing t0", NULL, NULL, output, end - output);
+  output += print_meas_log(&ue->phy_proc_rx[1], "L1 RX processing t1", NULL, NULL, output, end - output);
+  output += print_meas_log(&ue->ue_ul_indication_stats, "UL Indication", NULL, NULL, output, end - output);
+  output += print_meas_log(&ue->rx_pdsch_stats, "PDSCH receiver", NULL, NULL, output, end - output);
+  output += print_meas_log(&ue->dlsch_decoding_stats[0], "PDSCH decoding t0", NULL, NULL, output, end - output);
+  output += print_meas_log(&ue->dlsch_decoding_stats[1], "PDSCH decoding t1", NULL, NULL, output, end - output);
+  output += print_meas_log(&ue->dlsch_deinterleaving_stats, " -> Deinterleive", NULL, NULL, output, end - output);
+  output += print_meas_log(&ue->dlsch_rate_unmatching_stats, " -> Rate Unmatch", NULL, NULL, output, end - output);
+  output += print_meas_log(&ue->dlsch_ldpc_decoding_stats, " ->  LDPC Decode", NULL, NULL, output, end - output);
+  output += print_meas_log(&ue->dlsch_unscrambling_stats, "PDSCH unscrambling", NULL, NULL, output, end - output);
+  output += print_meas_log(&ue->dlsch_rx_pdcch_stats, "PDCCH handling", NULL, NULL, output, end - output);
+  return output - begin;
 }
 
 static void *nrL1_UE_stats_thread(void *param)
@@ -613,7 +614,7 @@ void processSlotTX(void *arg) {
   int tx_slot_type = nr_ue_slot_select(cfg, proc->frame_tx, proc->nr_slot_tx);
   uint8_t gNB_id = 0;
 
-  LOG_D(PHY,"%d.%d => slot type %d\n",proc->frame_tx,proc->nr_slot_tx,tx_slot_type);
+  LOG_D(PHY,"processSlotTX %d.%d => slot type %d\n",proc->frame_tx,proc->nr_slot_tx,tx_slot_type);
   if (tx_slot_type == NR_UPLINK_SLOT || tx_slot_type == NR_MIXED_SLOT){
 
     // trigger L2 to run ue_scheduler thru IF module
@@ -713,7 +714,8 @@ void processSlotRX(void *arg) {
       LOG_D(PHY, "Sending Uplink data \n");
       nr_ue_pusch_common_procedures(UE,
                                     proc->nr_slot_tx,
-                                    &UE->frame_parms,1);
+                                    &UE->frame_parms,
+                                    UE->frame_parms.nb_antennas_tx);
     }
 
     if (UE->UE_mode[gNB_id] > NOT_SYNCHED && UE->UE_mode[gNB_id] < PUSCH) {
@@ -1107,8 +1109,10 @@ void init_NR_UE_threads(int nb_inst) {
 
     LOG_I(PHY,"Intializing UE Threads for instance %d (%p,%p)...\n",inst,PHY_vars_UE_g[inst],PHY_vars_UE_g[inst][0]);
     threadCreate(&threads[inst], UE_thread, (void *)UE, "UEthread", -1, OAI_PRIORITY_RT_MAX);
-    pthread_t stat_pthread;
-    threadCreate(&stat_pthread, nrL1_UE_stats_thread, UE, "L1_UE_stats", -1, OAI_PRIORITY_RT_LOW);
+    if (!IS_SOFTMODEM_NOSTATS_BIT) {
+      pthread_t stat_pthread;
+      threadCreate(&stat_pthread, nrL1_UE_stats_thread, UE, "L1_UE_stats", -1, OAI_PRIORITY_RT_LOW);
+    }
   }
 }
 
diff --git a/executables/nr-uesoftmodem.c b/executables/nr-uesoftmodem.c
index b418fc9e90d39a7856cb33329f560edf3911c0a3..cb848a76cdf65e445c3d84c261547033dc493963 100644
--- a/executables/nr-uesoftmodem.c
+++ b/executables/nr-uesoftmodem.c
@@ -261,13 +261,11 @@ void init_tpools(uint8_t nun_dlsch_threads) {
 }
 static void get_options(void) {
 
-  nrUE_params.ofdm_offset_divisor = 8;
   paramdef_t cmdline_params[] =CMDLINE_NRUEPARAMS_DESC ;
   int numparams = sizeof(cmdline_params)/sizeof(paramdef_t);
+  config_get(cmdline_params,numparams,NULL);
   config_process_cmdline( cmdline_params,numparams,NULL);
 
-
-
   if (vcdflag > 0)
     ouput_vcd = 1;
 }
@@ -319,8 +317,8 @@ void set_options(int CC_id, PHY_VARS_NR_UE *UE){
   UE->rf_map.card          = card_offset;
   UE->rf_map.chain         = CC_id + chain_offset;
 
-  LOG_I(PHY,"Set UE mode %d, UE_fo_compensation %d, UE_scan_carrier %d, UE_no_timing_correction %d \n, do_prb_interpolation %d\n",
-  	   UE->mode, UE->UE_fo_compensation, UE->UE_scan_carrier, UE->no_timing_correction, UE->prb_interpolation);
+  LOG_I(PHY,"Set UE mode %d, UE_fo_compensation %d, UE_scan_carrier %d, UE_no_timing_correction %d \n, chest-freq %d\n",
+  	   UE->mode, UE->UE_fo_compensation, UE->UE_scan_carrier, UE->no_timing_correction, UE->chest_freq);
 
   // Set FP variables
 
@@ -332,6 +330,7 @@ void set_options(int CC_id, PHY_VARS_NR_UE *UE){
   LOG_I(PHY, "Set UE nb_rx_antenna %d, nb_tx_antenna %d, threequarter_fs %d, ssb_start_subcarrier %d\n", fp->nb_antennas_rx, fp->nb_antennas_tx, fp->threequarter_fs, fp->ssb_start_subcarrier);
 
   fp->ofdm_offset_divisor = nrUE_params.ofdm_offset_divisor;
+  UE->max_ldpc_iterations = nrUE_params.max_ldpc_iterations;
 
 }
 
@@ -356,6 +355,7 @@ void init_openair0(void) {
     openair0_cfg[card].num_rb_dl = frame_parms->N_RB_DL;
     openair0_cfg[card].clock_source = get_softmodem_params()->clock_source;
     openair0_cfg[card].time_source = get_softmodem_params()->timing_source;
+    openair0_cfg[card].tune_offset = get_softmodem_params()->tune_offset;
     openair0_cfg[card].tx_num_channels = min(4, frame_parms->nb_antennas_tx);
     openair0_cfg[card].rx_num_channels = min(4, frame_parms->nb_antennas_rx);
 
diff --git a/executables/nr-uesoftmodem.h b/executables/nr-uesoftmodem.h
index 927d619c42f03a5564961a1e95240a6ae7047c1a..a25d9cf5cfff1a8d1badc3df16c5f2eabaaa4a4b 100644
--- a/executables/nr-uesoftmodem.h
+++ b/executables/nr-uesoftmodem.h
@@ -7,10 +7,11 @@
 
 
 
-#define  CONFIG_HLP_IF_FREQ                "IF frequency for RF, if needed"
-#define  CONFIG_HLP_IF_FREQ_OFF            "UL IF frequency offset for RF, if needed"
+#define  CONFIG_HLP_IF_FREQ                "IF frequency for RF, if needed\n"
+#define  CONFIG_HLP_IF_FREQ_OFF            "UL IF frequency offset for RF, if needed\n"
 #define  CONFIG_HLP_DLSCH_PARA             "number of threads for dlsch processing 0 for no parallelization\n"
 #define  CONFIG_HLP_OFFSET_DIV             "Divisor for computing OFDM symbol offset in Rx chain (num samples in CP/<the value>). Default value is 8. To set the sample offset to 0, set this value ~ 10e6\n"
+#define  CONFIG_HLP_MAX_LDPC_ITERATIONS    "Maximum LDPC decoder iterations\n"
 /***************************************************************************************************************************************/
 /* command line options definitions, CMDLINE_XXXX_DESC macros are used to initialize paramdef_t arrays which are then used as argument
    when calling config_get or config_getlist functions                                                                                 */
@@ -32,8 +33,9 @@
     {"tx_subdev",                CONFIG_HLP_USRP_ARGS,   0,               strptr:(char **)&tx_subdev,         defstrval:"", TYPE_STRING,   0},    \
     {"rx_subdev",                CONFIG_HLP_USRP_ARGS,   0,               strptr:(char **)&rx_subdev,         defstrval:"", TYPE_STRING,   0},    \
     {"single-thread-disable",    CONFIG_HLP_NOSNGLT,     PARAMFLAG_BOOL,  iptr:&single_thread_flag,           defintval:1,           TYPE_INT,    0}, \
-    {"dlsch-parallel",           CONFIG_HLP_DLSCH_PARA,  0,               iptr:(int32_t *)&nrUE_params.nr_dlsch_parallel,       defintval:0,           TYPE_UINT8,  0}, \
-    {"offset-divisor",           CONFIG_HLP_OFFSET_DIV,  0,               uptr:(uint32_t *)&nrUE_params.ofdm_offset_divisor,    defuintval:UINT_MAX,           TYPE_UINT32,  0}, \
+    {"dlsch-parallel",           CONFIG_HLP_DLSCH_PARA,  0,               u8ptr:&nrUE_params.nr_dlsch_parallel,       defintval:0,           TYPE_UINT8,  0}, \
+    {"offset-divisor",           CONFIG_HLP_OFFSET_DIV,  0,               uptr:&nrUE_params.ofdm_offset_divisor,    defuintval:8,           TYPE_UINT32,  0}, \
+    {"max-ldpc-iterations",      CONFIG_HLP_MAX_LDPC_ITERATIONS, 0,       u8ptr:&nrUE_params.max_ldpc_iterations,    defuintval:5,       TYPE_UINT8, 0}, \
     {"nr-dlsch-demod-shift",     CONFIG_HLP_DLSHIFT,     0,               iptr:(int32_t *)&nr_dlsch_demod_shift,    defintval:0,     TYPE_INT,    0}, \
     {"V" ,                       CONFIG_HLP_VCD,         PARAMFLAG_BOOL,  iptr:&vcdflag,                      defintval:0,     TYPE_INT,    0}, \
     {"uecap_file",               CONFIG_HLP_UECAP_FILE,  0,               strptr:(char **)&uecap_file,        defstrval:"./uecap.xml", TYPE_STRING, 0}, \
@@ -69,7 +71,8 @@
     {"T" ,                       CONFIG_HLP_TDD,         PARAMFLAG_BOOL,  iptr:&tddflag,                      defintval:0,           TYPE_INT,   0}, \
     {"if_freq" ,                 CONFIG_HLP_IF_FREQ,     0,               u64ptr:&(UE->if_freq),              defuintval:0,          TYPE_UINT64,0}, \
     {"if_freq_off" ,             CONFIG_HLP_IF_FREQ_OFF, 0,               iptr:&(UE->if_freq_off),            defuintval:0,          TYPE_INT,   0}, \
-    {"do-prb-interpolation",     CONFIG_HLP_PRBINTER,    PARAMFLAG_BOOL,  iptr:&(UE->prb_interpolation),      defintval:0,           TYPE_INT,   0}, \
+    {"chest-freq",               CONFIG_HLP_CHESTFREQ,   0,               iptr:&(UE->chest_freq),             defintval:0,           TYPE_INT,   0}, \
+    {"chest-time",               CONFIG_HLP_CHESTTIME,   0,               iptr:&(UE->chest_time),             defintval:0,           TYPE_INT,   0}, \
     {"ue-timing-correction-disable", CONFIG_HLP_DISABLETIMECORR, PARAMFLAG_BOOL, iptr:&(UE->no_timing_correction), defintval:0,      TYPE_INT,   0}, \
 }
 
@@ -78,6 +81,7 @@ typedef struct {
   uint64_t       optmask;   //mask to store boolean config options
   uint32_t       ofdm_offset_divisor; // Divisor for sample offset computation for each OFDM symbol
   uint8_t        nr_dlsch_parallel; // number of threads for dlsch decoding, 0 means no parallelization
+  uint8_t        max_ldpc_iterations; // number of maximum LDPC iterations
   tpool_t        Tpool;             // thread pool 
 } nrUE_params_t;
 extern uint64_t get_nrUE_optmask(void);
diff --git a/executables/softmodem-common.c b/executables/softmodem-common.c
index c78fc70243c6e138f06e9a2cb89fc0be46e2c8c9..bf30cab847ec7d0aaab0e2e611143bab57875556 100644
--- a/executables/softmodem-common.c
+++ b/executables/softmodem-common.c
@@ -85,6 +85,7 @@ char *get_softmodem_function(uint64_t *sofmodemfunc_mask_ptr) {
 }
 
 void get_common_options(uint32_t execmask) {
+  int32_t stats_disabled = 0;
   uint32_t online_log_messages=0;
   uint32_t glog_level=0 ;
   uint32_t start_telnetsrv = 0, start_telnetclt = 0;
@@ -149,6 +150,8 @@ void get_common_options(uint32_t execmask) {
 
   if(worker_config != NULL)   set_worker_conf(worker_config);
   nfapi_setmode(nfapi_mode);
+  if (stats_disabled)
+    set_softmodem_optmask(SOFTMODEM_NOSTATS_BIT);
 }
 void softmodem_printresources(int sig, telnet_printfunc_t pf) {
   struct rusage usage;
diff --git a/executables/softmodem-common.h b/executables/softmodem-common.h
index eb0c1a54f74025e5c3cb31d159790883c4e59ea7..a2ba68023465ae387ad673121415833bb0d47b94 100644
--- a/executables/softmodem-common.h
+++ b/executables/softmodem-common.h
@@ -60,6 +60,7 @@ extern "C"
 #define CONFIG_HLP_DMRSSYNC      "tells RU to insert DMRS in subframe 1 slot 0"
 #define CONFIG_HLP_CLK           "tells hardware to use a clock reference (0:internal, 1:external, 2:gpsdo)\n"
 #define CONFIG_HLP_TME           "tells hardware to use a time reference (0:internal, 1:external, 2:gpsdo)\n"
+#define CONFIG_HLP_TUNE_OFFSET   "LO tuning offset to use in Hz\n"
 #define CONFIG_HLP_USIM          "use XOR autentication algo in case of test usim mode\n"
 #define CONFIG_HLP_NOSNGLT       "Disables single-thread mode in lte-softmodem\n"
 #define CONFIG_HLP_DLF           "Set the downlink frequency for all component carriers\n"
@@ -71,7 +72,8 @@ extern "C"
 #define CONFIG_HLP_DLMCS         "Set the maximum downlink MCS\n"
 #define CONFIG_HLP_STMON         "Enable processing timing measurement of lte softmodem on per subframe basis \n"
 #define CONFIG_HLP_256QAM        "Use the 256 QAM mcs table for PDSCH\n"
-#define CONFIG_HLP_PRBINTER       "Do PRB based averaging of channel estimates. Frequency domain linear interpolation by default\n"
+#define CONFIG_HLP_CHESTFREQ     "Set channel estimation type in frequency domain. 0-Linear interpolation (default). 1-PRB based averaging of channel estimates in frequency. \n"
+#define CONFIG_HLP_CHESTTIME     "Set channel estimation type in time domain. 0-Symbols take estimates of the last preceding DMRS symbol (default). 1-Symbol based averaging of channel estimates in time. \n"
 
 #define CONFIG_HLP_NONSTOP       "Go back to frame sync mode after 100 consecutive PBCH failures\n"
 //#define CONFIG_HLP_NUMUES        "Set the number of UEs for the emulation"
@@ -99,6 +101,7 @@ extern "C"
 #define CONFIG_HLP_NFAPI         "Change the nFAPI mode for NR\n"
 #define CONFIG_L1_EMULATOR       "Run in L1 emulated mode (disable PHY layer)\n"
 #define CONFIG_HLP_CONTINUOUS_TX "perform continuous transmission, even in TDD mode (to work around USRP issues)\n"
+#define CONFIG_HLP_STATS_DISABLE "disable globally the stats generation and persistence"
 
 /*-----------------------------------------------------------------------------------------------------------------------------------------------------*/
 /*                                            command line parameters common to eNodeB and UE                                                          */
@@ -118,9 +121,11 @@ extern "C"
 #define EMULATE_RF          softmodem_params.emulate_rf
 #define CLOCK_SOURCE        softmodem_params.clock_source
 #define TIMING_SOURCE       softmodem_params.timing_source
+#define TUNE_OFFSET         softmodem_params.tune_offset
 #define SEND_DMRSSYNC       softmodem_params.send_dmrs_sync
 #define USIM_TEST           softmodem_params.usim_test
-#define PRB_INTERPOLATION   softmodem_params.prb_interpolation
+#define CHEST_FREQ          softmodem_params.chest_freq
+#define CHEST_TIME          softmodem_params.chest_time
 #define NFAPI               softmodem_params.nfapi
 #define NSA                 softmodem_params.nsa
 #define NODE_NUMBER         softmodem_params.node_number
@@ -141,6 +146,7 @@ extern int usrp_tx_thread;
     {"usim-test",            CONFIG_HLP_USIM,         PARAMFLAG_BOOL, u8ptr:&USIM_TEST,                   defintval:0,           TYPE_UINT8,  0},                     \
     {"clock-source",         CONFIG_HLP_CLK,          0,              uptr:&CLOCK_SOURCE,                 defintval:0,           TYPE_UINT,   0},                     \
     {"time-source",          CONFIG_HLP_TME,          0,              uptr:&TIMING_SOURCE,                defintval:0,           TYPE_UINT,   0},                     \
+    {"tune-offset",          CONFIG_HLP_TUNE_OFFSET,  0,              dblptr:&TUNE_OFFSET,                defintval:0,           TYPE_DOUBLE, 0},                     \
     {"wait-for-sync",        NULL,                    PARAMFLAG_BOOL, iptr:&WAIT_FOR_SYNC,                defintval:0,           TYPE_INT,    0},                     \
     {"single-thread-enable", CONFIG_HLP_NOSNGLT,      PARAMFLAG_BOOL, iptr:&SINGLE_THREAD_FLAG,           defintval:0,           TYPE_INT,    0},                     \
     {"C" ,                   CONFIG_HLP_DLF,          0,              u64ptr:&(downlink_frequency[0][0]), defuintval:0,          TYPE_UINT64, 0},                     \
@@ -157,14 +163,16 @@ extern int usrp_tx_thread;
     {"rfsim",                CONFIG_HLP_RFSIM,        PARAMFLAG_BOOL, uptr:&rfsim,                        defintval:0,           TYPE_INT,    0},                     \
     {"nokrnmod",             CONFIG_HLP_NOKRNMOD,     PARAMFLAG_BOOL, uptr:&nokrnmod,                     defintval:0,           TYPE_INT,    0},                     \
     {"nbiot-disable",        CONFIG_HLP_DISABLNBIOT,  PARAMFLAG_BOOL, uptr:&nonbiot,                      defuintval:0,          TYPE_INT,    0},                     \
+    {"chest-freq",           CONFIG_HLP_CHESTFREQ,    0,              iptr:&CHEST_FREQ,                   defintval:0,           TYPE_INT,    0},                     \
+    {"chest-time",           CONFIG_HLP_CHESTTIME,    0,              iptr:&CHEST_TIME,                   defintval:0,           TYPE_INT,    0},                     \
     {"nsa",                  CONFIG_HLP_NSA,          PARAMFLAG_BOOL, iptr:&NSA,                          defintval:0,           TYPE_INT,    0},                     \
     {"node-number",          NULL,                    0,              u16ptr:&NODE_NUMBER,                defuintval:0,          TYPE_UINT16, 0},                     \
     {"usrp-tx-thread-config", CONFIG_HLP_USRP_THREAD, 0,              iptr:&usrp_tx_thread,               defstrval:0,           TYPE_INT,    0},                     \
-    {"do-prb-interpolation", CONFIG_HLP_PRBINTER,     PARAMFLAG_BOOL, iptr:&PRB_INTERPOLATION,            defintval:0,           TYPE_INT,    0},                     \
     {"nfapi",                CONFIG_HLP_NFAPI,        0,              u8ptr:&nfapi_mode,                  defintval:0,           TYPE_UINT8,  0},                     \
     {"non-stop",             CONFIG_HLP_NONSTOP,      PARAMFLAG_BOOL, iptr:&NON_STOP,                     defintval:0,           TYPE_INT,    0},                     \
     {"emulate-l1",           CONFIG_L1_EMULATOR,      PARAMFLAG_BOOL, iptr:&EMULATE_L1,                   defintval:0,           TYPE_INT,    0},                     \
     {"continuous-tx",        CONFIG_HLP_CONTINUOUS_TX,PARAMFLAG_BOOL, iptr:&CONTINUOUS_TX,                defintval:0,           TYPE_INT,    0},                     \
+    {"disable-stats",        CONFIG_HLP_STATS_DISABLE, PARAMFLAG_BOOL, iptr:&stats_disabled,               defintval:0,           TYPE_INT,    0},                     \
   }
 
 #define CONFIG_HLP_NSA           "Enable NSA mode \n"
@@ -203,6 +211,7 @@ extern int usrp_tx_thread;
 #define SOFTMODEM_NONBIOT_BIT         (1<<2)
 #define SOFTMODEM_RFSIM_BIT           (1<<10)
 #define SOFTMODEM_SIML1_BIT           (1<<12)
+#define SOFTMODEM_DLSIM_BIT           (1<<13)
 #define SOFTMODEM_DOSCOPE_BIT         (1<<15)
 #define SOFTMODEM_RECPLAY_BIT         (1<<16)
 #define SOFTMODEM_TELNETCLT_BIT       (1<<17)
@@ -210,6 +219,7 @@ extern int usrp_tx_thread;
 #define SOFTMODEM_GNB_BIT             (1<<21)
 #define SOFTMODEM_4GUE_BIT            (1<<22)
 #define SOFTMODEM_5GUE_BIT            (1<<23)
+#define SOFTMODEM_NOSTATS_BIT         (1<<24)
 #define SOFTMODEM_FUNC_BITS (SOFTMODEM_ENB_BIT | SOFTMODEM_GNB_BIT | SOFTMODEM_5GUE_BIT | SOFTMODEM_4GUE_BIT)
 #define MAPPING_SOFTMODEM_FUNCTIONS {{"enb",SOFTMODEM_ENB_BIT},{"gnb",SOFTMODEM_GNB_BIT},{"4Gue",SOFTMODEM_4GUE_BIT},{"5Gue",SOFTMODEM_5GUE_BIT}}
 
@@ -219,6 +229,7 @@ extern int usrp_tx_thread;
 #define IS_SOFTMODEM_NONBIOT         ( get_softmodem_optmask() & SOFTMODEM_NONBIOT_BIT)
 #define IS_SOFTMODEM_RFSIM           ( get_softmodem_optmask() & SOFTMODEM_RFSIM_BIT)
 #define IS_SOFTMODEM_SIML1           ( get_softmodem_optmask() & SOFTMODEM_SIML1_BIT)
+#define IS_SOFTMODEM_DLSIM           ( get_softmodem_optmask() & SOFTMODEM_DLSIM_BIT)
 #define IS_SOFTMODEM_DOSCOPE         ( get_softmodem_optmask() & SOFTMODEM_DOSCOPE_BIT)
 #define IS_SOFTMODEM_IQPLAYER        ( get_softmodem_optmask() & SOFTMODEM_RECPLAY_BIT)
 #define IS_SOFTMODEM_TELNETCLT_BIT   ( get_softmodem_optmask() & SOFTMODEM_TELNETCLT_BIT)    
@@ -226,6 +237,7 @@ extern int usrp_tx_thread;
 #define IS_SOFTMODEM_GNB_BIT         ( get_softmodem_optmask() & SOFTMODEM_GNB_BIT)
 #define IS_SOFTMODEM_4GUE_BIT        ( get_softmodem_optmask() & SOFTMODEM_4GUE_BIT)
 #define IS_SOFTMODEM_5GUE_BIT        ( get_softmodem_optmask() & SOFTMODEM_5GUE_BIT)
+#define IS_SOFTMODEM_NOSTATS_BIT     ( get_softmodem_optmask() & SOFTMODEM_NOSTATS_BIT)
 
 typedef struct {
   uint64_t       optmask;
@@ -245,9 +257,12 @@ typedef struct {
   int            band;
   uint32_t       clock_source;
   uint32_t       timing_source;
+  double         tune_offset;
   int            hw_timing_advance;
   uint32_t       send_dmrs_sync;
-  int            prb_interpolation;
+  int            use_256qam_table;
+  int            chest_time;
+  int            chest_freq;
   uint8_t        nfapi;
   int            nsa;
   uint16_t       node_number;
diff --git a/ldpctest_BG_1_Zc_384_rate_1-3_block_length_8448_maxit_5.txt b/ldpctest_BG_1_Zc_384_rate_1-3_block_length_8448_maxit_5.txt
new file mode 100644
index 0000000000000000000000000000000000000000..2983268dac4da362d46348bc81d447e6d30252b7
--- /dev/null
+++ b/ldpctest_BG_1_Zc_384_rate_1-3_block_length_8448_maxit_5.txt
@@ -0,0 +1,64 @@
+SNR BLER BER UNCODED_BER ENCODER_MEAN ENCODER_STD ENCODER_MAX DECODER_TIME_MEAN DECODER_TIME_STD DECODER_TIME_MAX DECODER_ITER_MEAN DECODER_ITER_STD DECODER_ITER_MAX
+-2.000000 1.000000 0.346185 0.258473 44.551218 31.688925 357.883903 217.655668 12.810778 326.852166 5.000000 0.000000 5 
+-1.900000 1.000000 0.345395 0.256275 40.787109 4.190954 65.926488 215.687102 4.300128 230.585721 5.000000 0.000000 5 
+-1.800000 1.000000 0.343100 0.253634 40.748628 3.912915 56.669470 215.314020 4.139156 227.806468 5.000000 0.000000 5 
+-1.700000 1.000000 0.341806 0.250634 40.550845 3.347808 56.032851 216.839001 5.959734 244.483352 5.000000 0.000000 5 
+-1.600000 1.000000 0.339245 0.248129 40.457158 3.735092 56.853508 215.747244 4.995522 242.867659 5.000000 0.000000 5 
+-1.500000 1.000000 0.337230 0.245763 41.178595 4.297429 56.265874 215.785600 4.151781 227.795995 5.000000 0.000000 5 
+-1.400000 1.000000 0.335131 0.243311 39.915221 2.739586 55.454917 216.866764 6.547848 251.528327 5.000000 0.000000 5 
+-1.300000 1.000000 0.333085 0.240664 40.119215 3.044973 55.978253 216.208443 4.459816 228.810686 5.000000 0.000000 5 
+-1.200000 1.000000 0.330664 0.238769 40.507713 2.998241 55.701876 215.868796 3.778455 226.049304 5.000000 0.000000 5 
+-1.100000 1.000000 0.329130 0.235812 41.038895 4.522472 56.760814 215.654663 4.746822 236.021980 5.000000 0.000000 5 
+-1.000000 1.000000 0.325980 0.233534 41.067622 4.626711 57.444142 215.260535 3.481966 225.512853 5.000000 0.000000 5 
+-0.900000 1.000000 0.323823 0.230863 40.683316 3.689159 56.208182 215.560917 5.180017 243.603452 5.000000 0.000000 5 
+-0.800000 1.000000 0.321004 0.228222 41.643513 4.717568 58.502452 215.630891 4.283475 238.574145 5.000000 0.000000 5 
+-0.700000 1.000000 0.317983 0.225520 41.214547 3.941824 56.054211 215.910346 4.375081 227.444626 5.000000 0.000000 5 
+-0.600000 1.000000 0.316243 0.222903 40.834442 4.370416 56.765508 215.153296 3.617927 226.280086 5.000000 0.000000 5 
+-0.500000 1.000000 0.312886 0.220473 40.178174 4.185502 64.657291 219.647151 4.454154 236.473446 5.000000 0.000000 5 
+-0.400000 1.000000 0.309757 0.217536 40.240385 3.172484 55.751563 217.761119 3.900779 228.757195 5.000000 0.000000 5 
+-0.300000 1.000000 0.305464 0.215229 40.852271 3.761739 56.158869 217.830497 4.087453 230.237764 5.000000 0.000000 5 
+-0.200000 1.000000 0.302919 0.212364 40.531166 3.688281 56.426841 217.657657 5.498697 253.516146 5.000000 0.000000 5 
+-0.100000 1.000000 0.298246 0.209310 41.058364 4.140510 59.959571 217.519279 4.087389 228.768313 5.000000 0.000000 5 
+0.000000 1.000000 0.294110 0.207107 40.436486 3.604369 55.788895 217.853044 4.012624 236.118036 5.000000 0.000000 5 
+0.100000 1.000000 0.288139 0.204033 40.603738 4.045866 57.560760 217.046816 4.583841 244.429411 5.000000 0.000000 5 
+0.200000 1.000000 0.285604 0.201954 40.494607 3.886199 59.431970 217.322824 4.080988 233.317513 5.000000 0.000000 5 
+0.300000 1.000000 0.278478 0.198929 40.311327 3.452837 56.124657 217.319394 4.434358 232.534720 5.000000 0.000000 5 
+0.400000 1.000000 0.270992 0.196299 40.649243 3.415612 56.204178 218.079445 4.990947 245.055337 5.000000 0.000000 5 
+0.500000 1.000000 0.263944 0.193661 40.464299 3.622703 56.602842 218.555364 3.936432 229.481159 5.000000 0.000000 5 
+0.600000 1.000000 0.256340 0.191194 40.200314 2.474984 53.432412 216.547260 3.695211 227.198078 5.000000 0.000000 5 
+0.700000 1.000000 0.251578 0.188606 40.111945 3.029821 54.900896 216.581752 4.247622 237.358365 5.000000 0.000000 5 
+0.800000 1.000000 0.234558 0.184742 39.533282 1.182169 42.753097 215.462335 2.960246 226.716604 5.000000 0.000000 5 
+0.900000 1.000000 0.225915 0.182691 39.851294 1.108193 42.180342 216.404194 4.450720 228.482353 5.000000 0.000000 5 
+1.000000 1.000000 0.216180 0.179994 40.721936 3.302539 56.032206 217.082196 4.599188 227.979232 5.000000 0.000000 5 
+1.100000 1.000000 0.203481 0.177332 41.006217 3.798207 56.014901 216.204345 4.292145 227.297386 5.000000 0.000000 5 
+1.200000 1.000000 0.188297 0.174121 40.739289 3.269948 56.653507 216.585873 6.250858 251.207034 5.000000 0.000000 5 
+1.300000 1.000000 0.172624 0.171622 41.215540 4.783342 55.692883 215.885639 3.629370 226.473280 5.000000 0.000000 5 
+1.400000 1.000000 0.156483 0.169110 40.289903 3.749338 56.290861 215.663761 4.176366 225.824735 5.000000 0.000000 5 
+1.500000 1.000000 0.136293 0.165692 42.208932 6.070189 69.182665 216.390504 4.816283 235.417446 5.000000 0.000000 5 
+1.600000 1.000000 0.125127 0.163325 40.890581 3.941185 56.491504 215.752348 4.426511 226.425984 5.000000 0.000000 5 
+1.700000 1.000000 0.104593 0.159971 41.263557 4.128935 57.062514 217.284932 5.311288 249.647163 5.000000 0.000000 5 
+1.800000 1.000000 0.091397 0.157460 40.273078 3.062810 55.546913 217.252505 6.331426 251.175692 5.000000 0.000000 5 
+1.900000 1.000000 0.078256 0.154628 40.407489 3.419342 56.316166 216.967648 4.712664 245.093313 5.000000 0.000000 5 
+2.000000 1.000000 0.065221 0.152571 40.660365 4.317854 57.537407 216.198346 4.991856 245.173269 5.000000 0.000000 5 
+2.100000 1.000000 0.053694 0.148885 40.355654 4.062614 60.051963 215.797667 4.447252 236.221454 5.000000 0.000000 5 
+2.200000 1.000000 0.042182 0.146229 40.613562 4.124655 56.201536 216.117304 4.060825 227.115987 5.000000 0.000000 5 
+2.300000 1.000000 0.034334 0.143612 40.465884 3.541452 55.067611 215.575953 4.891719 244.546802 5.000000 0.000000 5 
+2.400000 1.000000 0.026641 0.140869 41.074690 4.697458 61.619188 216.069185 4.700827 233.830937 5.000000 0.000000 5 
+2.500000 1.000000 0.019976 0.138112 40.766971 4.274128 58.871741 215.761570 5.633731 249.753931 5.000000 0.000000 5 
+2.600000 1.000000 0.012826 0.135122 40.559343 2.952804 54.017706 215.835161 4.039993 226.822103 5.000000 0.000000 5 
+2.700000 1.000000 0.010550 0.132915 40.985193 3.330639 55.013950 215.975836 4.240744 227.040703 5.000000 0.000000 5 
+2.800000 1.000000 0.007327 0.130133 39.778804 3.002485 56.610555 216.462786 7.082268 265.051418 5.000000 0.000000 5 
+2.900000 1.000000 0.004038 0.126763 40.327795 3.934211 55.515352 215.982666 4.626198 230.696124 5.000000 0.000000 5 
+3.000000 1.000000 0.003087 0.124336 40.337807 3.537021 55.101627 215.468662 4.177203 230.789145 5.000000 0.000000 5 
+3.100000 1.000000 0.001576 0.121689 39.812195 3.116738 55.422687 215.797778 4.091192 225.897780 5.000000 0.000000 5 
+3.200000 0.980000 0.001000 0.118928 39.853764 2.871322 56.405555 215.562722 4.187466 232.598421 5.000000 0.000000 5 
+3.300000 0.960000 0.000623 0.116065 40.440328 3.580650 56.738889 216.165848 4.735158 240.329999 5.000000 0.000000 5 
+3.400000 0.850000 0.000303 0.113505 40.974107 4.291544 56.280236 215.889562 4.448049 237.556780 5.000000 0.000000 5 
+3.500000 0.690000 0.000152 0.111010 41.508631 4.251791 56.198873 216.740295 4.889693 242.922934 5.000000 0.000000 5 
+3.600000 0.530000 0.000102 0.108493 40.065231 3.643794 57.120823 216.887338 5.242621 250.003843 5.000000 0.000000 5 
+3.700000 0.320000 0.000043 0.105612 40.462159 4.162383 56.782173 216.465615 3.846314 227.022697 5.000000 0.000000 5 
+3.800000 0.210000 0.000032 0.103084 42.192455 6.207380 64.648964 217.030913 4.482820 228.095918 5.000000 0.000000 5 
+3.900000 0.110000 0.000013 0.100391 40.640286 3.715782 55.922914 217.726055 4.553212 236.362804 5.000000 0.000000 5 
+4.000000 0.050000 0.000006 0.097518 40.437760 2.838308 54.764308 218.230040 4.309275 237.932625 5.000000 0.000000 5 
+4.100000 0.020000 0.000002 0.095436 41.347934 4.608500 64.182062 217.408836 4.385757 228.219627 5.000000 0.000000 5 
+4.200000 0.000000 0.000000 0.092396 40.782371 3.621708 55.984245 217.579878 4.102149 228.145363 5.000000 0.000000 5 
diff --git a/nfapi/oai_integration/nfapi_vnf.c b/nfapi/oai_integration/nfapi_vnf.c
index d13dc5d1c50f0340fdb935961a624f1251778acf..8cc1bda7828bb3f1dfde92f7e862157906e6c9b8 100644
--- a/nfapi/oai_integration/nfapi_vnf.c
+++ b/nfapi/oai_integration/nfapi_vnf.c
@@ -217,7 +217,7 @@ void oai_create_enb(void) {
   }
 
   // This will cause phy_config_request to be installed. That will result in RRC configuring the PHY
-  // that will result in eNB->configured being set to TRUE.
+  // that will result in eNB->configured being set to true.
   // See we need to wait for that to happen otherwise the NFAPI message exchanges won't contain the right parameter values
   if (RC.eNB[0][0]->if_inst==0 || RC.eNB[0][0]->if_inst->PHY_config_req==0 || RC.eNB[0][0]->if_inst->schedule_response==0) {
     NFAPI_TRACE(NFAPI_TRACE_INFO, "RC.eNB[0][0]->if_inst->PHY_config_req is not installed - install it\n");
@@ -267,7 +267,7 @@ void oai_create_gnb(void) {
 
 
   // This will cause phy_config_request to be installed. That will result in RRC configuring the PHY
-  // that will result in gNB->configured being set to TRUE.
+  // that will result in gNB->configured being set to true.
   // See we need to wait for that to happen otherwise the NFAPI message exchanges won't contain the right parameter values
   if (RC.gNB[0]->if_inst==0 || RC.gNB[0]->if_inst->NR_PHY_config_req==0 || RC.gNB[0]->if_inst->NR_Schedule_response==0) {
     NFAPI_TRACE(NFAPI_TRACE_INFO, "RC.gNB[0][0]->if_inst->NR_PHY_config_req is not installed - install it\n");
diff --git a/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_constants.h b/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_constants.h
index 7fb42e566aa5c1812ef62394ff5c458c753a444b..6d40752a9aa5f3299105d96f5ebbad05f6645b9c 100644
--- a/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_constants.h
+++ b/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_constants.h
@@ -10,7 +10,8 @@
 #define FAPI_NR_MAX_RA_OCCASION_PER_CSIRS          64
 // Constants Defined in 38.213
 #define FAPI_NR_MAX_CORESET_PER_BWP                3
-#define FAPI_NR_MAX_SS                             10
+#define FAPI_NR_MAX_SS_PER_BWP                     10
+#define FAPI_NR_MAX_SS                             FAPI_NR_MAX_SS_PER_BWP*NR_MAX_NUM_BWP
 
 
 /// RX_IND
@@ -19,6 +20,7 @@
 #define FAPI_NR_RX_PDU_TYPE_DLSCH 0x03 
 #define FAPI_NR_DCI_IND 0x04
 #define FAPI_NR_RX_PDU_TYPE_RAR 0x05
+#define FAPI_NR_CSIRS_IND 0x06
 
 #define FAPI_NR_SIBS_MASK_SIB1 0x1
 
diff --git a/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h b/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h
index 5f8a856028ca212a2aa612da244d3af67988e555..a28762d1ff092d9fdb52e36e070172c40643d0ec 100644
--- a/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h
+++ b/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h
@@ -36,9 +36,6 @@
 */
 
 
-
-
-
 typedef struct {
   uint8_t uci_format;
   uint8_t uci_channel;
@@ -50,7 +47,14 @@ typedef struct {
   uint32_t sr;
 } fapi_nr_uci_pdu_rel15_t;
 
-    
+typedef struct {
+  uint32_t rsrp;
+  int rsrp_dBm;
+  uint8_t rank_indicator;
+  uint8_t i1;
+  uint8_t i2;
+  uint8_t cqi;
+} fapi_nr_csirs_measurements_t;
 
 typedef struct {
   /// frequency_domain_resource;
@@ -87,7 +91,7 @@ typedef struct {
   // N_CCE is L, or number of CCEs for DCI
   int N_CCE;
   uint8_t payloadSize;
-  uint8_t payloadBits[16];
+  uint8_t payloadBits[16] __attribute__((aligned(16))); // will be cast as uint64
   //fapi_nr_dci_pdu_rel15_t dci;
 } fapi_nr_dci_indication_pdu_t;
 
@@ -130,6 +134,7 @@ typedef struct {
     fapi_nr_pdsch_pdu_t pdsch_pdu;
     fapi_nr_ssb_pdu_t ssb_pdu;
     fapi_nr_sib_pdu_t sib_pdu;
+    fapi_nr_csirs_measurements_t csirs_measurements;
   };
 } fapi_nr_rx_indication_body_t;
 
@@ -308,6 +313,7 @@ typedef struct
   uint8_t  transform_precoding;
   uint16_t data_scrambling_id;
   uint8_t  nrOfLayers;
+  uint8_t  Tpmi;
   //DMRS
   uint16_t  ul_dmrs_symb_pos;
   uint8_t  dmrs_config_type;
@@ -433,6 +439,9 @@ typedef struct {
   uint8_t mcs;
   uint8_t ndi;
   uint8_t rv;
+  uint16_t targetCodeRate;
+  uint8_t qamModOrder;
+  uint32_t TBS;
   uint8_t tb2_mcs;
   uint8_t tb2_ndi;
   uint8_t tb2_rv;
@@ -464,6 +473,7 @@ typedef struct {
   uint8_t nEpreRatioOfPDSCHToPTRS;
   /// MCS table for this DLSCH
   uint8_t mcs_table;
+  uint32_t tbslbrm;
   uint8_t nscid;
   uint16_t dlDmrsScramblingId;
   uint16_t pduBitmap;
@@ -476,20 +486,20 @@ typedef struct {
 
 
 typedef struct {
-  uint16_t bwp_size;//
-  uint16_t bwp_start;//
-  uint8_t  subcarrier_spacing;//
-  uint8_t  cyclic_prefix;//
-  uint16_t start_rb;
-  uint16_t nr_of_rbs;
-  uint8_t  csi_type;//Value: 0:TRS 1:CSI-RS NZP 2:CSI-RS ZP
-  uint8_t  row;//Row entry into the CSI Resource location table. [TS38.211, sec 7.4.1.5.3 and table 7.4.1.5.3-1] Value: 1-18
-  uint16_t freq_domain;//Value: Up to the 12 LSBs, actual size is determined by the Row parameter
-  uint8_t  symb_l0;//The time domain location l0 and firstOFDMSymbolInTimeDomain Value: 0->13
-  uint8_t  symb_l1;//
-  uint8_t  cdm_type;
-  uint8_t  freq_density;//The density field, p and comb offset (for dot5).0: dot5 (even RB), 1: dot5 (odd RB), 2: one, 3: three
-  uint16_t scramb_id;//ScramblingID of the CSI-RS [TS38.214, sec 5.2.2.3.1] Value: 0->1023
+  uint8_t subcarrier_spacing;       // subcarrierSpacing [3GPP TS 38.211, sec 4.2], Value:0->4
+  uint8_t cyclic_prefix;            // Cyclic prefix type [3GPP TS 38.211, sec 4.2], 0: Normal; 1: Extended
+  uint16_t start_rb;                // PRB where this CSI resource starts related to common resource block #0 (CRB#0). Only multiples of 4 are allowed. [3GPP TS 38.331, sec 6.3.2 parameter CSIFrequencyOccupation], Value: 0 ->274
+  uint16_t nr_of_rbs;               // Number of PRBs across which this CSI resource spans. Only multiples of 4 are allowed. [3GPP TS 38.331, sec 6.3.2 parameter CSI-FrequencyOccupation], Value: 24 -> 276
+  uint8_t csi_type;                 // CSI Type [3GPP TS 38.211, sec 7.4.1.5], Value: 0:TRS; 1:CSI-RS NZP; 2:CSI-RS ZP
+  uint8_t row;                      // Row entry into the CSI Resource location table. [3GPP TS 38.211, sec 7.4.1.5.3 and table 7.4.1.5.3-1], Value: 1-18
+  uint16_t freq_domain;             // Bitmap defining the frequencyDomainAllocation [3GPP TS 38.211, sec 7.4.1.5.3] [3GPP TS 38.331 CSIResourceMapping], Value: Up to the 12 LSBs, actual size is determined by the Row parameter
+  uint8_t symb_l0;                  // The time domain location l0 and firstOFDMSymbolInTimeDomain [3GPP TS 38.211, sec 7.4.1.5.3], Value: 0->13
+  uint8_t symb_l1;                  // The time domain location l1 and firstOFDMSymbolInTimeDomain2 [3GPP TS 38.211, sec 7.4.1.5.3], Value: 2->12
+  uint8_t cdm_type;                 // The cdm-Type field [3GPP TS 38.211, sec 7.4.1.5.3 and table 7.4.1.5.3-1], Value: 0: noCDM; 1: fd-CDM2; 2: cdm4-FD2-TD2; 3: cdm8-FD2-TD4
+  uint8_t freq_density;             // The density field, p and comb offset (for dot5). [3GPP TS 38.211, sec 7.4.1.5.3 and table 7.4.1.5.3-1], Value: 0: dot5 (even RB); 1: dot5 (odd RB); 2: one; 3: three
+  uint16_t scramb_id;               // ScramblingID of the CSI-RS [3GPP TS 38.214, sec 5.2.2.3.1], Value: 0->1023
+  uint8_t power_control_offset;     // Ratio of PDSCH EPRE to NZP CSI-RSEPRE [3GPP TS 38.214, sec 5.2.2.3.1], Value: 0->23 representing -8 to 15 dB in 1dB steps; 255: L1 is configured with ProfileSSS
+  uint8_t power_control_offset_ss;  // Ratio of NZP CSI-RS EPRE to SSB/PBCH block EPRE [3GPP TS 38.214, sec 5.2.2.3.1], Values: 0: -3dB; 1: 0dB; 2: 3dB; 3: 6dB; 255: L1 is configured with ProfileSSS
 } fapi_nr_dl_config_csirs_pdu_rel15_t;
 
 
diff --git a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h
index c3a173758cc30cceb688775293039799780b6604..3a7dd8d523da6c5783fa090052a639b8a860b3b1 100644
--- a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h
+++ b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h
@@ -738,7 +738,7 @@ typedef struct {
   // The total DCI length (in bits) including padding bits [TS38.212 sec 7.3.1] Range 0->DCI_PAYLOAD_BYTE_LEN*8
   uint16_t PayloadSizeBits;
   // DCI payload, where the actual size is defined by PayloadSizeBits. The bit order is as following bit0-bit7 are mapped to first byte of MSB - LSB
-  uint8_t Payload[DCI_PAYLOAD_BYTE_LEN];
+  uint8_t Payload[DCI_PAYLOAD_BYTE_LEN] __attribute__((aligned(32)));
 
 } nfapi_nr_dl_dci_pdu_t;
 
@@ -776,6 +776,10 @@ typedef struct {
   nfapi_nr_dl_dci_pdu_t dci_pdu[MAX_DCI_CORESET];
 }  nfapi_nr_dl_tti_pdcch_pdu_rel15_t;
 
+typedef struct {
+  uint32_t tbSizeLbrmBytes;
+}nfapi_v3_pdsch_maintenance_parameters_t;
+
 typedef struct {
   uint16_t pduBitmap;
   uint16_t rnti;
@@ -854,6 +858,7 @@ typedef struct {
   uint8_t nEpreRatioOfPDSCHToPTRS;
   // Beamforming
   nfapi_nr_tx_precoding_and_beamforming_t precodingAndBeamforming;
+  nfapi_v3_pdsch_maintenance_parameters_t maintenance_parms_v3;
 }nfapi_nr_dl_tti_pdsch_pdu_rel15_t;
 
 
@@ -920,32 +925,24 @@ typedef struct
 } nfapi_nr_dlsch_pdu_t;
 */
 
-//for csi-rs_pdu:
-
-//table 3-39
 typedef struct
 {
-  uint16_t bwp_size;//
-  uint16_t bwp_start;//
-  uint8_t  subcarrier_spacing;//
-  uint8_t  cyclic_prefix;//
-  uint16_t start_rb;
-  uint16_t nr_of_rbs;
-  uint8_t  csi_type;//Value: 0:TRS 1:CSI-RS NZP 2:CSI-RS ZP
-  uint8_t  row;//Row entry into the CSI Resource location table. [TS38.211, sec 7.4.1.5.3 and table 7.4.1.5.3-1] Value: 1-18
-  uint16_t freq_domain;//Value: Up to the 12 LSBs, actual size is determined by the Row parameter
-  uint8_t  symb_l0;//The time domain location l0 and firstOFDMSymbolInTimeDomain Value: 0->13
-  uint8_t  symb_l1;//
-  uint8_t  cdm_type;
-  uint8_t  freq_density;//The density field, p and comb offset (for dot5).0: dot5 (even RB), 1: dot5 (odd RB), 2: one, 3: three
-  uint16_t scramb_id;//ScramblingID of the CSI-RS [TS38.214, sec 5.2.2.3.1] Value: 0->1023
-  //tx power info
-  uint8_t  power_control_offset;//Ratio of PDSCH EPRE to NZP CSI-RSEPRE Value :0->23 representing -8 to 15 dB in 1dB steps
-  uint8_t  power_control_offset_ss;//Ratio of SSB/PBCH block EPRE to NZP CSI-RS EPRES 0: -3dB, 1: 0dB, 2: 3dB, 3: 6dB
-
+  uint8_t subcarrier_spacing;       // subcarrierSpacing [3GPP TS 38.211, sec 4.2], Value:0->4
+  uint8_t cyclic_prefix;            // Cyclic prefix type [3GPP TS 38.211, sec 4.2], 0: Normal; 1: Extended
+  uint16_t start_rb;                // PRB where this CSI resource starts related to common resource block #0 (CRB#0). Only multiples of 4 are allowed. [3GPP TS 38.331, sec 6.3.2 parameter CSIFrequencyOccupation], Value: 0 ->274
+  uint16_t nr_of_rbs;               // Number of PRBs across which this CSI resource spans. Only multiples of 4 are allowed. [3GPP TS 38.331, sec 6.3.2 parameter CSI-FrequencyOccupation], Value: 24 -> 276
+  uint8_t csi_type;                 // CSI Type [3GPP TS 38.211, sec 7.4.1.5], Value: 0:TRS; 1:CSI-RS NZP; 2:CSI-RS ZP
+  uint8_t row;                      // Row entry into the CSI Resource location table. [3GPP TS 38.211, sec 7.4.1.5.3 and table 7.4.1.5.3-1], Value: 1-18
+  uint16_t freq_domain;             // Bitmap defining the frequencyDomainAllocation [3GPP TS 38.211, sec 7.4.1.5.3] [3GPP TS 38.331 CSIResourceMapping], Value: Up to the 12 LSBs, actual size is determined by the Row parameter
+  uint8_t symb_l0;                  // The time domain location l0 and firstOFDMSymbolInTimeDomain [3GPP TS 38.211, sec 7.4.1.5.3], Value: 0->13
+  uint8_t symb_l1;                  // The time domain location l1 and firstOFDMSymbolInTimeDomain2 [3GPP TS 38.211, sec 7.4.1.5.3], Value: 2->12
+  uint8_t cdm_type;                 // The cdm-Type field [3GPP TS 38.211, sec 7.4.1.5.3 and table 7.4.1.5.3-1], Value: 0: noCDM; 1: fd-CDM2; 2: cdm4-FD2-TD2; 3: cdm8-FD2-TD4
+  uint8_t freq_density;             // The density field, p and comb offset (for dot5). [3GPP TS 38.211, sec 7.4.1.5.3 and table 7.4.1.5.3-1], Value: 0: dot5 (even RB); 1: dot5 (odd RB); 2: one; 3: three
+  uint16_t scramb_id;               // ScramblingID of the CSI-RS [3GPP TS 38.214, sec 5.2.2.3.1], Value: 0->1023
+  uint8_t power_control_offset;     // Ratio of PDSCH EPRE to NZP CSI-RSEPRE [3GPP TS 38.214, sec 5.2.2.3.1], Value: 0->23 representing -8 to 15 dB in 1dB steps; 255: L1 is configured with ProfileSSS
+  uint8_t power_control_offset_ss;  // Ratio of NZP CSI-RS EPRE to SSB/PBCH block EPRE [3GPP TS 38.214, sec 5.2.2.3.1], Values: 0: -3dB; 1: 0dB; 2: 3dB; 3: 6dB; 255: L1 is configured with ProfileSSS
 } nfapi_nr_dl_tti_csi_rs_pdu_rel15_t;
 
-//for ssb_pdu: 
 
 typedef struct
 {
@@ -1195,6 +1192,10 @@ typedef struct
 #define PUSCH_PDU_BITMAP_PUSCH_PTRS 0x4
 #define PUSCH_PDU_BITMAP_DFTS_OFDM  0x8
 
+typedef struct {
+  uint32_t tbSizeLbrmBytes;
+}nfapi_v3_pusch_maintenance_parameters_t;
+
 typedef struct
 {
   uint16_t pdu_bit_map;//Bitmap indicating presence of optional PDUs (see above)
@@ -1240,7 +1241,7 @@ typedef struct
   nfapi_nr_dfts_ofdm_t dfts_ofdm;
   //beamforming
   nfapi_nr_ul_beamforming_t beamforming;
-
+  nfapi_v3_pdsch_maintenance_parameters_t maintenance_parms_v3;
 } nfapi_nr_pusch_pdu_t;
 
 //for pucch_pdu:
@@ -1665,41 +1666,34 @@ typedef struct
 
 } nfapi_nr_uci_indication_t;
 
-//3.4.10 srs_indication
-//table 3-73
 
-typedef struct
-{
-  uint8_t  rb_snr;
-}nfapi_nr_srs_indication_reported_symbol_resource_block_t;
+/// 5G PHY FAPI Specification: SRS indication - Section 3.4.10, Table 3-73
 
-typedef struct
-{
-  uint16_t num_rbs;
+typedef struct {
+  uint8_t rb_snr;                 // SNR value in dB. Value: 0 -> 255 representing -64 dB to 63 dB with a step size 0.5 dB, 0xff will be set if this field is invalid.
+} nfapi_nr_srs_indication_reported_symbol_resource_block_t;
+
+typedef struct {
+  uint16_t num_rbs;               // Number of PRBs to be reported for this SRS PDU. Value: 0 -> 272.
   nfapi_nr_srs_indication_reported_symbol_resource_block_t* rb_list;
-}nfapi_nr_srs_indication_reported_symbol_t;
+} nfapi_nr_srs_indication_reported_symbol_t;
 
-#define NFAPI_NR_SRS_IND_MAX_PDU 100
-typedef struct
-{
-  uint32_t handle;
-  uint16_t rnti;
-  uint16_t timing_advance;
-  uint8_t  num_symbols;
-  uint8_t  wide_band_snr;
-  uint8_t  num_reported_symbols;
+typedef struct {
+  uint32_t handle;                // The handle passed to the PHY in the the UL_TTI.request SRS PDU.
+  uint16_t rnti;                  // The RNTI passed to the PHY in the UL_TTI.request SRS PDU. Value: 1 -> 65535.
+  uint16_t timing_advance;        // Timing advance TA measured for the UE [TS 38.213, Section 4.2]. NTA_new = NTA_old + (TA − 31) * 16 * 64 / (2^u). Value: 0 -> 63. 0xffff should be set if this field is invalid.
+  uint8_t num_symbols;            // Number of symbols for SRS. Value: 1 -> 4. If a PHY does not report for individual symbols then this parameter should be set to 1.
+  uint8_t wide_band_snr;          // SNR value in dB measured within configured SRS bandwidth on each symbol. Value: 0 -> 255 representing -64 dB to 63 dB with a step size 0.5 dB. 0xff will be set if this field is invalid.
+  uint8_t num_reported_symbols;   // Number of symbols reported in this message. This allows PHY to report individual symbols or aggregated symbols where this field will be set to 1. Value: 1 -> 4.
   nfapi_nr_srs_indication_reported_symbol_t* reported_symbol_list;
+} nfapi_nr_srs_indication_pdu_t;
 
-}nfapi_nr_srs_indication_pdu_t;
-
-typedef struct
-{
+typedef struct {
   nfapi_p7_message_header_t header;
-  uint16_t sfn;
-  uint16_t slot;
-  uint8_t number_of_pdus;
+  uint16_t sfn;                   // SFN. Value: 0 -> 1023
+  uint16_t slot;                  // Slot. Value: 0 -> 159
+  uint8_t number_of_pdus;         // Number of PDUs included in this message. Value: 0 -> 255
   nfapi_nr_srs_indication_pdu_t* pdu_list;
-
 } nfapi_nr_srs_indication_t;
 
 
diff --git a/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c b/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c
index 3adde23e7dab995bb0cd19c97f26a6087e67ef67..98f89f599c83955496c1d8503e32d739f3d4aba3 100644
--- a/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c
+++ b/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c
@@ -200,8 +200,6 @@ static uint8_t pack_tpm_value(nfapi_dl_config_dci_dl_tpm_t *value, uint8_t **ppW
 static uint8_t pack_dl_tti_csi_rs_pdu_rel15_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
   nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *value = (nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *)tlv;
   return(
-          push16(value->bwp_size, ppWritePackedMsg, end) &&
-          push16(value->bwp_start, ppWritePackedMsg, end) &&
           push8(value->subcarrier_spacing, ppWritePackedMsg, end) &&
           push8(value->cyclic_prefix, ppWritePackedMsg, end) &&
           push16(value->start_rb, ppWritePackedMsg, end) &&
@@ -3663,8 +3661,6 @@ int nfapi_p7_message_pack(void *pMessageBuf, void *pPackedBuf, uint32_t packedBu
 static uint8_t unpack_dl_tti_csi_rs_pdu_rel15_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
   nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *value = (nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *)tlv;
   return(
-          pull16(ppReadPackedMsg, &value->bwp_size, end) &&
-          pull16(ppReadPackedMsg, &value->bwp_start, end) &&
           pull8(ppReadPackedMsg, &value->subcarrier_spacing, end) &&
           pull8(ppReadPackedMsg, &value->cyclic_prefix, end) &&
           pull16(ppReadPackedMsg, &value->start_rb, end) &&
diff --git a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c
index 264b25deca4520b0d7ea910c35d9b2b2da9e8cd6..af02a1605475b1600d97ecb20c791e57494307f3 100644
--- a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c
+++ b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c
@@ -814,7 +814,7 @@ uint8_t phy_threegpplte_turbo_decoder8(int16_t *y,
   llr_t *s1,*s2,*yp1,*yp2,*yp;
   unsigned int i,j,iind;//,pi;
   unsigned char iteration_cnt=0;
-  unsigned int crc,oldcrc,crc_len;
+  unsigned int crc, crc_len;
   uint8_t temp;
 #if defined(__x86_64__) || defined(__i386__)
   __m128i *yp128;
@@ -1233,8 +1233,8 @@ uint8_t phy_threegpplte_turbo_decoder8(int16_t *y,
       }
 
       // check the CRC
-      oldcrc= *((unsigned int *)(&decoded_bytes[(n>>3)-crc_len]));
-
+      uint32_t oldcrc;
+      memcpy(&oldcrc, &decoded_bytes[(n >> 3) - crc_len], crc_len);
       switch (crc_type) {
         case CRC24_A:
           oldcrc&=0x00ffffff;
diff --git a/openair1/PHY/CODING/coding_defs.h b/openair1/PHY/CODING/coding_defs.h
index 8fe31f208ea4c76db380866faa87aa2d0277add2..1854f28fa788f6602366f959b191486a861340ec 100644
--- a/openair1/PHY/CODING/coding_defs.h
+++ b/openair1/PHY/CODING/coding_defs.h
@@ -38,7 +38,6 @@
 #define MAX_TURBO_ITERATIONS_MBSFN 8
 #define MAX_TURBO_ITERATIONS max_turbo_iterations
 
-#define MAX_LDPC_ITERATIONS 5
 #define MAX_LDPC_ITERATIONS_MBSFN 4
 
 #define LTE_NULL 2
@@ -469,28 +468,11 @@ int32_t nr_segmentation(unsigned char *input_buffer,
                      unsigned int *F,
                      uint8_t BG);
 
-/*!\fn uint32_t nr_compute_tbs
-\brief This function returns the TBS in bits as per 6.1.4.2 of TS 38.214
-*/
-uint32_t nr_compute_tbs(uint16_t Qm,
-                        uint16_t R,
-			uint16_t nb_rb,
-			uint16_t nb_symb_sch,
-			uint16_t nb_dmrs_prb,
-                        uint16_t nb_rb_oh,
-                        uint8_t tb_scaling,
-			uint8_t Nl);
-
-uint32_t nr_compute_tbslbrm(uint16_t table,
-			    uint16_t nb_rb,
-		            uint8_t Nl);
-
 void nr_interleaving_ldpc(uint32_t E, uint8_t Qm, uint8_t *e,uint8_t *f);
 
 void nr_deinterleaving_ldpc(uint32_t E, uint8_t Qm, int16_t *e,int16_t *f);
 
-int nr_rate_matching_ldpc(uint8_t Ilbrm,
-                          uint32_t Tbslbrm,
+int nr_rate_matching_ldpc(uint32_t Tbslbrm,
                           uint8_t BG,
                           uint16_t Z,
                           uint8_t *w,
@@ -501,8 +483,7 @@ int nr_rate_matching_ldpc(uint8_t Ilbrm,
                           uint8_t rvidx,
                           uint32_t E);
 
-int nr_rate_matching_ldpc_rx(uint8_t Ilbrm,
-                             uint32_t Tbslbrm,
+int nr_rate_matching_ldpc_rx(uint32_t Tbslbrm,
                              uint8_t BG,
                              uint16_t Z,
                              int16_t *w,
diff --git a/openair1/PHY/CODING/crc_byte.c b/openair1/PHY/CODING/crc_byte.c
index 9ad18cc1a6336c5a542182813ea7f7b66a1c523e..471b26fe2434cffa82713a72b76d3515434bce2c 100644
--- a/openair1/PHY/CODING/crc_byte.c
+++ b/openair1/PHY/CODING/crc_byte.c
@@ -244,11 +244,11 @@ crc16 (unsigned char * inptr, int bitlen)
 
   while (octetlen-- > 0) {
 
-    crc = (crc << 8) ^ (crc16Table[(*inptr++) ^ (crc >> 24)] << 16);
+    crc = (crc << 8) ^ (((uint32_t)crc16Table[(*inptr++) ^ (crc >> 24)]) << 16);
   }
 
   if (resbit > 0)
-    crc = (crc << resbit) ^ (crc16Table[((*inptr) >> (8 - resbit)) ^ (crc >> (32 - resbit))] << 16);
+    crc = (crc << resbit) ^ (((uint32_t)crc16Table[(*inptr) >> (8 - resbit) ^ (crc >> (32 - resbit))]) << 16);
 
   return crc;
 }
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/doc/nrLDPC/logo.png b/openair1/PHY/CODING/nrLDPC_decoder/doc/nrLDPC/logo.png
deleted file mode 100644
index 7b785ca0517c0aa7467aafebff9255b2bdf0b8ef..0000000000000000000000000000000000000000
Binary files a/openair1/PHY/CODING/nrLDPC_decoder/doc/nrLDPC/logo.png and /dev/null differ
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/doc/nrLDPC/nrLDPC.pdf b/openair1/PHY/CODING/nrLDPC_decoder/doc/nrLDPC/nrLDPC.pdf
deleted file mode 100644
index 590dab5ce26bd9181db6f61c649842e44aefd922..0000000000000000000000000000000000000000
Binary files a/openair1/PHY/CODING/nrLDPC_decoder/doc/nrLDPC/nrLDPC.pdf and /dev/null differ
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/doc/nrLDPC/nrLDPC.tex b/openair1/PHY/CODING/nrLDPC_decoder/doc/nrLDPC/nrLDPC.tex
deleted file mode 100644
index 019b51aa96feae79983d471b3f6c2e3f84ff9f40..0000000000000000000000000000000000000000
--- a/openair1/PHY/CODING/nrLDPC_decoder/doc/nrLDPC/nrLDPC.tex
+++ /dev/null
@@ -1,960 +0,0 @@
-%
-% Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
-% contributor license agreements.  See the NOTICE file distributed with
-% this work for additional information regarding copyright ownership.
-% The OpenAirInterface Software Alliance licenses this file to You under
-% the OAI Public License, Version 1.1  (the "License"); you may not use this file
-% except in compliance with the License.
-% You may obtain a copy of the License at
-%
-%      http://www.openairinterface.org/?page_id=698
-%
-% Unless required by applicable law or agreed to in writing, software
-% distributed under the License is distributed on an "AS IS" BASIS,
-% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-% See the License for the specific language governing permissions and
-% limitations under the License.
-%-------------------------------------------------------------------------------
-% For more information about the OpenAirInterface (OAI) Software Alliance:
-%      contact@openairinterface.org
-%
-
-\documentclass{article}
-
-\usepackage[a4paper, total={6in, 8in}]{geometry}
-
-\usepackage{amsmath}
-\usepackage{amsfonts}
-\usepackage{amssymb}
-\usepackage{booktabs}
-\usepackage{url}
-\usepackage{tcolorbox}
-
-\usepackage{tikz}
-\usetikzlibrary{arrows,decorations,shapes,backgrounds,patterns}
-\usepackage{pgfplots}
-\pgfplotsset{compat=newest}
-\definecolor{green}{RGB}{32,127,43}
-\usetikzlibrary{calc}
-
-\usepackage{listings}
-\lstdefinestyle{customc}{
-  belowcaptionskip=1\baselineskip,
-  breaklines=true,
-  frame=L,
-  xleftmargin=\parindent,
-  language=C,
-  showstringspaces=false,
-  basicstyle=\footnotesize\ttfamily,
-  keywordstyle=\bfseries\color{green!40!black},
-  commentstyle=\itshape\color{purple!40!black},
-  identifierstyle=\color{blue},
-  stringstyle=\color{orange},
-}
-\lstset{escapechar=@,style=customc}
-
-\title{NR LDPC Decoder}
-\author{Sebastian Wagner (TCL)}
-\date{\today}
-
-\def\0{\mathbf{0}}
-\def\b{\mathbf{b}}
-\def\Bbb{\mathbb{B}}
-\def\Bcal{\mathcal{B}}
-\def\c{\mathbf{c}}
-\def\C{\mathbf{C}}
-\def\Cbb{\mathbb{C}}
-\def\Ccal{\mathcal{C}}
-\def\eqdef{\triangleq}
-\def\g{\mathbf{g}}
-\def\G{\mathbf{G}}
-\def\Gcal{\mathcal{G}}
-\def\h{\mathbf{h}}
-\def\H{\mathbf{H}}
-\def\Hbg{\mathbf{H}_\mathrm{BG}}
-\def\Hbgo{\mathbf{H}_\mathrm{BG1}}
-\def\Hbgt{\mathbf{H}_\mathrm{BG2}}
-\def\I{\mathbf{I}}
-\def\Kb{{K_b}}
-\def\m{\mathbf{m}}
-\def\Mb{{M_b}}
-\def\Nb{{N_b}}
-\def\Nbb{\mathbb{N}}
-\def\n{\mathbf{n}}
-\def\nr{{n_{\rm r}}}
-\def\nt{{n_{\rm t}}}
-\def\s{\mathbf{s}}
-\def\SNR{\mathsf{SNR}}
-\def\y{\mathbf{y}}
-\def\z{\mathbf{z}}
-\def\Z{\mathbf{Z}}
-\def\Zc{{Z_c}}
-
-
-\def\herm{\mathsf{H}}
-\def\trans{\mathsf{T}}
-\def\EE{\mathsf{E}}
-\newcommand{\sgn}{\operatorname{sgn}}
-
-\begin{document}
-
-\maketitle
-
-\begin{tikzpicture}[remember picture,overlay]
-   \node[anchor=north west,inner sep=0pt] at (current page.north west)
-              {\includegraphics[scale=0.5]{logo.png}};
-\end{tikzpicture}
-
-
-\begin{center}Currently Supported:\end{center}
-\tcbox[center]{
-    \begin{tabular}{lll}
-      \toprule
-      \textbf{BG} & \textbf{Lifting Size Z} & \textbf{Code Rate R} \\
-      \midrule
-        1 & all & 1/3, 2/3, 8/9 \\
-        2 & all & 1/5, 1/3, 2/3 \\
-      \bottomrule
-    \end{tabular}
-}
-
-\paragraph{Version 1.0:}
-\begin{itemize}
-\item Initial version
-\end{itemize}
-
-\paragraph{Version 2.0:}
-\begin{itemize}
-\item Enhancements in message passing:
-  \begin{itemize}
-  \item LUTs replaced by smaller BG-specific parameters
-  \item Inefficient load/store replaced by circular memcpy
-  \end{itemize}
-\item Bug fixes:
-  \begin{itemize}
-  \item Fixed bug in function \texttt{llr2CnProcBuf}
-  \item Corrected input LLR dynamic range in BLER simulations
-  \end{itemize}
-\item Results:
-  \begin{itemize}
-  \item Size of LUTs reduced significantly (60MB to 200KB)
-  \item Siginifcantly enhances execution time (factor 3.5)
-  \item Improved BLER performance (all simulation results have been updated)
-  \end{itemize}
-\end{itemize}
-
-
-\newpage
-\tableofcontents
-
-\newpage
-\section{Introduction}
-\label{sec:introduction}
-
-Low Density Parity Check (LDPC) codes have been developed by Gallager in 1963 \cite{gallager1962low}. They are linear error correcting codes that are capacity-achieving for large block length and are completely described by their Parity Check Matrix (PCM) $\H^{M\times N}$. The PCM $\H$ defines $M$ constraints on the codeword $\c$ of length $N$ such that
-\begin{equation}
-  \label{eq:29}
-  \H\c = \0.
-\end{equation}
-The number of information bits $B$ that can be encoded with $\H$ is given by $B=N-M$. Hence the code rate $R$ of $\H$ reads
-\begin{equation}
-  \label{eq:37}
-  R = \frac{B}{N} = 1-\frac{M}{N}.
-\end{equation}
-
-
-\subsection{LDPC in NR}
-\label{sec:ldpc-nr}
-
-NR uses quasi-cyclic (QC) Protograph LDPC codes, i.e. a smaller graph, called Base Graph (BG), is defined and utilized to construct the larger PCM. This has the advantage that the large PCM does not have to be stored in memory and allows for a more efficient implementation while maintaining good decoding properties.
-Two BGs $\Hbg\in\Nbb^{\Mb\times \Nb}$ are defined in NR:
-\begin{enumerate}
-\item $\Hbgo\in\Nbb^{46\times 68}$
-\item $\Hbgt\in\Nbb^{42\times 52}$
-\end{enumerate}
-where $\Nbb$ is the set of integers. For instance the first 3 rows and 13 columns of BG2 are given by
-
-\setcounter{MaxMatrixCols}{30}
-\begin{equation*}
-  \label{eq:33}
-  \Hbgt =
-  \begin{bmatrix}
-    9   & 117       & 204       & 26  & \emptyset & \emptyset & 189       & \emptyset & \emptyset & 205       & 0         & 0         & \emptyset & \emptyset \\
-    127 & \emptyset & \emptyset & 166 & 253       & 125       & 226       & 156       & 224       & 252       & \emptyset & 0         & 0         & \emptyset \\
-    81  & 114       & \emptyset & 44  & 52        & \emptyset & \emptyset & \emptyset & 240       & \emptyset & 1         & \emptyset & 0         & 0
-  \end{bmatrix}.
-\end{equation*}
-
-To obtain the PCM $\H$ from the BG $\Hbg$, each element $\Hbg(i,j)$ in the BG is replaced by a lifting matrix of size $\Zc\times \Zc$ according to
-\begin{equation}
-  \label{eq:35}
-  \Hbg(i,j) =
-  \begin{cases}
-    \0 & \textrm{if}~ \Hbg(i,j)=\emptyset \\
-    \I_{P_{ij}} & \textrm{otherwise}
-  \end{cases}
-\end{equation}
-where $\I_{P_{ij}}$ is the identity matrix circularly shifted to the right by $P_{ij} = \Hbg(i,j)\mod \Zc$. Hence, the resulting PCM $\H$ will be of size $\Mb\Zc\times\Nb\Zc$.
-
-The lifting size $\Zc$ depends on the number of bits to encode. To limit the complexity, a discrete set $\mathcal{Z}$ of possible values of $\Zc$ has been defined in \cite{3gpp2017_38212} and the optimal value $\Zc$ is calculated according to
-\begin{equation}
-  \label{eq:36}
-  \Zc = \min_{\Z\in\mathcal{Z}}\left[Z\geq\frac{B}{\Nb}\right].
-\end{equation}
-
-The base rate of the two BGs is $1/3$ and $1/5$ for BG1 and BG2, respectively. That is, BG1 encodes $K=22\Zc$ bits and BG2 encodes $K=10\Zc$ bits. Note that the first 2 columns of BG 1 and 2 are always punctured, that is after encoding, the first $2\Zc$ bits are discarded and not transmitted.
-For instance, consider $B=500$ information bits to encode using BG2, \eqref{eq:36} yields $\Zc=64$ hence $K=640$. Since $K>B$, $K-B=140$ filler bits are appended to the information bits. The PCM $\Hbgt$ is of size $2688\times 3328$ and the $640$ bits $\b$ are encoded according to \eqref{eq:29} at a rate $R \approx 0.192$. To achieve the higher base rate of $0.2$, the first $128$ are punctured, i.e. instead of transmitting all $3328$ bits, only $3200$ are transmitted resulting in the desired rate $R=640/3200=0.2$.
-
-\subsection{LDPC Decoding}
-\label{sec:ldpc-decoding}
-
-The decoding of codeword $\c$ can be achieved via the classical message passing algorithm. This algorithm can be illustrated best using the Tanner graph of the PCM. The rows of the PCM are called check nodes (CN) since they represent the parity check equations. The parity check equation of each of these check nodes involves various bits in the codeword. Similarly, every column of the PCM corresponds to a bit and each bit is involved in several parity check equations. In the Tanner graph representation, the bits are called bit nodes (BN). Let's go back to the previous example of BG2 and assume $\Zc=2$, hence the first 3 rows and 13 columns of BG2 $\Hbgt$ read
-\begin{equation*}
-  \label{eq:36}
-  \Hbgt =
-  \begin{bmatrix}
-    1 & 1         & 0         & 0 & \emptyset & \emptyset & 1         & \emptyset & \emptyset & 1         & 0         & 0         & \emptyset & \emptyset \\
-    1 & \emptyset & \emptyset & 0 & 1         & 1         & 0         & 0         & 0         & 0         & \emptyset & 0         & 0         & \emptyset \\
-    1 & 0         & \emptyset & 0 & 0         & \emptyset & \emptyset & \emptyset & 0         & \emptyset & 1         & \emptyset & 0         & 0
-  \end{bmatrix}.
-\end{equation*}
-Replacing the elements according to \eqref{eq:35}, we obtain the first 6 rows and 26 columns of the PCM as
-\begin{equation*}
-  \label{eq:39}
-  \H =
-  \begin{bmatrix}
-    0 & 1 & 0 & 1 & 1 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 1 & 1 & 0 & 1 & 0 & 0 & 0 & 0 & 0\\
-    1 & 0 & 1 & 0 & 0 & 1 & 0 & 1 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 1 & 0 & 1 & 0 & 0 & 0 & 0\\
-    0 & 1 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 1 & 0 & 1 & 1 & 0 & 1 & 0 & 1 & 0 & 1 & 0 & 0 & 0 & 1 & 0 & 1 & 0 & 0 & 0\\
-    1 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 1 & 0 & 1 & 0 & 0 & 1 & 0 & 1 & 0 & 1 & 0 & 1 & 0 & 0 & 0 & 1 & 0 & 1 & 0 & 0\\
-    0 & 1 & 1 & 0 & 0 & 0 & 1 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 1 & 0 & 1 & 0\\
-    1 & 0 & 0 & 1 & 0 & 0 & 0 & 1 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 1 & 0 & 1
-  \end{bmatrix}.
-\end{equation*}
-
-The Tanner graph of the first 8 BNs is shown in Figure \ref{fig:tannergraph}.
-
-\begin{figure}[ht]
-  \label{fig:tannergraph}
-  \centering
-  \def\ww{0.3cm}
-  \def\hh{0.3cm}
-  \tikzstyle{cnode}=[fill=white,rectangle,draw=black,thick,inner sep=2pt, minimum height=\hh,minimum width=\ww, rounded corners=1pt,text width=\ww]
-  \tikzstyle{vnode}=[fill=white,circle,draw=black,thick,inner sep=2pt, minimum height=\hh,minimum width=\ww, rounded corners=1pt,text width=\ww]
-  \tikzstyle{connector}=[<->,>=latex',semithick]
-
-  \begin{tikzpicture}
-    \tikzstyle{every node}=[node distance=1.5cm,text centered]
-    % Check nodes
-    \node[cnode, label=above:$v_0$] (v0) {};
-    \node[cnode, label=above:$v_1$, right of=v0] (v1) {};
-    \node[cnode, label=above:$v_2$, right of=v1] (v2) {};
-    % Variable nodes
-    \node[vnode, label=below:$c_3$, below of=v1, node distance=1.5cm] (c3) {};
-    \node[vnode, label=below:$c_2$, left of=c3, node distance=1.5cm] (c2) {};
-    \node[vnode, label=below:$c_1$, left of=c2, node distance=1.5cm] (c1) {};
-    \node[vnode, label=below:$c_0$, left of=c1, node distance=1.5cm] (c0) {};
-    \node[vnode, label=below:$c_4$, right of=c3, node distance=1.5cm] (c4) {};
-    \node[vnode, label=below:$c_5$, right of=c4, node distance=1.5cm] (c5) {};
-    \node[vnode, label=below:$c_6$, right of=c5, node distance=1.5cm] (c6) {};
-
-    % Draw edges
-    \draw (c0) edge[connector] (v1);
-    \draw (c1) edge[connector] (v0);
-    \draw (c1) edge[connector] (v2);
-    \draw (c2) edge[connector] (v1);
-    \draw (c3) edge[connector] (v0);
-    \draw (c4) edge[connector] (v0);
-    \draw (c4) edge[connector] (v2);
-    \draw (c5) edge[connector] (v1);
-    \draw (c6) edge[connector] (v0);
-    \draw (c6) edge[connector] (v2);
-
-  \end{tikzpicture}
-
-  \caption{Tanner graph for first 7 bits nodes and 3 check nodes from \eqref{eq:39}.}
-\end{figure}
-
-The message passing algorithm is an iterative algorithm where probabilities of the bits (being either 0 or 1) are exchanged between the BNs and CNs. After sufficient iterations, the probabilities will have either converged to either 0 or 1 and the parity check equations will be satisfied, at this point, the codeword has been decoded correctly.
-
-\newpage
-\section{LDPC Decoder Implementation}
-\label{sec:ldpc-implementation}
-
-The implementation on a general purpose processor (GPP) has to take advantage of potential instruction extension of the processor architecture. We focus on the Intel x86 instruction set architecture (ISA) and its advanced vector extension (AVX). In particular, we utilize AVX2 with its 256-bit single instruction multiple data (SIMD) format. In order to utilize AVX2 to speed up the processing at the CNs and BNs, the corresponding data has to be ordered/aligned in a specific way. The processing flow of the LDPC decoder is depicted in \ref{fig:ldpc_decoder_flow}.
-
-\begin{figure}[ht]
-  \label{fig:ldpc_decoder_flow}
-  \centering
-  \def\ww{0.3cm}
-  \def\hh{0.3cm}
-  \tikzstyle{func}=[,draw=none]
-  \tikzstyle{connector}=[->,>=latex',semithick]
-
-  \begin{tikzpicture}
-    \tikzstyle{every node}=[node distance=2.5cm,text centered]
-    % Check nodes
-    % First iteration
-    \node[func]                               (llr2llrProcBuf) {\texttt{llr2llrProcBuf}};
-    \node[func, above of=llr2llrProcBuf]      (llr2CnProcBuf)  {\texttt{llr2CnProcBuf}};
-    \node[func, above right of=llr2CnProcBuf] (cnProc1)        {\texttt{cnProc}};
-    \node[func, below right of=cnProc1]       (cn2bnProcBuf1)  {\texttt{cn2bnProcBuf}};
-    \node[func, below  of=cn2bnProcBuf1]      (bnProcPc1)      {\texttt{bnProcPc}};
-
-    % Iterations
-    \node[func, right of=cnProc1, node distance=7cm] (cnProc)       {\texttt{cnProc}};
-    \node[func, below right of=cnProc]               (cn2bnProcBuf) {\texttt{cn2bnProcBuf}};
-    \node[func, below of=cn2bnProcBuf]               (bnProcPc)     {\texttt{bnProcPc}};
-    \node[func, below left of=cnProc]                (bn2cnProcBuf) {\texttt{bn2cnProcBuf}};
-    \node[func, below  of=bn2cnProcBuf]              (bnProc)       {\texttt{bnProc}};
-
-    % Post processing
-    \node[func, below of=bnProcPc]      (llrRes2llrOut) {\texttt{llrRes2llrOut}};
-    \node[func, below of=llrRes2llrOut, node distance=1cm] (llr2bit) {\texttt{llr2bit}};
-
-    % Draw edges
-    \draw (llr2llrProcBuf)  edge[connector] (llr2CnProcBuf);
-    \draw (llr2CnProcBuf)   edge[connector] (cnProc1);
-    \draw (cnProc1)         edge[connector] (cn2bnProcBuf1);
-    \draw (cn2bnProcBuf1)   edge[connector] (bnProcPc1);
-
-    \draw (bnProcPc)       edge[connector] (bnProc);
-    \draw (bnProc)         edge[connector] (bn2cnProcBuf);
-    \draw (bn2cnProcBuf)   edge[connector] node[above left] {\texttt{cnProcPc}} (cnProc);
-    \draw (cnProc)         edge[connector] (cn2bnProcBuf);
-    \draw (cn2bnProcBuf)   edge[connector] (bnProcPc);
-
-    \draw (bnProcPc1)      edge[connector] (bnProc);
-
-    \draw (bnProcPc) edge[connector] node[left] {iterations done} (llrRes2llrOut);
-    \draw (llrRes2llrOut) edge[connector] (llr2bit);
-
-    % Boxes
-    \node[inner sep=0pt,above right of=cn2bnProcBuf1, node distance = 2.5cm] (ref) {};
-
-    \draw[fill=black,opacity=.2, rounded corners] (llr2llrProcBuf.south west) rectangle ($(ref) + (-.5cm,.5cm)$);
-    \draw[fill=black,opacity=.2, rounded corners] ($(ref) + (.5cm,.5cm)$) rectangle ($(bnProcPc.south east) + (.4cm,0)$);
-
-    \node[func, above of=cnProc1, node distance=.8cm] (iter1) {\textbf{First Iteration}};
-    \node[func, above of=cnProc , node distance=.8cm] (iterX) {\textbf{Subsequent Iterations}};
-
-  \end{tikzpicture}
-
-  \caption{LDPC Decoder processing flow.}
-\end{figure}
-
-The functions involved are described in more detail in Table \ref{tab:sum_func}.
-
-\begin{table}[ht]
-  \centering
-  \begin{tabular}{ll}
-    \toprule
-    \textbf{Function} & \textbf{Description} \\
-    \midrule
-    \texttt{llr2llrProcBuf} & Copies input LLRs to LLR processing buffer \\
-    \texttt{llr2CnProcBuf}  & Copies input LLRs to CN  processing buffer \\
-    \texttt{cnProc}         & Performs CN signal processing \\
-    \texttt{cnProcPc}       & Performs parity check \\
-    \texttt{cn2bnProcBuf}   & Copies the CN results to the BN processing buffer \\
-    \texttt{bnProcPc}       & Performs BN processing for parity check and/or hard-decision \\
-    \texttt{bnProc}         & Utilizes the results of \texttt{bnProcPc} to compute LLRs for CN processing \\
-    \texttt{bn2cnProcBuf}   & Copies the BN results to the CN processing buffer \\
-    \texttt{llrRes2llrOut}  & Copies the results of \texttt{bnProcPc} to output LLRs \\
-    \texttt{llr2bit}        & Performs hard-decision on the output LLRs \\
-    \bottomrule
-  \end{tabular}
-  \caption{Summary of the LDPC decoder functions.}
-  \label{tab:sum_func}
-\end{table}
-
-The input LLRs are assumed to be 8-bit and aligned on 32 bytes. CN processing is carried out in 8-bit whereas BN processing is done in 16 bit. Subsequently, the processing tasks at the CNs and BNs are explained in more detail.
-
-\newpage
-\subsection{Check Node Processing}
-\label{sec:check-node-proc}
-
-Denote $q_{ij}$ the value from BN $j$ to CN $i$ and let $\Bcal_i$ be the set of connected BNs to the $i$th CN. Then, using the min-sum approximation, CN $i$ has to carry out the following operation for each connected BN.
-\begin{equation}
-  \label{eq:40}
-  r_{ji} = \prod_{j'\in\Bcal_i\setminus j}\sgn q_{ij'}\min_{j'\in\Bcal_i\setminus j} |q_{ij'}|
-\end{equation}
-where $r_{ji}$ is the value returned to BN $j$ from CN $i$. There are $\Mb = \{46,42\}$ CNs in BG 1 and BG 2, respectively. Each of these CNs is connected to only a small number of BNs. The number of connected BNs to CN $i$ is $|\Bcal_i|$. In BG1 and BG2, $|\Bcal_i|=\{3,4,5,6,7,8,9,10,19\}$ and $|\Bcal_i|=\{3,4,5,6,8,10\}$, respectively. The following tables show the number of CNs $M_{|\Bcal_i|}$ that are connected to the same number of BNs.
-
-\begin{table}[ht]
-  \centering
-  \begin{tabular}{llllllllll}
-    \toprule
-    $|\Bcal_i|$   & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10 & 19 \\
-    \midrule
-    $M_{|\Bcal_i|}^\mathrm{BG1}$ & 1 & 5  &18 & 8 & 5 & 2 & 2 & 1 & 4 \\
-    $M_{|\Bcal_i|}^\mathrm{BG2}$ & 6 & 20 & 9 & 3 & 0 & 2 & 0 & 2 & 0 \\
-    \bottomrule
-  \end{tabular}
-  \caption{Ceck node groups for BG1 and BG2.}
-  \label{tab:checkNodeGroups}
-\end{table}
-
-It can be observed that each CN is at least connected to 3 BNs and there are 9 groups and 5 groups in BG1 and BG2, respectively. Denote the set of CN groups as $\Gcal$ and $M_k$ the number of CNs in group $k\in\Gcal$, e.g. for BG2 $M_4=20\Zc$. Each CN group will be processed separately. The CN processing buffer $p_C^k$ of group $k$ is defined as
-\begin{equation}
-  \label{eq:44}
-  p_C^k = \{\underbrace{q_{11}q_{21}\dots q_{M_k 1}}_{\text 1. BN},\underbrace{q_{12}q_{22}\dots q_{M_k 2}}_{\text 2. BN},\dots,\underbrace{q_{12}q_{22}\dots q_{M_k k}}_{\text last BN}\}
-\end{equation}
-Hence, $|p_C^k| = kM_k$, e.g, $\Zc=128$, $|p_C^4| = 4\cdot 20\cdot 128 = 10240$.
-
-\begin{lstlisting}[frame=single,caption={Example of CN processing for group 3 from \texttt{cnProc}.},label=code_cnproc]  % Start your code-block
-
-  const uint8_t lut_idxCnProcG3[3][2] = {{72,144}, {0,144}, {0,72}};
-
-  // =====================================================================
-  // Process group with 3 BNs
-
-  // Number of groups of 32 CNs for parallel processing
-  M = (lut_numCnInCnGroups[0]*Z)>>5;
-  // Set the offset to each bit within a group in terms of 32 Byte
-  bitOffsetInGroup = (lut_numCnInCnGroups_BG2_R15[0]*NR_LDPC_ZMAX)>>5;
-
-  // Set pointers to start of group 3
-  p_cnProcBuf    = (__m256i*) &cnProcBuf   [lut_startAddrCnGroups[0]];
-  p_cnProcBufRes = (__m256i*) &cnProcBufRes[lut_startAddrCnGroups[0]];
-
-  // Loop over every BN
-  for (j=0; j<3; j++)
-  {
-    // Set of results pointer to correct BN address
-    p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup);
-
-    // Loop over CNs
-    for (i=0; i<M; i++)
-    {
-      // Abs and sign of 32 CNs (first BN)
-      ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
-      sgn  = _mm256_sign_epi8(*p_ones, ymm0);
-      min  = _mm256_abs_epi8(ymm0);
-
-      // 32 CNs of second BN
-      ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][1] + i];
-      min  = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
-      sgn  = _mm256_sign_epi8(sgn, ymm0);
-
-      // Store result
-      min = _mm256_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
-      *p_cnProcBufResBit = _mm256_sign_epi8(min, sgn);
-      p_cnProcBufResBit++;
-    }
-  }
-
-}
-\end{lstlisting}
-
-Once all results of the check node processing $r_{ji}$ have been calculated, they are copied to the bit node processing buffer.
-
-\subsection{Bit Node Processing}
-\label{sec:bit-node-processing}
-
-Denote $r_{ji}$ the value from CN $i$ to BN $j$ and let $\Ccal_j$ be the set of connected CNs to the $j$th BN. Each BN $j$ has to carry out the following operation for every connected CN $i\in\Ccal_j$.
-\begin{equation}
-  \label{eq:46}
-  q_{ij} = \Lambda_j + \sum_{i'\in\Ccal_j\setminus i}r_{ji'}
-\end{equation}
-
-There are $\Nb = \{68,52\}$ BNs in BG 1 and BG 2, respectively. Each of these BNs is connected to only a small number of CNs. The number of connected CNs to BN $j$ is $|\Ccal_j|$. In BG1 and BG2, $|\Ccal_j|=\{1,4,7,8,9,10,11,12,28,30\}$ and $|\Ccal_j|=\{1,5,6,7,8,9,10,12,13,14,16,22,23\}$, respectively. The following tables show the number of BNs $K_{|\Ccal_j|}$ that are connected to the same number of CNs.
-
-\begin{table}[ht]
-  \centering
-  \begin{tabular}{lllllllllllllllllll}
-    \toprule
-    $|\Ccal_j|$ & 1&4&5&6&7&8&9&10&11&12&13 & 14 & 15 & 16 & 22 & 23 &28&30 \\
-    \midrule
-    $K_{|\Ccal_j|}^\mathrm{BG1}$ & 42 & 1 & 1 & 2 & 4 & 3 & 1 & 4 & 3 & 4 & 1 & 0 & 0 & 0 & 0 & 0 & 1 & 1 \\
-    $K_{|\Ccal_j|}^\mathrm{BG2}$ & 38 & 0 & 2 & 1 & 1 & 1 & 2 & 1 & 0 & 1 & 1 & 1 & 0 & 1 & 1 & 1 & 0 & 0\\
-    \bottomrule
-  \end{tabular}
-  \caption{Bit node groups for BG1 and BG2 for base rates 1/3 and 1/5, respectively.}
-  \label{tab:bitNodeGroups}
-\end{table}
-
-The BNs that are connected to a single CN do not need to be considered in the BN processing since \eqref{eq:46} yields $q_{ij} = \Lambda_j$. It can be observed that the grouping is less compact, i.e. there are many groups with only a small number of elements.
-
-Denote the set of BN groups as $\Bcal$ and $K_k$ the number of BNs in group $k\in\Bcal$, e.g. for BG2 $K_5=2\Zc$. Each BN group will be processed separately. The BN processing buffer $p_B^k$ of group $k$ is defined as
-\begin{equation}
-  \label{eq:47}
-  p_B^k = \{\underbrace{r_{11}r_{21}\dots r_{K_k 1}}_{\text 1. CN},\underbrace{r_{12}r_{22}\dots r_{K_k 2}}_{\text 2. CN},\dots,\underbrace{r_{12}r_{22}\dots r_{K_k k}}_{\text last CN}\}
-\end{equation}
-Hence, $|p_B^k| = kK_k$, e.g, $\Zc=128$, $|p_B^5| = 5\cdot 2\cdot 128 = 1024$.
-
-Depending on the code rate, some parity bits are not being transmitted. For instance, for BG2 with code rate $R = 1/3$ the last $20\Zc$ bits are discarded. Therefore, the last 20 columns or the last $20\Zc$ parity check equation are not required for decoding. This means that the BN groups shown in table \ref{tab:bitNodeGroups} are depending on the rate.
-
-\begin{lstlisting}[frame=single,caption={Example of BN processing for group 3 from \texttt{bnProcPc}.},label=code_bnproc]  % Start your code-block
-
-  // If elements in group move to next address
-  idxBnGroup++;
-
-  // Number of groups of 32 BNs for parallel processing
-  M = (lut_numBnInBnGroups[2]*Z)>>5;
-
-  // Set the offset to each CN within a group in terms of 16 Byte
-  cnOffsetInGroup = (lut_numBnInBnGroups[2]*NR_LDPC_ZMAX)>>4;
-
-  // Set pointers to start of group 3
-  p_bnProcBuf  = (__m128i*) &bnProcBuf  [lut_startAddrBnGroups   [idxBnGroup]];
-  p_llrProcBuf = (__m128i*) &llrProcBuf [lut_startAddrBnGroupsLlr[idxBnGroup]];
-  p_llrRes     = (__m256i*) &llrRes     [lut_startAddrBnGroupsLlr[idxBnGroup]];
-
-  // Loop over BNs
-  for (i=0,j=0; i<M; i++,j+=2)
-  {
-    // First 16 LLRs of first CN
-    ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf[j]);
-    ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf[j+1]);
-
-    // Loop over CNs
-    for (k=1; k<3; k++)
-    {
-      ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[k*cnOffsetInGroup + j]);
-      ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);
-
-      ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[k*cnOffsetInGroup + j+1]);
-      ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
-    }
-
-    // Add LLR from receiver input
-    ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);
-    ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);
-
-    ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j+1]);
-    ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
-
-    // Pack results back to epi8
-    ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);
-    // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
-    // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
-    *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);
-
-    // Next result
-    p_llrRes++;
-  }
-}
-
-\end{lstlisting}
-
-The sum of the LLRs is carried out in 16 bit for accuracy and is then saturated to 8 bit for CN processing. Saturation after each addition results in significant loss of sensitivity for low code rates.
-
-\subsection{Mapping to the Processing Buffers}
-\label{sec:mapp-cn-proc}
-
-For efficient processing with the AVX instructions, the data is required to be aligned in a certain manner. That is the reason why processing buffers have been introduced. The drawback is that the results of the processing need to copied every time to the processing buffer of the next task. However, the speed up in computation with AVX more than makes up for the time wasted in copying data. The copying is implemented as a circular memcpy because every edge in the BG is a circular shift of a $Z\times Z$ identity matrix. Hence, a circular mempcy consists of two regular memcpys each copying a part of the $Z$ values depending on the circular shift in the BG definition. The circular shifts are stored in \texttt{nrLDPC\_lut.h} in arrays \texttt{circShift\_BGX\_ZX\_CNGX}. In the specification there are only 8 sets of cirular shifts defined. However, the applied circular shift depends on $Z$, i.e. modulo $Z$. To avoid inefficient modulo operations in loops, we store the the circular shift values for every $Z$. Moreover, for convinience the arrays are already arranged depending on the CN group (CNG).
-
-\newpage
-\section{Performance Results}
-\label{sec:performance-results}
-
-In this section, the performance in terms of BLER and decoding latency of the current LDPC decoder implementation is verified.
-
-\subsection{BLER Performance}
-\label{sec:bler-performance}
-
-In all simulations, we assume AWGN, QPSK modulation and 8-bit input LLRs, i.e. $-127$ until $+127$. The DLSCH coding procedure in 38.212 is used to encode/decode the TB and an error is declared if the TB CRC check failed. Results are averaged over at least $10\,000$ channel realizations. 
-
-The first set of simulations in Figure \ref{fig:bler-bg2-15} compares the current LDPC decoder implementation to the reference implementation developed by Kien. This reference implementation is called \textit{LDPC Ref} and uses the min-sum algorithm with 2 layers and 16 bit for processing. Our current optimized decoder implementation is referred to as \textit{LDPC OAI}. Moreover, reference results provided by Huawei are also shown.
-
-\begin{figure}[ht]
-  \centering
-  \begin{tikzpicture}
-  \tikzstyle{every pin}=[fill=white,draw=black]
-    \pgfplotsset{every axis legend/.append style={
-        cells={anchor=west}, at={(1.05,1)}, anchor=north west}}
- %   \pgfplotsset{every axis plot/.append style={smooth}}
-    \pgfplotsset{every axis/.append style={line width=0.5pt}}
-    \pgfplotsset{every axis/.append style={mark options=solid, mark size=2.5pt}}
-
-    \begin{semilogyaxis}[title={}, xlabel={$\SNR$ [dB]}, ylabel={BLER},
-      grid={both}, xmin=-4, xmax=2, xtick={-4,-3.5,...,2}, ymin=0,
-      ymax=1,ytickten={-5,-4,-3,-2,-1,0},legend columns=1]
-
-      % HUAWEI merged BG2 2017-06-15
-      \addplot[black, solid] plot coordinates { (-3.91839,0.01) (-3.5567,0.0001) };
-
-      % 5 iterations
-      % LDPC Ref
-      \addplot[red, solid, mark=o] plot coordinates {(-1.250000,0.781300) (-1.000000,0.421000) (-0.750000,0.140400) (-0.500000,0.028900) (-0.250000,0.003300) (0.000000,0.000300) (0.250000,0.000000) (0.500000,0.000000)};
-      % LDPC OAI
-      \addplot[blue, solid, mark=square] plot coordinates {(-1.000000,0.693730) (-0.750000,0.370190) (-0.500000,0.137260) (-0.250000,0.038850) (0.000000,0.009740) (0.250000,0.002510) (0.500000,0.000730) (0.750000,0.000180) };
-      % Matlab layered min-sum with scaling factor 1
-      \addplot[green, solid, mark=triangle] plot coordinates {(-1.750000,0.709000) (-1.500000,0.360600) (-1.250000,0.105500) (-1.000000,0.015700) (-0.750000,0.001300) (-0.500000,0.000100) (-0.250000,0.000000) (0.000000,0.000000) };
-      % Matlab layered min-sum with scaling factor 0.8
-      %\addplot[green, solid, mark=triangle] plot coordinates {(-2.750000,0.982300) (-2.500000,0.882200) (-2.250000,0.573100) (-2.000000,0.214100) (-1.750000,0.041300) (-1.500000,0.003800) (-1.250000,0.000000) (-1.000000,0.000000) };
-
-      % 10 iterations
-      % Kien's 2-layer 16bit code
-      \addplot[red, solid, mark=o] plot coordinates { (-2.750000,0.915500) (-2.500000,0.576000) (-2.250000,0.165000) (-2.000000,0.017100) (-1.750000,0.000600) (-1.500000,0.000000) (-1.250000,0.000000) (-1.000000,0.000000)};
-      % LDPC OAI
-      \addplot[blue, solid, mark=square] plot coordinates { (-2.750000,0.997200) (-2.500000,0.955000) (-2.250000,0.710900) (-2.000000,0.270400) (-1.750000,0.042400) (-1.500000,0.002200) (-1.250000,0.000000) (-1.000000,0.000000)};
-      % Matlab layered min-sum with scaling factor 1
-      \addplot[green, solid, mark=triangle] plot coordinates {(-2.750000,0.942900) (-2.500000,0.723200) (-2.250000,0.362300) (-2.000000,0.098400) (-1.750000,0.014500) (-1.500000,0.001100) (-1.250000,0.000000) (-1.000000,0.000000) };
-      % Matlab layered min-sum with scaling factor 0.8
-      %\addplot[green, solid, mark=triangle] plot coordinates {(-3.750000,0.994300) (-3.500000,0.927200) (-3.250000,0.651100) (-3.000000,0.252000) (-2.750000,0.042500) (-2.500000,0.002700) (-2.250000,0.000000) (-2.000000,0.000000) (-1.750000,0.000000) (-1.500000,0.000000) };
-
-
-      % 20 iterations
-      % Kien's 2-layer 16bit code
-      \addplot[red, solid, mark=o] plot coordinates { (-2.750000,0.330300) (-2.500000,0.067800) (-2.250000,0.006000) (-2.000000,0.000100) (-1.750000,0.000000) (-1.500000,0.000000) (-1.250000,0.000000) (-1.000000,0.000000)};
-      % LDPC OAI
-      \addplot[blue, solid, mark=square] plot coordinates  {(-2.750000,0.337900) (-2.500000,0.058300) (-2.250000,0.004000) (-2.000000,0.000200) (-1.750000,0.000000) (-1.500000,0.000000) };
-      % Matlab layered min-sum with scaling factor 1
-      %\addplot[green, solid, mark=triangle] plot coordinates {(-2.750000,0.843200) (-2.500000,0.524600) (-2.250000,0.198100) (-2.000000,0.037300) (-1.750000,0.003200) (-1.500000,0.000000) };
-      % Matlab layered min-sum with scaling factor 0.8
-      %\addplot[green, solid, mark=triangle] plot coordinates {(-3.750000,0.872300) (-3.500000,0.544600) (-3.250000,0.186400) (-3.000000,0.027500) (-2.750000,0.001900) (-2.500000,0.000000) };
-
-
-      
-      % Parity check 50 iterations
-      %\addplot[blue, solid, mark=square] plot coordinates {(-2.750000,0.214600) (-2.500000,0.029200) (-2.250000,0.001500) (-2.000000,0.000100) (-1.750000,0.000000) (-1.500000,0.000000) };
-
-
-      \draw (axis cs:-3.3,0.1)  node[fill=white,draw=black] (pint0) {20 iter};
-      \draw (axis cs:-2.3,0.01) node[draw,black,thick,ellipse,minimum height=0.3cm] (ell0) {}; \draw[black,thick] (pint0) -- (ell0);
-      
-      \draw (axis cs:-1.2,0.0001)   node[fill=white,draw=black] (pint1) {10 iter};
-      \draw (axis cs:-1.6,0.002) node[draw,black,thick,ellipse,minimum width=0.8cm] (ell1) {}; \draw[black,thick] (pint1) -- (ell1);
-      
-      \draw (axis cs:1.3,0.2)  node[fill=white,draw=black] (pint2) {5 iter};
-      \draw (axis cs:-0.4,0.01) node[draw,black,thick,ellipse,minimum width=2cm] (ell2) {}; \draw[black,thick] (pint2) -- (ell2);
-      
-
-      \legend{ {Huawei 2017-06-15}\\
-               {LDPC Ref}\\
-               {LDPC OAI}\\
-               {MATLAB NMS SF=1}\\};
-
-    \end{semilogyaxis}
-  \end{tikzpicture}
-  \caption{BLER vs. SNR, BG2, Rate=1/5, \{5,10,20\} Iterations, B=1280.}
-  \label{fig:bler-bg2-15}
-\end{figure}
-
-From Figure \ref{fig:bler-bg2-15} it can be observed that the reference decoder outperforms the current implementation significantly for low to medium number of iterations. The reason is the implementation of 2 layers in the reference decoder, which results in faster convergence for punctured codes and hence requires less iterations to achieve a given BLER target. Note that there is a large performance loss of about 4 dB at BLER $10^{-2}$ between the Huawei reference and the current optimized decoder implementation with 5 iterations.
-
-Moreover, there is a gap of about 1.5 dB between the results provided by Huawei and the current decoder with 20 iterations. The reason is the min-sum approximation algorithm used in both the reference decoder and the current implementation. The gap can be closed by using a tighter approximation like the min-sum with normalization or the lambda-min approach. Moreover, the gap closes for higher code rates which can be observed from Figure \ref{fig:bler-bg2-r23}. The gap is only about 0.6 dB for 50 iterations.
-
-The Matlab results denoted \texttt{MATLAB NMS} are obtained with the function \texttt{nrLDPCDecode} provided by the MATLAB 5G Toolbox R2019b. The following options are provided to the function: \texttt{'Termination','max','Algorithm','Normalized min-sum','ScalingFactor',1}. Furthermore, the 8-bit input LLRs are adapted to fit the dynamic range of \texttt{nrLDPCDecode} which is shown in Listing \ref{ldpc_matlab}. 
-
-\begin{lstlisting}[frame=single,caption={Input adaptation for MATLAB LDPC Decoder},label=ldpc_matlab]
-maxLLR = max(abs(softbits));
-rxLLRs = round((softbits/maxLLR)*127);
-// adjust range to fit tanh use in decoder code 
-softbits = rxLLRs/3.4;
-\end{lstlisting}
-
-A scaling factor (SF) of 1 has been chosen to compare the results more easily with the \textit{LDPC OAI} since the resulting check node processing is the same. However, the Matlab normelized min-sum algorithm uses layered processing and floating point operations. Thus, for the same number of iterations, the performance is significantly better than \textit{LDPC OAI}, especially for small a number of iterations.
-
-\begin{figure}[ht]
-  \centering
-  \begin{tikzpicture}
-  \tikzstyle{every pin}=[fill=white,draw=black]
-    \pgfplotsset{every axis legend/.append style={
-        cells={anchor=west}, at={(1.05,1)}, anchor=north west}}
- %   \pgfplotsset{every axis plot/.append style={smooth}}
-    \pgfplotsset{every axis/.append style={line width=0.5pt}}
-    \pgfplotsset{every axis/.append style={mark options=solid, mark size=2.5pt}}
-
-    \begin{semilogyaxis}[title={}, xlabel={$\SNR$ [dB]}, ylabel={BLER},
-      grid={both}, xmin=3, xmax=6.5, xtick={3,3.5,...,6.5}, ymin=0,
-      ymax=1,ytickten={-5,-4,-3,-2,-1,0},legend columns=1]
-
-      % Kien's 2-layer 16bit code
-      %\addplot[red, solid] plot coordinates { (-2.750000,0.915500) (-2.500000,0.576000) (-2.250000,0.165000) (-2.000000,0.017100) (-1.750000,0.000600) (-1.500000,0.000000) (-1.250000,0.000000) (-1.000000,0.000000)};
-
-      % Huawei
-      \addplot[black, solid] plot coordinates { (3.28392,0.01) (3.73319,0.0001) };
-
-      % LDPC opt with 16bit BN processing
-      %\addplot[blue, solid, mark=square] plot coordinates {(4.000000,0.487500) (4.250000,0.163400) (4.500000,0.029800) (4.750000,0.002700) (5.000000,0.000100)};
-      \addplot[blue, solid, mark=square] plot coordinates {(5.000000,0.439600) (5.250000,0.185800) (5.500000,0.062100) (5.750000,0.015000) (6.000000,0.003900)};
-
-
-      %\addplot[blue, dashed, mark=triangle] plot coordinates {(4.000000,0.487500) (4.250000,0.163700) (4.500000,0.030000) (4.750000,0.002900) (5.000000,0.000100)};
-
-      %\addplot[blue, dashed, mark=square] plot coordinates {(3.000000,0.911600) (3.250000,0.614100) (3.500000,0.230100) (3.750000,0.036900) (4.000000,0.001100) (4.250000,0.000000) (4.500000,0.000000)};
-      \addplot[blue, dashed, mark=square] plot coordinates {(3.000000,0.900400) (3.250000,0.600000) (3.500000,0.216400) (3.750000,0.036000) (4.000000,0.002600) (4.250000,0.000000) };      
-
-
-      \legend{ {Huawei 2017-06-15}\\
-               {LDPC OAI 5 iter}\\
-               {LDPC OAI 50 iter}\\};
-
-    \end{semilogyaxis}
-  \end{tikzpicture}
-  \caption{BLER vs. SNR, BG2, Rate=2/3, \{5,50\} Iterations, B=1280.}
-  \label{fig:bler-bg2-r23}
-\end{figure}
-
-In Figure \ref{fig:bler-bg2-15-2} we compare the performance of different algorithms using at most 50 iterations with early stopping if the parity check passes. The Matlab layered believe propagation (LBP) is used with unquantized input LLRs and performs the best since no approximation is done in the processing. Both NMS and offset min-sum (OMS) use a scaling factor and offset, respectively, that has been empirically found to perform best in this simulation setting. Theirs performance is very close to the BLP and OMS is slightly better than NMS. The performance of \textit{LDPC OAI} is more than 1 dB worse mainly because of the looser approximation. Moreover, the NMS algorithm with SF=1 performs worst probably because the SF is not optimized for the input LLRs. From the results in Figure \ref{fig:bler-bg2-15-2} we can conclude that the performance of the \textit{LDPC OAI} can be significantly improved by adopting an offset min-sum approximation improving the performance to within 0.3dB of the Huawei reference curve.
-
-\begin{figure}[ht]
-  \centering
-  \begin{tikzpicture}
-  \tikzstyle{every pin}=[fill=white,draw=black]
-    \pgfplotsset{every axis legend/.append style={
-        cells={anchor=west}, at={(1.05,1)}, anchor=north west}}
- %   \pgfplotsset{every axis plot/.append style={smooth}}
-    \pgfplotsset{every axis/.append style={line width=0.5pt}}
-    \pgfplotsset{every axis/.append style={mark options=solid, mark size=2.5pt}}
-
-    \begin{semilogyaxis}[title={}, xlabel={$\SNR$ [dB]}, ylabel={BLER},
-      grid={both}, xmin=-4, xmax=-1, xtick={-4,-3.5,...,-1}, ymin=0,
-      ymax=1,ytickten={-5,-4,-3,-2,-1,0},legend columns=1]
-
-      % HUAWEI merged BG2 2017-06-15
-      \addplot[black, solid] plot coordinates { (-3.91839,0.01) (-3.5567,0.0001) };
-
-      % Parity check 50 iterations
-      \addplot[blue, solid, mark=square] plot coordinates {(-2.750000,0.214600) (-2.500000,0.029200) (-2.250000,0.001500) (-2.000000,0.000100) (-1.750000,0.000000) (-1.500000,0.000000) };
-
-      % Matlab layered believe propagation
-      \addplot[red, solid, mark=diamond] plot coordinates {(-4.500000,0.854200) (-4.250000,0.495800) (-4.000000,0.147700) (-3.750000,0.016100) (-3.500000,0.000800) (-3.250000,0.000200) (-3.000000,0.000000) };
-      
-      % Matlab layered min-sum with scaling factor 1
-      \addplot[green, dashed, mark=triangle] plot coordinates {(-2.750000,0.830100) (-2.500000,0.497700) (-2.250000,0.165800) (-2.000000,0.024000) (-1.750000,0.001900) (-1.500000,0.000000) };
-      % Matlab layered min-sum with scaling factor 0.8
-      %\addplot[green, solid, mark=triangle] plot coordinates {(-3.750000,0.734800) (-3.500000,0.353800) (-3.250000,0.084300) (-3.000000,0.008000) (-2.750000,0.000400) };
-      \addplot[green, solid, mark=triangle] plot coordinates {(-4.500000,0.964400) (-4.250000,0.748200) (-4.000000,0.333600) (-3.750000,0.057700) (-3.500000,0.004400) (-3.250000,0.000400) };
-
-      % Matlab layered offset min-sum with offset 0.025
-      \addplot[brown, solid, mark=asterisk] plot coordinates {(-4.250000,0.688800) (-4.000000,0.253800) (-3.750000,0.035600) (-3.500000,0.002000) (-3.250000,0.000000) (-3.000000,0.000000) };
-
-      
-
-      \legend{ {Huawei 2017-06-15}\\
-               {LDPC OAI}\\
-               {MATLAB LBP}\\
-               {MATLAB NMS SF=1}\\
-               {MATLAB NMS SF=0.65}\\
-               {MATLAB OMS OS=0.025}\\};
-
-    \end{semilogyaxis}
-  \end{tikzpicture}
-  \caption{BLER vs. SNR, BG2, Rate=1/5, max iterations = 50, B=1280.}
-  \label{fig:bler-bg2-15-2}
-\end{figure}
-
-
-Figure \ref{fig:bler-bg1-r89} shows the performance of BG1 with largest block size of $B=8448$ and highest code rate $R=8/9$. From Figure \ref{fig:bler-bg1-r89} it can be observed that the performance gap is only about 0.3 dB if 50 iterations are used. However, for 5 iterations there is still a significant performance loss of about 2.3 dB at BLER $10^{-2}$.
-
-\begin{figure}[ht]
-  \centering
-  \begin{tikzpicture}
-  \tikzstyle{every pin}=[fill=white,draw=black]
-    \pgfplotsset{every axis legend/.append style={
-        cells={anchor=west}, at={(1.05,1)}, anchor=north west}}
- %   \pgfplotsset{every axis plot/.append style={smooth}}
-    \pgfplotsset{every axis/.append style={line width=0.5pt}}
-    \pgfplotsset{every axis/.append style={mark options=solid, mark size=2.5pt}}
-
-    \begin{semilogyaxis}[title={}, xlabel={$\SNR$ [dB]}, ylabel={BLER},
-      grid={both}, xmin=6, xmax=9, xtick={6,6.5,...,9}, ymin=0,
-      ymax=1,ytickten={-5,-4,-3,-2,-1,0},legend columns=1]
-
-      % Huawei
-      \addplot[black, solid] plot coordinates { (6.118717,0.01) (6.291449,0.0001) };
-
-      % LDPC opt 5 iter
-      %\addplot[blue, solid, mark=square] plot coordinates {(8.500000,0.350000) (8.750000,0.155100) (9.000000,0.062400) (9.250000,0.023000) (9.500000,0.008700) (9.750000,0.003500) (10.000000,0.000900) (10.250000,0.000300) };
-      \addplot[blue, solid, mark=square] plot coordinates {(7.500000,0.858900) (7.750000,0.449500) (8.000000,0.129700) (8.250000,0.025500) (8.500000,0.002300) (8.750000,0.000300) (9.000000,0.000000) };
-
-      % LDPC opt 50 iter
-      %\addplot[blue, dashed, mark=square] plot coordinates {(6.000000,0.705333) (6.100000,0.353367) (6.200000,0.102100) (6.300000,0.015133) (6.400000,0.000967) (6.500000,0.000000)};
-      \addplot[blue, dashed, mark=square] plot coordinates {(6.000000,0.970000) (6.100000,0.830800) (6.200000,0.527300) (6.300000,0.216900) (6.400000,0.045500) (6.500000,0.005600) (6.600000,0.000300) (6.700000,0.000000) (6.800000,0.000000) };
-
-      \legend{ {Huawei}\\
-               {LDPC OAI 5 iter}\\
-               {LDPC OAI 50 iter}\\};
-
-    \end{semilogyaxis}
-  \end{tikzpicture}
-  \caption{BLER vs. SNR, BG1, Rate=8/9 \{5,50\} Iterations, B=8448.}
-  \label{fig:bler-bg1-r89}
-\end{figure}
-
-\newpage
-\subsection{Decoding Latency}
-\label{sec:decoding-time}
-
-This section provides results in terms of decoding latency. That is, the time it takes the decoder to to finish decoding for a given number of iterations. To measure the run time of the decoder we use the OAI tool \texttt{time\_meas.h}. The clock frequency is about 2.9 GHZ, decoder is run on a single core and the results are averaged over $10\,000$ blocks.
-
-The results in Table \ref{tab:lat-bg2-r15} show the impact of the number of iterations on the decoding latency. It can be observed that the latency roughly doubles if the number of iterations are doubled.
-
-\begin{table}[ht]
-  \centering
-  \begin{tabular}{lrrr}
-    \toprule
-    \textbf{Function} & \textbf{Time [$\mu s$] (5 it)} & \textbf{Time [$\mu s$] (10 it)} & \textbf{Time [$\mu s$] (20 it)}\\
-    \midrule
-    % \texttt{llr2llrProcBuf} & 1.1   & 1.1   & 1.1   \\
-    % \texttt{llr2CnProcBuf}  & 12.4  & 12.0  & 12.0  \\
-    % \texttt{cnProc}         & 11.7  & 22.1  & 43.5  \\
-    % \texttt{bnProcPc}       & 6.6   & 12.1  & 23.8  \\
-    % \texttt{bnProc}         & 4.2   & 8.1   & 16.2  \\
-    % \texttt{cn2bnProcBuf}   & 61.3  & 118.3 & 234.9 \\
-    % \texttt{bn2cnProcBuf}   & 38.1  & 82.5  & 172.3 \\
-    % \texttt{llrRes2llrOut}  & 3.5   & 3.4   & 3.4   \\
-    % \texttt{llr2bit}        & 0.2   & 0.1   & 0.1   \\
-    \texttt{llr2llrProcBuf} & 0.5  & 0.5  & 0.5  \\
-    \texttt{llr2CnProcBuf}  & 5.0  & 4.8  & 4.9  \\
-    \texttt{cnProc}         & 12.4 & 23.0 & 42.7 \\
-    \texttt{bnProcPc}       & 8.4  & 14.8 & 27.0 \\
-    \texttt{bnProc}         & 5.5  & 10.1 & 19.0 \\
-    \texttt{cn2bnProcBuf}   & 14.9 & 24.4 & 44.0 \\
-    \texttt{bn2cnProcBuf}   & 10.5 & 17.8 & 31.8 \\
-    \texttt{llrRes2llrOut}  & 0.3  & 0.3  & 0.3  \\
-    \texttt{llr2bit}        & 0.2  & 0.2  & 0.2  \\
-    \midrule
-    % \textbf{Total}          & \textbf{139.4} & \textbf{260.3} & \textbf{508.4} \\
-    \textbf{Total}          & \textbf{58.5} & \textbf{97.1} & \textbf{172.6} \\
-    \bottomrule
-  \end{tabular}
-  \caption{BG2, Z=128, R=1/5, B=1280, LDPC OAI}
-  \label{tab:lat-bg2-r15}
-\end{table}
-
-Table \ref{tab:lat-bg2-i5} shows the impact of the code rate on the latency for a given block size and 5 iterations. It can be observed that the performance gain from code rate 1/3 to 2/3 is about a factor 2.
-
-\begin{table}[ht]
-  \centering
-  \begin{tabular}{lrrr}
-    \toprule
-    \textbf{Function} & \textbf{Time [$\mu s$] (R=1/5)} & \textbf{Time [$\mu s$] (R=1/3)} & \textbf{Time [$\mu s$] (R=2/3)}\\
-    \midrule
-    % \texttt{llr2llrProcBuf} & 3.2   & 2.9   & 2.6   \\
-    % \texttt{llr2CnProcBuf}  & 36.5  & 25.4  & 14.8  \\
-    % \texttt{cnProc}         & 33.6  & 25.2  & 13.3  \\
-    % \texttt{bnProcPc}       & 17.6  & 10.2  & 4.5   \\
-    % \texttt{bnProc}         & 8.5   & 5.4   & 2.5   \\
-    % \texttt{cn2bnProcBuf}   & 175.3 & 110.6 & 50.7  \\
-    % \texttt{bn2cnProcBuf}   & 106.6 & 71.2  & 36.1  \\
-    % \texttt{llrRes2llrOut}  & 10.2  & 6.3   & 3.3   \\
-    % \texttt{llr2bit}        & 0.4   & 0.2   & 0.1   \\
-    \texttt{llr2llrProcBuf} & 1.5  & 0.9  & 0.5  \\
-    \texttt{llr2CnProcBuf}  & 6.0  & 4.1  & 2.2  \\
-    \texttt{cnProc}         & 32.2 & 23.7 & 14.4 \\
-    \texttt{bnProcPc}       & 21.2 & 12.1 & 5.5  \\
-    \texttt{bnProc}         & 9.8  & 5.9  & 2.9  \\
-    \texttt{cn2bnProcBuf}   & 23.3 & 13.9 & 6.8  \\
-    \texttt{bn2cnProcBuf}   & 14.8 & 9.7  & 5.0  \\
-    \texttt{llrRes2llrOut}  & 0.6  & 0.4  & 0.3  \\
-    \texttt{llr2bit}        & 0.7  & 0.4  & 0.2  \\
-    \midrule
-    % \textbf{Total}          & \textbf{392.4} & \textbf{258.0} & \textbf{128.2} \\
-    \textbf{Total}          & \textbf{111.0} & \textbf{71.8} & \textbf{38.5} \\
-    \bottomrule
-  \end{tabular}
-  \caption{BG2, Z=384, B=3840, LDPC OAI, 5 iterations}
-  \label{tab:lat-bg2-i5}
-\end{table}
-
-Table \ref{tab:lat-bg1-i5} shows the results for BG1, larges block size and different code rates. The latency difference betwee code rate 1/3 and code rate 2/3 is less than half because upper left corner of the PCM is more dense than the rest of the PCM.
-
-\begin{table}[ht]
-  \centering
-  \begin{tabular}{lrrr}
-    \toprule
-    \textbf{Function} &  \textbf{Time [$\mu s$] (R=1/3)} & \textbf{Time [$\mu s$] (R=2/3)} & \textbf{Time [$\mu s$] (R=8/9)}\\
-    \midrule
-    % \texttt{llr2llrProcBuf}  & 5.5   & 4.9   & 4.6  \\
-    % \texttt{llr2CnProcBuf}   & 60.6  & 34.1  & 24.4 \\
-    % \texttt{cnProc}          & 102.0 & 74.1  & 56.0 \\
-    % \texttt{bnProcPc}        & 26.0  & 11.0  & 6.4  \\
-    % \texttt{bnProc}          & 15.7  & 7.4   & 4.5  \\
-    % \texttt{cn2bnProcBuf}    & 291.0 & 140.8 & 83.1 \\
-    % \texttt{bn2cnProcBuf}    & 193.6 & 100.5 & 63.0 \\
-    % \texttt{llrRes2llrOut}   & 13.3  & 6.9   & 5.2  \\
-    % \texttt{llr2bit}         & 0.4   & 0.2   & 0.2  \\
-    \texttt{llr2llrProcBuf}  & 2.1  & 1.2  & 0.9  \\
-    \texttt{llr2CnProcBuf}   & 10.6 & 5.4  & 2.9  \\
-    \texttt{cnProc}          & 89.8 & 66.3 & 50.0 \\
-    \texttt{bnProcPc}        & 28.1 & 12.4 & 7.1 \\
-    \texttt{bnProc}          & 17.1 & 8.1  & 4.8 \\
-    \texttt{cn2bnProcBuf}    & 38.7 & 17.1 & 9.3 \\
-    \texttt{bn2cnProcBuf}    & 25.6 & 12.7 & 7.2 \\
-    \texttt{llrRes2llrOut}   & 0.8  & 0.4  & 0.3 \\
-    \texttt{llr2bit}         & 0.9  & 0.4  & 0.3 \\
-    \midrule
-    % \textbf{Total}           & \textbf{708.9} & \textbf{380.6} & \textbf{248.1}\\
-    \textbf{Total}           & \textbf{214.6} & \textbf{124.6} & \textbf{83.6}\\
-    \bottomrule
-  \end{tabular}
-  \caption{BG1, Z=384, B=8448, LDPC OAI, 5 iterations}
-  \label{tab:lat-bg1-i5}
-\end{table}
-
-From the above results it can be observed that the data transfer between CNs and BNs takes up a significant amount of the run time. However, the performance gain due to AVX instructions in both CN and BN processing is significantly larger than the penalty incurred by the data transfers.
-
-\section{Parity Check and Early Stopping Criteria}
-It is often unnecessary to carry out the maximum number of iterations. After each iteration a parity check (PC) \eqref{eq:29} can be computed and if a valid code word is found the decoder can stop. This functionality has been implemented and the additional overhead is reasonable. The PC is carried out in the CN processing buffer and the calculation complexity itself is negligible. However, for the processing it is necessary to move the BN results to the CN buffer which takes time, the overall overhead is at most $10\%$ compared to an algorithm without early stopping criteria with the same number of iterations. The PC has to be activated via the define \texttt{NR\_LDPC\_ENABLE\_PARITY\_CHECK}.
-
-
-\section{Conclusion}
-\label{sec:conclusion}
-
-The results in the previous sections show that the current optimized LDPC implementation full-fills the requirements in terms of decoding latency for low to medium number of iterations at the expense of a loss in BLER performance. To improve BLER performance, it is recommended to implement a layered algorithm and a min-sum algorithm with normalization. Further improvements upon the current implementation are detailed in the next section.
-
-\newpage
-\section{Future Work}
-\label{sec:future-work}
-
-The improvements upon the current LDPC decoder implementation can be divided into two categories:
-\begin{enumerate}
-\item Improved BLER performance
-\item Reduced decoding latency
-\end{enumerate}
-
-\subsection{Improved BLER Performance}
-\label{sec:impr-bler-perf}
-
-The BLER performance can be improved by using a tighter approximation than the min-sum approximation. For instance, the min-sum algorithm can be improved by adding a correction factor in the CN processing . The min-sum approximation in \eqref{eq:40} is modified as
-\begin{equation}
-  \label{eq:50}
-  r_{ji} = \prod_{j'\in\Bcal_i\setminus j}\sgn q_{ij'}\min_{j'\in\Bcal_i\setminus j} |q_{ij'}| + w(q_{ij'})
-\end{equation}
-The correction term $w(q_{ij'})$ is defined as
-\begin{equation}
-  \label{eq:51}
-  w(q_{ij'}) =
-  \begin{cases}
-     c & \textrm{if}~  \\
-    -c & \textrm{if}~ \\
-     0 & \textrm{otherwise}
-  \end{cases}
-\end{equation}
-where the constant $c$ is of order $0.5$ typically.
-
-\subsection{Reduced Decoding Latency}
-\label{sec:reduc-decod-latency}
-
-The following improvements will reduce the decoding latency:
-
-\begin{itemize}
-\item Adapt to AVX512
-\item Optimization of CN processing
-\item Implement 2/3-layers for faster convergence
-\end{itemize}
-
-\paragraph{AVX512:}
-The computations in the CN and BN processing can be further accelerated by using AVX512 instructions. This improvement will speed-up the CN and BN processing by a approximately a factor of 2.
-
-\paragraph{Optimization of CN Processing:}
-It can be investigated if CN processing can be improved by computing two minima regardless of the number of BNs. Susequently, the (absolute) value fed back to the BN is one of those minima.
-
-\paragraph{Layered processing:}
-The LDPC code in NR always punctures the first 2 columns of the base graph. Hence, the decoder inserts LLRs with value 0 at their place and needs to retrieve those bits during the decoding process. Instead of computing all the parity equations and then passing the results to the BN processing, it is beneficial to first compute parity equations where at most one punctured BN is connected to that CN. If two punctured BNs are connected than according to \eqref{eq:40}, the result will be again 0. Thus in a first sub-iteration those parity equation are computed and the results are send to BN processing which calculates the results using only those rows in the PCM. In the second sub-iteration the remaining check equation are used.
-The convergence of this layered approach is much fast since the bit can be retrieved more quickly while the decoding complexity remains the same. Therefore, for a fixed number of iterations the layered algorithm will have a significantly better performance.
-
-\newpage
-\bibliographystyle{IEEEtran}
-\bibliography{./references}
-
-\end{document}
-
-%%% Local Variables:
-%%% mode: latex
-%%% TeX-master: t
-%%% End:
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/doc/nrLDPC/references.bib b/openair1/PHY/CODING/nrLDPC_decoder/doc/nrLDPC/references.bib
deleted file mode 100644
index 6f446edeb38f51885de12846cc98a7456e045931..0000000000000000000000000000000000000000
--- a/openair1/PHY/CODING/nrLDPC_decoder/doc/nrLDPC/references.bib
+++ /dev/null
@@ -1,105 +0,0 @@
-%
-% Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
-% contributor license agreements.  See the NOTICE file distributed with
-% this work for additional information regarding copyright ownership.
-% The OpenAirInterface Software Alliance licenses this file to You under
-% the OAI Public License, Version 1.1  (the "License"); you may not use this file
-% except in compliance with the License.
-% You may obtain a copy of the License at
-%
-%      http://www.openairinterface.org/?page_id=698
-%
-% Unless required by applicable law or agreed to in writing, software
-% distributed under the License is distributed on an "AS IS" BASIS,
-% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-% See the License for the specific language governing permissions and
-% limitations under the License.
-%-------------------------------------------------------------------------------
-% For more information about the OpenAirInterface (OAI) Software Alliance:
-%      contact@openairinterface.org
-%
-@online{3gpp5gTimeline,
-  author = {3GPP},
-  title = {{3GPP 5G Timeline}},
-  year = 2016,
-  urldate = {2017-06-14},
-  url = {http://www.3gpp.org/images/articleimages/5g_timeline.jpg}
-}
-
-@techreport{3gppTR38913,
-  author =	 "{Technical Specification Group Radio Access Network}",
-  title =	 "{Study on Scenarios and Requirements for Next Generation Access Technologies}",
-  institution =	 "{3GPP TR 38.913 V14.2.0}",
-  month =	 mar,
-  year =	 2017,
-};
-
-@techreport{iturM2038,
-  author =	 "{ITU-R}",
-  title =	 "{IMT Vision -- Framework and overall objectives of the future development of IMT for 2020 and beyond}",
-  institution =	 "{Radiocommunication Sector of ITU}",
-  month =	 sep,
-  year =	 2015,
-};
-
-@techreport{3gpp2014seb,
-  author =	 "{Samsung, Nokia Networks}",
-  title =	 "{New SID Proposal: Study on Elevation Beamforming/Full-Dimension (FD) MIMO for LTE}",
-  institution =	 "3GPP",
-  month =	 sep,
-  year =	 2014,
-};
-
-@techreport{3gpp2015fdm,
-  author =	 "{Technical Specification Group Radio Access Network}",
-  title =	 "{Study on elevation beamforming / Full-Dimension (FD) Multiple Input Multiple Output (MIMO) for LTE}",
-  institution =	 "3GPP TR 36.897 V13.0.0",
-  month =	 jun,
-  year =	 2015,
-};
-
-
-@techreport{3gpp2008tsg,
-  author =	 "{Technical Specification Group Radio Access Network;
-Evolved Universal Terrestrial Radio Access (E-UTRA)}",
-  title =	 "{Further advancements for E-UTRA physical layer aspects (Release 9)}",
-  institution =	 "{3GPP TR 36.814 V9.0.0}",
-  month =	 mar,
-  year =	 2010,
-};
-
-@techreport{3gpp2011uer,
-  author =	 "{Technical Specification Group Radio Access Network;
-Evolved Universal Terrestrial Radio Access (E-UTRA)}",
-  title =	 "{User Equipment (UE) Radio Transmission and Reception}",
-  institution =	 "{3GPP TR 36.101 V10.3.0}",
-  month =	 jun,
-  year =	 2011,
-};
-
-@techreport{3gpp2009_36211,
-  author =	 "{3rd Generation Partnership Project}",
-  title =	 "{Physical Channels and Modulation (Release 8)}",
-  institution =	 "{3GPP TS 36.211 V8.6.0}",
-  month =	 mar,
-  year =	 2009,
-};
-
-@techreport{3gpp2017_38212,
-  author =	 "{3rd Generation Partnership Project}",
-  title =	 "{Multiplexing and channel coding (Release 15)}",
-  institution =	 "{3GPP TS 38.212 V15.0.1}",
-  month =	 mar,
-  year =	 2018,
-};
-
-@article{gallager1962low,
-  title={Low-density parity-check codes},
-  author={Gallager, Robert},
-  journal={IRE Transactions on information theory},
-  volume={8},
-  number={1},
-  pages={21--28},
-  year={1962},
-  publisher={IEEE}
-}
\ No newline at end of file
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/doc/nrLDPC_doxyCfg b/openair1/PHY/CODING/nrLDPC_decoder/doc/nrLDPC_doxyCfg
deleted file mode 100644
index 3a4137acb49ee35c37cb397f87167fee24a76264..0000000000000000000000000000000000000000
--- a/openair1/PHY/CODING/nrLDPC_decoder/doc/nrLDPC_doxyCfg
+++ /dev/null
@@ -1,2427 +0,0 @@
-# Doxyfile 1.8.11
-
-# This file describes the settings to be used by the documentation system
-# doxygen (www.doxygen.org) for a project.
-#
-# All text after a double hash (##) is considered a comment and is placed in
-# front of the TAG it is preceding.
-#
-# All text after a single hash (#) is considered a comment and will be ignored.
-# The format is:
-# TAG = value [value, ...]
-# For lists, items can also be appended using:
-# TAG += value [value, ...]
-# Values that contain spaces should be placed between quotes (\" \").
-
-#---------------------------------------------------------------------------
-# Project related configuration options
-#---------------------------------------------------------------------------
-
-# This tag specifies the encoding used for all characters in the config file
-# that follow. The default is UTF-8 which is also the encoding used for all text
-# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
-# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv
-# for the list of possible encodings.
-# The default value is: UTF-8.
-
-DOXYFILE_ENCODING      = UTF-8
-
-# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
-# double-quotes, unless you are using Doxywizard) that should identify the
-# project for which the documentation is generated. This name is used in the
-# title of most generated pages and in a few other places.
-# The default value is: My Project.
-
-PROJECT_NAME           = "NR LDPC Decoder"
-
-# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
-# could be handy for archiving the generated documentation or if some version
-# control system is used.
-
-PROJECT_NUMBER         =
-
-# Using the PROJECT_BRIEF tag one can provide an optional one line description
-# for a project that appears at the top of each page and should give viewer a
-# quick idea about the purpose of the project. Keep the description short.
-
-PROJECT_BRIEF          =
-
-# With the PROJECT_LOGO tag one can specify a logo or an icon that is included
-# in the documentation. The maximum height of the logo should not exceed 55
-# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
-# the logo to the output directory.
-
-PROJECT_LOGO           =
-
-# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
-# into which the generated documentation will be written. If a relative path is
-# entered, it will be relative to the location where doxygen was started. If
-# left blank the current directory will be used.
-
-OUTPUT_DIRECTORY       =
-
-# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub-
-# directories (in 2 levels) under the output directory of each output format and
-# will distribute the generated files over these directories. Enabling this
-# option can be useful when feeding doxygen a huge amount of source files, where
-# putting all generated files in the same directory would otherwise causes
-# performance problems for the file system.
-# The default value is: NO.
-
-CREATE_SUBDIRS         = NO
-
-# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
-# characters to appear in the names of generated files. If set to NO, non-ASCII
-# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
-# U+3044.
-# The default value is: NO.
-
-ALLOW_UNICODE_NAMES    = NO
-
-# The OUTPUT_LANGUAGE tag is used to specify the language in which all
-# documentation generated by doxygen is written. Doxygen will use this
-# information to generate all constant output in the proper language.
-# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,
-# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),
-# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,
-# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),
-# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,
-# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,
-# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,
-# Ukrainian and Vietnamese.
-# The default value is: English.
-
-OUTPUT_LANGUAGE        = English
-
-# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member
-# descriptions after the members that are listed in the file and class
-# documentation (similar to Javadoc). Set to NO to disable this.
-# The default value is: YES.
-
-BRIEF_MEMBER_DESC      = YES
-
-# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief
-# description of a member or function before the detailed description
-#
-# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
-# brief descriptions will be completely suppressed.
-# The default value is: YES.
-
-REPEAT_BRIEF           = YES
-
-# This tag implements a quasi-intelligent brief description abbreviator that is
-# used to form the text in various listings. Each string in this list, if found
-# as the leading text of the brief description, will be stripped from the text
-# and the result, after processing the whole list, is used as the annotated
-# text. Otherwise, the brief description is used as-is. If left blank, the
-# following values are used ($name is automatically replaced with the name of
-# the entity):The $name class, The $name widget, The $name file, is, provides,
-# specifies, contains, represents, a, an and the.
-
-ABBREVIATE_BRIEF       =
-
-# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
-# doxygen will generate a detailed section even if there is only a brief
-# description.
-# The default value is: NO.
-
-ALWAYS_DETAILED_SEC    = NO
-
-# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
-# inherited members of a class in the documentation of that class as if those
-# members were ordinary class members. Constructors, destructors and assignment
-# operators of the base classes will not be shown.
-# The default value is: NO.
-
-INLINE_INHERITED_MEMB  = NO
-
-# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path
-# before files name in the file list and in the header files. If set to NO the
-# shortest path that makes the file name unique will be used
-# The default value is: YES.
-
-FULL_PATH_NAMES        = YES
-
-# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
-# Stripping is only done if one of the specified strings matches the left-hand
-# part of the path. The tag can be used to show relative paths in the file list.
-# If left blank the directory from which doxygen is run is used as the path to
-# strip.
-#
-# Note that you can specify absolute paths here, but also relative paths, which
-# will be relative from the directory where doxygen is started.
-# This tag requires that the tag FULL_PATH_NAMES is set to YES.
-
-STRIP_FROM_PATH        =
-
-# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
-# path mentioned in the documentation of a class, which tells the reader which
-# header file to include in order to use a class. If left blank only the name of
-# the header file containing the class definition is used. Otherwise one should
-# specify the list of include paths that are normally passed to the compiler
-# using the -I flag.
-
-STRIP_FROM_INC_PATH    =
-
-# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
-# less readable) file names. This can be useful is your file systems doesn't
-# support long names like on DOS, Mac, or CD-ROM.
-# The default value is: NO.
-
-SHORT_NAMES            = NO
-
-# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
-# first line (until the first dot) of a Javadoc-style comment as the brief
-# description. If set to NO, the Javadoc-style will behave just like regular Qt-
-# style comments (thus requiring an explicit @brief command for a brief
-# description.)
-# The default value is: NO.
-
-JAVADOC_AUTOBRIEF      = NO
-
-# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
-# line (until the first dot) of a Qt-style comment as the brief description. If
-# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
-# requiring an explicit \brief command for a brief description.)
-# The default value is: NO.
-
-QT_AUTOBRIEF           = NO
-
-# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
-# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
-# a brief description. This used to be the default behavior. The new default is
-# to treat a multi-line C++ comment block as a detailed description. Set this
-# tag to YES if you prefer the old behavior instead.
-#
-# Note that setting this tag to YES also means that rational rose comments are
-# not recognized any more.
-# The default value is: NO.
-
-MULTILINE_CPP_IS_BRIEF = NO
-
-# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
-# documentation from any documented member that it re-implements.
-# The default value is: YES.
-
-INHERIT_DOCS           = YES
-
-# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new
-# page for each member. If set to NO, the documentation of a member will be part
-# of the file/class/namespace that contains it.
-# The default value is: NO.
-
-SEPARATE_MEMBER_PAGES  = NO
-
-# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
-# uses this value to replace tabs by spaces in code fragments.
-# Minimum value: 1, maximum value: 16, default value: 4.
-
-TAB_SIZE               = 4
-
-# This tag can be used to specify a number of aliases that act as commands in
-# the documentation. An alias has the form:
-# name=value
-# For example adding
-# "sideeffect=@par Side Effects:\n"
-# will allow you to put the command \sideeffect (or @sideeffect) in the
-# documentation, which will result in a user-defined paragraph with heading
-# "Side Effects:". You can put \n's in the value part of an alias to insert
-# newlines.
-
-ALIASES                =
-
-# This tag can be used to specify a number of word-keyword mappings (TCL only).
-# A mapping has the form "name=value". For example adding "class=itcl::class"
-# will allow you to use the command class in the itcl::class meaning.
-
-TCL_SUBST              =
-
-# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
-# only. Doxygen will then generate output that is more tailored for C. For
-# instance, some of the names that are used will be different. The list of all
-# members will be omitted, etc.
-# The default value is: NO.
-
-OPTIMIZE_OUTPUT_FOR_C  = YES
-
-# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
-# Python sources only. Doxygen will then generate output that is more tailored
-# for that language. For instance, namespaces will be presented as packages,
-# qualified scopes will look different, etc.
-# The default value is: NO.
-
-OPTIMIZE_OUTPUT_JAVA   = NO
-
-# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
-# sources. Doxygen will then generate output that is tailored for Fortran.
-# The default value is: NO.
-
-OPTIMIZE_FOR_FORTRAN   = NO
-
-# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
-# sources. Doxygen will then generate output that is tailored for VHDL.
-# The default value is: NO.
-
-OPTIMIZE_OUTPUT_VHDL   = NO
-
-# Doxygen selects the parser to use depending on the extension of the files it
-# parses. With this tag you can assign which parser to use for a given
-# extension. Doxygen has a built-in mapping, but you can override or extend it
-# using this tag. The format is ext=language, where ext is a file extension, and
-# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
-# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran:
-# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran:
-# Fortran. In the later case the parser tries to guess whether the code is fixed
-# or free formatted code, this is the default for Fortran type files), VHDL. For
-# instance to make doxygen treat .inc files as Fortran files (default is PHP),
-# and .f files as C (default is Fortran), use: inc=Fortran f=C.
-#
-# Note: For files without extension you can use no_extension as a placeholder.
-#
-# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
-# the files are not read by doxygen.
-
-EXTENSION_MAPPING      =
-
-# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
-# according to the Markdown format, which allows for more readable
-# documentation. See http://daringfireball.net/projects/markdown/ for details.
-# The output of markdown processing is further processed by doxygen, so you can
-# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
-# case of backward compatibilities issues.
-# The default value is: YES.
-
-MARKDOWN_SUPPORT       = YES
-
-# When enabled doxygen tries to link words that correspond to documented
-# classes, or namespaces to their corresponding documentation. Such a link can
-# be prevented in individual cases by putting a % sign in front of the word or
-# globally by setting AUTOLINK_SUPPORT to NO.
-# The default value is: YES.
-
-AUTOLINK_SUPPORT       = YES
-
-# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
-# to include (a tag file for) the STL sources as input, then you should set this
-# tag to YES in order to let doxygen match functions declarations and
-# definitions whose arguments contain STL classes (e.g. func(std::string);
-# versus func(std::string) {}). This also make the inheritance and collaboration
-# diagrams that involve STL classes more complete and accurate.
-# The default value is: NO.
-
-BUILTIN_STL_SUPPORT    = NO
-
-# If you use Microsoft's C++/CLI language, you should set this option to YES to
-# enable parsing support.
-# The default value is: NO.
-
-CPP_CLI_SUPPORT        = NO
-
-# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
-# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen
-# will parse them like normal C++ but will assume all classes use public instead
-# of private inheritance when no explicit protection keyword is present.
-# The default value is: NO.
-
-SIP_SUPPORT            = NO
-
-# For Microsoft's IDL there are propget and propput attributes to indicate
-# getter and setter methods for a property. Setting this option to YES will make
-# doxygen to replace the get and set methods by a property in the documentation.
-# This will only work if the methods are indeed getting or setting a simple
-# type. If this is not the case, or you want to show the methods anyway, you
-# should set this option to NO.
-# The default value is: YES.
-
-IDL_PROPERTY_SUPPORT   = YES
-
-# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
-# tag is set to YES then doxygen will reuse the documentation of the first
-# member in the group (if any) for the other members of the group. By default
-# all members of a group must be documented explicitly.
-# The default value is: NO.
-
-DISTRIBUTE_GROUP_DOC   = NO
-
-# If one adds a struct or class to a group and this option is enabled, then also
-# any nested class or struct is added to the same group. By default this option
-# is disabled and one has to add nested compounds explicitly via \ingroup.
-# The default value is: NO.
-
-GROUP_NESTED_COMPOUNDS = NO
-
-# Set the SUBGROUPING tag to YES to allow class member groups of the same type
-# (for instance a group of public functions) to be put as a subgroup of that
-# type (e.g. under the Public Functions section). Set it to NO to prevent
-# subgrouping. Alternatively, this can be done per class using the
-# \nosubgrouping command.
-# The default value is: YES.
-
-SUBGROUPING            = YES
-
-# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
-# are shown inside the group in which they are included (e.g. using \ingroup)
-# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
-# and RTF).
-#
-# Note that this feature does not work in combination with
-# SEPARATE_MEMBER_PAGES.
-# The default value is: NO.
-
-INLINE_GROUPED_CLASSES = NO
-
-# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
-# with only public data fields or simple typedef fields will be shown inline in
-# the documentation of the scope in which they are defined (i.e. file,
-# namespace, or group documentation), provided this scope is documented. If set
-# to NO, structs, classes, and unions are shown on a separate page (for HTML and
-# Man pages) or section (for LaTeX and RTF).
-# The default value is: NO.
-
-INLINE_SIMPLE_STRUCTS  = NO
-
-# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
-# enum is documented as struct, union, or enum with the name of the typedef. So
-# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
-# with name TypeT. When disabled the typedef will appear as a member of a file,
-# namespace, or class. And the struct will be named TypeS. This can typically be
-# useful for C code in case the coding convention dictates that all compound
-# types are typedef'ed and only the typedef is referenced, never the tag name.
-# The default value is: NO.
-
-TYPEDEF_HIDES_STRUCT   = NO
-
-# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
-# cache is used to resolve symbols given their name and scope. Since this can be
-# an expensive process and often the same symbol appears multiple times in the
-# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
-# doxygen will become slower. If the cache is too large, memory is wasted. The
-# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
-# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
-# symbols. At the end of a run doxygen will report the cache usage and suggest
-# the optimal cache size from a speed point of view.
-# Minimum value: 0, maximum value: 9, default value: 0.
-
-LOOKUP_CACHE_SIZE      = 0
-
-#---------------------------------------------------------------------------
-# Build related configuration options
-#---------------------------------------------------------------------------
-
-# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in
-# documentation are documented, even if no documentation was available. Private
-# class members and static file members will be hidden unless the
-# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
-# Note: This will also disable the warnings about undocumented members that are
-# normally produced when WARNINGS is set to YES.
-# The default value is: NO.
-
-EXTRACT_ALL            = NO
-
-# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will
-# be included in the documentation.
-# The default value is: NO.
-
-EXTRACT_PRIVATE        = NO
-
-# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal
-# scope will be included in the documentation.
-# The default value is: NO.
-
-EXTRACT_PACKAGE        = NO
-
-# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be
-# included in the documentation.
-# The default value is: NO.
-
-EXTRACT_STATIC         = YES
-
-# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined
-# locally in source files will be included in the documentation. If set to NO,
-# only classes defined in header files are included. Does not have any effect
-# for Java sources.
-# The default value is: YES.
-
-EXTRACT_LOCAL_CLASSES  = YES
-
-# This flag is only useful for Objective-C code. If set to YES, local methods,
-# which are defined in the implementation section but not in the interface are
-# included in the documentation. If set to NO, only methods in the interface are
-# included.
-# The default value is: NO.
-
-EXTRACT_LOCAL_METHODS  = NO
-
-# If this flag is set to YES, the members of anonymous namespaces will be
-# extracted and appear in the documentation as a namespace called
-# 'anonymous_namespace{file}', where file will be replaced with the base name of
-# the file that contains the anonymous namespace. By default anonymous namespace
-# are hidden.
-# The default value is: NO.
-
-EXTRACT_ANON_NSPACES   = NO
-
-# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
-# undocumented members inside documented classes or files. If set to NO these
-# members will be included in the various overviews, but no documentation
-# section is generated. This option has no effect if EXTRACT_ALL is enabled.
-# The default value is: NO.
-
-HIDE_UNDOC_MEMBERS     = NO
-
-# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
-# undocumented classes that are normally visible in the class hierarchy. If set
-# to NO, these classes will be included in the various overviews. This option
-# has no effect if EXTRACT_ALL is enabled.
-# The default value is: NO.
-
-HIDE_UNDOC_CLASSES     = NO
-
-# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
-# (class|struct|union) declarations. If set to NO, these declarations will be
-# included in the documentation.
-# The default value is: NO.
-
-HIDE_FRIEND_COMPOUNDS  = NO
-
-# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
-# documentation blocks found inside the body of a function. If set to NO, these
-# blocks will be appended to the function's detailed documentation block.
-# The default value is: NO.
-
-HIDE_IN_BODY_DOCS      = NO
-
-# The INTERNAL_DOCS tag determines if documentation that is typed after a
-# \internal command is included. If the tag is set to NO then the documentation
-# will be excluded. Set it to YES to include the internal documentation.
-# The default value is: NO.
-
-INTERNAL_DOCS          = NO
-
-# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
-# names in lower-case letters. If set to YES, upper-case letters are also
-# allowed. This is useful if you have classes or files whose names only differ
-# in case and if your file system supports case sensitive file names. Windows
-# and Mac users are advised to set this option to NO.
-# The default value is: system dependent.
-
-CASE_SENSE_NAMES       = YES
-
-# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
-# their full class and namespace scopes in the documentation. If set to YES, the
-# scope will be hidden.
-# The default value is: NO.
-
-HIDE_SCOPE_NAMES       = NO
-
-# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will
-# append additional text to a page's title, such as Class Reference. If set to
-# YES the compound reference will be hidden.
-# The default value is: NO.
-
-HIDE_COMPOUND_REFERENCE= NO
-
-# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
-# the files that are included by a file in the documentation of that file.
-# The default value is: YES.
-
-SHOW_INCLUDE_FILES     = YES
-
-# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
-# grouped member an include statement to the documentation, telling the reader
-# which file to include in order to use the member.
-# The default value is: NO.
-
-SHOW_GROUPED_MEMB_INC  = NO
-
-# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
-# files with double quotes in the documentation rather than with sharp brackets.
-# The default value is: NO.
-
-FORCE_LOCAL_INCLUDES   = NO
-
-# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
-# documentation for inline members.
-# The default value is: YES.
-
-INLINE_INFO            = YES
-
-# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
-# (detailed) documentation of file and class members alphabetically by member
-# name. If set to NO, the members will appear in declaration order.
-# The default value is: YES.
-
-SORT_MEMBER_DOCS       = YES
-
-# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
-# descriptions of file, namespace and class members alphabetically by member
-# name. If set to NO, the members will appear in declaration order. Note that
-# this will also influence the order of the classes in the class list.
-# The default value is: NO.
-
-SORT_BRIEF_DOCS        = NO
-
-# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
-# (brief and detailed) documentation of class members so that constructors and
-# destructors are listed first. If set to NO the constructors will appear in the
-# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
-# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
-# member documentation.
-# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
-# detailed member documentation.
-# The default value is: NO.
-
-SORT_MEMBERS_CTORS_1ST = NO
-
-# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
-# of group names into alphabetical order. If set to NO the group names will
-# appear in their defined order.
-# The default value is: NO.
-
-SORT_GROUP_NAMES       = NO
-
-# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
-# fully-qualified names, including namespaces. If set to NO, the class list will
-# be sorted only by class name, not including the namespace part.
-# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
-# Note: This option applies only to the class list, not to the alphabetical
-# list.
-# The default value is: NO.
-
-SORT_BY_SCOPE_NAME     = NO
-
-# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
-# type resolution of all parameters of a function it will reject a match between
-# the prototype and the implementation of a member function even if there is
-# only one candidate or it is obvious which candidate to choose by doing a
-# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
-# accept a match between prototype and implementation in such cases.
-# The default value is: NO.
-
-STRICT_PROTO_MATCHING  = NO
-
-# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo
-# list. This list is created by putting \todo commands in the documentation.
-# The default value is: YES.
-
-GENERATE_TODOLIST      = YES
-
-# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test
-# list. This list is created by putting \test commands in the documentation.
-# The default value is: YES.
-
-GENERATE_TESTLIST      = YES
-
-# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug
-# list. This list is created by putting \bug commands in the documentation.
-# The default value is: YES.
-
-GENERATE_BUGLIST       = YES
-
-# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO)
-# the deprecated list. This list is created by putting \deprecated commands in
-# the documentation.
-# The default value is: YES.
-
-GENERATE_DEPRECATEDLIST= YES
-
-# The ENABLED_SECTIONS tag can be used to enable conditional documentation
-# sections, marked by \if <section_label> ... \endif and \cond <section_label>
-# ... \endcond blocks.
-
-ENABLED_SECTIONS       =
-
-# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
-# initial value of a variable or macro / define can have for it to appear in the
-# documentation. If the initializer consists of more lines than specified here
-# it will be hidden. Use a value of 0 to hide initializers completely. The
-# appearance of the value of individual variables and macros / defines can be
-# controlled using \showinitializer or \hideinitializer command in the
-# documentation regardless of this setting.
-# Minimum value: 0, maximum value: 10000, default value: 30.
-
-MAX_INITIALIZER_LINES  = 30
-
-# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
-# the bottom of the documentation of classes and structs. If set to YES, the
-# list will mention the files that were used to generate the documentation.
-# The default value is: YES.
-
-SHOW_USED_FILES        = YES
-
-# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
-# will remove the Files entry from the Quick Index and from the Folder Tree View
-# (if specified).
-# The default value is: YES.
-
-SHOW_FILES             = YES
-
-# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
-# page. This will remove the Namespaces entry from the Quick Index and from the
-# Folder Tree View (if specified).
-# The default value is: YES.
-
-SHOW_NAMESPACES        = YES
-
-# The FILE_VERSION_FILTER tag can be used to specify a program or script that
-# doxygen should invoke to get the current version for each file (typically from
-# the version control system). Doxygen will invoke the program by executing (via
-# popen()) the command command input-file, where command is the value of the
-# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
-# by doxygen. Whatever the program writes to standard output is used as the file
-# version. For an example see the documentation.
-
-FILE_VERSION_FILTER    =
-
-# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
-# by doxygen. The layout file controls the global structure of the generated
-# output files in an output format independent way. To create the layout file
-# that represents doxygen's defaults, run doxygen with the -l option. You can
-# optionally specify a file name after the option, if omitted DoxygenLayout.xml
-# will be used as the name of the layout file.
-#
-# Note that if you run doxygen from a directory containing a file called
-# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
-# tag is left empty.
-
-LAYOUT_FILE            =
-
-# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
-# the reference definitions. This must be a list of .bib files. The .bib
-# extension is automatically appended if omitted. This requires the bibtex tool
-# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.
-# For LaTeX the style of the bibliography can be controlled using
-# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
-# search path. See also \cite for info how to create references.
-
-CITE_BIB_FILES         =
-
-#---------------------------------------------------------------------------
-# Configuration options related to warning and progress messages
-#---------------------------------------------------------------------------
-
-# The QUIET tag can be used to turn on/off the messages that are generated to
-# standard output by doxygen. If QUIET is set to YES this implies that the
-# messages are off.
-# The default value is: NO.
-
-QUIET                  = NO
-
-# The WARNINGS tag can be used to turn on/off the warning messages that are
-# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES
-# this implies that the warnings are on.
-#
-# Tip: Turn warnings on while writing the documentation.
-# The default value is: YES.
-
-WARNINGS               = YES
-
-# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate
-# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
-# will automatically be disabled.
-# The default value is: YES.
-
-WARN_IF_UNDOCUMENTED   = YES
-
-# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
-# potential errors in the documentation, such as not documenting some parameters
-# in a documented function, or documenting parameters that don't exist or using
-# markup commands wrongly.
-# The default value is: YES.
-
-WARN_IF_DOC_ERROR      = YES
-
-# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
-# are documented, but have no documentation for their parameters or return
-# value. If set to NO, doxygen will only warn about wrong or incomplete
-# parameter documentation, but not about the absence of documentation.
-# The default value is: NO.
-
-WARN_NO_PARAMDOC       = NO
-
-# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when
-# a warning is encountered.
-# The default value is: NO.
-
-WARN_AS_ERROR          = NO
-
-# The WARN_FORMAT tag determines the format of the warning messages that doxygen
-# can produce. The string should contain the $file, $line, and $text tags, which
-# will be replaced by the file and line number from which the warning originated
-# and the warning text. Optionally the format may contain $version, which will
-# be replaced by the version of the file (if it could be obtained via
-# FILE_VERSION_FILTER)
-# The default value is: $file:$line: $text.
-
-WARN_FORMAT            = "$file:$line: $text"
-
-# The WARN_LOGFILE tag can be used to specify a file to which warning and error
-# messages should be written. If left blank the output is written to standard
-# error (stderr).
-
-WARN_LOGFILE           =
-
-#---------------------------------------------------------------------------
-# Configuration options related to the input files
-#---------------------------------------------------------------------------
-
-# The INPUT tag is used to specify the files and/or directories that contain
-# documented source files. You may enter file names like myfile.cpp or
-# directories like /usr/src/myproject. Separate the files or directories with
-# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
-# Note: If this tag is empty the current directory is searched.
-
-INPUT                  = ../nrLDPC_defs.h ../nrLDPC_types.h ../nrLDPC_init.h ../nrLDPC_cnProc.h ../nrLDPC_bnProc.h ../nrLDPC_mPass.h ../nrLDPC_decoder.h ../nrLDPC_decoder.c ../nrLDPC_lut.h
-
-# This tag can be used to specify the character encoding of the source files
-# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
-# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
-# documentation (see: http://www.gnu.org/software/libiconv) for the list of
-# possible encodings.
-# The default value is: UTF-8.
-
-INPUT_ENCODING         = UTF-8
-
-# If the value of the INPUT tag contains directories, you can use the
-# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
-# *.h) to filter out the source-files in the directories.
-#
-# Note that for custom extensions or not directly supported extensions you also
-# need to set EXTENSION_MAPPING for the extension otherwise the files are not
-# read by doxygen.
-#
-# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,
-# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,
-# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc,
-# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f, *.for, *.tcl,
-# *.vhd, *.vhdl, *.ucf, *.qsf, *.as and *.js.
-
-FILE_PATTERNS          =
-
-# The RECURSIVE tag can be used to specify whether or not subdirectories should
-# be searched for input files as well.
-# The default value is: NO.
-
-RECURSIVE              = NO
-
-# The EXCLUDE tag can be used to specify files and/or directories that should be
-# excluded from the INPUT source files. This way you can easily exclude a
-# subdirectory from a directory tree whose root is specified with the INPUT tag.
-#
-# Note that relative paths are relative to the directory from which doxygen is
-# run.
-
-EXCLUDE                =
-
-# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
-# directories that are symbolic links (a Unix file system feature) are excluded
-# from the input.
-# The default value is: NO.
-
-EXCLUDE_SYMLINKS       = NO
-
-# If the value of the INPUT tag contains directories, you can use the
-# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
-# certain files from those directories.
-#
-# Note that the wildcards are matched against the file with absolute path, so to
-# exclude all test directories for example use the pattern */test/*
-
-EXCLUDE_PATTERNS       =
-
-# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
-# (namespaces, classes, functions, etc.) that should be excluded from the
-# output. The symbol name can be a fully qualified name, a word, or if the
-# wildcard * is used, a substring. Examples: ANamespace, AClass,
-# AClass::ANamespace, ANamespace::*Test
-#
-# Note that the wildcards are matched against the file with absolute path, so to
-# exclude all test directories use the pattern */test/*
-
-EXCLUDE_SYMBOLS        =
-
-# The EXAMPLE_PATH tag can be used to specify one or more files or directories
-# that contain example code fragments that are included (see the \include
-# command).
-
-EXAMPLE_PATH           =
-
-# If the value of the EXAMPLE_PATH tag contains directories, you can use the
-# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
-# *.h) to filter out the source-files in the directories. If left blank all
-# files are included.
-
-EXAMPLE_PATTERNS       =
-
-# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
-# searched for input files to be used with the \include or \dontinclude commands
-# irrespective of the value of the RECURSIVE tag.
-# The default value is: NO.
-
-EXAMPLE_RECURSIVE      = NO
-
-# The IMAGE_PATH tag can be used to specify one or more files or directories
-# that contain images that are to be included in the documentation (see the
-# \image command).
-
-IMAGE_PATH             =
-
-# The INPUT_FILTER tag can be used to specify a program that doxygen should
-# invoke to filter for each input file. Doxygen will invoke the filter program
-# by executing (via popen()) the command:
-#
-# <filter> <input-file>
-#
-# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
-# name of an input file. Doxygen will then use the output that the filter
-# program writes to standard output. If FILTER_PATTERNS is specified, this tag
-# will be ignored.
-#
-# Note that the filter must not add or remove lines; it is applied before the
-# code is scanned, but not when the output code is generated. If lines are added
-# or removed, the anchors will not be placed correctly.
-#
-# Note that for custom extensions or not directly supported extensions you also
-# need to set EXTENSION_MAPPING for the extension otherwise the files are not
-# properly processed by doxygen.
-
-INPUT_FILTER           =
-
-# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
-# basis. Doxygen will compare the file name with each pattern and apply the
-# filter if there is a match. The filters are a list of the form: pattern=filter
-# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
-# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
-# patterns match the file name, INPUT_FILTER is applied.
-#
-# Note that for custom extensions or not directly supported extensions you also
-# need to set EXTENSION_MAPPING for the extension otherwise the files are not
-# properly processed by doxygen.
-
-FILTER_PATTERNS        =
-
-# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
-# INPUT_FILTER) will also be used to filter the input files that are used for
-# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
-# The default value is: NO.
-
-FILTER_SOURCE_FILES    = NO
-
-# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
-# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
-# it is also possible to disable source filtering for a specific pattern using
-# *.ext= (so without naming a filter).
-# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
-
-FILTER_SOURCE_PATTERNS =
-
-# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
-# is part of the input, its contents will be placed on the main page
-# (index.html). This can be useful if you have a project on for instance GitHub
-# and want to reuse the introduction page also for the doxygen output.
-
-USE_MDFILE_AS_MAINPAGE =
-
-#---------------------------------------------------------------------------
-# Configuration options related to source browsing
-#---------------------------------------------------------------------------
-
-# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
-# generated. Documented entities will be cross-referenced with these sources.
-#
-# Note: To get rid of all source code in the generated output, make sure that
-# also VERBATIM_HEADERS is set to NO.
-# The default value is: NO.
-
-SOURCE_BROWSER         = NO
-
-# Setting the INLINE_SOURCES tag to YES will include the body of functions,
-# classes and enums directly into the documentation.
-# The default value is: NO.
-
-INLINE_SOURCES         = NO
-
-# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
-# special comment blocks from generated source code fragments. Normal C, C++ and
-# Fortran comments will always remain visible.
-# The default value is: YES.
-
-STRIP_CODE_COMMENTS    = YES
-
-# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
-# function all documented functions referencing it will be listed.
-# The default value is: NO.
-
-REFERENCED_BY_RELATION = NO
-
-# If the REFERENCES_RELATION tag is set to YES then for each documented function
-# all documented entities called/used by that function will be listed.
-# The default value is: NO.
-
-REFERENCES_RELATION    = NO
-
-# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
-# to YES then the hyperlinks from functions in REFERENCES_RELATION and
-# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
-# link to the documentation.
-# The default value is: YES.
-
-REFERENCES_LINK_SOURCE = YES
-
-# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
-# source code will show a tooltip with additional information such as prototype,
-# brief description and links to the definition and documentation. Since this
-# will make the HTML file larger and loading of large files a bit slower, you
-# can opt to disable this feature.
-# The default value is: YES.
-# This tag requires that the tag SOURCE_BROWSER is set to YES.
-
-SOURCE_TOOLTIPS        = YES
-
-# If the USE_HTAGS tag is set to YES then the references to source code will
-# point to the HTML generated by the htags(1) tool instead of doxygen built-in
-# source browser. The htags tool is part of GNU's global source tagging system
-# (see http://www.gnu.org/software/global/global.html). You will need version
-# 4.8.6 or higher.
-#
-# To use it do the following:
-# - Install the latest version of global
-# - Enable SOURCE_BROWSER and USE_HTAGS in the config file
-# - Make sure the INPUT points to the root of the source tree
-# - Run doxygen as normal
-#
-# Doxygen will invoke htags (and that will in turn invoke gtags), so these
-# tools must be available from the command line (i.e. in the search path).
-#
-# The result: instead of the source browser generated by doxygen, the links to
-# source code will now point to the output of htags.
-# The default value is: NO.
-# This tag requires that the tag SOURCE_BROWSER is set to YES.
-
-USE_HTAGS              = NO
-
-# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
-# verbatim copy of the header file for each class for which an include is
-# specified. Set to NO to disable this.
-# See also: Section \class.
-# The default value is: YES.
-
-VERBATIM_HEADERS       = YES
-
-# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the
-# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the
-# cost of reduced performance. This can be particularly helpful with template
-# rich C++ code for which doxygen's built-in parser lacks the necessary type
-# information.
-# Note: The availability of this option depends on whether or not doxygen was
-# generated with the -Duse-libclang=ON option for CMake.
-# The default value is: NO.
-
-CLANG_ASSISTED_PARSING = NO
-
-# If clang assisted parsing is enabled you can provide the compiler with command
-# line options that you would normally use when invoking the compiler. Note that
-# the include paths will already be set by doxygen for the files and directories
-# specified with INPUT and INCLUDE_PATH.
-# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.
-
-CLANG_OPTIONS          =
-
-#---------------------------------------------------------------------------
-# Configuration options related to the alphabetical class index
-#---------------------------------------------------------------------------
-
-# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
-# compounds will be generated. Enable this if the project contains a lot of
-# classes, structs, unions or interfaces.
-# The default value is: YES.
-
-ALPHABETICAL_INDEX     = YES
-
-# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
-# which the alphabetical index list will be split.
-# Minimum value: 1, maximum value: 20, default value: 5.
-# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
-
-COLS_IN_ALPHA_INDEX    = 5
-
-# In case all classes in a project start with a common prefix, all classes will
-# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
-# can be used to specify a prefix (or a list of prefixes) that should be ignored
-# while generating the index headers.
-# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
-
-IGNORE_PREFIX          =
-
-#---------------------------------------------------------------------------
-# Configuration options related to the HTML output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output
-# The default value is: YES.
-
-GENERATE_HTML          = YES
-
-# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
-# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
-# it.
-# The default directory is: html.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_OUTPUT            = html
-
-# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
-# generated HTML page (for example: .htm, .php, .asp).
-# The default value is: .html.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_FILE_EXTENSION    = .html
-
-# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
-# each generated HTML page. If the tag is left blank doxygen will generate a
-# standard header.
-#
-# To get valid HTML the header file that includes any scripts and style sheets
-# that doxygen needs, which is dependent on the configuration options used (e.g.
-# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
-# default header using
-# doxygen -w html new_header.html new_footer.html new_stylesheet.css
-# YourConfigFile
-# and then modify the file new_header.html. See also section "Doxygen usage"
-# for information on how to generate the default header that doxygen normally
-# uses.
-# Note: The header is subject to change so you typically have to regenerate the
-# default header when upgrading to a newer version of doxygen. For a description
-# of the possible markers and block names see the documentation.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_HEADER            =
-
-# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
-# generated HTML page. If the tag is left blank doxygen will generate a standard
-# footer. See HTML_HEADER for more information on how to generate a default
-# footer and what special commands can be used inside the footer. See also
-# section "Doxygen usage" for information on how to generate the default footer
-# that doxygen normally uses.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_FOOTER            =
-
-# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
-# sheet that is used by each HTML page. It can be used to fine-tune the look of
-# the HTML output. If left blank doxygen will generate a default style sheet.
-# See also section "Doxygen usage" for information on how to generate the style
-# sheet that doxygen normally uses.
-# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
-# it is more robust and this tag (HTML_STYLESHEET) will in the future become
-# obsolete.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_STYLESHEET        =
-
-# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
-# cascading style sheets that are included after the standard style sheets
-# created by doxygen. Using this option one can overrule certain style aspects.
-# This is preferred over using HTML_STYLESHEET since it does not replace the
-# standard style sheet and is therefore more robust against future updates.
-# Doxygen will copy the style sheet files to the output directory.
-# Note: The order of the extra style sheet files is of importance (e.g. the last
-# style sheet in the list overrules the setting of the previous ones in the
-# list). For an example see the documentation.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_EXTRA_STYLESHEET  =
-
-# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
-# other source files which should be copied to the HTML output directory. Note
-# that these files will be copied to the base HTML output directory. Use the
-# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
-# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
-# files will be copied as-is; there are no commands or markers available.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_EXTRA_FILES       =
-
-# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
-# will adjust the colors in the style sheet and background images according to
-# this color. Hue is specified as an angle on a colorwheel, see
-# http://en.wikipedia.org/wiki/Hue for more information. For instance the value
-# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
-# purple, and 360 is red again.
-# Minimum value: 0, maximum value: 359, default value: 220.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_COLORSTYLE_HUE    = 220
-
-# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
-# in the HTML output. For a value of 0 the output will use grayscales only. A
-# value of 255 will produce the most vivid colors.
-# Minimum value: 0, maximum value: 255, default value: 100.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_COLORSTYLE_SAT    = 100
-
-# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
-# luminance component of the colors in the HTML output. Values below 100
-# gradually make the output lighter, whereas values above 100 make the output
-# darker. The value divided by 100 is the actual gamma applied, so 80 represents
-# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
-# change the gamma.
-# Minimum value: 40, maximum value: 240, default value: 80.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_COLORSTYLE_GAMMA  = 80
-
-# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
-# page will contain the date and time when the page was generated. Setting this
-# to YES can help to show when doxygen was last run and thus if the
-# documentation is up to date.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_TIMESTAMP         = NO
-
-# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
-# documentation will contain sections that can be hidden and shown after the
-# page has loaded.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_DYNAMIC_SECTIONS  = NO
-
-# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
-# shown in the various tree structured indices initially; the user can expand
-# and collapse entries dynamically later on. Doxygen will expand the tree to
-# such a level that at most the specified number of entries are visible (unless
-# a fully collapsed tree already exceeds this amount). So setting the number of
-# entries 1 will produce a full collapsed tree by default. 0 is a special value
-# representing an infinite number of entries and will result in a full expanded
-# tree by default.
-# Minimum value: 0, maximum value: 9999, default value: 100.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_INDEX_NUM_ENTRIES = 100
-
-# If the GENERATE_DOCSET tag is set to YES, additional index files will be
-# generated that can be used as input for Apple's Xcode 3 integrated development
-# environment (see: http://developer.apple.com/tools/xcode/), introduced with
-# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a
-# Makefile in the HTML output directory. Running make will produce the docset in
-# that directory and running make install will install the docset in
-# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
-# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
-# for more information.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-GENERATE_DOCSET        = NO
-
-# This tag determines the name of the docset feed. A documentation feed provides
-# an umbrella under which multiple documentation sets from a single provider
-# (such as a company or product suite) can be grouped.
-# The default value is: Doxygen generated docs.
-# This tag requires that the tag GENERATE_DOCSET is set to YES.
-
-DOCSET_FEEDNAME        = "Doxygen generated docs"
-
-# This tag specifies a string that should uniquely identify the documentation
-# set bundle. This should be a reverse domain-name style string, e.g.
-# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
-# The default value is: org.doxygen.Project.
-# This tag requires that the tag GENERATE_DOCSET is set to YES.
-
-DOCSET_BUNDLE_ID       = org.doxygen.Project
-
-# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
-# the documentation publisher. This should be a reverse domain-name style
-# string, e.g. com.mycompany.MyDocSet.documentation.
-# The default value is: org.doxygen.Publisher.
-# This tag requires that the tag GENERATE_DOCSET is set to YES.
-
-DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
-
-# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
-# The default value is: Publisher.
-# This tag requires that the tag GENERATE_DOCSET is set to YES.
-
-DOCSET_PUBLISHER_NAME  = Publisher
-
-# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
-# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
-# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
-# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on
-# Windows.
-#
-# The HTML Help Workshop contains a compiler that can convert all HTML output
-# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
-# files are now used as the Windows 98 help format, and will replace the old
-# Windows help format (.hlp) on all Windows platforms in the future. Compressed
-# HTML files also contain an index, a table of contents, and you can search for
-# words in the documentation. The HTML workshop also contains a viewer for
-# compressed HTML files.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-GENERATE_HTMLHELP      = NO
-
-# The CHM_FILE tag can be used to specify the file name of the resulting .chm
-# file. You can add a path in front of the file if the result should not be
-# written to the html output directory.
-# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
-
-CHM_FILE               =
-
-# The HHC_LOCATION tag can be used to specify the location (absolute path
-# including file name) of the HTML help compiler (hhc.exe). If non-empty,
-# doxygen will try to run the HTML help compiler on the generated index.hhp.
-# The file has to be specified with full path.
-# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
-
-HHC_LOCATION           =
-
-# The GENERATE_CHI flag controls if a separate .chi index file is generated
-# (YES) or that it should be included in the master .chm file (NO).
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
-
-GENERATE_CHI           = NO
-
-# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc)
-# and project file content.
-# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
-
-CHM_INDEX_ENCODING     =
-
-# The BINARY_TOC flag controls whether a binary table of contents is generated
-# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it
-# enables the Previous and Next buttons.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
-
-BINARY_TOC             = NO
-
-# The TOC_EXPAND flag can be set to YES to add extra items for group members to
-# the table of contents of the HTML help documentation and to the tree view.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
-
-TOC_EXPAND             = NO
-
-# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
-# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
-# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
-# (.qch) of the generated HTML documentation.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-GENERATE_QHP           = NO
-
-# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
-# the file name of the resulting .qch file. The path specified is relative to
-# the HTML output folder.
-# This tag requires that the tag GENERATE_QHP is set to YES.
-
-QCH_FILE               =
-
-# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
-# Project output. For more information please see Qt Help Project / Namespace
-# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace).
-# The default value is: org.doxygen.Project.
-# This tag requires that the tag GENERATE_QHP is set to YES.
-
-QHP_NAMESPACE          = org.doxygen.Project
-
-# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
-# Help Project output. For more information please see Qt Help Project / Virtual
-# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-
-# folders).
-# The default value is: doc.
-# This tag requires that the tag GENERATE_QHP is set to YES.
-
-QHP_VIRTUAL_FOLDER     = doc
-
-# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
-# filter to add. For more information please see Qt Help Project / Custom
-# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
-# filters).
-# This tag requires that the tag GENERATE_QHP is set to YES.
-
-QHP_CUST_FILTER_NAME   =
-
-# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
-# custom filter to add. For more information please see Qt Help Project / Custom
-# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
-# filters).
-# This tag requires that the tag GENERATE_QHP is set to YES.
-
-QHP_CUST_FILTER_ATTRS  =
-
-# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
-# project's filter section matches. Qt Help Project / Filter Attributes (see:
-# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).
-# This tag requires that the tag GENERATE_QHP is set to YES.
-
-QHP_SECT_FILTER_ATTRS  =
-
-# The QHG_LOCATION tag can be used to specify the location of Qt's
-# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
-# generated .qhp file.
-# This tag requires that the tag GENERATE_QHP is set to YES.
-
-QHG_LOCATION           =
-
-# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
-# generated, together with the HTML files, they form an Eclipse help plugin. To
-# install this plugin and make it available under the help contents menu in
-# Eclipse, the contents of the directory containing the HTML and XML files needs
-# to be copied into the plugins directory of eclipse. The name of the directory
-# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
-# After copying Eclipse needs to be restarted before the help appears.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-GENERATE_ECLIPSEHELP   = NO
-
-# A unique identifier for the Eclipse help plugin. When installing the plugin
-# the directory name containing the HTML and XML files should also have this
-# name. Each documentation set should have its own identifier.
-# The default value is: org.doxygen.Project.
-# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
-
-ECLIPSE_DOC_ID         = org.doxygen.Project
-
-# If you want full control over the layout of the generated HTML pages it might
-# be necessary to disable the index and replace it with your own. The
-# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
-# of each HTML page. A value of NO enables the index and the value YES disables
-# it. Since the tabs in the index contain the same information as the navigation
-# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-DISABLE_INDEX          = NO
-
-# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
-# structure should be generated to display hierarchical information. If the tag
-# value is set to YES, a side panel will be generated containing a tree-like
-# index structure (just like the one that is generated for HTML Help). For this
-# to work a browser that supports JavaScript, DHTML, CSS and frames is required
-# (i.e. any modern browser). Windows users are probably better off using the
-# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can
-# further fine-tune the look of the index. As an example, the default style
-# sheet generated by doxygen has an example that shows how to put an image at
-# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
-# the same information as the tab index, you could consider setting
-# DISABLE_INDEX to YES when enabling this option.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-GENERATE_TREEVIEW      = NO
-
-# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
-# doxygen will group on one line in the generated HTML documentation.
-#
-# Note that a value of 0 will completely suppress the enum values from appearing
-# in the overview section.
-# Minimum value: 0, maximum value: 20, default value: 4.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-ENUM_VALUES_PER_LINE   = 4
-
-# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
-# to set the initial width (in pixels) of the frame in which the tree is shown.
-# Minimum value: 0, maximum value: 1500, default value: 250.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-TREEVIEW_WIDTH         = 250
-
-# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to
-# external symbols imported via tag files in a separate window.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-EXT_LINKS_IN_WINDOW    = NO
-
-# Use this tag to change the font size of LaTeX formulas included as images in
-# the HTML documentation. When you change the font size after a successful
-# doxygen run you need to manually remove any form_*.png images from the HTML
-# output directory to force them to be regenerated.
-# Minimum value: 8, maximum value: 50, default value: 10.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-FORMULA_FONTSIZE       = 10
-
-# Use the FORMULA_TRANPARENT tag to determine whether or not the images
-# generated for formulas are transparent PNGs. Transparent PNGs are not
-# supported properly for IE 6.0, but are supported on all modern browsers.
-#
-# Note that when changing this option you need to delete any form_*.png files in
-# the HTML output directory before the changes have effect.
-# The default value is: YES.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-FORMULA_TRANSPARENT    = YES
-
-# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
-# http://www.mathjax.org) which uses client side Javascript for the rendering
-# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX
-# installed or if you want to formulas look prettier in the HTML output. When
-# enabled you may also need to install MathJax separately and configure the path
-# to it using the MATHJAX_RELPATH option.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-USE_MATHJAX            = NO
-
-# When MathJax is enabled you can set the default output format to be used for
-# the MathJax output. See the MathJax site (see:
-# http://docs.mathjax.org/en/latest/output.html) for more details.
-# Possible values are: HTML-CSS (which is slower, but has the best
-# compatibility), NativeMML (i.e. MathML) and SVG.
-# The default value is: HTML-CSS.
-# This tag requires that the tag USE_MATHJAX is set to YES.
-
-MATHJAX_FORMAT         = HTML-CSS
-
-# When MathJax is enabled you need to specify the location relative to the HTML
-# output directory using the MATHJAX_RELPATH option. The destination directory
-# should contain the MathJax.js script. For instance, if the mathjax directory
-# is located at the same level as the HTML output directory, then
-# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
-# Content Delivery Network so you can quickly see the result without installing
-# MathJax. However, it is strongly recommended to install a local copy of
-# MathJax from http://www.mathjax.org before deployment.
-# The default value is: http://cdn.mathjax.org/mathjax/latest.
-# This tag requires that the tag USE_MATHJAX is set to YES.
-
-MATHJAX_RELPATH        = http://cdn.mathjax.org/mathjax/latest
-
-# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
-# extension names that should be enabled during MathJax rendering. For example
-# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
-# This tag requires that the tag USE_MATHJAX is set to YES.
-
-MATHJAX_EXTENSIONS     =
-
-# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
-# of code that will be used on startup of the MathJax code. See the MathJax site
-# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
-# example see the documentation.
-# This tag requires that the tag USE_MATHJAX is set to YES.
-
-MATHJAX_CODEFILE       =
-
-# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
-# the HTML output. The underlying search engine uses javascript and DHTML and
-# should work on any modern browser. Note that when using HTML help
-# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
-# there is already a search function so this one should typically be disabled.
-# For large projects the javascript based search engine can be slow, then
-# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
-# search using the keyboard; to jump to the search box use <access key> + S
-# (what the <access key> is depends on the OS and browser, but it is typically
-# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down
-# key> to jump into the search results window, the results can be navigated
-# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel
-# the search. The filter options can be selected when the cursor is inside the
-# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>
-# to select a filter and <Enter> or <escape> to activate or cancel the filter
-# option.
-# The default value is: YES.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-SEARCHENGINE           = YES
-
-# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
-# implemented using a web server instead of a web client using Javascript. There
-# are two flavors of web server based searching depending on the EXTERNAL_SEARCH
-# setting. When disabled, doxygen will generate a PHP script for searching and
-# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
-# and searching needs to be provided by external tools. See the section
-# "External Indexing and Searching" for details.
-# The default value is: NO.
-# This tag requires that the tag SEARCHENGINE is set to YES.
-
-SERVER_BASED_SEARCH    = NO
-
-# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
-# script for searching. Instead the search results are written to an XML file
-# which needs to be processed by an external indexer. Doxygen will invoke an
-# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
-# search results.
-#
-# Doxygen ships with an example indexer (doxyindexer) and search engine
-# (doxysearch.cgi) which are based on the open source search engine library
-# Xapian (see: http://xapian.org/).
-#
-# See the section "External Indexing and Searching" for details.
-# The default value is: NO.
-# This tag requires that the tag SEARCHENGINE is set to YES.
-
-EXTERNAL_SEARCH        = NO
-
-# The SEARCHENGINE_URL should point to a search engine hosted by a web server
-# which will return the search results when EXTERNAL_SEARCH is enabled.
-#
-# Doxygen ships with an example indexer (doxyindexer) and search engine
-# (doxysearch.cgi) which are based on the open source search engine library
-# Xapian (see: http://xapian.org/). See the section "External Indexing and
-# Searching" for details.
-# This tag requires that the tag SEARCHENGINE is set to YES.
-
-SEARCHENGINE_URL       =
-
-# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
-# search data is written to a file for indexing by an external tool. With the
-# SEARCHDATA_FILE tag the name of this file can be specified.
-# The default file is: searchdata.xml.
-# This tag requires that the tag SEARCHENGINE is set to YES.
-
-SEARCHDATA_FILE        = searchdata.xml
-
-# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
-# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
-# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
-# projects and redirect the results back to the right project.
-# This tag requires that the tag SEARCHENGINE is set to YES.
-
-EXTERNAL_SEARCH_ID     =
-
-# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
-# projects other than the one defined by this configuration file, but that are
-# all added to the same external search index. Each project needs to have a
-# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
-# to a relative location where the documentation can be found. The format is:
-# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
-# This tag requires that the tag SEARCHENGINE is set to YES.
-
-EXTRA_SEARCH_MAPPINGS  =
-
-#---------------------------------------------------------------------------
-# Configuration options related to the LaTeX output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.
-# The default value is: YES.
-
-GENERATE_LATEX         = NO
-
-# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
-# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
-# it.
-# The default directory is: latex.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_OUTPUT           = latex
-
-# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
-# invoked.
-#
-# Note that when enabling USE_PDFLATEX this option is only used for generating
-# bitmaps for formulas in the HTML output, but not in the Makefile that is
-# written to the output directory.
-# The default file is: latex.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_CMD_NAME         = latex
-
-# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
-# index for LaTeX.
-# The default file is: makeindex.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-MAKEINDEX_CMD_NAME     = makeindex
-
-# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX
-# documents. This may be useful for small projects and may help to save some
-# trees in general.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-COMPACT_LATEX          = NO
-
-# The PAPER_TYPE tag can be used to set the paper type that is used by the
-# printer.
-# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
-# 14 inches) and executive (7.25 x 10.5 inches).
-# The default value is: a4.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-PAPER_TYPE             = a4
-
-# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
-# that should be included in the LaTeX output. The package can be specified just
-# by its name or with the correct syntax as to be used with the LaTeX
-# \usepackage command. To get the times font for instance you can specify :
-# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times}
-# To use the option intlimits with the amsmath package you can specify:
-# EXTRA_PACKAGES=[intlimits]{amsmath}
-# If left blank no extra packages will be included.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-EXTRA_PACKAGES         =
-
-# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
-# generated LaTeX document. The header should contain everything until the first
-# chapter. If it is left blank doxygen will generate a standard header. See
-# section "Doxygen usage" for information on how to let doxygen write the
-# default header to a separate file.
-#
-# Note: Only use a user-defined header if you know what you are doing! The
-# following commands have a special meaning inside the header: $title,
-# $datetime, $date, $doxygenversion, $projectname, $projectnumber,
-# $projectbrief, $projectlogo. Doxygen will replace $title with the empty
-# string, for the replacement values of the other commands the user is referred
-# to HTML_HEADER.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_HEADER           =
-
-# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
-# generated LaTeX document. The footer should contain everything after the last
-# chapter. If it is left blank doxygen will generate a standard footer. See
-# LATEX_HEADER for more information on how to generate a default footer and what
-# special commands can be used inside the footer.
-#
-# Note: Only use a user-defined footer if you know what you are doing!
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_FOOTER           =
-
-# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined
-# LaTeX style sheets that are included after the standard style sheets created
-# by doxygen. Using this option one can overrule certain style aspects. Doxygen
-# will copy the style sheet files to the output directory.
-# Note: The order of the extra style sheet files is of importance (e.g. the last
-# style sheet in the list overrules the setting of the previous ones in the
-# list).
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_EXTRA_STYLESHEET =
-
-# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
-# other source files which should be copied to the LATEX_OUTPUT output
-# directory. Note that the files will be copied as-is; there are no commands or
-# markers available.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_EXTRA_FILES      =
-
-# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
-# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
-# contain links (just like the HTML output) instead of page references. This
-# makes the output suitable for online browsing using a PDF viewer.
-# The default value is: YES.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-PDF_HYPERLINKS         = YES
-
-# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
-# the PDF file directly from the LaTeX files. Set this option to YES, to get a
-# higher quality PDF documentation.
-# The default value is: YES.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-USE_PDFLATEX           = YES
-
-# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
-# command to the generated LaTeX files. This will instruct LaTeX to keep running
-# if errors occur, instead of asking the user for help. This option is also used
-# when generating formulas in HTML.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_BATCHMODE        = NO
-
-# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
-# index chapters (such as File Index, Compound Index, etc.) in the output.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_HIDE_INDICES     = NO
-
-# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
-# code with syntax highlighting in the LaTeX output.
-#
-# Note that which sources are shown also depends on other settings such as
-# SOURCE_BROWSER.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_SOURCE_CODE      = NO
-
-# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
-# bibliography, e.g. plainnat, or ieeetr. See
-# http://en.wikipedia.org/wiki/BibTeX and \cite for more info.
-# The default value is: plain.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_BIB_STYLE        = plain
-
-# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated
-# page will contain the date and time when the page was generated. Setting this
-# to NO can help when comparing the output of multiple runs.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_TIMESTAMP        = NO
-
-#---------------------------------------------------------------------------
-# Configuration options related to the RTF output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The
-# RTF output is optimized for Word 97 and may not look too pretty with other RTF
-# readers/editors.
-# The default value is: NO.
-
-GENERATE_RTF           = NO
-
-# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
-# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
-# it.
-# The default directory is: rtf.
-# This tag requires that the tag GENERATE_RTF is set to YES.
-
-RTF_OUTPUT             = rtf
-
-# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF
-# documents. This may be useful for small projects and may help to save some
-# trees in general.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_RTF is set to YES.
-
-COMPACT_RTF            = NO
-
-# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
-# contain hyperlink fields. The RTF file will contain links (just like the HTML
-# output) instead of page references. This makes the output suitable for online
-# browsing using Word or some other Word compatible readers that support those
-# fields.
-#
-# Note: WordPad (write) and others do not support links.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_RTF is set to YES.
-
-RTF_HYPERLINKS         = NO
-
-# Load stylesheet definitions from file. Syntax is similar to doxygen's config
-# file, i.e. a series of assignments. You only have to provide replacements,
-# missing definitions are set to their default value.
-#
-# See also section "Doxygen usage" for information on how to generate the
-# default style sheet that doxygen normally uses.
-# This tag requires that the tag GENERATE_RTF is set to YES.
-
-RTF_STYLESHEET_FILE    =
-
-# Set optional variables used in the generation of an RTF document. Syntax is
-# similar to doxygen's config file. A template extensions file can be generated
-# using doxygen -e rtf extensionFile.
-# This tag requires that the tag GENERATE_RTF is set to YES.
-
-RTF_EXTENSIONS_FILE    =
-
-# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code
-# with syntax highlighting in the RTF output.
-#
-# Note that which sources are shown also depends on other settings such as
-# SOURCE_BROWSER.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_RTF is set to YES.
-
-RTF_SOURCE_CODE        = NO
-
-#---------------------------------------------------------------------------
-# Configuration options related to the man page output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for
-# classes and files.
-# The default value is: NO.
-
-GENERATE_MAN           = NO
-
-# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
-# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
-# it. A directory man3 will be created inside the directory specified by
-# MAN_OUTPUT.
-# The default directory is: man.
-# This tag requires that the tag GENERATE_MAN is set to YES.
-
-MAN_OUTPUT             = man
-
-# The MAN_EXTENSION tag determines the extension that is added to the generated
-# man pages. In case the manual section does not start with a number, the number
-# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
-# optional.
-# The default value is: .3.
-# This tag requires that the tag GENERATE_MAN is set to YES.
-
-MAN_EXTENSION          = .3
-
-# The MAN_SUBDIR tag determines the name of the directory created within
-# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by
-# MAN_EXTENSION with the initial . removed.
-# This tag requires that the tag GENERATE_MAN is set to YES.
-
-MAN_SUBDIR             =
-
-# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
-# will generate one additional man file for each entity documented in the real
-# man page(s). These additional files only source the real man page, but without
-# them the man command would be unable to find the correct page.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_MAN is set to YES.
-
-MAN_LINKS              = NO
-
-#---------------------------------------------------------------------------
-# Configuration options related to the XML output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that
-# captures the structure of the code including all documentation.
-# The default value is: NO.
-
-GENERATE_XML           = NO
-
-# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
-# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
-# it.
-# The default directory is: xml.
-# This tag requires that the tag GENERATE_XML is set to YES.
-
-XML_OUTPUT             = xml
-
-# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program
-# listings (including syntax highlighting and cross-referencing information) to
-# the XML output. Note that enabling this will significantly increase the size
-# of the XML output.
-# The default value is: YES.
-# This tag requires that the tag GENERATE_XML is set to YES.
-
-XML_PROGRAMLISTING     = YES
-
-#---------------------------------------------------------------------------
-# Configuration options related to the DOCBOOK output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files
-# that can be used to generate PDF.
-# The default value is: NO.
-
-GENERATE_DOCBOOK       = NO
-
-# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
-# front of it.
-# The default directory is: docbook.
-# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
-
-DOCBOOK_OUTPUT         = docbook
-
-# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the
-# program listings (including syntax highlighting and cross-referencing
-# information) to the DOCBOOK output. Note that enabling this will significantly
-# increase the size of the DOCBOOK output.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
-
-DOCBOOK_PROGRAMLISTING = NO
-
-#---------------------------------------------------------------------------
-# Configuration options for the AutoGen Definitions output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an
-# AutoGen Definitions (see http://autogen.sf.net) file that captures the
-# structure of the code including all documentation. Note that this feature is
-# still experimental and incomplete at the moment.
-# The default value is: NO.
-
-GENERATE_AUTOGEN_DEF   = NO
-
-#---------------------------------------------------------------------------
-# Configuration options related to the Perl module output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module
-# file that captures the structure of the code including all documentation.
-#
-# Note that this feature is still experimental and incomplete at the moment.
-# The default value is: NO.
-
-GENERATE_PERLMOD       = NO
-
-# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary
-# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
-# output from the Perl module output.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_PERLMOD is set to YES.
-
-PERLMOD_LATEX          = NO
-
-# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely
-# formatted so it can be parsed by a human reader. This is useful if you want to
-# understand what is going on. On the other hand, if this tag is set to NO, the
-# size of the Perl module output will be much smaller and Perl will parse it
-# just the same.
-# The default value is: YES.
-# This tag requires that the tag GENERATE_PERLMOD is set to YES.
-
-PERLMOD_PRETTY         = YES
-
-# The names of the make variables in the generated doxyrules.make file are
-# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
-# so different doxyrules.make files included by the same Makefile don't
-# overwrite each other's variables.
-# This tag requires that the tag GENERATE_PERLMOD is set to YES.
-
-PERLMOD_MAKEVAR_PREFIX =
-
-#---------------------------------------------------------------------------
-# Configuration options related to the preprocessor
-#---------------------------------------------------------------------------
-
-# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all
-# C-preprocessor directives found in the sources and include files.
-# The default value is: YES.
-
-ENABLE_PREPROCESSING   = YES
-
-# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names
-# in the source code. If set to NO, only conditional compilation will be
-# performed. Macro expansion can be done in a controlled way by setting
-# EXPAND_ONLY_PREDEF to YES.
-# The default value is: NO.
-# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-
-MACRO_EXPANSION        = NO
-
-# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
-# the macro expansion is limited to the macros specified with the PREDEFINED and
-# EXPAND_AS_DEFINED tags.
-# The default value is: NO.
-# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-
-EXPAND_ONLY_PREDEF     = NO
-
-# If the SEARCH_INCLUDES tag is set to YES, the include files in the
-# INCLUDE_PATH will be searched if a #include is found.
-# The default value is: YES.
-# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-
-SEARCH_INCLUDES        = YES
-
-# The INCLUDE_PATH tag can be used to specify one or more directories that
-# contain include files that are not input files but should be processed by the
-# preprocessor.
-# This tag requires that the tag SEARCH_INCLUDES is set to YES.
-
-INCLUDE_PATH           =
-
-# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
-# patterns (like *.h and *.hpp) to filter out the header-files in the
-# directories. If left blank, the patterns specified with FILE_PATTERNS will be
-# used.
-# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-
-INCLUDE_FILE_PATTERNS  =
-
-# The PREDEFINED tag can be used to specify one or more macro names that are
-# defined before the preprocessor is started (similar to the -D option of e.g.
-# gcc). The argument of the tag is a list of macros of the form: name or
-# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
-# is assumed. To prevent a macro definition from being undefined via #undef or
-# recursively expanded use the := operator instead of the = operator.
-# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-
-PREDEFINED             =
-
-# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
-# tag can be used to specify a list of macro names that should be expanded. The
-# macro definition that is found in the sources will be used. Use the PREDEFINED
-# tag if you want to use a different macro definition that overrules the
-# definition found in the source code.
-# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-
-EXPAND_AS_DEFINED      =
-
-# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
-# remove all references to function-like macros that are alone on a line, have
-# an all uppercase name, and do not end with a semicolon. Such function macros
-# are typically used for boiler-plate code, and will confuse the parser if not
-# removed.
-# The default value is: YES.
-# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-
-SKIP_FUNCTION_MACROS   = YES
-
-#---------------------------------------------------------------------------
-# Configuration options related to external references
-#---------------------------------------------------------------------------
-
-# The TAGFILES tag can be used to specify one or more tag files. For each tag
-# file the location of the external documentation should be added. The format of
-# a tag file without this location is as follows:
-# TAGFILES = file1 file2 ...
-# Adding location for the tag files is done as follows:
-# TAGFILES = file1=loc1 "file2 = loc2" ...
-# where loc1 and loc2 can be relative or absolute paths or URLs. See the
-# section "Linking to external documentation" for more information about the use
-# of tag files.
-# Note: Each tag file must have a unique name (where the name does NOT include
-# the path). If a tag file is not located in the directory in which doxygen is
-# run, you must also specify the path to the tagfile here.
-
-TAGFILES               =
-
-# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
-# tag file that is based on the input files it reads. See section "Linking to
-# external documentation" for more information about the usage of tag files.
-
-GENERATE_TAGFILE       =
-
-# If the ALLEXTERNALS tag is set to YES, all external class will be listed in
-# the class index. If set to NO, only the inherited external classes will be
-# listed.
-# The default value is: NO.
-
-ALLEXTERNALS           = NO
-
-# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed
-# in the modules index. If set to NO, only the current project's groups will be
-# listed.
-# The default value is: YES.
-
-EXTERNAL_GROUPS        = YES
-
-# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in
-# the related pages index. If set to NO, only the current project's pages will
-# be listed.
-# The default value is: YES.
-
-EXTERNAL_PAGES         = YES
-
-# The PERL_PATH should be the absolute path and name of the perl script
-# interpreter (i.e. the result of 'which perl').
-# The default file (with absolute path) is: /usr/bin/perl.
-
-PERL_PATH              = /usr/bin/perl
-
-#---------------------------------------------------------------------------
-# Configuration options related to the dot tool
-#---------------------------------------------------------------------------
-
-# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram
-# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
-# NO turns the diagrams off. Note that this option also works with HAVE_DOT
-# disabled, but it is recommended to install and use dot, since it yields more
-# powerful graphs.
-# The default value is: YES.
-
-CLASS_DIAGRAMS         = YES
-
-# You can define message sequence charts within doxygen comments using the \msc
-# command. Doxygen will then run the mscgen tool (see:
-# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
-# documentation. The MSCGEN_PATH tag allows you to specify the directory where
-# the mscgen tool resides. If left empty the tool is assumed to be found in the
-# default search path.
-
-MSCGEN_PATH            =
-
-# You can include diagrams made with dia in doxygen documentation. Doxygen will
-# then run dia to produce the diagram and insert it in the documentation. The
-# DIA_PATH tag allows you to specify the directory where the dia binary resides.
-# If left empty dia is assumed to be found in the default search path.
-
-DIA_PATH               =
-
-# If set to YES the inheritance and collaboration graphs will hide inheritance
-# and usage relations if the target is undocumented or is not a class.
-# The default value is: YES.
-
-HIDE_UNDOC_RELATIONS   = YES
-
-# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
-# available from the path. This tool is part of Graphviz (see:
-# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
-# Bell Labs. The other options in this section have no effect if this option is
-# set to NO
-# The default value is: YES.
-
-HAVE_DOT               = YES
-
-# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
-# to run in parallel. When set to 0 doxygen will base this on the number of
-# processors available in the system. You can set it explicitly to a value
-# larger than 0 to get control over the balance between CPU load and processing
-# speed.
-# Minimum value: 0, maximum value: 32, default value: 0.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOT_NUM_THREADS        = 0
-
-# When you want a differently looking font in the dot files that doxygen
-# generates you can specify the font name using DOT_FONTNAME. You need to make
-# sure dot is able to find the font, which can be done by putting it in a
-# standard location or by setting the DOTFONTPATH environment variable or by
-# setting DOT_FONTPATH to the directory containing the font.
-# The default value is: Helvetica.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOT_FONTNAME           = Helvetica
-
-# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
-# dot graphs.
-# Minimum value: 4, maximum value: 24, default value: 10.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOT_FONTSIZE           = 10
-
-# By default doxygen will tell dot to use the default font as specified with
-# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
-# the path where dot can find it using this tag.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOT_FONTPATH           =
-
-# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
-# each documented class showing the direct and indirect inheritance relations.
-# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-CLASS_GRAPH            = YES
-
-# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
-# graph for each documented class showing the direct and indirect implementation
-# dependencies (inheritance, containment, and class references variables) of the
-# class with other documented classes.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-COLLABORATION_GRAPH    = YES
-
-# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
-# groups, showing the direct groups dependencies.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-GROUP_GRAPHS           = YES
-
-# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and
-# collaboration diagrams in a style similar to the OMG's Unified Modeling
-# Language.
-# The default value is: NO.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-UML_LOOK               = NO
-
-# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
-# class node. If there are many fields or methods and many nodes the graph may
-# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
-# number of items for each type to make the size more manageable. Set this to 0
-# for no limit. Note that the threshold may be exceeded by 50% before the limit
-# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
-# but if the number exceeds 15, the total amount of fields shown is limited to
-# 10.
-# Minimum value: 0, maximum value: 100, default value: 10.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-UML_LIMIT_NUM_FIELDS   = 10
-
-# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
-# collaboration graphs will show the relations between templates and their
-# instances.
-# The default value is: NO.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-TEMPLATE_RELATIONS     = NO
-
-# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
-# YES then doxygen will generate a graph for each documented file showing the
-# direct and indirect include dependencies of the file with other documented
-# files.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-INCLUDE_GRAPH          = YES
-
-# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
-# set to YES then doxygen will generate a graph for each documented file showing
-# the direct and indirect include dependencies of the file with other documented
-# files.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-INCLUDED_BY_GRAPH      = YES
-
-# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
-# dependency graph for every global function or class method.
-#
-# Note that enabling this option will significantly increase the time of a run.
-# So in most cases it will be better to enable call graphs for selected
-# functions only using the \callgraph command. Disabling a call graph can be
-# accomplished by means of the command \hidecallgraph.
-# The default value is: NO.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-CALL_GRAPH             = NO
-
-# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
-# dependency graph for every global function or class method.
-#
-# Note that enabling this option will significantly increase the time of a run.
-# So in most cases it will be better to enable caller graphs for selected
-# functions only using the \callergraph command. Disabling a caller graph can be
-# accomplished by means of the command \hidecallergraph.
-# The default value is: NO.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-CALLER_GRAPH           = NO
-
-# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
-# hierarchy of all classes instead of a textual one.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-GRAPHICAL_HIERARCHY    = YES
-
-# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
-# dependencies a directory has on other directories in a graphical way. The
-# dependency relations are determined by the #include relations between the
-# files in the directories.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DIRECTORY_GRAPH        = YES
-
-# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
-# generated by dot. For an explanation of the image formats see the section
-# output formats in the documentation of the dot tool (Graphviz (see:
-# http://www.graphviz.org/)).
-# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
-# to make the SVG files visible in IE 9+ (other browsers do not have this
-# requirement).
-# Possible values are: png, png:cairo, png:cairo:cairo, png:cairo:gd, png:gd,
-# png:gd:gd, jpg, jpg:cairo, jpg:cairo:gd, jpg:gd, jpg:gd:gd, gif, gif:cairo,
-# gif:cairo:gd, gif:gd, gif:gd:gd, svg, png:gd, png:gd:gd, png:cairo,
-# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and
-# png:gdiplus:gdiplus.
-# The default value is: png.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOT_IMAGE_FORMAT       = png
-
-# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
-# enable generation of interactive SVG images that allow zooming and panning.
-#
-# Note that this requires a modern browser other than Internet Explorer. Tested
-# and working are Firefox, Chrome, Safari, and Opera.
-# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
-# the SVG files visible. Older versions of IE do not have SVG support.
-# The default value is: NO.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-INTERACTIVE_SVG        = NO
-
-# The DOT_PATH tag can be used to specify the path where the dot tool can be
-# found. If left blank, it is assumed the dot tool can be found in the path.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOT_PATH               =
-
-# The DOTFILE_DIRS tag can be used to specify one or more directories that
-# contain dot files that are included in the documentation (see the \dotfile
-# command).
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOTFILE_DIRS           =
-
-# The MSCFILE_DIRS tag can be used to specify one or more directories that
-# contain msc files that are included in the documentation (see the \mscfile
-# command).
-
-MSCFILE_DIRS           =
-
-# The DIAFILE_DIRS tag can be used to specify one or more directories that
-# contain dia files that are included in the documentation (see the \diafile
-# command).
-
-DIAFILE_DIRS           =
-
-# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
-# path where java can find the plantuml.jar file. If left blank, it is assumed
-# PlantUML is not used or called during a preprocessing step. Doxygen will
-# generate a warning when it encounters a \startuml command in this case and
-# will not generate output for the diagram.
-
-PLANTUML_JAR_PATH      =
-
-# When using plantuml, the specified paths are searched for files specified by
-# the !include statement in a plantuml block.
-
-PLANTUML_INCLUDE_PATH  =
-
-# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
-# that will be shown in the graph. If the number of nodes in a graph becomes
-# larger than this value, doxygen will truncate the graph, which is visualized
-# by representing a node as a red box. Note that doxygen if the number of direct
-# children of the root node in a graph is already larger than
-# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
-# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
-# Minimum value: 0, maximum value: 10000, default value: 50.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOT_GRAPH_MAX_NODES    = 50
-
-# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
-# generated by dot. A depth value of 3 means that only nodes reachable from the
-# root by following a path via at most 3 edges will be shown. Nodes that lay
-# further from the root node will be omitted. Note that setting this option to 1
-# or 2 may greatly reduce the computation time needed for large code bases. Also
-# note that the size of a graph can be further restricted by
-# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
-# Minimum value: 0, maximum value: 1000, default value: 0.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-MAX_DOT_GRAPH_DEPTH    = 0
-
-# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
-# background. This is disabled by default, because dot on Windows does not seem
-# to support this out of the box.
-#
-# Warning: Depending on the platform used, enabling this option may lead to
-# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
-# read).
-# The default value is: NO.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOT_TRANSPARENT        = NO
-
-# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output
-# files in one run (i.e. multiple -o and -T options on the command line). This
-# makes dot run faster, but since only newer versions of dot (>1.8.10) support
-# this, this feature is disabled by default.
-# The default value is: NO.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOT_MULTI_TARGETS      = NO
-
-# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
-# explaining the meaning of the various boxes and arrows in the dot generated
-# graphs.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-GENERATE_LEGEND        = YES
-
-# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot
-# files that are used to generate the various graphs.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOT_CLEANUP            = YES
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_bnProc.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_bnProc.h
index 91f552f935c02d41543c94826dcbf74dfdea01f4..c21169869cb56f7e9245c80365fa6951afcc4acd 100644
--- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_bnProc.h
+++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_bnProc.h
@@ -30,7 +30,7 @@
 
 #ifndef __NR_LDPC_BNPROC__H__
 #define __NR_LDPC_BNPROC__H__
-
+#include <immintrin.h>
 /**
    \brief Performs first part of BN processing on the BN processing buffer and stores the results in the LLR results buffer.
           At every BN, the sum of the returned LLRs from the connected CNs and the LLR of the receiver input is computed.
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_cnProc.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_cnProc.h
index 6d82fe5f11f86ebc924e3a163a56cb1adbd7e36f..f792f993e9c78066328ff859bb14afd9eaa69ca7 100644
--- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_cnProc.h
+++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_cnProc.h
@@ -1,3 +1,4 @@
+
 /*
  * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
  * contributor license agreements.  See the NOTICE file distributed with
@@ -28,8 +29,8 @@
  * \warning
  */
 
-#ifndef __NR_LDPC_CNPROC__H__
-#define __NR_LDPC_CNPROC__H__
+#ifndef __NR_LDPC_DECODER_CNPROC__H__
+#define __NR_LDPC_DECODER_CNPROC__H__
 
 /**
    \brief Performs CN processing for BG2 on the CN processing buffer and stores the results in the CN processing results buffer.
@@ -37,6 +38,13 @@
    \param p_procBuf Pointer to processing buffers
    \param Z Lifting size
 */
+
+
+#ifdef __AVX512BW__
+#include "nrLDPC_cnProc_avx512.h"
+
+#else
+
 static inline void nrLDPC_cnProc_BG2(t_nrLDPC_lut* p_lut, int8_t* cnProcBuf, int8_t* cnProcBufRes, uint16_t Z)
 {
     const uint8_t*  lut_numCnInCnGroups   = p_lut->numCnInCnGroups;
@@ -92,14 +100,14 @@ static inline void nrLDPC_cnProc_BG2(t_nrLDPC_lut* p_lut, int8_t* cnProcBuf, int
             for (i=0; i<M; i++)
             {
                 // Abs and sign of 32 CNs (first BN)
-	      //                ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
-	        ymm0 = pj0[i];
+              //                ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
+                ymm0 = pj0[i];
                 sgn  = _mm256_sign_epi8(*p_ones, ymm0);
                 min  = _mm256_abs_epi8(ymm0);
 
                 // 32 CNs of second BN
-		//  ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][1] + i];
-		ymm0 = pj1[i];
+                //  ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][1] + i];
+                ymm0 = pj1[i];
                 min  = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
                 sgn  = _mm256_sign_epi8(sgn, ymm0);
 
@@ -107,7 +115,7 @@ static inline void nrLDPC_cnProc_BG2(t_nrLDPC_lut* p_lut, int8_t* cnProcBuf, int
                 min = _mm256_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
                 //*p_cnProcBufResBit = _mm256_sign_epi8(min, sgn);
                 //p_cnProcBufResBit++;
-		p_cnProcBufResBit[i]=_mm256_sign_epi8(min, sgn);
+                p_cnProcBufResBit[i]=_mm256_sign_epi8(min, sgn);
             }
         }
     }
@@ -364,6 +372,15 @@ static inline void nrLDPC_cnProc_BG2(t_nrLDPC_lut* p_lut, int8_t* cnProcBuf, int
 
 }
 
+
+/**
+   \brief Performs CN processing for BG1 on the CN processing buffer and stores the results in the CN processing results buffer.
+   \param p_lut Pointer to decoder LUTs
+   \param Z Lifting size
+*/
+
+
+
 /**
    \brief Performs CN processing for BG1 on the CN processing buffer and stores the results in the CN processing results buffer.
    \param p_lut Pointer to decoder LUTs
@@ -431,6 +448,7 @@ static inline void nrLDPC_cnProc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBuf, int
                 min  = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
                 sgn  = _mm256_sign_epi8(sgn, ymm0);
 
+
                 // Store result
                 min = _mm256_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
                 *p_cnProcBufResBit = _mm256_sign_epi8(min, sgn);
@@ -859,6 +877,7 @@ static inline void nrLDPC_cnProc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBuf, int
 
 }
 
+#endif
 /**
    \brief Performs parity check for BG1 on the CN processing buffer. Stops as soon as error is detected.
    \param p_lut Pointer to decoder LUTs
@@ -942,7 +961,8 @@ static inline uint32_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
 
         // If no error pcRes should be 0
         // Only use valid CNs
-        pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
+        if (Mrem)
+          pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
 
         // If PC failed we can stop here
         if (pcResSum > 0)
@@ -1009,7 +1029,8 @@ static inline uint32_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
 
         // If no error pcRes should be 0
         // Only use valid CNs
-        pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
+        if (Mrem)
+          pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
 
         // If PC failed we can stop here
         if (pcResSum > 0)
@@ -1077,7 +1098,8 @@ static inline uint32_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
 
         // If no error pcRes should be 0
         // Only use valid CNs
-        pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
+        if (Mrem)
+          pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
 
         // If PC failed we can stop here
         if (pcResSum > 0)
@@ -1144,7 +1166,8 @@ static inline uint32_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
 
         // If no error pcRes should be 0
         // Only use valid CNs
-        pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
+        if (Mrem)
+          pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
 
         // If PC failed we can stop here
         if (pcResSum > 0)
@@ -1211,7 +1234,8 @@ static inline uint32_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
 
         // If no error pcRes should be 0
         // Only use valid CNs
-        pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
+        if (Mrem)
+          pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
 
         // If PC failed we can stop here
         if (pcResSum > 0)
@@ -1278,7 +1302,8 @@ static inline uint32_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
 
         // If no error pcRes should be 0
         // Only use valid CNs
-        pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
+        if (Mrem)
+          pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
 
         // If PC failed we can stop here
         if (pcResSum > 0)
@@ -1345,7 +1370,8 @@ static inline uint32_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
 
         // If no error pcRes should be 0
         // Only use valid CNs
-        pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
+        if (Mrem)
+          pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
 
         // If PC failed we can stop here
         if (pcResSum > 0)
@@ -1412,7 +1438,8 @@ static inline uint32_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
 
         // If no error pcRes should be 0
         // Only use valid CNs
-        pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
+        if (Mrem)
+          pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
 
         // If PC failed we can stop here
         if (pcResSum > 0)
@@ -1479,7 +1506,8 @@ static inline uint32_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
 
         // If no error pcRes should be 0
         // Only use valid CNs
-        pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
+        if (Mrem)
+          pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
 
         // If PC failed we can stop here
         if (pcResSum > 0)
@@ -1574,7 +1602,8 @@ static inline uint32_t nrLDPC_cnProcPc_BG2(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
 
         // If no error pcRes should be 0
         // Only use valid CNs
-        pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
+        if (Mrem)
+          pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
 
         // If PC failed we can stop here
         if (pcResSum > 0)
@@ -1641,7 +1670,8 @@ static inline uint32_t nrLDPC_cnProcPc_BG2(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
 
         // If no error pcRes should be 0
         // Only use valid CNs
-        pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
+        if (Mrem)
+          pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
 
         // If PC failed we can stop here
         if (pcResSum > 0)
@@ -1708,7 +1738,8 @@ static inline uint32_t nrLDPC_cnProcPc_BG2(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
 
         // If no error pcRes should be 0
         // Only use valid CNs
-        pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
+        if (Mrem)
+          pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
 
         // If PC failed we can stop here
         if (pcResSum > 0)
@@ -1775,7 +1806,8 @@ static inline uint32_t nrLDPC_cnProcPc_BG2(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
 
         // If no error pcRes should be 0
         // Only use valid CNs
-        pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
+        if (Mrem)
+          pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
 
         // If PC failed we can stop here
         if (pcResSum > 0)
@@ -1842,7 +1874,8 @@ static inline uint32_t nrLDPC_cnProcPc_BG2(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
 
         // If no error pcRes should be 0
         // Only use valid CNs
-        pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
+        if (Mrem)
+          pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
 
         // If PC failed we can stop here
         if (pcResSum > 0)
@@ -1909,7 +1942,8 @@ static inline uint32_t nrLDPC_cnProcPc_BG2(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
 
         // If no error pcRes should be 0
         // Only use valid CNs
-        pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
+        if (Mrem)
+          pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
 
         // If PC failed we can stop here
         if (pcResSum > 0)
@@ -1922,3 +1956,6 @@ static inline uint32_t nrLDPC_cnProcPc_BG2(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
 }
 
 #endif
+
+
+
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_cnProc_avx512.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_cnProc_avx512.h
new file mode 100644
index 0000000000000000000000000000000000000000..044f1048e71fc7df3a36f3771465c232f4183d62
--- /dev/null
+++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_cnProc_avx512.h
@@ -0,0 +1,865 @@
+
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+/*!\file nrLDPC_cnProc_avx512.h
+ * \brief Defines the functions for check node processing
+ * \author Sebastian Wagner (TCL Communications) Email: <mailto:sebastian.wagner@tcl.com>
+ * \date 30-09-2021
+ * \version 1.0
+ * \note
+ * \warning
+ */
+
+#ifndef __NR_LDPC_CNPROC__H__
+#define __NR_LDPC_CNPROC__H__
+
+#define conditional_negate(a,b,z) _mm512_mask_sub_epi8(a,_mm512_movepi8_mask(b),z,a)
+static inline void nrLDPC_cnProc_BG2_AVX512(t_nrLDPC_lut* p_lut, int8_t* cnProcBuf, int8_t* cnProcBufRes, uint16_t Z)
+{
+    const uint8_t*  lut_numCnInCnGroups   = p_lut->numCnInCnGroups;
+    const uint32_t* lut_startAddrCnGroups = p_lut->startAddrCnGroups;
+
+    __m512i* p_cnProcBuf;
+    __m512i* p_cnProcBufRes;
+
+    // Number of CNs in Groups
+    uint32_t M;
+    uint32_t i;
+    uint32_t j;
+    uint32_t k;
+    // Offset to each bit within a group in terms of 32 Byte
+    uint32_t bitOffsetInGroup;
+
+    __m512i zmm0, min, sgn, zeros;
+    zeros  = _mm512_setzero_si512();
+//     maxLLR = _mm512_set1_epi8((char)127);
+    __m512i* p_cnProcBufResBit;
+
+    const __m512i* p_ones   = (__m512i*) ones512_epi8;
+    const __m512i* p_maxLLR = (__m512i*) maxLLR512_epi8;
+
+    // LUT with offsets for bits that need to be processed
+    // 1. bit proc requires LLRs of 2. and 3. bit, 2.bits of 1. and 3. etc.
+    // Offsets are in units of bitOffsetInGroup
+    const uint8_t lut_idxCnProcG3[3][2] = {{72,144}, {0,144}, {0,72}};
+
+    // =====================================================================
+    // Process group with 3 BNs
+
+    if (lut_numCnInCnGroups[0] > 0)
+    {
+        // Number of groups of 32 CNs for parallel processing
+        // Ceil for values not divisible by 32
+        M = (lut_numCnInCnGroups[0]*Z + 63)>>6;
+        // Set the offset to each bit within a group in terms of 32 Byte
+        bitOffsetInGroup = (lut_numCnInCnGroups_BG2_R15[0]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 3
+        p_cnProcBuf    = (__m512i*) &cnProcBuf   [lut_startAddrCnGroups[0]];
+        p_cnProcBufRes = (__m512i*) &cnProcBufRes[lut_startAddrCnGroups[0]];
+
+        // Loop over every BN
+        for (j=0; j<3; j++)
+        {
+            // Set of results pointer to correct BN address
+            p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup);
+
+            __m512i *pj0 = &p_cnProcBuf[(lut_idxCnProcG3[j][0]/2)];
+            __m512i *pj1 = &p_cnProcBuf[(lut_idxCnProcG3[j][1]/2)];
+
+            // Loop over CNs
+            for (i=0; i<M; i++)
+            {
+                // Abs and sign of 32 CNs (first BN)
+              //                zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
+                zmm0 = pj0[i];
+                sgn  = _mm512_xor_si512(*p_ones, zmm0);
+                min  = _mm512_abs_epi8(zmm0);
+
+                // 32 CNs of second BN
+                //  zmm0 = p_cnProcBuf[(lut_idxCnProcG3[j][1]/2) + i];
+                zmm0 = pj1[i];
+                min  = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
+                sgn  = _mm512_xor_si512(sgn, zmm0);
+
+                // Store result
+                min = _mm512_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
+                *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);
+                p_cnProcBufResBit++;
+                //p_cnProcBufResBit[i]=_mm512_sign_epi8(min, sgn);
+            }
+        }
+    }
+
+    // =====================================================================
+    // Process group with 4 BNs
+
+    // Offset is 20*384/32 = 240
+    const uint16_t lut_idxCnProcG4[4][3] = {{240,480,720}, {0,480,720}, {0,240,720}, {0,240,480}};
+
+    if (lut_numCnInCnGroups[1] > 0)
+    {
+        // Number of groups of 32 CNs for parallel processing
+        // Ceil for values not divisible by 32
+        M = (lut_numCnInCnGroups[1]*Z + 63)>>6;
+        // Set the offset to each bit within a group in terms of 32 Byte
+        bitOffsetInGroup = (lut_numCnInCnGroups_BG2_R15[1]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 4
+        p_cnProcBuf    = (__m512i*) &cnProcBuf   [lut_startAddrCnGroups[1]];
+        p_cnProcBufRes = (__m512i*) &cnProcBufRes[lut_startAddrCnGroups[1]];
+
+        // Loop over every BN
+        for (j=0; j<4; j++)
+        {
+            // Set of results pointer to correct BN address
+            p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup);
+
+            // Loop over CNs
+            for (i=0; i<M; i++)
+            {
+                // Abs and sign of 32 CNs (first BN)
+                zmm0 = p_cnProcBuf[(lut_idxCnProcG4[j][0]/2) + i];
+                sgn  = _mm512_xor_si512(*p_ones, zmm0);
+                min  = _mm512_abs_epi8(zmm0);
+
+                // Loop over BNs
+                for (k=1; k<3; k++)
+                {
+                    zmm0 = p_cnProcBuf[(lut_idxCnProcG4[j][k]/2) + i];
+                    min  = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
+                   sgn  = _mm512_xor_si512(sgn, zmm0);
+                }
+
+                // Store result
+                min = _mm512_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
+                *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);
+                p_cnProcBufResBit++;
+            }
+        }
+    }
+
+    // =====================================================================
+    // Process group with 5 BNs
+
+    // Offset is 9*384/32 = 108
+    const uint16_t lut_idxCnProcG5[5][4] = {{108,216,324,432}, {0,216,324,432},
+                                            {0,108,324,432}, {0,108,216,432}, {0,108,216,324}};
+
+    if (lut_numCnInCnGroups[2] > 0)
+    {
+        // Number of groups of 32 CNs for parallel processing
+        // Ceil for values not divisible by 32
+        M = (lut_numCnInCnGroups[2]*Z + 63)>>6;
+        // Set the offset to each bit within a group in terms of 32 Byte
+        bitOffsetInGroup = (lut_numCnInCnGroups_BG2_R15[2]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 5
+        p_cnProcBuf    = (__m512i*) &cnProcBuf   [lut_startAddrCnGroups[2]];
+        p_cnProcBufRes = (__m512i*) &cnProcBufRes[lut_startAddrCnGroups[2]];
+
+        // Loop over every BN
+        for (j=0; j<5; j++)
+        {
+            // Set of results pointer to correct BN address
+            p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup);
+
+            // Loop over CNs
+            for (i=0; i<M; i++)
+            {
+                // Abs and sign of 32 CNs (first BN)
+                zmm0 = p_cnProcBuf[(lut_idxCnProcG5[j][0]/2) + i];
+                sgn  = _mm512_xor_si512(*p_ones, zmm0);
+                min  = _mm512_abs_epi8(zmm0);
+
+                // Loop over BNs
+                for (k=1; k<4; k++)
+                {
+                    zmm0 = p_cnProcBuf[(lut_idxCnProcG5[j][k]/2) + i];
+                    min  = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
+                   sgn  = _mm512_xor_si512(sgn, zmm0);
+                }
+
+                // Store result
+                min = _mm512_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
+                *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);
+                p_cnProcBufResBit++;
+            }
+        }
+    }
+
+    // =====================================================================
+    // Process group with 6 BNs
+
+    // Offset is 3*384/32 = 36
+    const uint16_t lut_idxCnProcG6[6][5] = {{36,72,108,144,180}, {0,72,108,144,180},
+                                            {0,36,108,144,180}, {0,36,72,144,180},
+                                            {0,36,72,108,180}, {0,36,72,108,144}};
+
+    if (lut_numCnInCnGroups[3] > 0)
+    {
+        // Number of groups of 32 CNs for parallel processing
+        // Ceil for values not divisible by 32
+        M = (lut_numCnInCnGroups[3]*Z + 63)>>6;
+        // Set the offset to each bit within a group in terms of 32 Byte
+        bitOffsetInGroup = (lut_numCnInCnGroups_BG2_R15[3]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 6
+        p_cnProcBuf    = (__m512i*) &cnProcBuf   [lut_startAddrCnGroups[3]];
+        p_cnProcBufRes = (__m512i*) &cnProcBufRes[lut_startAddrCnGroups[3]];
+
+        // Loop over every BN
+        for (j=0; j<6; j++)
+        {
+            // Set of results pointer to correct BN address
+            p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup);
+
+            // Loop over CNs
+            for (i=0; i<M; i++)
+            {
+                // Abs and sign of 32 CNs (first BN)
+                zmm0 = p_cnProcBuf[(lut_idxCnProcG6[j][0]/2) + i];
+                sgn  = _mm512_xor_si512(*p_ones, zmm0);
+                min  = _mm512_abs_epi8(zmm0);
+
+                // Loop over BNs
+                for (k=1; k<5; k++)
+                {
+                    zmm0 = p_cnProcBuf[(lut_idxCnProcG6[j][k]/2) + i];
+                    min  = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
+                   sgn  = _mm512_xor_si512(sgn, zmm0);
+                }
+
+                // Store result
+                min = _mm512_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
+                *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);
+                p_cnProcBufResBit++;
+            }
+        }
+    }
+
+    // =====================================================================
+    // Process group with 8 BNs
+
+    // Offset is 2*384/32 = 24
+    const uint8_t lut_idxCnProcG8[8][7] = {{24,48,72,96,120,144,168}, {0,48,72,96,120,144,168},
+                                           {0,24,72,96,120,144,168}, {0,24,48,96,120,144,168},
+                                           {0,24,48,72,120,144,168}, {0,24,48,72,96,144,168},
+                                           {0,24,48,72,96,120,168}, {0,24,48,72,96,120,144}};
+
+    if (lut_numCnInCnGroups[4] > 0)
+    {
+        // Number of groups of 32 CNs for parallel processing
+        // Ceil for values not divisible by 32
+        M = (lut_numCnInCnGroups[4]*Z + 63)>>6;
+        // Set the offset to each bit within a group in terms of 32 Byte
+        bitOffsetInGroup = (lut_numCnInCnGroups_BG2_R15[4]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 8
+        p_cnProcBuf    = (__m512i*) &cnProcBuf   [lut_startAddrCnGroups[4]];
+        p_cnProcBufRes = (__m512i*) &cnProcBufRes[lut_startAddrCnGroups[4]];
+
+        // Loop over every BN
+        for (j=0; j<8; j++)
+        {
+            // Set of results pointer to correct BN address
+            p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup);
+
+            // Loop over CNs
+            for (i=0; i<M; i++)
+            {
+                // Abs and sign of 32 CNs (first BN)
+                zmm0 = p_cnProcBuf[(lut_idxCnProcG8[j][0]/2) + i];
+                sgn  = _mm512_xor_si512(*p_ones, zmm0);
+                min  = _mm512_abs_epi8(zmm0);
+
+                // Loop over BNs
+                for (k=1; k<7; k++)
+                {
+                    zmm0 = p_cnProcBuf[(lut_idxCnProcG8[j][k]/2) + i];
+                    min  = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
+                   sgn  = _mm512_xor_si512(sgn, zmm0);
+                }
+
+                // Store result
+                min = _mm512_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
+                *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);
+                p_cnProcBufResBit++;
+            }
+        }
+    }
+
+    // =====================================================================
+    // Process group with 10 BNs
+
+    // Offset is 2*384/32 = 24
+    const uint8_t lut_idxCnProcG10[10][9] = {{24,48,72,96,120,144,168,192,216}, {0,48,72,96,120,144,168,192,216},
+                                             {0,24,72,96,120,144,168,192,216}, {0,24,48,96,120,144,168,192,216},
+                                             {0,24,48,72,120,144,168,192,216}, {0,24,48,72,96,144,168,192,216},
+                                             {0,24,48,72,96,120,168,192,216}, {0,24,48,72,96,120,144,192,216},
+                                             {0,24,48,72,96,120,144,168,216}, {0,24,48,72,96,120,144,168,192}};
+
+    if (lut_numCnInCnGroups[5] > 0)
+    {
+        // Number of groups of 32 CNs for parallel processing
+        // Ceil for values not divisible by 32
+        M = (lut_numCnInCnGroups[5]*Z + 63)>>6;
+        // Set the offset to each bit within a group in terms of 32 Byte
+        bitOffsetInGroup = (lut_numCnInCnGroups_BG2_R15[5]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 10
+        p_cnProcBuf    = (__m512i*) &cnProcBuf   [lut_startAddrCnGroups[5]];
+        p_cnProcBufRes = (__m512i*) &cnProcBufRes[lut_startAddrCnGroups[5]];
+
+        // Loop over every BN
+        for (j=0; j<10; j++)
+        {
+            // Set of results pointer to correct BN address
+            p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup);
+
+            // Loop over CNs
+            for (i=0; i<M; i++)
+            {
+                // Abs and sign of 32 CNs (first BN)
+                zmm0 = p_cnProcBuf[(lut_idxCnProcG10[j][0]/2) + i];
+                sgn  = _mm512_xor_si512(*p_ones, zmm0);
+                min  = _mm512_abs_epi8(zmm0);
+
+                // Loop over BNs
+                for (k=1; k<9; k++)
+                {
+                    zmm0 = p_cnProcBuf[(lut_idxCnProcG10[j][k]/2) + i];
+                    min  = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
+                   sgn  = _mm512_xor_si512(sgn, zmm0);
+                }
+
+                // Store result
+                min = _mm512_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
+                *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);
+                p_cnProcBufResBit++;
+            }
+        }
+    }
+
+}
+
+static inline void nrLDPC_cnProc_BG1_AVX512(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_procBuf, uint16_t Z)
+{
+    const uint8_t*  lut_numCnInCnGroups   = p_lut->numCnInCnGroups;
+    const uint32_t* lut_startAddrCnGroups = p_lut->startAddrCnGroups;
+
+    int8_t* cnProcBuf    = p_procBuf->cnProcBuf;
+    int8_t* cnProcBufRes = p_procBuf->cnProcBufRes;
+
+    __m512i* p_cnProcBuf;
+    __m512i* p_cnProcBufRes;
+
+    // Number of CNs in Groups
+    uint32_t M;
+    uint32_t i;
+    uint32_t j;
+    uint32_t k;
+    // Offset to each bit within a group in terms of 32 Byte
+    uint32_t bitOffsetInGroup;
+
+    __m512i zmm0, min, sgn, zeros;
+
+     zeros  = _mm512_setzero_si512();
+    // maxLLR = _mm512_set1_epi8((char)127);
+    __m512i* p_cnProcBufResBit;
+
+
+    const __m512i* p_ones   = (__m512i*) ones512_epi8;
+    const __m512i* p_maxLLR = (__m512i*) maxLLR512_epi8;
+
+
+
+
+    // LUT with offsets for bits that need to be processed
+    // 1. bit proc requires LLRs of 2. and 3. bit, 2.bits of 1. and 3. etc.
+    // Offsets are in units of bitOffsetInGroup (1*384/32)
+    const uint8_t lut_idxCnProcG3[3][2] = {{12,24}, {0,24}, {0,12}};
+
+    // =====================================================================
+    // Process group with 3 BNs
+
+    if (lut_numCnInCnGroups[0] > 0)
+    {
+        // Number of groups of 32 CNs for parallel processing
+        // Ceil for values not divisible by 32
+        M = (lut_numCnInCnGroups[0]*Z + 63)>>6;
+
+        // Set the offset to each bit within a group in terms of 32 Byte
+        bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[0]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 3
+        p_cnProcBuf    = (__m512i*) &cnProcBuf   [lut_startAddrCnGroups[0]];
+        p_cnProcBufRes = (__m512i*) &cnProcBufRes[lut_startAddrCnGroups[0]];
+
+        // Loop over every BN
+        for (j=0; j<3; j++)
+        {
+            // Set of results pointer to correct BN address
+            p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup);
+
+            // Loop over CNs
+            for (i=0; i<M; i++)
+            {
+                // Abs and sign of 32 CNs (first BN)
+                zmm0 = p_cnProcBuf[(lut_idxCnProcG3[j][0]/2) + i];
+                sgn  = _mm512_xor_si512(*p_ones, zmm0);
+                min  = _mm512_abs_epi8(zmm0);
+
+                // 32 CNs of second BN
+                zmm0 = p_cnProcBuf[(lut_idxCnProcG3[j][1]/2) + i];
+                min  = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
+               sgn  = _mm512_xor_si512(sgn, zmm0);
+
+
+                // Store result
+                min = _mm512_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
+                *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);
+                p_cnProcBufResBit++;
+            }
+        }
+    }
+
+    // =====================================================================
+    // Process group with 4 BNs
+
+    // Offset is 5*384/32 = 60
+    const uint8_t lut_idxCnProcG4[4][3] = {{60,120,180}, {0,120,180}, {0,60,180}, {0,60,120}};
+
+    if (lut_numCnInCnGroups[1] > 0)
+    {
+        // Number of groups of 32 CNs for parallel processing
+        // Ceil for values not divisible by 32
+        M = (lut_numCnInCnGroups[1]*Z + 63)>>6;
+
+        // Set the offset to each bit within a group in terms of 32 Byte
+        bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[1]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 4
+        p_cnProcBuf    = (__m512i*) &cnProcBuf   [lut_startAddrCnGroups[1]];
+        p_cnProcBufRes = (__m512i*) &cnProcBufRes[lut_startAddrCnGroups[1]];
+
+        // Loop over every BN
+        for (j=0; j<4; j++)
+        {
+            // Set of results pointer to correct BN address
+            p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup);
+
+            // Loop over CNs
+            for (i=0; i<M; i++)
+            {
+                // Abs and sign of 32 CNs (first BN)
+                zmm0 = p_cnProcBuf[(lut_idxCnProcG4[j][0]/2) + i];
+                sgn  = _mm512_xor_si512(*p_ones, zmm0);
+                min  = _mm512_abs_epi8(zmm0);
+
+                // Loop over BNs
+                for (k=1; k<3; k++)
+                {
+                    zmm0 = p_cnProcBuf[(lut_idxCnProcG4[j][k]/2) + i];
+                    min  = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
+                   sgn  = _mm512_xor_si512(sgn, zmm0);
+                }
+
+                // Store result
+                min = _mm512_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
+                *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);
+                p_cnProcBufResBit++;
+            }
+        }
+    }
+
+    // =====================================================================
+    // Process group with 5 BNs
+
+    // Offset is 18*384/32 = 216
+    const uint16_t lut_idxCnProcG5[5][4] = {{216,432,648,864}, {0,432,648,864},
+                                            {0,216,648,864}, {0,216,432,864}, {0,216,432,648}};
+
+    if (lut_numCnInCnGroups[2] > 0)
+    {
+        // Number of groups of 32 CNs for parallel processing
+        // Ceil for values not divisible by 32
+        M = (lut_numCnInCnGroups[2]*Z + 63)>>6;
+
+        // Set the offset to each bit within a group in terms of 32 Byte
+        bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[2]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 5
+        p_cnProcBuf    = (__m512i*) &cnProcBuf   [lut_startAddrCnGroups[2]];
+        p_cnProcBufRes = (__m512i*) &cnProcBufRes[lut_startAddrCnGroups[2]];
+
+        // Loop over every BN
+        for (j=0; j<5; j++)
+        {
+            // Set of results pointer to correct BN address
+            p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup);
+
+            // Loop over CNs
+            for (i=0; i<M; i++)
+            {
+                // Abs and sign of 32 CNs (first BN)
+                zmm0 = p_cnProcBuf[(lut_idxCnProcG5[j][0]/2) + i];
+                sgn  = _mm512_xor_si512(*p_ones, zmm0);
+                min  = _mm512_abs_epi8(zmm0);
+
+                // Loop over BNs
+                for (k=1; k<4; k++)
+                {
+                    zmm0 = p_cnProcBuf[(lut_idxCnProcG5[j][k]/2) + i];
+                    min  = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
+                   sgn  = _mm512_xor_si512(sgn, zmm0);
+                }
+
+                // Store result
+                min = _mm512_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
+                *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);
+                p_cnProcBufResBit++;
+            }
+        }
+    }
+
+    // =====================================================================
+    // Process group with 6 BNs
+
+    // Offset is 8*384/32 = 96
+    const uint16_t lut_idxCnProcG6[6][5] = {{96,192,288,384,480}, {0,192,288,384,480},
+                                            {0,96,288,384,480}, {0,96,192,384,480},
+                                            {0,96,192,288,480}, {0,96,192,288,384}};
+
+    if (lut_numCnInCnGroups[3] > 0)
+    {
+        // Number of groups of 32 CNs for parallel processing
+        // Ceil for values not divisible by 32
+        M = (lut_numCnInCnGroups[3]*Z + 63)>>6;
+
+        // Set the offset to each bit within a group in terms of 32 Byte
+        bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[3]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 6
+        p_cnProcBuf    = (__m512i*) &cnProcBuf   [lut_startAddrCnGroups[3]];
+        p_cnProcBufRes = (__m512i*) &cnProcBufRes[lut_startAddrCnGroups[3]];
+
+        // Loop over every BN
+        for (j=0; j<6; j++)
+        {
+            // Set of results pointer to correct BN address
+            p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup);
+
+            // Loop over CNs
+            for (i=0; i<M; i++)
+            {
+                // Abs and sign of 32 CNs (first BN)
+                zmm0 = p_cnProcBuf[(lut_idxCnProcG6[j][0]/2) + i];
+                sgn  = _mm512_xor_si512(*p_ones, zmm0);
+                min  = _mm512_abs_epi8(zmm0);
+
+                // Loop over BNs
+                for (k=1; k<5; k++)
+                {
+                    zmm0 = p_cnProcBuf[(lut_idxCnProcG6[j][k]/2) + i];
+                    min  = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
+                   sgn  = _mm512_xor_si512(sgn, zmm0);
+                }
+
+                // Store result
+                min = _mm512_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
+                *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);
+                p_cnProcBufResBit++;
+            }
+        }
+    }
+
+    // =====================================================================
+    // Process group with 7 BNs
+
+    // Offset is 5*384/32 = 60
+    const uint16_t lut_idxCnProcG7[7][6] = {{60,120,180,240,300,360}, {0,120,180,240,300,360},
+                                            {0,60,180,240,300,360},   {0,60,120,240,300,360},
+                                            {0,60,120,180,300,360},   {0,60,120,180,240,360},
+                                            {0,60,120,180,240,300}};
+
+    if (lut_numCnInCnGroups[4] > 0)
+    {
+        // Number of groups of 32 CNs for parallel processing
+        // Ceil for values not divisible by 32
+        M = (lut_numCnInCnGroups[4]*Z + 63)>>6;
+
+        // Set the offset to each bit within a group in terms of 32 Byte
+        bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[4]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 7
+        p_cnProcBuf    = (__m512i*) &cnProcBuf   [lut_startAddrCnGroups[4]];
+        p_cnProcBufRes = (__m512i*) &cnProcBufRes[lut_startAddrCnGroups[4]];
+
+        // Loop over every BN
+        for (j=0; j<7; j++)
+        {
+            // Set of results pointer to correct BN address
+            p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup);
+
+            // Loop over CNs
+            for (i=0; i<M; i++)
+            {
+                // Abs and sign of 32 CNs (first BN)
+                zmm0 = p_cnProcBuf[(lut_idxCnProcG7[j][0]/2) + i];
+                sgn  = _mm512_xor_si512(*p_ones, zmm0);
+                min  = _mm512_abs_epi8(zmm0);
+
+                // Loop over BNs
+                for (k=1; k<6; k++)
+                {
+                    zmm0 = p_cnProcBuf[(lut_idxCnProcG7[j][k]/2) + i];
+                    min  = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
+                   sgn  = _mm512_xor_si512(sgn, zmm0);
+                }
+
+                // Store result
+                min = _mm512_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
+                *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);
+                p_cnProcBufResBit++;
+            }
+        }
+    }
+
+    // =====================================================================
+    // Process group with 8 BNs
+
+    // Offset is 2*384/32 = 24
+    const uint8_t lut_idxCnProcG8[8][7] = {{24,48,72,96,120,144,168}, {0,48,72,96,120,144,168},
+                                           {0,24,72,96,120,144,168}, {0,24,48,96,120,144,168},
+                                           {0,24,48,72,120,144,168}, {0,24,48,72,96,144,168},
+                                           {0,24,48,72,96,120,168}, {0,24,48,72,96,120,144}};
+
+    if (lut_numCnInCnGroups[5] > 0)
+    {
+        // Number of groups of 32 CNs for parallel processing
+        // Ceil for values not divisible by 32
+        M = (lut_numCnInCnGroups[5]*Z + 63)>>6;
+
+        // Set the offset to each bit within a group in terms of 32 Byte
+        bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[5]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 8
+        p_cnProcBuf    = (__m512i*) &cnProcBuf   [lut_startAddrCnGroups[5]];
+        p_cnProcBufRes = (__m512i*) &cnProcBufRes[lut_startAddrCnGroups[5]];
+
+        // Loop over every BN
+        for (j=0; j<8; j++)
+        {
+            // Set of results pointer to correct BN address
+            p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup);
+
+            // Loop over CNs
+            for (i=0; i<M; i++)
+            {
+                // Abs and sign of 32 CNs (first BN)
+                zmm0 = p_cnProcBuf[(lut_idxCnProcG8[j][0]/2) + i];
+                sgn  = _mm512_xor_si512(*p_ones, zmm0);
+                min  = _mm512_abs_epi8(zmm0);
+
+                // Loop over BNs
+                for (k=1; k<7; k++)
+                {
+                    zmm0 = p_cnProcBuf[(lut_idxCnProcG8[j][k]/2) + i];
+                    min  = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
+                   sgn  = _mm512_xor_si512(sgn, zmm0);
+                }
+
+                // Store result
+                min = _mm512_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
+                *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);
+                p_cnProcBufResBit++;
+            }
+        }
+    }
+
+    // =====================================================================
+    // Process group with 9 BNs
+
+    // Offset is 2*384/32 = 24
+    const uint8_t lut_idxCnProcG9[9][8] = {{24,48,72,96,120,144,168,192}, {0,48,72,96,120,144,168,192},
+                                           {0,24,72,96,120,144,168,192}, {0,24,48,96,120,144,168,192},
+                                           {0,24,48,72,120,144,168,192}, {0,24,48,72,96,144,168,192},
+                                           {0,24,48,72,96,120,168,192}, {0,24,48,72,96,120,144,192},
+                                           {0,24,48,72,96,120,144,168}};
+
+    if (lut_numCnInCnGroups[6] > 0)
+    {
+        // Number of groups of 32 CNs for parallel processing
+        // Ceil for values not divisible by 32
+        M = (lut_numCnInCnGroups[6]*Z + 63)>>6;
+
+        // Set the offset to each bit within a group in terms of 32 Byte
+        bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[6]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 9
+        p_cnProcBuf    = (__m512i*) &cnProcBuf   [lut_startAddrCnGroups[6]];
+        p_cnProcBufRes = (__m512i*) &cnProcBufRes[lut_startAddrCnGroups[6]];
+
+        // Loop over every BN
+        for (j=0; j<9; j++)
+        {
+            // Set of results pointer to correct BN address
+            p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup);
+
+            // Loop over CNs
+            for (i=0; i<M; i++)
+            {
+                // Abs and sign of 32 CNs (first BN)
+                zmm0 = p_cnProcBuf[(lut_idxCnProcG9[j][0]/2) + i];
+                sgn  = _mm512_xor_si512(*p_ones, zmm0);
+                min  = _mm512_abs_epi8(zmm0);
+
+                // Loop over BNs
+                for (k=1; k<8; k++)
+                {
+                    zmm0 = p_cnProcBuf[(lut_idxCnProcG9[j][k]/2) + i];
+                    min  = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
+                   sgn  = _mm512_xor_si512(sgn, zmm0);
+                }
+
+                // Store result
+                min = _mm512_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
+                *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);
+                p_cnProcBufResBit++;
+            }
+        }
+    }
+
+    // =====================================================================
+    // Process group with 10 BNs
+
+    // Offset is 1*384/32 = 12
+    const uint8_t lut_idxCnProcG10[10][9] = {{12,24,36,48,60,72,84,96,108}, {0,24,36,48,60,72,84,96,108},
+                                             {0,12,36,48,60,72,84,96,108}, {0,12,24,48,60,72,84,96,108},
+                                             {0,12,24,36,60,72,84,96,108}, {0,12,24,36,48,72,84,96,108},
+                                             {0,12,24,36,48,60,84,96,108}, {0,12,24,36,48,60,72,96,108},
+                                             {0,12,24,36,48,60,72,84,108}, {0,12,24,36,48,60,72,84,96}};
+
+    if (lut_numCnInCnGroups[7] > 0)
+    {
+        // Number of groups of 32 CNs for parallel processing
+        // Ceil for values not divisible by 32
+        M = (lut_numCnInCnGroups[7]*Z + 63)>>6;
+
+        // Set the offset to each bit within a group in terms of 32 Byte
+        bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[7]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 10
+        p_cnProcBuf    = (__m512i*) &cnProcBuf   [lut_startAddrCnGroups[7]];
+        p_cnProcBufRes = (__m512i*) &cnProcBufRes[lut_startAddrCnGroups[7]];
+
+        // Loop over every BN
+        for (j=0; j<10; j++)
+        {
+            // Set of results pointer to correct BN address
+            p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup);
+
+            // Loop over CNs
+            for (i=0; i<M; i++)
+            {
+                // Abs and sign of 32 CNs (first BN)
+                zmm0 = p_cnProcBuf[(lut_idxCnProcG10[j][0]/2) + i];
+                sgn  = _mm512_xor_si512(*p_ones, zmm0);
+                min  = _mm512_abs_epi8(zmm0);
+
+                // Loop over BNs
+                for (k=1; k<9; k++)
+                {
+                    zmm0 = p_cnProcBuf[(lut_idxCnProcG10[j][k]/2) + i];
+                    min  = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
+                   sgn  = _mm512_xor_si512(sgn, zmm0);
+                }
+
+                // Store result
+                min = _mm512_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
+                *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);
+                p_cnProcBufResBit++;
+            }
+        }
+    }
+
+    // =====================================================================
+    // Process group with 19 BNs
+
+    // Offset is 4*384/32 = 12
+    const uint16_t lut_idxCnProcG19[19][18] = {{48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, {0,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864},
+                                               {0,48,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, {0,48,96,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864},
+                                               {0,48,96,144,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, {0,48,96,144,192,288,336,384,432,480,528,576,624,672,720,768,816,864},
+                                               {0,48,96,144,192,240,336,384,432,480,528,576,624,672,720,768,816,864}, {0,48,96,144,192,240,288,384,432,480,528,576,624,672,720,768,816,864},
+                                               {0,48,96,144,192,240,288,336,432,480,528,576,624,672,720,768,816,864}, {0,48,96,144,192,240,288,336,384,480,528,576,624,672,720,768,816,864},
+                                               {0,48,96,144,192,240,288,336,384,432,528,576,624,672,720,768,816,864}, {0,48,96,144,192,240,288,336,384,432,480,576,624,672,720,768,816,864},
+                                               {0,48,96,144,192,240,288,336,384,432,480,528,624,672,720,768,816,864}, {0,48,96,144,192,240,288,336,384,432,480,528,576,672,720,768,816,864},
+                                               {0,48,96,144,192,240,288,336,384,432,480,528,576,624,720,768,816,864}, {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,768,816,864},
+                                               {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,816,864}, {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,864},
+                                               {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816}};
+
+    if (lut_numCnInCnGroups[8] > 0)
+    {
+        // Number of groups of 32 CNs for parallel processing
+        // Ceil for values not divisible by 32
+        M = (lut_numCnInCnGroups[8]*Z + 63)>>6;
+
+        // Set the offset to each bit within a group in terms of 32 Byte
+        bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[8]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 19
+        p_cnProcBuf    = (__m512i*) &cnProcBuf   [lut_startAddrCnGroups[8]];
+        p_cnProcBufRes = (__m512i*) &cnProcBufRes[lut_startAddrCnGroups[8]];
+
+        // Loop over every BN
+        for (j=0; j<19; j++)
+        {
+            // Set of results pointer to correct BN address
+            p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup);
+
+            // Loop over CNs
+            for (i=0; i<M; i++)
+            {
+                // Abs and sign of 32 CNs (first BN)
+                zmm0 = p_cnProcBuf[(lut_idxCnProcG19[j][0]/2) + i];
+                sgn  = _mm512_xor_si512(*p_ones, zmm0);
+                min  = _mm512_abs_epi8(zmm0);
+
+                // Loop over BNs
+                for (k=1; k<18; k++)
+                {
+                    zmm0 = p_cnProcBuf[(lut_idxCnProcG19[j][k]/2) + i];
+                    min  = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
+                   sgn  = _mm512_xor_si512(sgn, zmm0);
+                }
+
+                // Store result
+                min = _mm512_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
+                *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);
+                p_cnProcBufResBit++;
+            }
+        }
+    }
+
+}
+#endif
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c
index bf0f401e9746d7d48bf571dc2066cb68288d0689..0ab3ea8e6b17b35b585af4687a5b902406559028 100644
--- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c
+++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c
@@ -1,3 +1,5 @@
+
+
 /*
  * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
  * contributor license agreements.  See the NOTICE file distributed with
@@ -20,14 +22,8 @@
  */
 
 /*!\file nrLDPC_decoder.c
- * \brief Defines the LDPC decoder
- * \author Sebastian Wagner (TCL Communications) Email: <mailto:sebastian.wagner@tcl.com>
- * \date 30-09-2019
- * \version 2.0
- * \note
- * \warning
- */
-
+ * \brief Defines thenrLDPC decoder
+*/
 
 #include <stdint.h>
 #include <immintrin.h>
@@ -37,6 +33,83 @@
 #include "nrLDPC_mPass.h"
 #include "nrLDPC_cnProc.h"
 #include "nrLDPC_bnProc.h"
+#define UNROLL_CN_PROC 1
+#define UNROLL_BN_PROC 1
+#define UNROLL_BN_PROC_PC 1
+#define UNROLL_BN2CN_PROC 1
+/*----------------------------------------------------------------------
+|                  cn processing files -->AVX512
+/----------------------------------------------------------------------*/
+
+//BG1-------------------------------------------------------------------
+#ifdef __AVX512BW__
+
+#include "cnProc_avx512/nrLDPC_cnProc_BG1_R13_AVX512.h"
+#include "cnProc_avx512/nrLDPC_cnProc_BG1_R23_AVX512.h"
+#include "cnProc_avx512/nrLDPC_cnProc_BG1_R89_AVX512.h"
+//BG2-------------------------------------------------------------------
+#include "cnProc_avx512/nrLDPC_cnProc_BG2_R15_AVX512.h"
+#include "cnProc_avx512/nrLDPC_cnProc_BG2_R13_AVX512.h"
+#include "cnProc_avx512/nrLDPC_cnProc_BG2_R23_AVX512.h"
+
+#else
+
+/*----------------------------------------------------------------------
+|                  cn Processing files -->AVX2
+/----------------------------------------------------------------------*/
+
+//BG1------------------------------------------------------------------
+#include "cnProc/nrLDPC_cnProc_BG1_R13_AVX2.h"
+#include "cnProc/nrLDPC_cnProc_BG1_R23_AVX2.h"
+#include "cnProc/nrLDPC_cnProc_BG1_R89_AVX2.h"
+//BG2 --------------------------------------------------------------------
+#include "cnProc/nrLDPC_cnProc_BG2_R15_AVX2.h"
+#include "cnProc/nrLDPC_cnProc_BG2_R13_AVX2.h"
+#include "cnProc/nrLDPC_cnProc_BG2_R23_AVX2.h"
+
+#endif
+
+/*----------------------------------------------------------------------
+|                 bn Processing files -->AVX2
+/----------------------------------------------------------------------*/
+
+//bnProcPc-------------------------------------------------------------
+//BG1------------------------------------------------------------------
+#include "bnProcPc/nrLDPC_bnProcPc_BG1_R13_AVX2.h"
+#include "bnProcPc/nrLDPC_bnProcPc_BG1_R23_AVX2.h"
+#include "bnProcPc/nrLDPC_bnProcPc_BG1_R89_AVX2.h"
+//BG2 --------------------------------------------------------------------
+#include "bnProcPc/nrLDPC_bnProcPc_BG2_R15_AVX2.h"
+#include "bnProcPc/nrLDPC_bnProcPc_BG2_R13_AVX2.h"
+#include "bnProcPc/nrLDPC_bnProcPc_BG2_R23_AVX2.h"
+
+//bnProc----------------------------------------------------------------
+
+#ifdef __AVX512BW__
+//BG1-------------------------------------------------------------------
+#include "bnProc_avx512/nrLDPC_bnProc_BG1_R13_AVX512.h"
+#include "bnProc_avx512/nrLDPC_bnProc_BG1_R23_AVX512.h"
+#include "bnProc_avx512/nrLDPC_bnProc_BG1_R89_AVX512.h"
+//BG2 --------------------------------------------------------------------
+#include "bnProc_avx512/nrLDPC_bnProc_BG2_R15_AVX512.h"
+#include "bnProc_avx512/nrLDPC_bnProc_BG2_R13_AVX512.h"
+#include "bnProc_avx512/nrLDPC_bnProc_BG2_R23_AVX512.h"
+
+#else
+#include "bnProc/nrLDPC_bnProc_BG1_R13_AVX2.h"
+#include "bnProc/nrLDPC_bnProc_BG1_R23_AVX2.h"
+#include "bnProc/nrLDPC_bnProc_BG1_R89_AVX2.h"
+//BG2 --------------------------------------------------------------------
+#include "bnProc/nrLDPC_bnProc_BG2_R15_AVX2.h"
+#include "bnProc/nrLDPC_bnProc_BG2_R13_AVX2.h"
+#include "bnProc/nrLDPC_bnProc_BG2_R23_AVX2.h"
+
+#endif
+
+
+
+
+
 
 #define NR_LDPC_ENABLE_PARITY_CHECK
 //#define NR_LDPC_PROFILER_DETAIL
@@ -66,28 +139,31 @@ int32_t nrLDPC_decod(t_nrLDPC_dec_params* p_decParams, int8_t* p_llr, int8_t* p_
 }
 
 /**
-   \brief Performs LDPC decoding of one code block
+   \brief PerformsnrLDPC decoding of one code block
    \param p_llr Input LLRs
    \param p_out Output vector
    \param numLLR Number of LLRs
    \param p_lut Pointer to decoder LUTs
-   \param p_decParams LDPC decoder parameters
-   \param p_profiler LDPC profiler statistics
+   \param p_decParamsnrLDPC decoder parameters
+   \param p_profilernrLDPC profiler statistics
 */
 static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, uint32_t numLLR, t_nrLDPC_lut* p_lut, t_nrLDPC_dec_params* p_decParams, t_nrLDPC_time_stats* p_profiler)
 {
     uint16_t Z          = p_decParams->Z;
     uint8_t  BG         = p_decParams->BG;
+    uint8_t  R         = p_decParams->R; //Decoding rate: Format 15,13,... for code rates 1/5, 1/3,... */
     uint8_t  numMaxIter = p_decParams->numMaxIter;
     e_nrLDPC_outMode outMode = p_decParams->outMode;
-
-    int8_t cnProcBuf[NR_LDPC_SIZE_CN_PROC_BUF]    __attribute__ ((aligned(32))) = {0};
-    int8_t cnProcBufRes[NR_LDPC_SIZE_CN_PROC_BUF] __attribute__ ((aligned(32))) = {0};
-    int8_t bnProcBuf[NR_LDPC_SIZE_BN_PROC_BUF]    __attribute__ ((aligned(32))) = {0};
-    int8_t bnProcBufRes[NR_LDPC_SIZE_BN_PROC_BUF] __attribute__ ((aligned(32))) = {0};
-    int8_t llrRes[NR_LDPC_MAX_NUM_LLR]            __attribute__ ((aligned(32))) = {0};
-    int8_t llrProcBuf[NR_LDPC_MAX_NUM_LLR]        __attribute__ ((aligned(32))) = {0};
-    int8_t llrOut[NR_LDPC_MAX_NUM_LLR]            __attribute__ ((aligned(32))) = {0};
+   // int8_t* cnProcBuf=  cnProcBuf;
+   // int8_t* cnProcBufRes= cnProcBufRes;
+
+    int8_t cnProcBuf[NR_LDPC_SIZE_CN_PROC_BUF]    __attribute__ ((aligned(64))) = {0};
+    int8_t cnProcBufRes[NR_LDPC_SIZE_CN_PROC_BUF] __attribute__ ((aligned(64))) = {0};
+    int8_t bnProcBuf[NR_LDPC_SIZE_BN_PROC_BUF]    __attribute__ ((aligned(64))) = {0};
+    int8_t bnProcBufRes[NR_LDPC_SIZE_BN_PROC_BUF] __attribute__ ((aligned(64))) = {0};
+    int8_t llrRes[NR_LDPC_MAX_NUM_LLR]            __attribute__ ((aligned(64))) = {0};
+    int8_t llrProcBuf[NR_LDPC_MAX_NUM_LLR]        __attribute__ ((aligned(64))) = {0};
+    int8_t llrOut[NR_LDPC_MAX_NUM_LLR]            __attribute__ ((aligned(64))) = {0};
     // Minimum number of iterations is 1
     // 0 iterations means hard-decision on input LLRs
     uint32_t i = 1;
@@ -123,14 +199,8 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, uint32_
 #ifdef NR_LDPC_PROFILER_DETAIL
     start_meas(&p_profiler->llr2CnProcBuf);
 #endif
-    if (BG == 1)
-    {
-        nrLDPC_llr2CnProcBuf_BG1(p_lut, p_llr, cnProcBuf, Z);
-    }
-    else
-    {
-        nrLDPC_llr2CnProcBuf_BG2(p_lut, p_llr, cnProcBuf, Z);
-    }
+    if (BG == 1) nrLDPC_llr2CnProcBuf_BG1(p_lut, p_llr, cnProcBuf, Z);
+    else nrLDPC_llr2CnProcBuf_BG2(p_lut, p_llr, cnProcBuf, Z);
 #ifdef NR_LDPC_PROFILER_DETAIL
     stop_meas(&p_profiler->llr2CnProcBuf);
 #endif
@@ -146,13 +216,79 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, uint32_
 #ifdef NR_LDPC_PROFILER_DETAIL
     start_meas(&p_profiler->cnProc);
 #endif
-    if (BG == 1)
-    {
+    if (BG==1) {
+#ifndef UNROLL_CN_PROC      
         nrLDPC_cnProc_BG1(p_lut, cnProcBuf, cnProcBufRes, Z);
-    }
-    else
-    {
+#else        
+        switch (R)
+        {
+            case 13:
+            {
+                #ifdef __AVX512BW__
+                nrLDPC_cnProc_BG1_R13_AVX512(cnProcBuf, cnProcBufRes, Z);
+                #else
+                nrLDPC_cnProc_BG1_R13_AVX2(cnProcBuf, cnProcBufRes, Z);
+                #endif
+                break;
+            }
+
+            case 23:
+            {
+                #ifdef __AVX512BW__
+                nrLDPC_cnProc_BG1_R23_AVX512(cnProcBuf,cnProcBufRes, Z);
+                #else
+                nrLDPC_cnProc_BG1_R23_AVX2(cnProcBuf, cnProcBufRes, Z);
+                #endif
+                break;
+            }
+
+            case 89:
+            {
+                #ifdef __AVX512BW__
+                 nrLDPC_cnProc_BG1_R89_AVX512(cnProcBuf, cnProcBufRes, Z);
+                #else
+                nrLDPC_cnProc_BG1_R89_AVX2(cnProcBuf, cnProcBufRes, Z);
+                #endif
+                break;
+            }
+
+        }
+#endif        
+    } else {
+#ifndef UNROLL_CN_PROC
         nrLDPC_cnProc_BG2(p_lut, cnProcBuf, cnProcBufRes, Z);
+#else
+        switch (R) {
+            case 15:
+            {
+                #ifdef __AVX512BW__
+                nrLDPC_cnProc_BG2_R15_AVX512(cnProcBuf, cnProcBufRes, Z);
+                #else
+                nrLDPC_cnProc_BG2_R15_AVX2(cnProcBuf, cnProcBufRes, Z);
+                #endif
+                break;
+            }
+            case 13:
+            {
+                #ifdef __AVX512BW__
+                 nrLDPC_cnProc_BG2_R13_AVX512(cnProcBuf, cnProcBufRes, Z);
+                #else
+                nrLDPC_cnProc_BG2_R13_AVX2(cnProcBuf, cnProcBufRes, Z);
+                #endif
+                break;
+            }
+            case 23:
+            {
+                #ifdef __AVX512BW__
+                 nrLDPC_cnProc_BG2_R23_AVX512(cnProcBuf, cnProcBufRes, Z);
+                #else
+                nrLDPC_cnProc_BG2_R23_AVX2(cnProcBuf, cnProcBufRes, Z);
+                #endif
+                break;
+            }
+
+        }
+#endif        
     }
 #ifdef NR_LDPC_PROFILER_DETAIL
     stop_meas(&p_profiler->cnProc);
@@ -166,14 +302,8 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, uint32_
 #ifdef NR_LDPC_PROFILER_DETAIL
     start_meas(&p_profiler->cn2bnProcBuf);
 #endif
-    if (BG == 1)
-    {
-        nrLDPC_cn2bnProcBuf_BG1(p_lut, cnProcBufRes, bnProcBuf, Z);
-    }
-    else
-    {
-        nrLDPC_cn2bnProcBuf_BG2(p_lut, cnProcBufRes, bnProcBuf, Z);
-    }
+    if (BG == 1) nrLDPC_cn2bnProcBuf_BG1(p_lut, cnProcBufRes, bnProcBuf, Z);
+    else         nrLDPC_cn2bnProcBuf_BG2(p_lut, cnProcBufRes, bnProcBuf, Z);
 #ifdef NR_LDPC_PROFILER_DETAIL
     stop_meas(&p_profiler->cn2bnProcBuf);
 #endif
@@ -187,7 +317,51 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, uint32_
 #ifdef NR_LDPC_PROFILER_DETAIL
     start_meas(&p_profiler->bnProcPc);
 #endif
+
+
+#ifndef UNROLL_BN_PROC_PC
     nrLDPC_bnProcPc(p_lut, bnProcBuf, bnProcBufRes, llrProcBuf, llrRes, Z);
+#else        
+    if (BG==1) {
+        switch (R) {
+            case 13:
+            {
+                nrLDPC_bnProcPc_BG1_R13_AVX2(bnProcBuf,bnProcBufRes,llrRes, llrProcBuf, Z);
+                break;
+            }
+            case 23:
+            {
+                nrLDPC_bnProcPc_BG1_R23_AVX2(bnProcBuf,bnProcBufRes, llrRes, llrProcBuf, Z);
+                break;
+            }
+            case 89:
+            {
+                nrLDPC_bnProcPc_BG1_R89_AVX2(bnProcBuf,bnProcBufRes, llrRes, llrProcBuf, Z);
+                break;
+            }
+        }
+    } else {
+        switch (R) {
+            case 15:
+            {
+                nrLDPC_bnProcPc_BG2_R15_AVX2(bnProcBuf,bnProcBufRes, llrRes, llrProcBuf, Z);
+                break;
+            }
+            case 13:
+            {
+                nrLDPC_bnProcPc_BG2_R13_AVX2(bnProcBuf,bnProcBufRes,llrRes,llrProcBuf, Z);
+                break;
+            }
+
+            case 23:
+            {
+                nrLDPC_bnProcPc_BG2_R23_AVX2(bnProcBuf,bnProcBufRes,llrRes, llrProcBuf, Z);
+                break;
+            }
+        }
+    }
+#endif
+
 #ifdef NR_LDPC_PROFILER_DETAIL
     stop_meas(&p_profiler->bnProcPc);
 #endif
@@ -200,7 +374,78 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, uint32_
 #ifdef NR_LDPC_PROFILER_DETAIL
     start_meas(&p_profiler->bnProc);
 #endif
-    nrLDPC_bnProc(p_lut, bnProcBuf, bnProcBufRes, llrRes, Z);
+
+    if (BG==1) {
+#ifndef UNROLL_BN_PROC
+        nrLDPC_bnProc(p_lut, bnProcBuf, bnProcBufRes, llrRes, Z);
+#else
+        switch (R) {
+            case 13:
+            {
+                #ifdef __AVX512BW__
+                nrLDPC_bnProc_BG1_R13_AVX512(bnProcBuf, bnProcBufRes,llrRes, Z);
+                #else
+                nrLDPC_bnProc_BG1_R13_AVX2(bnProcBuf, bnProcBufRes,llrRes, Z);
+                #endif
+                break;
+            }
+            case 23:
+            {
+                #ifdef __AVX512BW__
+                nrLDPC_bnProc_BG1_R23_AVX512(bnProcBuf, bnProcBufRes,llrRes, Z);
+                #else
+                nrLDPC_bnProc_BG1_R23_AVX2(bnProcBuf, bnProcBufRes,llrRes, Z);
+                #endif
+                break;
+            }
+            case 89:
+            {
+                #ifdef __AVX512BW__
+                nrLDPC_bnProc_BG1_R89_AVX512(bnProcBuf, bnProcBufRes,llrRes, Z);
+                #else
+                nrLDPC_bnProc_BG1_R89_AVX2(bnProcBuf, bnProcBufRes,llrRes, Z);
+                #endif
+                break;
+            }
+        }
+#endif
+    } else {
+#ifndef UNROLL_BN2CN_PROC
+        nrLDPC_bn2cnProcBuf_BG2(p_lut, bnProcBufRes, cnProcBuf, Z);
+#else
+        switch (R) {
+            case 15:
+            {
+                #ifdef __AVX512BW__
+                nrLDPC_bnProc_BG2_R15_AVX512(bnProcBuf, bnProcBufRes,llrRes, Z);
+                #else
+                nrLDPC_bnProc_BG2_R15_AVX2(bnProcBuf, bnProcBufRes,llrRes, Z);
+                #endif
+                break;
+            }
+            case 13:
+            {
+                #ifdef __AVX512BW__
+                nrLDPC_bnProc_BG2_R13_AVX512(bnProcBuf, bnProcBufRes,llrRes, Z);
+                #else
+                nrLDPC_bnProc_BG2_R13_AVX2(bnProcBuf, bnProcBufRes,llrRes, Z);
+                #endif
+                break;
+            }
+
+            case 23:
+            {
+                #ifdef __AVX512BW__
+                nrLDPC_bnProc_BG2_R23_AVX512(bnProcBuf, bnProcBufRes,llrRes, Z);
+                #else
+                nrLDPC_bnProc_BG2_R23_AVX2(bnProcBuf, bnProcBufRes,llrRes, Z);
+                #endif
+                break;
+            }
+        }
+#endif        
+   }
+
 #ifdef NR_LDPC_PROFILER_DETAIL
     stop_meas(&p_profiler->bnProc);
 #endif
@@ -214,14 +459,8 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, uint32_
 #ifdef NR_LDPC_PROFILER_DETAIL
     start_meas(&p_profiler->bn2cnProcBuf);
 #endif
-    if (BG == 1)
-    {
-        nrLDPC_bn2cnProcBuf_BG1(p_lut, bnProcBufRes, cnProcBuf, Z);
-    }
-    else
-    {
-        nrLDPC_bn2cnProcBuf_BG2(p_lut, bnProcBufRes, cnProcBuf, Z);
-    }
+    if (BG == 1) nrLDPC_bn2cnProcBuf_BG1(p_lut, bnProcBufRes, cnProcBuf, Z);
+    else         nrLDPC_bn2cnProcBuf_BG2(p_lut, bnProcBufRes, cnProcBuf, Z);
 #ifdef NR_LDPC_PROFILER_DETAIL
     stop_meas(&p_profiler->bn2cnProcBuf);
 #endif
@@ -236,8 +475,7 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, uint32_
 
     // First iteration finished
 
-    while ( (i < numMaxIter) && (pcRes != 0) )
-    {
+    while ( (i < numMaxIter) && (pcRes != 0) ) {
         // Increase iteration counter
         i++;
 
@@ -245,13 +483,74 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, uint32_
 #ifdef NR_LDPC_PROFILER_DETAIL
         start_meas(&p_profiler->cnProc);
 #endif
-        if (BG == 1)
-        {
-            nrLDPC_cnProc_BG1(p_lut, cnProcBuf, cnProcBufRes, Z);
-        }
-        else
-        {
-            nrLDPC_cnProc_BG2(p_lut, cnProcBuf, cnProcBufRes, Z);
+        if (BG==1) {
+#ifndef UNROLL_CN_PROC
+           nrLDPC_cnProc_BG1(p_lut, cnProcBuf, cnProcBufRes, Z);
+#else        
+           switch (R) {
+            case 13:
+            {
+                #ifdef __AVX512BW__
+                nrLDPC_cnProc_BG1_R13_AVX512(cnProcBuf, cnProcBufRes, Z);
+                #else
+                nrLDPC_cnProc_BG1_R13_AVX2(cnProcBuf, cnProcBufRes, Z);
+                #endif
+                break;
+            }
+            case 23:
+            {
+                #ifdef __AVX512BW__
+                 nrLDPC_cnProc_BG1_R23_AVX512(cnProcBuf, cnProcBufRes, Z);
+                #else
+                nrLDPC_cnProc_BG1_R23_AVX2(cnProcBuf, cnProcBufRes, Z);
+                #endif
+                break;
+            }
+            case 89:
+            {
+                #ifdef __AVX512BW__
+                 nrLDPC_cnProc_BG1_R89_AVX512(cnProcBuf, cnProcBufRes, Z);
+                #else
+                nrLDPC_cnProc_BG1_R89_AVX2(cnProcBuf, cnProcBufRes, Z);
+                #endif
+                break;
+            }
+           }
+#endif        
+        } else {
+#ifndef UNROLL_CN_PROC
+           nrLDPC_cnProc_BG2(p_lut, cnProcBuf, cnProcBufRes, Z);
+#else
+           switch (R) {
+            case 15:
+            {
+                #ifdef __AVX512BW__
+                nrLDPC_cnProc_BG2_R15_AVX512(cnProcBuf,cnProcBufRes, Z);
+                #else
+                nrLDPC_cnProc_BG2_R15_AVX2(cnProcBuf, cnProcBufRes, Z);
+                #endif
+                break;
+            }
+            case 13:
+            {
+                #ifdef __AVX512BW__
+                 nrLDPC_cnProc_BG2_R13_AVX512(cnProcBuf, cnProcBufRes, Z);
+                #else
+                nrLDPC_cnProc_BG2_R13_AVX2(cnProcBuf, cnProcBufRes, Z);
+                #endif
+                break;
+            } 
+            case 23:
+            {
+                #ifdef __AVX512BW__
+                 nrLDPC_cnProc_BG2_R23_AVX512(cnProcBuf, cnProcBufRes, Z);
+                #else
+                nrLDPC_cnProc_BG2_R23_AVX2(cnProcBuf, cnProcBufRes, Z);
+                #endif
+                break;
+            }
+          }  
+#endif
         }
 #ifdef NR_LDPC_PROFILER_DETAIL
         stop_meas(&p_profiler->cnProc);
@@ -265,14 +564,8 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, uint32_
 #ifdef NR_LDPC_PROFILER_DETAIL
         start_meas(&p_profiler->cn2bnProcBuf);
 #endif
-        if (BG == 1)
-        {
-            nrLDPC_cn2bnProcBuf_BG1(p_lut, cnProcBufRes, bnProcBuf, Z);
-        }
-        else
-        {
-            nrLDPC_cn2bnProcBuf_BG2(p_lut, cnProcBufRes, bnProcBuf, Z);
-        }
+        if (BG == 1) nrLDPC_cn2bnProcBuf_BG1(p_lut, cnProcBufRes, bnProcBuf, Z);
+        else         nrLDPC_cn2bnProcBuf_BG2(p_lut, cnProcBufRes, bnProcBuf, Z);
 #ifdef NR_LDPC_PROFILER_DETAIL
         stop_meas(&p_profiler->cn2bnProcBuf);
 #endif
@@ -285,7 +578,49 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, uint32_
 #ifdef NR_LDPC_PROFILER_DETAIL
         start_meas(&p_profiler->bnProcPc);
 #endif
+
+#ifndef UNROLL_BN_PROC_PC
         nrLDPC_bnProcPc(p_lut, bnProcBuf, bnProcBufRes, llrProcBuf, llrRes, Z);
+#else
+        if (BG==1) {
+          switch (R) {
+            case 13:
+            {
+                nrLDPC_bnProcPc_BG1_R13_AVX2(bnProcBuf,bnProcBufRes,llrRes, llrProcBuf, Z);
+                break;
+            }
+            case 23:
+            {
+                nrLDPC_bnProcPc_BG1_R23_AVX2(bnProcBuf,bnProcBufRes, llrRes, llrProcBuf, Z);
+                break;
+            }
+            case 89:
+            {
+                nrLDPC_bnProcPc_BG1_R89_AVX2(bnProcBuf,bnProcBufRes, llrRes, llrProcBuf, Z);
+                break;
+            }
+          }
+        } else {
+          switch (R)
+          {
+            case 15:
+            {
+                nrLDPC_bnProcPc_BG2_R15_AVX2(bnProcBuf,bnProcBufRes,llrRes, llrProcBuf, Z);
+                break;
+            }
+            case 13:
+            {
+                nrLDPC_bnProcPc_BG2_R13_AVX2(bnProcBuf,bnProcBufRes,llrRes, llrProcBuf, Z);
+                break;
+            }
+            case 23:
+            {
+                nrLDPC_bnProcPc_BG2_R23_AVX2(bnProcBuf,bnProcBufRes,llrRes, llrProcBuf, Z);
+                break;
+            }
+          }
+        }
+#endif
 #ifdef NR_LDPC_PROFILER_DETAIL
         stop_meas(&p_profiler->bnProcPc);
 #endif
@@ -297,7 +632,75 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, uint32_
 #ifdef NR_LDPC_PROFILER_DETAIL
         start_meas(&p_profiler->bnProc);
 #endif
+#ifndef UNROLL_BN_PROC
         nrLDPC_bnProc(p_lut, bnProcBuf, bnProcBufRes, llrRes, Z);
+#else     
+        if (BG==1) {
+          switch (R) {
+            case 13:
+            {
+                #ifdef __AVX512BW__
+                nrLDPC_bnProc_BG1_R13_AVX512(bnProcBuf, bnProcBufRes,llrRes, Z);
+                #else
+                nrLDPC_bnProc_BG1_R13_AVX2(bnProcBuf, bnProcBufRes,llrRes, Z);
+                #endif
+                break;
+            }
+            case 23:
+            {
+                #ifdef __AVX512BW__
+                nrLDPC_bnProc_BG1_R23_AVX512(bnProcBuf, bnProcBufRes,llrRes, Z);
+                #else
+                nrLDPC_bnProc_BG1_R23_AVX2(bnProcBuf,bnProcBufRes,llrRes, Z);
+                #endif
+                break;
+            }
+            case 89:
+            {
+                #ifdef __AVX512BW__
+                nrLDPC_bnProc_BG1_R89_AVX512(bnProcBuf, bnProcBufRes,llrRes, Z);
+                #else
+                nrLDPC_bnProc_BG1_R89_AVX2(bnProcBuf, bnProcBufRes,llrRes, Z);
+                #endif
+                break;
+            }
+          }
+        } else {
+          switch (R)
+          {
+            case 15:
+            {
+                #ifdef __AVX512BW__
+                nrLDPC_bnProc_BG2_R15_AVX512(bnProcBuf, bnProcBufRes,llrRes, Z);
+                #else
+                nrLDPC_bnProc_BG2_R15_AVX2(bnProcBuf, bnProcBufRes,llrRes, Z);
+                #endif
+                break;
+            }
+            case 13:
+            {
+                #ifdef __AVX512BW__
+                nrLDPC_bnProc_BG2_R13_AVX512(bnProcBuf, bnProcBufRes,llrRes, Z);
+                #else
+                nrLDPC_bnProc_BG2_R13_AVX2(bnProcBuf, bnProcBufRes,llrRes, Z);
+                #endif
+                break;
+            }
+            case 23:
+            {
+                #ifdef __AVX512BW__
+                nrLDPC_bnProc_BG2_R23_AVX512(bnProcBuf, bnProcBufRes,llrRes, Z);
+                #else
+                nrLDPC_bnProc_BG2_R23_AVX2(bnProcBuf, bnProcBufRes,llrRes, Z);
+                #endif
+                break;
+            }
+          }
+        }
+#endif
+
+
+
 #ifdef NR_LDPC_PROFILER_DETAIL
         stop_meas(&p_profiler->bnProc);
 #endif
@@ -310,14 +713,8 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, uint32_
 #ifdef NR_LDPC_PROFILER_DETAIL
         start_meas(&p_profiler->bn2cnProcBuf);
 #endif
-        if (BG == 1)
-        {
-            nrLDPC_bn2cnProcBuf_BG1(p_lut, bnProcBufRes, cnProcBuf, Z);
-        }
-        else
-        {
-            nrLDPC_bn2cnProcBuf_BG2(p_lut, bnProcBufRes, cnProcBuf, Z);
-        }
+        if (BG == 1) nrLDPC_bn2cnProcBuf_BG1(p_lut, bnProcBufRes, cnProcBuf, Z);
+        else         nrLDPC_bn2cnProcBuf_BG2(p_lut, bnProcBufRes, cnProcBuf, Z);
 #ifdef NR_LDPC_PROFILER_DETAIL
         stop_meas(&p_profiler->bn2cnProcBuf);
 #endif
@@ -326,60 +723,44 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, uint32_
         nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_CN_PROC, cnProcBuf);
 #endif
 
-        // Parity Check
+   // Parity Check
 #ifdef NR_LDPC_ENABLE_PARITY_CHECK
 #ifdef NR_LDPC_PROFILER_DETAIL
-        start_meas(&p_profiler->cnProcPc);
+       start_meas(&p_profiler->cnProcPc);
 #endif
-        if (BG == 1)
-        {
-            pcRes = nrLDPC_cnProcPc_BG1(p_lut, cnProcBuf, cnProcBufRes, Z);
-        }
-        else
-        {
-            pcRes = nrLDPC_cnProcPc_BG2(p_lut, cnProcBuf, cnProcBufRes, Z);
-        }
+       if (BG == 1) pcRes = nrLDPC_cnProcPc_BG1(p_lut, cnProcBuf, cnProcBufRes, Z);
+       else         pcRes = nrLDPC_cnProcPc_BG2(p_lut, cnProcBuf, cnProcBufRes, Z);
 #ifdef NR_LDPC_PROFILER_DETAIL
-        stop_meas(&p_profiler->cnProcPc);
-#endif
+       stop_meas(&p_profiler->cnProcPc);
 #endif
-    }
-
-    // If maximum number of iterations reached an PC still fails increase number of iterations
-    // Thus, i > numMaxIter indicates that PC has failed
-
-#ifdef NR_LDPC_ENABLE_PARITY_CHECK
-    if (pcRes != 0)
-    {
-        i++;
-    }
 #endif
+   } // end while
 
+   // Last iteration
+   if (pcRes != 0) i++;
     // Assign results from processing buffer to output
 #ifdef NR_LDPC_PROFILER_DETAIL
-    start_meas(&p_profiler->llrRes2llrOut);
+   start_meas(&p_profiler->llrRes2llrOut);
 #endif
-    nrLDPC_llrRes2llrOut(p_lut, p_llrOut, llrRes, Z, BG);
+   nrLDPC_llrRes2llrOut(p_lut, p_llrOut, llrRes, Z, BG);
 #ifdef NR_LDPC_PROFILER_DETAIL
-    stop_meas(&p_profiler->llrRes2llrOut);
+   stop_meas(&p_profiler->llrRes2llrOut);
 #endif
 
     // Hard-decision
 #ifdef NR_LDPC_PROFILER_DETAIL
-    start_meas(&p_profiler->llr2bit);
+   start_meas(&p_profiler->llr2bit);
 #endif
-    if (outMode == nrLDPC_outMode_BIT)
-    {
-        nrLDPC_llr2bitPacked(p_out, p_llrOut, numLLR);
-    }
-    else if (outMode == nrLDPC_outMode_BITINT8)
-    {
-        nrLDPC_llr2bit(p_out, p_llrOut, numLLR);
-    }
-
+   if (outMode == nrLDPC_outMode_BIT) nrLDPC_llr2bitPacked(p_out, p_llrOut, numLLR);
+   else //if (outMode == nrLDPC_outMode_BITINT8)
+     nrLDPC_llr2bit(p_out, p_llrOut, numLLR);
 #ifdef NR_LDPC_PROFILER_DETAIL
     stop_meas(&p_profiler->llr2bit);
 #endif
 
     return i;
 }
+
+
+
+
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_init_mem.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_init_mem.h
new file mode 100644
index 0000000000000000000000000000000000000000..5678a7b3b7cc6a0374c4a8edc73123e02ce24063
--- /dev/null
+++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_init_mem.h
@@ -0,0 +1,83 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+/*!\file nrLDPC_init_mem.h
+ * \brief Defines the function to initialize the LDPC decoder and sets correct LUTs.
+ * \author Sebastian Wagner (TCL Communications) Email: <mailto:sebastian.wagner@tcl.com>
+ * \date 07-12-2018
+ * \version 1.0
+ * \note
+ * \warning
+ */
+
+#ifndef __NR_LDPC_INIT_MEM__H__
+#define __NR_LDPC_INIT_MEM__H__
+
+#include <stdlib.h>
+#include "nrLDPC_types.h"
+
+/**
+   \brief Allocates 32 byte aligned memory and initializes to zero
+   \param size Input size in bytes
+   \return Pointer to memory
+*/
+static inline void* malloc32_clear(size_t size)
+{
+    void* ptr = (void*) memalign(64, size+64);
+    memset(ptr, 0, size);
+    return ptr;
+}
+
+/**
+   \brief Allocates and initializes the internal decoder processing buffers
+   \param p_decParams Pointer to decoder parameters
+   \param p_lut Pointer to decoder LUTs
+   \return Number of LLR values
+*/
+static inline t_nrLDPC_procBuf* nrLDPC_init_mem(void)
+{
+    t_nrLDPC_procBuf* p_procBuf = (t_nrLDPC_procBuf*) malloc32_clear(sizeof(t_nrLDPC_procBuf));
+
+    if (p_procBuf)
+    {
+        p_procBuf->cnProcBuf    = (int8_t*) malloc32_clear(NR_LDPC_SIZE_CN_PROC_BUF*sizeof(int8_t));
+        p_procBuf->cnProcBufRes = (int8_t*) malloc32_clear(NR_LDPC_SIZE_CN_PROC_BUF*sizeof(int8_t));
+        p_procBuf->bnProcBuf    = (int8_t*) malloc32_clear(NR_LDPC_SIZE_BN_PROC_BUF*sizeof(int8_t));
+        p_procBuf->bnProcBufRes = (int8_t*) malloc32_clear(NR_LDPC_SIZE_BN_PROC_BUF*sizeof(int8_t));
+        p_procBuf->llrRes       = (int8_t*) malloc32_clear(NR_LDPC_MAX_NUM_LLR     *sizeof(int8_t));
+        p_procBuf->llrProcBuf   = (int8_t*) malloc32_clear(NR_LDPC_MAX_NUM_LLR     *sizeof(int8_t));
+    }
+
+    return(p_procBuf);
+}
+
+static inline void nrLDPC_free_mem(t_nrLDPC_procBuf* p_procBuf)
+{
+    free(p_procBuf->cnProcBuf);
+    free(p_procBuf->cnProcBufRes);
+    free(p_procBuf->bnProcBuf);
+    free(p_procBuf->bnProcBufRes);
+    free(p_procBuf->llrRes);
+    free(p_procBuf->llrProcBuf);
+
+    free(p_procBuf);
+}
+#endif
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_mPass.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_mPass.h
index 7f514d5cfa6ff2a457f79c2493ea314c3517cf24..ecbcac638d147ccbed6eb660c5a2734921fd15aa 100644
--- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_mPass.h
+++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_mPass.h
@@ -21,21 +21,16 @@
 
 /*!\file nrLDPC_mPass.h
  * \brief Defines the functions for message passing
- * \author Sebastian Wagner (TCL Communications) Email: <mailto:sebastian.wagner@tcl.com>
- * \date 30-09-2019
- * \version 2.0
- * \note
- * \warning
- */
-
+ *
+*/
 #ifndef __NR_LDPC_MPASS__H__
 #define __NR_LDPC_MPASS__H__
 
 #include <string.h>
 #include "nrLDPCdecoder_defs.h"
-
+//#include <omp.h>
 /**
-   \brief Circular memcpy
+   \brief Circular memcpy1
                 |<- rem->|<- circular shift ->|
    (src) str2 = |--------xxxxxxxxxxxxxxxxxxxxx|
                          \_______________
@@ -46,6 +41,7 @@
    \param Z Lifting size
    \param cshift Circular shift
 */
+
 static inline void *nrLDPC_inv_circ_memcpy(int8_t *str1, const int8_t *str2, uint16_t Z, uint16_t cshift)
 {
     uint16_t rem = Z - cshift;
@@ -169,6 +165,8 @@ static inline void nrLDPC_llr2CnProcBuf_BG1(t_nrLDPC_lut* p_lut, int8_t* llr, in
 
     bitOffsetInGroup = lut_numCnInCnGroups_BG1_R13[0]*NR_LDPC_ZMAX;
 
+
+
     for (j=0; j<3; j++)
     {
         p_cnProcBuf = &cnProcBuf[lut_startAddrCnGroups[0] + j*bitOffsetInGroup];
@@ -200,8 +198,10 @@ static inline void nrLDPC_llr2CnProcBuf_BG1(t_nrLDPC_lut* p_lut, int8_t* llr, in
     // =====================================================================
     // CN group with 5 BNs
 
+
     bitOffsetInGroup = lut_numCnInCnGroups_BG1_R13[2]*NR_LDPC_ZMAX;
 
+
     for (j=0; j<5; j++)
     {
         p_cnProcBuf = &cnProcBuf[lut_startAddrCnGroups[2] + j*bitOffsetInGroup];
@@ -234,8 +234,10 @@ static inline void nrLDPC_llr2CnProcBuf_BG1(t_nrLDPC_lut* p_lut, int8_t* llr, in
     // =====================================================================
     // CN group with 7 BNs
 
+
     bitOffsetInGroup = lut_numCnInCnGroups_BG1_R13[4]*NR_LDPC_ZMAX;
 
+
     for (j=0; j<7; j++)
     {
         p_cnProcBuf = &cnProcBuf[lut_startAddrCnGroups[4] + j*bitOffsetInGroup];
@@ -253,6 +255,7 @@ static inline void nrLDPC_llr2CnProcBuf_BG1(t_nrLDPC_lut* p_lut, int8_t* llr, in
 
     bitOffsetInGroup = lut_numCnInCnGroups_BG1_R13[5]*NR_LDPC_ZMAX;
 
+
     for (j=0; j<8; j++)
     {
         p_cnProcBuf = &cnProcBuf[lut_startAddrCnGroups[5] + j*bitOffsetInGroup];
@@ -302,6 +305,7 @@ static inline void nrLDPC_llr2CnProcBuf_BG1(t_nrLDPC_lut* p_lut, int8_t* llr, in
     // =====================================================================
     // CN group with 19 BNs
 
+
     bitOffsetInGroup = lut_numCnInCnGroups_BG1_R13[8]*NR_LDPC_ZMAX;
 
     for (j=0; j<19; j++)
@@ -1007,18 +1011,18 @@ static inline void nrLDPC_bn2cnProcBuf_BG1(t_nrLDPC_lut* p_lut, int8_t* bnProcBu
     // CN group with 4 BNs
 
     bitOffsetInGroup = lut_numCnInCnGroups_BG1_R13[1]*NR_LDPC_ZMAX;
-
+  
     for (j=0; j<3; j++)
     {
         p_cnProcBuf = &cnProcBuf[lut_startAddrCnGroups[1] + j*bitOffsetInGroup];
+
         for (i=0; i<lut_numCnInCnGroups[1]; i++)
         {
             idxBn = lut_startAddrBnProcBuf_CNG4[j][i] + lut_bnPosBnProcBuf_CNG4[j][i]*Z;
             nrLDPC_circ_memcpy(p_cnProcBuf, &bnProcBufRes[idxBn], Z, lut_circShift_CNG4[j][i]);
             p_cnProcBuf += Z;
-        }
+         }
     }
-
     // =====================================================================
     // CN group with 5 BNs
 
@@ -1027,6 +1031,7 @@ static inline void nrLDPC_bn2cnProcBuf_BG1(t_nrLDPC_lut* p_lut, int8_t* bnProcBu
     for (j=0; j<4; j++)
     {
         p_cnProcBuf = &cnProcBuf[lut_startAddrCnGroups[2] + j*bitOffsetInGroup];
+    
         for (i=0; i<lut_numCnInCnGroups[2]; i++)
         {
             idxBn = lut_startAddrBnProcBuf_CNG5[j][i] + lut_bnPosBnProcBuf_CNG5[j][i]*Z;
@@ -1039,10 +1044,11 @@ static inline void nrLDPC_bn2cnProcBuf_BG1(t_nrLDPC_lut* p_lut, int8_t* bnProcBu
     // CN group with 6 BNs
 
     bitOffsetInGroup = lut_numCnInCnGroups_BG1_R13[3]*NR_LDPC_ZMAX;
-
+    
     for (j=0; j<5; j++)
     {
         p_cnProcBuf = &cnProcBuf[lut_startAddrCnGroups[3] + j*bitOffsetInGroup];
+      
         for (i=0; i<lut_numCnInCnGroups[3]; i++)
         {
             idxBn = lut_startAddrBnProcBuf_CNG6[j][i] + lut_bnPosBnProcBuf_CNG6[j][i]*Z;
@@ -1055,11 +1061,12 @@ static inline void nrLDPC_bn2cnProcBuf_BG1(t_nrLDPC_lut* p_lut, int8_t* bnProcBu
     // CN group with 7 BNs
 
     bitOffsetInGroup = lut_numCnInCnGroups_BG1_R13[4]*NR_LDPC_ZMAX;
-
+    
     for (j=0; j<6; j++)
     {
         p_cnProcBuf = &cnProcBuf[lut_startAddrCnGroups[4] + j*bitOffsetInGroup];
 
+    
         for (i=0; i<lut_numCnInCnGroups[4]; i++)
         {
             idxBn = lut_startAddrBnProcBuf_CNG7[j][i] + lut_bnPosBnProcBuf_CNG7[j][i]*Z;
@@ -1092,6 +1099,7 @@ static inline void nrLDPC_bn2cnProcBuf_BG1(t_nrLDPC_lut* p_lut, int8_t* bnProcBu
     for (j=0; j<8; j++)
     {
         p_cnProcBuf = &cnProcBuf[lut_startAddrCnGroups[6] + j*bitOffsetInGroup];
+
         for (i=0; i<lut_numCnInCnGroups[6]; i++)
         {
             idxBn = lut_startAddrBnProcBuf_CNG9[j][i] + lut_bnPosBnProcBuf_CNG9[j][i]*Z;
@@ -1104,10 +1112,11 @@ static inline void nrLDPC_bn2cnProcBuf_BG1(t_nrLDPC_lut* p_lut, int8_t* bnProcBu
     // CN group with 10 BNs
 
     bitOffsetInGroup = lut_numCnInCnGroups_BG1_R13[7]*NR_LDPC_ZMAX;
-
+    
     for (j=0; j<9; j++)
     {
         p_cnProcBuf = &cnProcBuf[lut_startAddrCnGroups[7] + j*bitOffsetInGroup];
+    
         for (i=0; i<lut_numCnInCnGroups[7]; i++)
         {
             idxBn = lut_startAddrBnProcBuf_CNG10[j][i] + lut_bnPosBnProcBuf_CNG10[j][i]*Z;
@@ -1120,10 +1129,11 @@ static inline void nrLDPC_bn2cnProcBuf_BG1(t_nrLDPC_lut* p_lut, int8_t* bnProcBu
     // CN group with 19 BNs
 
     bitOffsetInGroup = lut_numCnInCnGroups_BG1_R13[8]*NR_LDPC_ZMAX;
-
+   
     for (j=0; j<19; j++)
     {
         p_cnProcBuf = &cnProcBuf[lut_startAddrCnGroups[8] + j*bitOffsetInGroup];
+      
         for (i=0; i<lut_numCnInCnGroups[8]; i++)
         {
             idxBn = lut_startAddrBnProcBuf_CNG19[j][i] + lut_bnPosBnProcBuf_CNG19[j][i]*Z;
@@ -1172,3 +1182,7 @@ static inline void nrLDPC_llrRes2llrOut(t_nrLDPC_lut* p_lut, int8_t* llrOut, int
 }
 
 #endif
+
+
+
+
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/CMakeLists.txt b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..669ab17aa7d8ffe1491fd19ebd5ccd157ed15a36
--- /dev/null
+++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/CMakeLists.txt
@@ -0,0 +1,19 @@
+add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/generator_bnProc        ldpc/generator_bnProc)
+add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/generator_bnProc_avx512 ldpc/generator_bnProc_avx512)
+add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/generator_cnProc        ldpc/generator_cnProc)
+add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/generator_cnProc_avx512 ldpc/generator_cnProc_avx512)
+
+# custom target to build all generators
+add_custom_target(ldpc_generators)
+add_dependencies(ldpc_generators
+                 bnProc_gen_avx2
+                 bnProc_gen_avx512
+                 cnProc_gen_avx2
+                 cnProc_gen_avx512)
+
+add_library(ldpc_gen_HEADERS INTERFACE)
+target_link_libraries(ldpc_gen_HEADERS INTERFACE
+                      bnProc_gen_avx2_HEADERS
+                      bnProc_gen_avx512_HEADERS
+                      cnProc_gen_avx2_HEADERS
+                      cnProc_gen_avx512_HEADERS)
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/CMakeLists.txt b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..baf2f19d97c85ded840674fbbed32e9a40a56ae9
--- /dev/null
+++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/CMakeLists.txt
@@ -0,0 +1,36 @@
+add_executable(bnProc_gen_avx2
+               bnProc_gen_BG1_avx2.c
+               bnProc_gen_BG2_avx2.c
+               bnProcPc_gen_BG1_avx2.c
+               bnProcPc_gen_BG2_avx2.c
+               main.c)
+target_compile_options(bnProc_gen_avx2 PRIVATE -W -Wall -mavx2)
+
+#set(bnProc_headers
+#    bnProc/nrLDPC_bnProc_BG1_R13_AVX2.h
+#    bnProc/nrLDPC_bnProc_BG1_R23_AVX2.h
+#    bnProc/nrLDPC_bnProc_BG1_R89_AVX2.h
+#    bnProc/rLDPC_bnProc_BG2_R13_AVX2.h
+#    bnProc/rLDPC_bnProc_BG2_R15_AVX2.h
+#    bnProc/rLDPC_bnProc_BG2_R23_AVX2.h)
+#
+#set(bnProcPc_headers
+#    bnProcPc/rLDPC_bnProcPc_BG1_R13_AVX2.h
+#    bnProcPc/rLDPC_bnProcPc_BG1_R23_AVX2.h
+#    bnProcPc/rLDPC_bnProcPc_BG1_R89_AVX2.h
+#    bnProcPc/rLDPC_bnProcPc_BG2_R13_AVX2.h
+#    bnProcPc/rLDPC_bnProcPc_BG2_R15_AVX2.h
+#    bnProcPc/rLDPC_bnProcPc_BG2_R23_AVX2.h)
+
+add_custom_command(TARGET bnProc_gen_avx2 POST_BUILD
+  #OUTPUT ${bnProc_headers} ${bnProcPc_headers}
+  COMMAND ${CMAKE_COMMAND} -E make_directory bnProc
+  COMMAND ${CMAKE_COMMAND} -E make_directory bnProcPc
+  COMMAND bnProc_gen_avx2 .
+  DEPENDS bnProc_gen_avx2
+  COMMENT "Generating LDPC bnProc header files for AVX2"
+)
+
+add_library(bnProc_gen_avx2_HEADERS INTERFACE)
+target_include_directories(bnProc_gen_avx2_HEADERS INTERFACE ${CMAKE_CURRENT_BINARY_DIR})
+add_dependencies(bnProc_gen_avx2_HEADERS bnProc_gen_avx2)
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProcPc_gen_BG1_avx2.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProcPc_gen_BG1_avx2.c
new file mode 100644
index 0000000000000000000000000000000000000000..f51f607b885d20552442d9f72b83b504c83ecbe9
--- /dev/null
+++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProcPc_gen_BG1_avx2.c
@@ -0,0 +1,1789 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include "../../nrLDPCdecoder_defs.h"
+#include "../../nrLDPC_types.h"
+
+
+void nrLDPC_bnProcPc_BG1_generator_AVX2(const char *dir, int R)
+{
+  const char *ratestr[3]={"13","23","89"};
+
+  if (R<0 || R>2) {printf("Illegal R %d\n",R); abort();}
+
+
+ // system("mkdir -p ../ldpc_gen_files");
+
+  char fname[FILENAME_MAX+1];
+  snprintf(fname, sizeof(fname), "%s/bnProcPc/nrLDPC_bnProcPc_BG1_R%s_AVX2.h", dir, ratestr[R]);
+  FILE *fd=fopen(fname,"w");
+  if (fd == NULL) {
+    printf("Cannot create file %s\n", fname);
+    abort();
+  }
+
+//  fprintf(fd,"#include <stdint.h>\n");
+//  fprintf(fd,"#include <immintrin.h>\n");
+
+  fprintf(fd,"static inline void nrLDPC_bnProcPc_BG1_R%s_AVX2(int8_t* bnProcBuf,int8_t* bnProcBufRes,int8_t* llrRes ,  int8_t* llrProcBuf, uint16_t Z ) {\n",ratestr[R]);
+    const uint8_t*  lut_numBnInBnGroups;
+    const uint32_t* lut_startAddrBnGroups;
+    const uint16_t* lut_startAddrBnGroupsLlr;
+    if (R==0) {
+
+
+      lut_numBnInBnGroups =  lut_numBnInBnGroups_BG1_R13;
+      lut_startAddrBnGroups = lut_startAddrBnGroups_BG1_R13;
+      lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG1_R13;
+
+    }
+    else if (R==1){
+
+      lut_numBnInBnGroups =  lut_numBnInBnGroups_BG1_R23;
+      lut_startAddrBnGroups = lut_startAddrBnGroups_BG1_R23;
+      lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG1_R23;
+    }
+    else if (R==2) {
+
+      lut_numBnInBnGroups = lut_numBnInBnGroups_BG1_R89;
+      lut_startAddrBnGroups = lut_startAddrBnGroups_BG1_R89;
+      lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG1_R89;
+    }
+  else { printf("aborting, illegal R %d\n",R); fclose(fd);abort();}
+        // Number of BNs in Groups
+//    uint32_t M;
+    //uint32_t M32rem;
+    //uint32_t i,j;
+    uint32_t k;
+    // Offset to each bit within a group in terms of 32 Byte
+    uint32_t cnOffsetInGroup;
+    uint8_t idxBnGroup = 0;
+
+    fprintf(fd,"   __m256i ymm0, ymm1, ymmRes0, ymmRes1;  \n");
+
+
+    fprintf(fd,"        __m128i* p_bnProcBuf; \n");
+    fprintf(fd,"        __m128i* p_llrProcBuf;\n");
+    fprintf(fd,"        __m256i* p_llrRes; \n");
+  //  fprintf(fd,"        __m256i* p_bnProcBufRes; \n");
+//    fprintf(fd,"        __m256i* p_llrProcBuf256; \n");
+    fprintf(fd,"         uint32_t M ;\n");
+
+
+    fprintf(fd,  "// Process group with 1 CNs \n");
+
+/*
+ // Process group with 1 CNs
+
+   // if (lut_numBnInBnGroups[0] > 0)
+   // {
+        // If elements in group move to next address
+       // idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[0] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+       // cnOffsetInGroup = (lut_numBnInBnGroups[0]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+       // fprintf(fd,"    p_bnProcBufRes     = (__m256i*) &bnProcBufRes    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+       //  fprintf(fd,"   p_llrProcBuf256   = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+
+        // Loop over BNs
+        fprintf(fd,"            for (int i=0,j=0;i<M;i++,j+=2) {\n");
+         
+         fprintf(fd,"           p_bnProcBufRes[i] = p_llrProcBuf256[i];\n");
+       
+            // First 16 LLRs of first CN
+        fprintf(fd,"            ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"            ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"           ymmRes0 = _mm256_adds_epi16(ymm0, ymm1);\n");
+
+        
+            // Second 16 LLRs of first CN
+        fprintf(fd,"            ymm0    = _mm256_cvtepi8_epi16(p_bnProcBuf[j + 1 ]);\n");
+        fprintf(fd,"            ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j + 1 ]);\n");
+        fprintf(fd,"            ymmRes1 = _mm256_adds_epi16(ymm0, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"            ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+
+        fprintf(fd,"}\n");
+    //}
+*/  
+    // =====================================================================
+    // Process group with 2 CNs
+
+
+fprintf(fd,  "// Process group with 2 CNs \n");
+
+ // Process group with 2 CNs
+
+    if (lut_numBnInBnGroups[1] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[1] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[1]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+
+        // Loop over BNs
+        fprintf(fd,"            for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"            ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"            ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf[j + 1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<2; k++)
+        {
+        fprintf(fd,"            ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"            ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"            ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "           ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"            ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"            ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"            ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"            ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"            ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+
+        fprintf(fd,"}\n");
+    }
+
+    // =====================================================================
+    // Process group with 3 CNs
+
+
+fprintf(fd,  "// Process group with 3 CNs \n");
+
+ // Process group with 3 CNs
+
+    if (lut_numBnInBnGroups[2] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[2] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[2]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<3; k++)
+        {
+        fprintf(fd,"        ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd,"        ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+            }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+
+    // =====================================================================
+    // Process group with 4 CNs
+
+fprintf(fd,  "// Process group with 4 CNs \n");
+
+ // Process group with 4 CNs
+
+    if (lut_numBnInBnGroups[3] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[3] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[3]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<4; k++)
+        {
+        fprintf(fd,"        ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+   // =====================================================================
+    // Process group with 5 CNs
+
+fprintf(fd,  "// Process group with 5 CNs \n");
+
+ // Process group with 5 CNs
+
+    if (lut_numBnInBnGroups[4] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[4] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[4]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<5; k++)
+        {
+        fprintf(fd,"        ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+
+   // =====================================================================
+    // Process group with 6 CNs
+
+fprintf(fd,  "// Process group with 6 CNs \n");
+
+ // Process group with 6 CNs
+
+    if (lut_numBnInBnGroups[5] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[5] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[5]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<6; k++)
+        {
+        fprintf(fd,"        ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+   // =====================================================================
+    // Process group with 7 CNs
+
+fprintf(fd,  "// Process group with 7 CNs \n");
+
+ // Process group with 7 CNs
+
+    if (lut_numBnInBnGroups[6] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[6] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[6]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<7; k++)
+        {
+        fprintf(fd,"        ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+        //fprintf(fd,"         (__m256i*) &llrRes[%d + i]    = _mm256_permute4x64_epi64(ymm0, 0xD8);\n",lut_startAddrBnGroupsLlr[idxBnGroup]>>5 );
+        fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+   // =====================================================================
+    // Process group with 8 CNs
+
+fprintf(fd,  "// Process group with 8 CNs \n");
+
+ // Process group with 8 CNs
+
+    if (lut_numBnInBnGroups[7] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[7] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[7]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<8; k++)
+        {
+        fprintf(fd,"        ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+        //fprintf(fd,"         (__m256i*) &llrRes[%d + i]    = _mm256_permute4x64_epi64(ymm0, 0xD8);\n",lut_startAddrBnGroupsLlr[idxBnGroup]>>5 );
+
+        fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+   // =====================================================================
+    // Process group with 9 CNs
+
+fprintf(fd,  "// Process group with 9 CNs \n");
+
+ // Process group with 9 CNs
+
+    if (lut_numBnInBnGroups[8] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[8] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[8]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<9; k++)
+        {
+        fprintf(fd,"        ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+        //fprintf(fd,"         (__m256i*) &llrRes[%d + i]    = _mm256_permute4x64_epi64(ymm0, 0xD8);\n",lut_startAddrBnGroupsLlr[idxBnGroup]>>5 );
+        fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+   // =====================================================================
+    // Process group with 10 CNs
+
+fprintf(fd,  "// Process group with 10 CNs \n");
+
+ // Process group with 10 CNs
+
+    if (lut_numBnInBnGroups[9] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[9] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[9]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<10; k++)
+        {
+        fprintf(fd,"        ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+
+    // =====================================================================
+
+fprintf(fd,  "// Process group with 11 CNs \n");
+
+
+
+ // Process group with 2 CNs
+
+    if (lut_numBnInBnGroups[10] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[10] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[10]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"            for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"            ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"            ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<11; k++)
+        {
+        fprintf(fd,"            ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"            ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"            ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "           ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"            ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"            ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"            ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"            ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"            ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+      // =====================================================================
+    // Process group with 2 CNs
+
+
+fprintf(fd,  "// Process group with 12 CNs \n");
+
+ // Process group with 2 CNs
+
+    if (lut_numBnInBnGroups[11] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[11] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[11]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"            for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"            ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"            ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<12; k++)
+        {
+        fprintf(fd,"            ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"            ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"            ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "           ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"            ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"            ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"            ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"            ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"            ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+    // =====================================================================
+    // Process group with 13 CNs
+
+
+fprintf(fd,  "// Process group with 13 CNs \n");
+
+ // Process group with 3 CNs
+
+    if (lut_numBnInBnGroups[12] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[12] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[12]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<13; k++)
+        {
+        fprintf(fd,"        ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd,"        ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+            }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+
+    // =====================================================================
+    // Process group with 4 CNs
+
+fprintf(fd,  "// Process group with 14 CNs \n");
+
+ // Process group with 4 CNs
+
+    if (lut_numBnInBnGroups[13] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[13] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[13]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<14; k++)
+        {
+        fprintf(fd,"        ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+   // =====================================================================
+    // Process group with 5 CNs
+
+fprintf(fd,  "// Process group with 15 CNs \n");
+
+ // Process group with 5 CNs
+
+    if (lut_numBnInBnGroups[14] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[14] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[14]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<15; k++)
+        {
+        fprintf(fd,"        ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+         fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+
+   // =====================================================================
+    // Process group with 6 CNs
+
+fprintf(fd,  "// Process group with 16 CNs \n");
+
+ // Process group with 6 CNs
+
+    if (lut_numBnInBnGroups[15] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[15] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[15]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<16; k++)
+        {
+        fprintf(fd,"        ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+   // =====================================================================
+    // Process group with 17 CNs
+
+fprintf(fd,  "// Process group with 17 CNs \n");
+
+ // Process group with 17 CNs
+
+    if (lut_numBnInBnGroups[16] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[16] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[16]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<17; k++)
+        {
+        fprintf(fd,"        ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+   // =====================================================================
+    // Process group with 18 CNs
+
+fprintf(fd,  "// Process group with 18 CNs \n");
+
+ // Process group with 8 CNs
+
+    if (lut_numBnInBnGroups[17] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[17] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[17]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<18; k++)
+        {
+        fprintf(fd,"        ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+   // =====================================================================
+    // Process group with 9 CNs
+
+fprintf(fd,  "// Process group with 19 CNs \n");
+
+ // Process group with 9 CNs
+
+    if (lut_numBnInBnGroups[18] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[18] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[18]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<19; k++)
+        {
+        fprintf(fd,"        ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+   // =====================================================================
+    // Process group with 20 CNs
+
+fprintf(fd,  "// Process group with 20 CNs \n");
+
+ // Process group with 20 CNs
+
+    if (lut_numBnInBnGroups[19] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[19] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[19]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<20; k++)
+        {
+        fprintf(fd,"        ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+
+
+
+    // =====================================================================
+
+fprintf(fd,  "// Process group with 21 CNs \n");
+
+
+
+ // Process group with 2 CNs
+
+    if (lut_numBnInBnGroups[20] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[20] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[20]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"            for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"            ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"            ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<21; k++)
+        {
+        fprintf(fd,"            ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"            ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"            ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "           ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"            ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"            ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"            ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"            ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"            ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+      // =====================================================================
+    // Process group with 2 CNs
+
+
+fprintf(fd,  "// Process group with 22 CNs \n");
+
+ // Process group with 2 CNs
+
+    if (lut_numBnInBnGroups[21] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[21] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[21]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"            for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"            ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"            ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<22; k++)
+        {
+        fprintf(fd,"            ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"            ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"            ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "           ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"            ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"            ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"            ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"            ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"            ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+         fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+    // =====================================================================
+    // Process group with 13 CNs
+
+
+fprintf(fd,  "// Process group with <23 CNs \n");
+
+ // Process group with 3 CNs
+
+    if (lut_numBnInBnGroups[22] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[22] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[22]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<23; k++)
+        {
+        fprintf(fd,"        ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd,"        ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+
+    // =====================================================================
+    // Process group with 4 CNs
+
+fprintf(fd,  "// Process group with 24 CNs \n");
+
+ // Process group with 4 CNs
+
+    if (lut_numBnInBnGroups[23] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[23] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[23]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<24; k++)
+        {
+        fprintf(fd,"        ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+   // =====================================================================
+    // Process group with 5 CNs
+
+fprintf(fd,  "// Process group with 25 CNs \n");
+
+ // Process group with 5 CNs
+
+    if (lut_numBnInBnGroups[24] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[24] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[24]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<25; k++)
+        {
+        fprintf(fd,"        ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+
+   // =====================================================================
+    // Process group with 6 CNs
+
+fprintf(fd,  "// Process group with 26 CNs \n");
+
+ // Process group with 6 CNs
+
+    if (lut_numBnInBnGroups[25] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[25] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[25]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<26; k++)
+        {
+        fprintf(fd,"        ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+   // =====================================================================
+    // Process group with 17 CNs
+
+fprintf(fd,  "// Process group with 27 CNs \n");
+
+ // Process group with 17 CNs
+
+    if (lut_numBnInBnGroups[26] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[26] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[26]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<27; k++)
+        {
+        fprintf(fd,"        ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+   // =====================================================================
+    // Process group with 18 CNs
+
+fprintf(fd,  "// Process group with 28 CNs \n");
+
+ // Process group with 8 CNs
+
+    if (lut_numBnInBnGroups[27] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[27] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[27]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<28; k++)
+        {
+        fprintf(fd,"        ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+   // =====================================================================
+    // Process group with 9 CNs
+
+fprintf(fd,  "// Process group with 29 CNs \n");
+
+ // Process group with 9 CNs
+
+    if (lut_numBnInBnGroups[28] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[28] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[28]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<29; k++)
+        {
+        fprintf(fd,"        ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+   // =====================================================================
+    // Process group with 20 CNs
+
+fprintf(fd,  "// Process group with 30 CNs \n");
+
+ // Process group with 20 CNs
+
+    if (lut_numBnInBnGroups[29] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[29] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[29]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<30; k++)
+        {
+        fprintf(fd,"        ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+    fprintf(fd,"}\n");
+  fclose(fd);
+}//end of the function  nrLDPC_bnProcPc_BG1
+
+
+
+
+
+
+
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProcPc_gen_BG2_avx2.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProcPc_gen_BG2_avx2.c
new file mode 100644
index 0000000000000000000000000000000000000000..c2c96280e9a84a2554f3648b8afb27bd1cd216e2
--- /dev/null
+++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProcPc_gen_BG2_avx2.c
@@ -0,0 +1,1789 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#include <immintrin.h>
+#include "../../nrLDPCdecoder_defs.h"
+#include "../../nrLDPC_types.h"
+
+
+void nrLDPC_bnProcPc_BG2_generator_AVX2(const char *dir, int R)
+{
+  const char *ratestr[3]={"15","13","23"};
+
+  if (R<0 || R>2) {printf("Illegal R %d\n",R); abort();}
+
+
+ // system("mkdir -p ../ldpc_gen_files");
+
+  char fname[FILENAME_MAX+1];
+  snprintf(fname, sizeof(fname), "%s/bnProcPc/nrLDPC_bnProcPc_BG2_R%s_AVX2.h", dir, ratestr[R]);
+  FILE *fd=fopen(fname,"w");
+  if (fd == NULL) {
+    printf("Cannot create file %s\n", fname);
+    abort();
+  }
+
+//  fprintf(fd,"#include <stdint.h>\n");
+  //fprintf(fd,"#include <immintrin.h>\n");
+
+  fprintf(fd,"static inline void nrLDPC_bnProcPc_BG2_R%s_AVX2(int8_t* bnProcBuf,int8_t* bnProcBufRes,int8_t* llrRes ,  int8_t* llrProcBuf, uint16_t Z  ) {\n",ratestr[R]);
+    const uint8_t*  lut_numBnInBnGroups;
+    const uint32_t* lut_startAddrBnGroups;
+    const uint16_t* lut_startAddrBnGroupsLlr;
+    if (R==0) {
+
+
+      lut_numBnInBnGroups =  lut_numBnInBnGroups_BG2_R15;
+      lut_startAddrBnGroups = lut_startAddrBnGroups_BG2_R15;
+      lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG2_R15;
+
+    }
+    else if (R==1){
+
+      lut_numBnInBnGroups =  lut_numBnInBnGroups_BG2_R13;
+      lut_startAddrBnGroups = lut_startAddrBnGroups_BG2_R13;
+      lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG2_R13;
+    }
+    else if (R==2) {
+
+      lut_numBnInBnGroups = lut_numBnInBnGroups_BG2_R23;
+      lut_startAddrBnGroups = lut_startAddrBnGroups_BG2_R23;
+      lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG2_R23;
+    }
+  else { printf("aborting, illegal R %d\n",R); fclose(fd);abort();}
+
+
+
+
+    uint32_t k;
+    // Offset to each bit within a group in terms of 32 Byte
+    uint32_t cnOffsetInGroup;
+    uint8_t idxBnGroup = 0;
+
+    fprintf(fd,"   __m256i ymm0, ymm1, ymmRes0, ymmRes1;  \n");
+
+
+    fprintf(fd,"        __m128i* p_bnProcBuf; \n");
+    fprintf(fd,"        __m128i* p_llrProcBuf;\n");
+    fprintf(fd,"        __m256i* p_llrRes; \n");
+   // fprintf(fd,"        __m256i* p_bnProcBufRes; \n");
+   // fprintf(fd,"        __m256i* p_llrProcBuf256; \n");
+    fprintf(fd,"         uint32_t M ;\n");
+
+
+    fprintf(fd,  "// Process group with 1 CNs \n");
+/*
+
+ // Process group with 1 CNs
+
+   // if (lut_numBnInBnGroups[0] > 0)
+   // {
+        // If elements in group move to next address
+       // idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[0] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+       // cnOffsetInGroup = (lut_numBnInBnGroups[0]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_bnProcBufRes     = (__m256i*) &bnProcBufRes    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+         fprintf(fd,"   p_llrProcBuf256   = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+
+        // Loop over BNs
+        fprintf(fd,"            for (int i=0,j=0;i<M;i++,j+=2) {\n");
+
+         fprintf(fd,"           p_bnProcBufRes[i] = p_llrProcBuf256[i];\n");
+
+            // First 16 LLRs of first CN
+        fprintf(fd,"            ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"            ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"           ymmRes0 = _mm256_adds_epi16(ymm0, ymm1);\n");
+
+
+            // Second 16 LLRs of first CN
+        fprintf(fd,"            ymm0    = _mm256_cvtepi8_epi16(p_bnProcBuf[j + 1 ]);\n");
+        fprintf(fd,"            ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j + 1 ]);\n");
+        fprintf(fd,"            ymmRes1 = _mm256_adds_epi16(ymm0, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"            ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+
+        fprintf(fd,"}\n");
+    //}
+  */    // =====================================================================
+    // Process group with 2 CNs
+
+
+fprintf(fd,  "// Process group with 2 CNs \n");
+
+ // Process group with 2 CNs
+
+    if (lut_numBnInBnGroups[1] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[1] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[1]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+
+        // Loop over BNs
+        fprintf(fd,"            for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"            ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"            ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf[j + 1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<2; k++)
+        {
+        fprintf(fd,"            ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"            ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"            ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "           ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"            ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"            ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"            ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"            ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"            ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+
+        fprintf(fd,"}\n");
+    }
+
+    // =====================================================================
+    // Process group with 3 CNs
+
+
+fprintf(fd,  "// Process group with 3 CNs \n");
+
+ // Process group with 3 CNs
+
+    if (lut_numBnInBnGroups[2] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[2] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[2]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<3; k++)
+        {
+        fprintf(fd,"        ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd,"        ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+            }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+
+    // =====================================================================
+    // Process group with 4 CNs
+
+fprintf(fd,  "// Process group with 4 CNs \n");
+
+ // Process group with 4 CNs
+
+    if (lut_numBnInBnGroups[3] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[3] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[3]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<4; k++)
+        {
+        fprintf(fd,"        ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+   // =====================================================================
+    // Process group with 5 CNs
+
+fprintf(fd,  "// Process group with 5 CNs \n");
+
+ // Process group with 5 CNs
+
+    if (lut_numBnInBnGroups[4] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[4] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[4]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<5; k++)
+        {
+        fprintf(fd,"        ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+
+   // =====================================================================
+    // Process group with 6 CNs
+
+fprintf(fd,  "// Process group with 6 CNs \n");
+
+ // Process group with 6 CNs
+
+    if (lut_numBnInBnGroups[5] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[5] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[5]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<6; k++)
+        {
+        fprintf(fd,"        ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+   // =====================================================================
+    // Process group with 7 CNs
+
+fprintf(fd,  "// Process group with 7 CNs \n");
+
+ // Process group with 7 CNs
+
+    if (lut_numBnInBnGroups[6] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[6] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[6]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<7; k++)
+        {
+        fprintf(fd,"        ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+        //fprintf(fd,"         (__m256i*) &llrRes[%d + i]    = _mm256_permute4x64_epi64(ymm0, 0xD8);\n",lut_startAddrBnGroupsLlr[idxBnGroup]>>5 );
+        fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+   // =====================================================================
+    // Process group with 8 CNs
+
+fprintf(fd,  "// Process group with 8 CNs \n");
+
+ // Process group with 8 CNs
+
+    if (lut_numBnInBnGroups[7] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[7] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[7]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<8; k++)
+        {
+        fprintf(fd,"        ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+        //fprintf(fd,"         (__m256i*) &llrRes[%d + i]    = _mm256_permute4x64_epi64(ymm0, 0xD8);\n",lut_startAddrBnGroupsLlr[idxBnGroup]>>5 );
+
+        fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+   // =====================================================================
+    // Process group with 9 CNs
+
+fprintf(fd,  "// Process group with 9 CNs \n");
+
+ // Process group with 9 CNs
+
+    if (lut_numBnInBnGroups[8] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[8] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[8]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<9; k++)
+        {
+        fprintf(fd,"        ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+        //fprintf(fd,"         (__m256i*) &llrRes[%d + i]    = _mm256_permute4x64_epi64(ymm0, 0xD8);\n",lut_startAddrBnGroupsLlr[idxBnGroup]>>5 );
+        fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+   // =====================================================================
+    // Process group with 10 CNs
+
+fprintf(fd,  "// Process group with 10 CNs \n");
+
+ // Process group with 10 CNs
+
+    if (lut_numBnInBnGroups[9] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[9] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[9]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<10; k++)
+        {
+        fprintf(fd,"        ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+
+    // =====================================================================
+
+fprintf(fd,  "// Process group with 11 CNs \n");
+
+
+
+ // Process group with 2 CNs
+
+    if (lut_numBnInBnGroups[10] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[10] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[10]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"            for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"            ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"            ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<11; k++)
+        {
+        fprintf(fd,"            ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"            ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"            ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "           ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"            ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"            ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"            ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"            ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"            ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+      // =====================================================================
+    // Process group with 2 CNs
+
+
+fprintf(fd,  "// Process group with 12 CNs \n");
+
+ // Process group with 2 CNs
+
+    if (lut_numBnInBnGroups[11] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[11] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[11]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"            for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"            ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"            ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<12; k++)
+        {
+        fprintf(fd,"            ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"            ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"            ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "           ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"            ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"            ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"            ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"            ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"            ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+    // =====================================================================
+    // Process group with 13 CNs
+
+
+fprintf(fd,  "// Process group with 13 CNs \n");
+
+ // Process group with 3 CNs
+
+    if (lut_numBnInBnGroups[12] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[12] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[12]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<13; k++)
+        {
+        fprintf(fd,"        ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd,"        ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+            }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+
+    // =====================================================================
+    // Process group with 4 CNs
+
+fprintf(fd,  "// Process group with 14 CNs \n");
+
+ // Process group with 4 CNs
+
+    if (lut_numBnInBnGroups[13] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[13] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[13]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<14; k++)
+        {
+        fprintf(fd,"        ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+   // =====================================================================
+    // Process group with 5 CNs
+
+fprintf(fd,  "// Process group with 15 CNs \n");
+
+ // Process group with 5 CNs
+
+    if (lut_numBnInBnGroups[14] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[14] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[14]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<15; k++)
+        {
+        fprintf(fd,"        ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+         fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+
+   // =====================================================================
+    // Process group with 6 CNs
+
+fprintf(fd,  "// Process group with 16 CNs \n");
+
+ // Process group with 6 CNs
+
+    if (lut_numBnInBnGroups[15] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[15] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[15]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<16; k++)
+        {
+        fprintf(fd,"        ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+   // =====================================================================
+    // Process group with 17 CNs
+
+fprintf(fd,  "// Process group with 17 CNs \n");
+
+ // Process group with 17 CNs
+
+    if (lut_numBnInBnGroups[16] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[16] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[16]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<17; k++)
+        {
+        fprintf(fd,"        ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+   // =====================================================================
+    // Process group with 18 CNs
+
+fprintf(fd,  "// Process group with 18 CNs \n");
+
+ // Process group with 8 CNs
+
+    if (lut_numBnInBnGroups[17] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[17] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[17]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<18; k++)
+        {
+        fprintf(fd,"        ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+   // =====================================================================
+    // Process group with 9 CNs
+
+fprintf(fd,  "// Process group with 19 CNs \n");
+
+ // Process group with 9 CNs
+
+    if (lut_numBnInBnGroups[18] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[18] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[18]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<19; k++)
+        {
+        fprintf(fd,"        ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+   // =====================================================================
+    // Process group with 20 CNs
+
+fprintf(fd,  "// Process group with 20 CNs \n");
+
+ // Process group with 20 CNs
+
+    if (lut_numBnInBnGroups[19] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[19] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[19]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<20; k++)
+        {
+        fprintf(fd,"        ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+
+
+
+    // =====================================================================
+
+fprintf(fd,  "// Process group with 21 CNs \n");
+
+
+
+ // Process group with 2 CNs
+
+    if (lut_numBnInBnGroups[20] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[20] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[20]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"            for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"            ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"            ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<21; k++)
+        {
+        fprintf(fd,"            ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"            ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"            ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "           ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"            ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"            ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"            ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"            ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"            ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+      // =====================================================================
+    // Process group with 2 CNs
+
+
+fprintf(fd,  "// Process group with 22 CNs \n");
+
+ // Process group with 2 CNs
+
+    if (lut_numBnInBnGroups[21] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[21] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[21]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"            for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"            ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"            ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<22; k++)
+        {
+        fprintf(fd,"            ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"            ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"            ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "           ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"            ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"            ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"            ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"            ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"            ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+         fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+    // =====================================================================
+    // Process group with 13 CNs
+
+
+fprintf(fd,  "// Process group with <23 CNs \n");
+
+ // Process group with 3 CNs
+
+    if (lut_numBnInBnGroups[22] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[22] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[22]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<23; k++)
+        {
+        fprintf(fd,"        ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd,"        ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+
+    // =====================================================================
+    // Process group with 4 CNs
+
+fprintf(fd,  "// Process group with 24 CNs \n");
+
+ // Process group with 4 CNs
+
+    if (lut_numBnInBnGroups[23] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[23] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[23]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<24; k++)
+        {
+        fprintf(fd,"        ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+   // =====================================================================
+    // Process group with 5 CNs
+
+fprintf(fd,  "// Process group with 25 CNs \n");
+
+ // Process group with 5 CNs
+
+    if (lut_numBnInBnGroups[24] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[24] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[24]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<25; k++)
+        {
+        fprintf(fd,"        ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+
+   // =====================================================================
+    // Process group with 6 CNs
+
+fprintf(fd,  "// Process group with 26 CNs \n");
+
+ // Process group with 6 CNs
+
+    if (lut_numBnInBnGroups[25] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[25] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[25]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<26; k++)
+        {
+        fprintf(fd,"        ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+   // =====================================================================
+    // Process group with 17 CNs
+
+fprintf(fd,  "// Process group with 27 CNs \n");
+
+ // Process group with 17 CNs
+
+    if (lut_numBnInBnGroups[26] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[26] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[26]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<27; k++)
+        {
+        fprintf(fd,"        ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+   // =====================================================================
+    // Process group with 18 CNs
+
+fprintf(fd,  "// Process group with 28 CNs \n");
+
+ // Process group with 8 CNs
+
+    if (lut_numBnInBnGroups[27] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[27] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[27]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<28; k++)
+        {
+        fprintf(fd,"        ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+   // =====================================================================
+    // Process group with 9 CNs
+
+fprintf(fd,  "// Process group with 29 CNs \n");
+
+ // Process group with 9 CNs
+
+    if (lut_numBnInBnGroups[28] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[28] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[28]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<29; k++)
+        {
+        fprintf(fd,"        ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+   // =====================================================================
+    // Process group with 20 CNs
+
+fprintf(fd,  "// Process group with 30 CNs \n");
+
+ // Process group with 20 CNs
+
+    if (lut_numBnInBnGroups[29] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[29] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[29]*NR_LDPC_ZMAX)>>4;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m128i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m128i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m256i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<30; k++)
+        {
+        fprintf(fd,"        ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        ymm0    = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
+
+        fprintf(fd,"        ymm1    = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
+            // ymm0     = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
+            // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+    fprintf(fd,"}\n");
+  fclose(fd);
+}//end of the function  nrLDPC_bnProcPc_BG2
+
+
+
+
+
+
+
+
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProc_gen_BG1_avx2.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProc_gen_BG1_avx2.c
new file mode 100644
index 0000000000000000000000000000000000000000..972a5720ca41f865b8b917cf884804682ee46b09
--- /dev/null
+++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProc_gen_BG1_avx2.c
@@ -0,0 +1,1112 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <immintrin.h>
+#include "../../nrLDPCdecoder_defs.h"
+#include "../../nrLDPC_types.h"
+
+
+void nrLDPC_bnProc_BG1_generator_AVX2(const char *dir, int R)
+{
+  const char *ratestr[3]={"13","23","89"};
+
+  if (R<0 || R>2) {printf("Illegal R %d\n",R); abort();}
+
+
+ // system("mkdir -p ../ldpc_gen_files");
+
+  char fname[FILENAME_MAX+1];
+  snprintf(fname, sizeof(fname), "%s/bnProc/nrLDPC_bnProc_BG1_R%s_AVX2.h", dir, ratestr[R]);
+  FILE *fd=fopen(fname,"w");
+  if (fd == NULL) {
+    printf("Cannot create file %s\n", fname);
+    abort();
+  }
+
+  //fprintf(fd,"#include <stdint.h>\n");
+  //fprintf(fd,"#include <immintrin.h>\n");
+
+
+    fprintf(fd,"static inline void nrLDPC_bnProc_BG1_R%s_AVX2(int8_t* bnProcBuf,int8_t* bnProcBufRes,  int8_t* llrRes, uint16_t Z ) {\n", ratestr[R]);
+
+    const uint8_t*  lut_numBnInBnGroups;
+    const uint32_t* lut_startAddrBnGroups;
+    const uint16_t* lut_startAddrBnGroupsLlr;
+    if (R==0) {
+
+
+      lut_numBnInBnGroups =  lut_numBnInBnGroups_BG1_R13;
+      lut_startAddrBnGroups = lut_startAddrBnGroups_BG1_R13;
+      lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG1_R13;
+
+    }
+    else if (R==1){
+
+      lut_numBnInBnGroups =  lut_numBnInBnGroups_BG1_R23;
+      lut_startAddrBnGroups = lut_startAddrBnGroups_BG1_R23;
+      lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG1_R23;
+    }
+    else if (R==2) {
+
+      lut_numBnInBnGroups = lut_numBnInBnGroups_BG1_R89;
+      lut_startAddrBnGroups = lut_startAddrBnGroups_BG1_R89;
+      lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG1_R89;
+    }
+  else { printf("aborting, illegal R %d\n",R); fclose(fd);abort();}
+
+
+    //uint32_t M;
+    //uint32_t M32rem;
+   // uint32_t i;
+    uint32_t k;
+    // Offset to each bit within a group in terms of 32 Byte
+    uint32_t cnOffsetInGroup;
+    uint8_t idxBnGroup = 0;
+    fprintf(fd,"        uint32_t M, i; \n");
+
+
+
+// =====================================================================
+    // Process group with 1 CN
+    // Already done in bnProcBufPc
+
+    // =====================================================================
+
+fprintf(fd,  "// Process group with 2 CNs \n");
+
+    if (lut_numBnInBnGroups[1] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs or parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[1] );
+
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[1]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<2; k++)
+        {
+    
+          // Loop over BNs
+        fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+
+
+
+    }
+
+    // =====================================================================
+
+
+fprintf(fd,  "// Process group with 3 CNs \n");
+
+
+
+    if (lut_numBnInBnGroups[2] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+         fprintf(fd,"       M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[2] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[2]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        //fprintf(fd,"    ((__m256i*) bnProcBuf)     = ((__m256i*) &bnProcBuf)    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        
+
+        for (k=0; k<3; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+        }
+    }
+
+
+
+    // =====================================================================
+
+
+fprintf(fd,  "// Process group with 4 CNs \n");
+
+
+
+    if (lut_numBnInBnGroups[3] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[3] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[3]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+      
+    
+
+        for (k=0; k<4; k++)
+        {
+  
+          // Loop over BNs
+        fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",((lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup),(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), ((lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup));
+
+         fprintf(fd,"}\n");
+        }
+    }
+
+
+   // =====================================================================
+
+
+    fprintf(fd,  "// Process group with 5 CNs \n");
+
+
+
+    if (lut_numBnInBnGroups[4] > 0)
+    {
+    // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[4] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[4]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<5; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+
+   // =====================================================================
+
+
+fprintf(fd,  "// Process group with 6 CNs \n");
+
+ // Process group with 6 CNs
+
+    if (lut_numBnInBnGroups[5] > 0)
+    {
+  // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[5] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[5]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<6; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+   // =====================================================================
+
+
+fprintf(fd,  "// Process group with 7 CNs \n");
+
+ // Process group with 7 CNs
+
+    if (lut_numBnInBnGroups[6] > 0)
+    {
+  // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[6] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[6]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<7; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+   // =====================================================================
+
+
+fprintf(fd,  "// Process group with 8 CNs \n");
+
+ // Process group with 8 CNs
+
+    if (lut_numBnInBnGroups[7] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[7] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[7]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<8; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+   // =====================================================================
+
+
+fprintf(fd,  "// Process group with 9 CNs \n");
+
+ // Process group with 9 CNs
+
+    if (lut_numBnInBnGroups[8] > 0)
+    {
+  // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[8] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[8]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<9; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+   // =====================================================================
+
+fprintf(fd,  "// Process group with 10 CNs \n");
+
+ // Process group with 10 CNs
+
+    if (lut_numBnInBnGroups[9] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[9] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[9]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<10; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+
+    // =====================================================================
+
+fprintf(fd,  "// Process group with 11 CNs \n");
+
+    if (lut_numBnInBnGroups[10] > 0)
+    {
+  // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[10] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[10]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<11; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+      // =====================================================================
+
+
+
+fprintf(fd,  "// Process group with 12 CNs \n");
+
+
+    if (lut_numBnInBnGroups[11] > 0)
+    {
+  // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[11] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[11]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<12; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+    // =====================================================================
+
+
+
+fprintf(fd,  "// Process group with 13 CNs \n");
+
+
+
+    if (lut_numBnInBnGroups[12] > 0)
+    {
+  // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[12] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[12]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<13; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+
+    // =====================================================================
+
+
+fprintf(fd,  "// Process group with 14 CNs \n");
+
+
+
+    if (lut_numBnInBnGroups[13] > 0)
+    {
+  // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[13] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[13]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<14; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+   // =====================================================================
+
+
+fprintf(fd,  "// Process group with 15 CNs \n");
+
+
+
+    if (lut_numBnInBnGroups[14] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[14] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[14]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<15; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+
+   // =====================================================================
+
+
+fprintf(fd,  "// Process group with 16 CNs \n");
+
+
+
+    if (lut_numBnInBnGroups[15] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[15] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[15]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<16; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+   // =====================================================================
+    // Process group with 17 CNs
+
+fprintf(fd,  "// Process group with 17 CNs \n");
+
+ // Process group with 17 CNs
+
+    if (lut_numBnInBnGroups[16] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[16] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[16]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<17; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+   // =====================================================================
+
+
+fprintf(fd,  "// Process group with 18 CNs \n");
+
+ // Process group with 8 CNs
+
+    if (lut_numBnInBnGroups[17] > 0)
+    {
+  // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[17] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[17]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<18; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+   // =====================================================================
+
+
+fprintf(fd,  "// Process group with 19 CNs \n");
+
+
+
+    if (lut_numBnInBnGroups[18] > 0)
+    {
+  // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[18] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[18]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<19; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+   // =====================================================================
+
+
+fprintf(fd,  "// Process group with 20 CNs \n");
+
+
+
+    if (lut_numBnInBnGroups[19] > 0)
+    {
+  // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[19] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[19]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<20; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+
+
+
+    // =====================================================================
+
+fprintf(fd,  "// Process group with 21 CNs \n");
+
+
+
+
+
+    if (lut_numBnInBnGroups[20] > 0)
+    {
+  // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[20] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[20]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<21; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+      // =====================================================================
+
+
+
+fprintf(fd,  "// Process group with 22 CNs \n");
+
+
+    if (lut_numBnInBnGroups[21] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[21] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[21]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<22; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+    // =====================================================================
+
+
+
+fprintf(fd,  "// Process group with <23 CNs \n");
+
+
+
+    if (lut_numBnInBnGroups[22] > 0)
+    {
+  // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[22] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[22]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<23; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+
+    // =====================================================================
+
+
+fprintf(fd,  "// Process group with 24 CNs \n");
+
+ // Process group with 4 CNs
+
+    if (lut_numBnInBnGroups[23] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[23] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[23]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<24; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+   // =====================================================================
+
+
+fprintf(fd,  "// Process group with 25 CNs \n");
+
+
+
+    if (lut_numBnInBnGroups[24] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[24] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[24]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<25; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup);
+
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+
+   // =====================================================================
+
+
+fprintf(fd,  "// Process group with 26 CNs \n");
+
+
+
+    if (lut_numBnInBnGroups[25] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[25] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[25]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<26; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+   // =====================================================================
+
+
+fprintf(fd,  "// Process group with 27 CNs \n");
+
+ // Process group with 17 CNs
+
+    if (lut_numBnInBnGroups[26] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[26] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[26]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<27; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+   // =====================================================================
+
+
+fprintf(fd,  "// Process group with 28 CNs \n");
+
+ // Process group with 8 CNs
+
+    if (lut_numBnInBnGroups[27] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[27] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[27]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<28; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+   // =====================================================================
+
+fprintf(fd,  "// Process group with 29 CNs \n");
+
+ // Process group with 9 CNs
+
+    if (lut_numBnInBnGroups[28] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[28] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[28]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<29; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+   // =====================================================================
+
+fprintf(fd,  "// Process group with 30 CNs \n");
+
+ // Process group with 20 CNs
+
+    if (lut_numBnInBnGroups[29] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[29] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[29]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<30; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+    fprintf(fd,"}\n");
+  fclose(fd);
+}//end of the function  nrLDPC_bnProc_BG1
+
+
+
+
+
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProc_gen_BG2_avx2.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProc_gen_BG2_avx2.c
new file mode 100644
index 0000000000000000000000000000000000000000..c23fd0b5a75d036513be1a6b0c6f9f7bc0346262
--- /dev/null
+++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProc_gen_BG2_avx2.c
@@ -0,0 +1,1108 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include "../../nrLDPCdecoder_defs.h"
+#include "../../nrLDPC_types.h"
+
+
+
+void nrLDPC_bnProc_BG2_generator_AVX2(const char *dir, int R)
+{
+  const char *ratestr[3]={"15","13","23"};
+
+  if (R<0 || R>2) {printf("Illegal R %d\n",R); abort();}
+
+
+ // system("mkdir -p ../ldpc_gen_files");
+
+  char fname[FILENAME_MAX+1];
+  snprintf(fname, sizeof(fname), "%s/bnProc/nrLDPC_bnProc_BG2_R%s_AVX2.h", dir, ratestr[R]);
+  FILE *fd=fopen(fname,"w");
+  if (fd == NULL) {
+    printf("Cannot create file %s\n", fname);
+    abort();
+  }
+
+
+
+    fprintf(fd,"static inline void nrLDPC_bnProc_BG2_R%s_AVX2(int8_t* bnProcBuf,int8_t* bnProcBufRes,  int8_t* llrRes, uint16_t Z  ) {\n",ratestr[R]);
+    const uint8_t*  lut_numBnInBnGroups;
+    const uint32_t* lut_startAddrBnGroups;
+    const uint16_t* lut_startAddrBnGroupsLlr;
+    if (R==0) {
+
+
+      lut_numBnInBnGroups =  lut_numBnInBnGroups_BG2_R15;
+      lut_startAddrBnGroups = lut_startAddrBnGroups_BG2_R15;
+      lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG2_R15;
+
+    }
+    else if (R==1){
+
+      lut_numBnInBnGroups =  lut_numBnInBnGroups_BG2_R13;
+      lut_startAddrBnGroups = lut_startAddrBnGroups_BG2_R13;
+      lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG2_R13;
+    }
+    else if (R==2) {
+
+      lut_numBnInBnGroups = lut_numBnInBnGroups_BG2_R23;
+      lut_startAddrBnGroups = lut_startAddrBnGroups_BG2_R23;
+      lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG2_R23;
+    }
+  else { printf("aborting, illegal R %d\n",R); fclose(fd);abort();}
+
+
+    //uint32_t M;
+    //uint32_t M32rem;
+   // uint32_t i;
+    uint32_t k;
+    // Offset to each bit within a group in terms of 32 Byte
+    uint32_t cnOffsetInGroup;
+    uint8_t idxBnGroup = 0;
+
+
+
+     fprintf(fd,"        uint32_t M, i; \n");
+
+
+
+// =====================================================================
+    // Process group with 1 CN
+    // Already done in bnProcBufPc
+
+    // =====================================================================
+
+fprintf(fd,  "// Process group with 2 CNs \n");
+
+    if (lut_numBnInBnGroups[1] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs or parallel processing
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[1] );
+
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[1]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<2; k++)
+        {
+    
+          // Loop over BNs
+        fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+
+
+
+    }
+
+    // =====================================================================
+
+
+fprintf(fd,  "// Process group with 3 CNs \n");
+
+
+
+    if (lut_numBnInBnGroups[2] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+         fprintf(fd,"       M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[2] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[2]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        //fprintf(fd,"    ((__m256i*) bnProcBuf)     = ((__m256i*) &bnProcBuf)    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        
+
+        for (k=0; k<3; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+        }
+    }
+
+
+
+    // =====================================================================
+
+
+fprintf(fd,  "// Process group with 4 CNs \n");
+
+
+
+    if (lut_numBnInBnGroups[3] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[3] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[3]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+      
+    
+
+        for (k=0; k<4; k++)
+        {
+  
+          // Loop over BNs
+        fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",((lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup),(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), ((lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup));
+
+         fprintf(fd,"}\n");
+        }
+    }
+
+
+   // =====================================================================
+
+
+    fprintf(fd,  "// Process group with 5 CNs \n");
+
+
+
+    if (lut_numBnInBnGroups[4] > 0)
+    {
+    // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[4] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[4]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<5; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+
+   // =====================================================================
+
+
+fprintf(fd,  "// Process group with 6 CNs \n");
+
+ // Process group with 6 CNs
+
+    if (lut_numBnInBnGroups[5] > 0)
+    {
+  // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[5] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[5]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<6; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+   // =====================================================================
+
+
+fprintf(fd,  "// Process group with 7 CNs \n");
+
+ // Process group with 7 CNs
+
+    if (lut_numBnInBnGroups[6] > 0)
+    {
+  // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[6] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[6]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<7; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+   // =====================================================================
+
+
+fprintf(fd,  "// Process group with 8 CNs \n");
+
+ // Process group with 8 CNs
+
+    if (lut_numBnInBnGroups[7] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[7] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[7]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<8; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+   // =====================================================================
+
+
+fprintf(fd,  "// Process group with 9 CNs \n");
+
+ // Process group with 9 CNs
+
+    if (lut_numBnInBnGroups[8] > 0)
+    {
+  // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[8] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[8]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<9; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+   // =====================================================================
+
+fprintf(fd,  "// Process group with 10 CNs \n");
+
+ // Process group with 10 CNs
+
+    if (lut_numBnInBnGroups[9] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[9] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[9]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<10; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+
+    // =====================================================================
+
+fprintf(fd,  "// Process group with 11 CNs \n");
+
+    if (lut_numBnInBnGroups[10] > 0)
+    {
+  // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[10] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[10]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<11; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+      // =====================================================================
+
+
+
+fprintf(fd,  "// Process group with 12 CNs \n");
+
+
+    if (lut_numBnInBnGroups[11] > 0)
+    {
+  // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[11] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[11]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<12; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+    // =====================================================================
+
+
+
+fprintf(fd,  "// Process group with 13 CNs \n");
+
+
+
+    if (lut_numBnInBnGroups[12] > 0)
+    {
+  // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[12] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[12]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<13; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+
+    // =====================================================================
+
+
+fprintf(fd,  "// Process group with 14 CNs \n");
+
+
+
+    if (lut_numBnInBnGroups[13] > 0)
+    {
+  // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[13] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[13]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<14; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+   // =====================================================================
+
+
+fprintf(fd,  "// Process group with 15 CNs \n");
+
+
+
+    if (lut_numBnInBnGroups[14] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[14] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[14]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<15; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+
+   // =====================================================================
+
+
+fprintf(fd,  "// Process group with 16 CNs \n");
+
+
+
+    if (lut_numBnInBnGroups[15] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[15] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[15]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<16; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+   // =====================================================================
+    // Process group with 17 CNs
+
+fprintf(fd,  "// Process group with 17 CNs \n");
+
+ // Process group with 17 CNs
+
+    if (lut_numBnInBnGroups[16] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[16] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[16]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<17; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+   // =====================================================================
+
+
+fprintf(fd,  "// Process group with 18 CNs \n");
+
+ // Process group with 8 CNs
+
+    if (lut_numBnInBnGroups[17] > 0)
+    {
+  // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[17] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[17]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<18; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+   // =====================================================================
+
+
+fprintf(fd,  "// Process group with 19 CNs \n");
+
+
+
+    if (lut_numBnInBnGroups[18] > 0)
+    {
+  // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[18] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[18]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<19; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+   // =====================================================================
+
+
+fprintf(fd,  "// Process group with 20 CNs \n");
+
+
+
+    if (lut_numBnInBnGroups[19] > 0)
+    {
+  // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[19] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[19]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<20; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+
+
+
+    // =====================================================================
+
+fprintf(fd,  "// Process group with 21 CNs \n");
+
+
+
+
+
+    if (lut_numBnInBnGroups[20] > 0)
+    {
+  // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[20] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[20]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<21; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+      // =====================================================================
+
+
+
+fprintf(fd,  "// Process group with 22 CNs \n");
+
+
+    if (lut_numBnInBnGroups[21] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[21] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[21]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<22; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+    // =====================================================================
+
+
+
+fprintf(fd,  "// Process group with <23 CNs \n");
+
+
+
+    if (lut_numBnInBnGroups[22] > 0)
+    {
+  // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[22] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[22]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<23; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+
+    // =====================================================================
+
+
+fprintf(fd,  "// Process group with 24 CNs \n");
+
+ // Process group with 4 CNs
+
+    if (lut_numBnInBnGroups[23] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[23] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[23]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<24; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+   // =====================================================================
+
+
+fprintf(fd,  "// Process group with 25 CNs \n");
+
+
+
+    if (lut_numBnInBnGroups[24] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[24] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[24]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<25; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup);
+
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+
+   // =====================================================================
+
+
+fprintf(fd,  "// Process group with 26 CNs \n");
+
+
+
+    if (lut_numBnInBnGroups[25] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[25] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[25]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<26; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+   // =====================================================================
+
+
+fprintf(fd,  "// Process group with 27 CNs \n");
+
+ // Process group with 17 CNs
+
+    if (lut_numBnInBnGroups[26] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[26] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[26]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<27; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+   // =====================================================================
+
+
+fprintf(fd,  "// Process group with 28 CNs \n");
+
+ // Process group with 8 CNs
+
+    if (lut_numBnInBnGroups[27] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[27] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[27]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<28; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+   // =====================================================================
+
+fprintf(fd,  "// Process group with 29 CNs \n");
+
+ // Process group with 9 CNs
+
+    if (lut_numBnInBnGroups[28] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[28] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[28]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<29; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+   // =====================================================================
+
+fprintf(fd,  "// Process group with 30 CNs \n");
+
+ // Process group with 20 CNs
+
+    if (lut_numBnInBnGroups[29] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[29] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[29]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<30; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+    fprintf(fd,"}\n");
+  fclose(fd);
+}//end of the function  nrLDPC_bnProc_BG2
+
+
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/main.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/main.c
new file mode 100644
index 0000000000000000000000000000000000000000..9e5f9e2bb8838c26ec19d6d5c1fdf7dcb6e96a52
--- /dev/null
+++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/main.c
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#define NB_R  3
+void nrLDPC_bnProc_BG1_generator_AVX2(const char*, int);
+void nrLDPC_bnProc_BG2_generator_AVX2(const char*, int);
+void nrLDPC_bnProcPc_BG1_generator_AVX2(const char*, int);
+void nrLDPC_bnProcPc_BG2_generator_AVX2(const char*, int);
+
+const char *__asan_default_options()
+{
+  /* don't do leak checking in nr_ulsim, creates problems in the CI */
+  return "detect_leaks=0";
+}
+
+int main(int argc, char *argv[])
+{
+  if (argc != 2) {
+    fprintf(stderr, "usage: %s <output-dir>\n", argv[0]);
+    return 1;
+  }
+  const char *dir = argv[1];
+
+  int R[NB_R]={0,1,2};
+  for(int i=0; i<NB_R;i++){
+    nrLDPC_bnProc_BG1_generator_AVX2(dir, R[i]);
+    nrLDPC_bnProc_BG2_generator_AVX2(dir, R[i]);
+
+    nrLDPC_bnProcPc_BG1_generator_AVX2(dir, R[i]);
+    nrLDPC_bnProcPc_BG2_generator_AVX2(dir, R[i]);
+  }
+
+  return(0);
+}
+
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/CMakeLists.txt b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..f0b3d49b1e6e28bb2f8d824ff88a3417db0777b6
--- /dev/null
+++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/CMakeLists.txt
@@ -0,0 +1,36 @@
+add_executable(bnProc_gen_avx512
+               bnProc_gen_BG1_avx512.c
+               bnProc_gen_BG2_avx512.c
+               bnProcPc_gen_BG1_avx512.c
+               bnProcPc_gen_BG2_avx512.c
+               main.c)
+target_compile_options(bnProc_gen_avx512 PRIVATE -W -Wall -mavx2)
+
+#set(bnProc_avx512_headers
+#    bnProc_avx512/rLDPC_bnProc_BG1_R13_AVX512.h
+#    bnProc_avx512/rLDPC_bnProc_BG1_R23_AVX512.h
+#    bnProc_avx512/rLDPC_bnProc_BG1_R89_AVX512.h
+#    bnProc_avx512/rLDPC_bnProc_BG2_R13_AVX512.h
+#    bnProc_avx512/rLDPC_bnProc_BG2_R15_AVX512.h
+#    bnProc_avx512/rLDPC_bnProc_BG2_R23_AVX512.h)
+#
+#set(bnProcPc_avx512_headers
+#    bnProcPc_avx512/rLDPC_bnProcPc_BG1_R13_AVX512.h
+#    bnProcPc_avx512/rLDPC_bnProcPc_BG1_R23_AVX512.h
+#    bnProcPc_avx512/rLDPC_bnProcPc_BG1_R89_AVX512.h
+#    bnProcPc_avx512/rLDPC_bnProcPc_BG2_R13_AVX512.h
+#    bnProcPc_avx512/rLDPC_bnProcPc_BG2_R15_AVX512.h
+#    bnProcPc_avx512/rLDPC_bnProcPc_BG2_R23_AVX512.h)
+
+add_custom_command(TARGET bnProc_gen_avx512 POST_BUILD
+  #OUTPUT ${bnProc_avx512_headers} ${bnProcPc_avx512_headers}
+  COMMAND ${CMAKE_COMMAND} -E make_directory bnProc_avx512
+  COMMAND ${CMAKE_COMMAND} -E make_directory bnProcPc_avx512
+  COMMAND bnProc_gen_avx512 .
+  DEPENDS bnProc_gen_avx512
+  COMMENT "Generating LDPC bnProc header files for AVX512"
+)
+
+add_library(bnProc_gen_avx512_HEADERS INTERFACE)
+target_include_directories(bnProc_gen_avx512_HEADERS INTERFACE ${CMAKE_CURRENT_BINARY_DIR})
+add_dependencies(bnProc_gen_avx512_HEADERS bnProc_gen_avx512)
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/bnProcPc_gen_BG1_avx512.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/bnProcPc_gen_BG1_avx512.c
new file mode 100644
index 0000000000000000000000000000000000000000..2bbca1591f716fc004d3c4fe58e3ac899a62ff42
--- /dev/null
+++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/bnProcPc_gen_BG1_avx512.c
@@ -0,0 +1,1790 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <immintrin.h>
+#include "../../nrLDPCdecoder_defs.h"
+#include "../../nrLDPC_types.h"
+
+
+void nrLDPC_bnProcPc_BG1_generator_AVX512(const char *dir, int R)
+{
+  const char *ratestr[3]={"13","23","89"};
+
+  if (R<0 || R>2) {printf("Illegal R %d\n",R); abort();}
+
+
+
+
+  char fname[FILENAME_MAX+1];
+  snprintf(fname, sizeof(fname), "%s/bnProcPc_avx512/nrLDPC_bnProcPc_BG1_R%s_AVX512.h", dir, ratestr[R]);
+  FILE *fd=fopen(fname,"w");
+  if (fd == NULL) {
+    printf("Cannot create file %s\n", fname);
+    abort();
+  }
+
+
+
+  fprintf(fd,"static inline void nrLDPC_bnProcPc_BG1_R%s_AVX512(int8_t* bnProcBuf,int8_t* llrRes ,  int8_t* llrProcBuf, uint16_t Z ) {\n",ratestr[R]);
+    const uint8_t*  lut_numBnInBnGroups;
+    const uint32_t* lut_startAddrBnGroups;
+    const uint16_t* lut_startAddrBnGroupsLlr;
+    if (R==0) {
+
+
+      lut_numBnInBnGroups =  lut_numBnInBnGroups_BG1_R13;
+      lut_startAddrBnGroups = lut_startAddrBnGroups_BG1_R13;
+      lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG1_R13;
+
+    }
+    else if (R==1){
+
+      lut_numBnInBnGroups =  lut_numBnInBnGroups_BG1_R23;
+      lut_startAddrBnGroups = lut_startAddrBnGroups_BG1_R23;
+      lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG1_R23;
+    }
+    else if (R==2) {
+
+      lut_numBnInBnGroups = lut_numBnInBnGroups_BG1_R89;
+      lut_startAddrBnGroups = lut_startAddrBnGroups_BG1_R89;
+      lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG1_R89;
+    }
+  else { printf("aborting, illegal R %d\n",R); fclose(fd);abort();}
+        // Number of BNs in Groups
+//    uint32_t M;
+    //uint32_t M32rem;
+    //uint32_t i,j;
+    uint32_t k;
+    // Offset to each bit within a group in terms of 32 Byte
+    uint32_t cnOffsetInGroup;
+    uint8_t idxBnGroup = 0;
+
+    fprintf(fd,"   __m512i zmm0, zmm1, zmmRes0, zmmRes1;  \n");
+
+
+    fprintf(fd,"        __m256i* p_bnProcBuf; \n");
+    fprintf(fd,"        __m256i* p_llrProcBuf;\n");
+    fprintf(fd,"        __m512i* p_llrRes; \n");
+    fprintf(fd,"         uint32_t M ;\n");
+
+
+fprintf(fd,  "// Process group with 1 CNs \n");
+
+
+ // Process group with 2 CNs
+
+    if (lut_numBnInBnGroups[0] > 0)
+    {
+        // If elements in group move to next address
+       // idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[0] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[0]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+
+        // Loop over BNs
+        fprintf(fd,"            for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"            zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"            zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[j + 1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<1; k++)
+        {
+        fprintf(fd,"            zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"            zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"            zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "           zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"            zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"            zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"            zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"            zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"            zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n");
+            // zmm0     = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+
+        fprintf(fd,"}\n");
+    }
+      // =====================================================================
+    // Process group with 2 CNs
+
+
+fprintf(fd,  "// Process group with 2 CNs \n");
+
+ // Process group with 2 CNs
+
+    if (lut_numBnInBnGroups[1] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[1] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[1]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+
+        // Loop over BNs
+        fprintf(fd,"            for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"            zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"            zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf[j + 1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<2; k++)
+        {
+        fprintf(fd,"            zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"            zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"            zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "           zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"            zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"            zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"            zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"            zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"            zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n");
+            // zmm0     = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+
+        fprintf(fd,"}\n");
+    }
+
+    // =====================================================================
+    // Process group with 3 CNs
+
+
+fprintf(fd,  "// Process group with 3 CNs \n");
+
+ // Process group with 3 CNs
+
+    if (lut_numBnInBnGroups[2] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[2] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[2]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<3; k++)
+        {
+        fprintf(fd,"        zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"        zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd,"        zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n");
+            }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"        zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n");
+            // zmm0     = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+
+    // =====================================================================
+    // Process group with 4 CNs
+
+fprintf(fd,  "// Process group with 4 CNs \n");
+
+ // Process group with 4 CNs
+
+    if (lut_numBnInBnGroups[3] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[3] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[3]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<4; k++)
+        {
+        fprintf(fd,"        zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"        zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"        zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n");
+            // zmm0     = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+   // =====================================================================
+    // Process group with 5 CNs
+
+fprintf(fd,  "// Process group with 5 CNs \n");
+
+ // Process group with 5 CNs
+
+    if (lut_numBnInBnGroups[4] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[4] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[4]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<5; k++)
+        {
+        fprintf(fd,"        zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"        zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"        zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n");
+            // zmm0     = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+
+   // =====================================================================
+    // Process group with 6 CNs
+
+fprintf(fd,  "// Process group with 6 CNs \n");
+
+ // Process group with 6 CNs
+
+    if (lut_numBnInBnGroups[5] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[5] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[5]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<6; k++)
+        {
+        fprintf(fd,"        zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"        zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"        zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n");
+            // zmm0     = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+   // =====================================================================
+    // Process group with 7 CNs
+
+fprintf(fd,  "// Process group with 7 CNs \n");
+
+ // Process group with 7 CNs
+
+    if (lut_numBnInBnGroups[6] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[6] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[6]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<7; k++)
+        {
+        fprintf(fd,"        zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"        zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"        zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n");
+            // zmm0     = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]]
+        //fprintf(fd,"         (__m512i*) &llrRes[%d + i]    = _mm512_permutex_epi64(zmm0, 0xD8);\n",lut_startAddrBnGroupsLlr[idxBnGroup]>>6 );
+        fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+   // =====================================================================
+    // Process group with 8 CNs
+
+fprintf(fd,  "// Process group with 8 CNs \n");
+
+ // Process group with 8 CNs
+
+    if (lut_numBnInBnGroups[7] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[7] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[7]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<8; k++)
+        {
+        fprintf(fd,"        zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"        zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"        zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n");
+            // zmm0     = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]]
+        //fprintf(fd,"         (__m512i*) &llrRes[%d + i]    = _mm512_permutex_epi64(zmm0, 0xD8);\n",lut_startAddrBnGroupsLlr[idxBnGroup]>>6 );
+
+        fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+   // =====================================================================
+    // Process group with 9 CNs
+
+fprintf(fd,  "// Process group with 9 CNs \n");
+
+ // Process group with 9 CNs
+
+    if (lut_numBnInBnGroups[8] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[8] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[8]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<9; k++)
+        {
+        fprintf(fd,"        zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"        zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"        zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n");
+            // zmm0     = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]]
+        //fprintf(fd,"         (__m512i*) &llrRes[%d + i]    = _mm512_permutex_epi64(zmm0, 0xD8);\n",lut_startAddrBnGroupsLlr[idxBnGroup]>>6 );
+        fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+   // =====================================================================
+    // Process group with 10 CNs
+
+fprintf(fd,  "// Process group with 10 CNs \n");
+
+ // Process group with 10 CNs
+
+    if (lut_numBnInBnGroups[9] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[9] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[9]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<10; k++)
+        {
+        fprintf(fd,"        zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"        zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"        zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n");
+            // zmm0     = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+
+    // =====================================================================
+
+fprintf(fd,  "// Process group with 11 CNs \n");
+
+
+
+ // Process group with 2 CNs
+
+    if (lut_numBnInBnGroups[10] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[10] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[10]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"            for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"            zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"            zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<11; k++)
+        {
+        fprintf(fd,"            zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"            zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"            zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "           zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"            zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"            zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"            zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"            zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"            zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n");
+            // zmm0     = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+      // =====================================================================
+    // Process group with 2 CNs
+
+
+fprintf(fd,  "// Process group with 12 CNs \n");
+
+ // Process group with 2 CNs
+
+    if (lut_numBnInBnGroups[11] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[11] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[11]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"            for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"            zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"            zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<12; k++)
+        {
+        fprintf(fd,"            zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"            zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"            zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "           zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"            zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"            zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"            zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"            zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"            zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n");
+            // zmm0     = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+    // =====================================================================
+    // Process group with 13 CNs
+
+
+fprintf(fd,  "// Process group with 13 CNs \n");
+
+ // Process group with 3 CNs
+
+    if (lut_numBnInBnGroups[12] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[12] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[12]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<13; k++)
+        {
+        fprintf(fd,"        zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"        zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd,"        zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n");
+            }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"        zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n");
+            // zmm0     = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+
+    // =====================================================================
+    // Process group with 4 CNs
+
+fprintf(fd,  "// Process group with 14 CNs \n");
+
+ // Process group with 4 CNs
+
+    if (lut_numBnInBnGroups[13] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[13] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[13]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<14; k++)
+        {
+        fprintf(fd,"        zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"        zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"        zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n");
+            // zmm0     = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+   // =====================================================================
+    // Process group with 5 CNs
+
+fprintf(fd,  "// Process group with 15 CNs \n");
+
+ // Process group with 5 CNs
+
+    if (lut_numBnInBnGroups[14] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[14] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[14]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<15; k++)
+        {
+        fprintf(fd,"        zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"        zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"        zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n");
+            // zmm0     = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]]
+         fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+
+   // =====================================================================
+    // Process group with 6 CNs
+
+fprintf(fd,  "// Process group with 16 CNs \n");
+
+ // Process group with 6 CNs
+
+    if (lut_numBnInBnGroups[15] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[15] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[15]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<16; k++)
+        {
+        fprintf(fd,"        zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"        zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"        zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n");
+            // zmm0     = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+   // =====================================================================
+    // Process group with 17 CNs
+
+fprintf(fd,  "// Process group with 17 CNs \n");
+
+ // Process group with 17 CNs
+
+    if (lut_numBnInBnGroups[16] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[16] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[16]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<17; k++)
+        {
+        fprintf(fd,"        zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"        zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"        zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n");
+            // zmm0     = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+   // =====================================================================
+    // Process group with 18 CNs
+
+fprintf(fd,  "// Process group with 18 CNs \n");
+
+ // Process group with 8 CNs
+
+    if (lut_numBnInBnGroups[17] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[17] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[17]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<18; k++)
+        {
+        fprintf(fd,"        zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"        zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"        zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n");
+            // zmm0     = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+   // =====================================================================
+    // Process group with 9 CNs
+
+fprintf(fd,  "// Process group with 19 CNs \n");
+
+ // Process group with 9 CNs
+
+    if (lut_numBnInBnGroups[18] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[18] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[18]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<19; k++)
+        {
+        fprintf(fd,"        zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"        zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"        zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n");
+            // zmm0     = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+   // =====================================================================
+    // Process group with 20 CNs
+
+fprintf(fd,  "// Process group with 20 CNs \n");
+
+ // Process group with 20 CNs
+
+    if (lut_numBnInBnGroups[19] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[19] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[19]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<20; k++)
+        {
+        fprintf(fd,"        zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"        zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"        zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n");
+            // zmm0     = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+
+
+
+    // =====================================================================
+
+fprintf(fd,  "// Process group with 21 CNs \n");
+
+
+
+ // Process group with 2 CNs
+
+    if (lut_numBnInBnGroups[20] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[20] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[20]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"            for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"            zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"            zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<21; k++)
+        {
+        fprintf(fd,"            zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"            zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"            zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "           zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"            zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"            zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"            zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"            zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"            zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n");
+            // zmm0     = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+      // =====================================================================
+    // Process group with 2 CNs
+
+
+fprintf(fd,  "// Process group with 22 CNs \n");
+
+ // Process group with 2 CNs
+
+    if (lut_numBnInBnGroups[21] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[21] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[21]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"            for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"            zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"            zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<22; k++)
+        {
+        fprintf(fd,"            zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"            zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"            zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "           zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"            zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"            zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"            zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"            zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"            zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n");
+            // zmm0     = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]]
+         fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+    // =====================================================================
+    // Process group with 13 CNs
+
+
+fprintf(fd,  "// Process group with <23 CNs \n");
+
+ // Process group with 3 CNs
+
+    if (lut_numBnInBnGroups[22] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[22] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[22]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<23; k++)
+        {
+        fprintf(fd,"        zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"        zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd,"        zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n");
+            }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"        zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n");
+            // zmm0     = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+
+    // =====================================================================
+    // Process group with 4 CNs
+
+fprintf(fd,  "// Process group with 24 CNs \n");
+
+ // Process group with 4 CNs
+
+    if (lut_numBnInBnGroups[23] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[23] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[23]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<24; k++)
+        {
+        fprintf(fd,"        zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"        zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"        zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n");
+            // zmm0     = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+   // =====================================================================
+    // Process group with 5 CNs
+
+fprintf(fd,  "// Process group with 25 CNs \n");
+
+ // Process group with 5 CNs
+
+    if (lut_numBnInBnGroups[24] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[24] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[24]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<25; k++)
+        {
+        fprintf(fd,"        zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"        zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"        zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n");
+            // zmm0     = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+
+   // =====================================================================
+    // Process group with 6 CNs
+
+fprintf(fd,  "// Process group with 26 CNs \n");
+
+ // Process group with 6 CNs
+
+    if (lut_numBnInBnGroups[25] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[25] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[25]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<26; k++)
+        {
+        fprintf(fd,"        zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"        zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"        zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n");
+            // zmm0     = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+   // =====================================================================
+    // Process group with 17 CNs
+
+fprintf(fd,  "// Process group with 27 CNs \n");
+
+ // Process group with 17 CNs
+
+    if (lut_numBnInBnGroups[26] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[26] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[26]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<27; k++)
+        {
+        fprintf(fd,"        zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"        zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"        zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n");
+            // zmm0     = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+   // =====================================================================
+    // Process group with 18 CNs
+
+fprintf(fd,  "// Process group with 28 CNs \n");
+
+ // Process group with 8 CNs
+
+    if (lut_numBnInBnGroups[27] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[27] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[27]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<28; k++)
+        {
+        fprintf(fd,"        zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"        zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"        zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n");
+            // zmm0     = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+   // =====================================================================
+    // Process group with 9 CNs
+
+fprintf(fd,  "// Process group with 29 CNs \n");
+
+ // Process group with 9 CNs
+
+    if (lut_numBnInBnGroups[28] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[28] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[28]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<29; k++)
+        {
+        fprintf(fd,"        zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"        zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"        zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n");
+            // zmm0     = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+   // =====================================================================
+    // Process group with 20 CNs
+
+fprintf(fd,  "// Process group with 30 CNs \n");
+
+ // Process group with 20 CNs
+
+    if (lut_numBnInBnGroups[29] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[29] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[29]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"        zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"        zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<30; k++)
+        {
+        fprintf(fd,"        zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"        zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"        zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "       zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"        zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"        zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n");
+
+        fprintf(fd,"        zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"        zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"        zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n");
+            // zmm0     = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+    fprintf(fd,"}\n");
+  fclose(fd);
+}//end of the function  nrLDPC_bnProcPc_BG1
+
+
+
+
+
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/bnProcPc_gen_BG2_avx512.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/bnProcPc_gen_BG2_avx512.c
new file mode 100644
index 0000000000000000000000000000000000000000..418fe1f36f8dfde85f126ee0d984cd977b31ecaa
--- /dev/null
+++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/bnProcPc_gen_BG2_avx512.c
@@ -0,0 +1,1793 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <immintrin.h>
+#include "../../nrLDPCdecoder_defs.h"
+#include "../../nrLDPC_types.h"
+
+
+void nrLDPC_bnProcPc_BG2_generator_AVX512(const char *dir, int R)
+{
+  const char *ratestr[3]={"15","13","23"};
+
+  if (R<0 || R>2) {printf("Illegal R %d\n",R); abort();}
+
+
+ // system("mkdir -p ../ldpc_gen_files");
+
+  char fname[FILENAME_MAX+1];
+  snprintf(fname, sizeof(fname), "%s/bnProcPc_avx512/nrLDPC_bnProcPc_BG2_R%s_AVX512.h", dir, ratestr[R]);
+  FILE *fd=fopen(fname,"w");
+  if (fd == NULL) {
+    printf("Cannot create file %s\n", fname);
+    abort();
+  }
+
+//  fprintf(fd,"#include <stdint.h>\n");
+  //fprintf(fd,"#include <immintrin.h>\n");
+
+  fprintf(fd,"static inline void nrLDPC_bnProcPc_BG2_R%s_AVX512(int8_t* bnProcBuf,int8_t* llrRes ,  int8_t* llrProcBuf, uint16_t Z ) {\n",ratestr[R]);
+    const uint8_t*  lut_numBnInBnGroups;
+    const uint32_t* lut_startAddrBnGroups;
+    const uint16_t* lut_startAddrBnGroupsLlr;
+    if (R==0) {
+
+
+      lut_numBnInBnGroups =  lut_numBnInBnGroups_BG2_R15;
+      lut_startAddrBnGroups = lut_startAddrBnGroups_BG2_R15;
+      lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG2_R15;
+
+    }
+    else if (R==1){
+
+      lut_numBnInBnGroups =  lut_numBnInBnGroups_BG2_R13;
+      lut_startAddrBnGroups = lut_startAddrBnGroups_BG2_R13;
+      lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG2_R13;
+    }
+    else if (R==2) {
+
+      lut_numBnInBnGroups = lut_numBnInBnGroups_BG2_R23;
+      lut_startAddrBnGroups = lut_startAddrBnGroups_BG2_R23;
+      lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG2_R23;
+    }
+  else { printf("aborting, illegal R %d\n",R); fclose(fd);abort();}
+
+
+    uint32_t k;
+    // Offset to each bit within a group in terms of 32 Byte
+    uint32_t cnOffsetInGroup;
+    uint8_t idxBnGroup = 0;
+
+    fprintf(fd,"   __m512i zmm0,zmm1,zmmRes0,zmmRes1;  \n");
+
+
+    fprintf(fd,"        __m256i* p_bnProcBuf; \n");
+    fprintf(fd,"        __m256i* p_llrProcBuf;\n");
+    fprintf(fd,"        __m512i* p_llrRes; \n");
+    fprintf(fd,"         uint32_t M ;\n");
+
+
+fprintf(fd,  "// Process group with 1 CNs \n");
+
+
+ // Process group with 2 CNs
+
+    if (lut_numBnInBnGroups[0] > 0)
+    {
+        // If elements in group move to next address
+       // idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[0] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[0]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+
+        // Loop over BNs
+        fprintf(fd,"            for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"           zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"           zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+
+            // Loop over CNs
+        /*for (k=1; k<1; k++)
+        {
+        fprintf(fd,"           zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"           zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"           zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "          zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n");
+        }
+*/
+            // Add LLR from receiver input
+        fprintf(fd,"           zmm0    = _mm512_cvtepi8_epi16(p_bnProcBuf[j+1]);\n");
+        fprintf(fd,"           zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"           zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"           zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"           zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n");
+            //zmm0     = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+
+        fprintf(fd,"}\n");
+    }
+      // =====================================================================
+    // Process group with 2 CNs
+
+
+fprintf(fd,  "// Process group with 2 CNs \n");
+
+ // Process group with 2 CNs
+
+    if (lut_numBnInBnGroups[1] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[1] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[1]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+
+        // Loop over BNs
+        fprintf(fd,"            for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"           zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"           zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf[j + 1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<2; k++)
+        {
+        fprintf(fd,"           zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"           zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"           zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "          zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"           zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"           zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"           zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"           zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"           zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n");
+            //zmm0     = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+
+        fprintf(fd,"}\n");
+    }
+
+    // =====================================================================
+    // Process group with 3 CNs
+
+
+fprintf(fd,  "// Process group with 3 CNs \n");
+
+ // Process group with 3 CNs
+
+    if (lut_numBnInBnGroups[2] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[2] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[2]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"       zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"       zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<3; k++)
+        {
+        fprintf(fd,"       zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"       zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"       zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd,"       zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n");
+            }
+
+            // Add LLR from receiver input
+        fprintf(fd,"       zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"       zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"       zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"       zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"       zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n");
+            //zmm0     = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+
+    // =====================================================================
+    // Process group with 4 CNs
+
+fprintf(fd,  "// Process group with 4 CNs \n");
+
+ // Process group with 4 CNs
+
+    if (lut_numBnInBnGroups[3] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[3] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[3]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"       zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"       zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<4; k++)
+        {
+        fprintf(fd,"       zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"       zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"       zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "      zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"       zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"       zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"       zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"       zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"       zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n");
+            //zmm0     = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+   // =====================================================================
+    // Process group with 5 CNs
+
+fprintf(fd,  "// Process group with 5 CNs \n");
+
+ // Process group with 5 CNs
+
+    if (lut_numBnInBnGroups[4] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[4] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[4]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"       zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"       zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<5; k++)
+        {
+        fprintf(fd,"       zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"       zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"       zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "      zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"       zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"       zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"       zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"       zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"       zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n");
+            //zmm0     = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+
+   // =====================================================================
+    // Process group with 6 CNs
+
+fprintf(fd,  "// Process group with 6 CNs \n");
+
+ // Process group with 6 CNs
+
+    if (lut_numBnInBnGroups[5] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[5] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[5]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"       zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"       zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<6; k++)
+        {
+        fprintf(fd,"       zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"       zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"       zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "      zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"       zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"       zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"       zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"       zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"       zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n");
+            //zmm0     = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+   // =====================================================================
+    // Process group with 7 CNs
+
+fprintf(fd,  "// Process group with 7 CNs \n");
+
+ // Process group with 7 CNs
+
+    if (lut_numBnInBnGroups[6] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[6] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[6]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"       zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"       zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<7; k++)
+        {
+        fprintf(fd,"       zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"       zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"       zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "      zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"       zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"       zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"       zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"       zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"       zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n");
+            //zmm0     = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]]
+        //fprintf(fd,"         (__m512i*) &llrRes[%d + i]    = _mm512_permutex_epi64(zmm0, 0xD8);\n",lut_startAddrBnGroupsLlr[idxBnGroup]>>5 );
+        fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+   // =====================================================================
+    // Process group with 8 CNs
+
+fprintf(fd,  "// Process group with 8 CNs \n");
+
+ // Process group with 8 CNs
+
+    if (lut_numBnInBnGroups[7] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[7] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[7]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"       zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"       zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<8; k++)
+        {
+        fprintf(fd,"       zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"       zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"       zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "      zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"       zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"       zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"       zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"       zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"       zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n");
+            //zmm0     = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]]
+        //fprintf(fd,"         (__m512i*) &llrRes[%d + i]    = _mm512_permutex_epi64(zmm0, 0xD8);\n",lut_startAddrBnGroupsLlr[idxBnGroup]>>5 );
+
+        fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+   // =====================================================================
+    // Process group with 9 CNs
+
+fprintf(fd,  "// Process group with 9 CNs \n");
+
+ // Process group with 9 CNs
+
+    if (lut_numBnInBnGroups[8] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[8] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[8]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"       zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"       zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<9; k++)
+        {
+        fprintf(fd,"       zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"       zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"       zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "      zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"       zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"       zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"       zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"       zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"       zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n");
+            //zmm0     = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]]
+        //fprintf(fd,"         (__m512i*) &llrRes[%d + i]    = _mm512_permutex_epi64(zmm0, 0xD8);\n",lut_startAddrBnGroupsLlr[idxBnGroup]>>5 );
+        fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+   // =====================================================================
+    // Process group with 10 CNs
+
+fprintf(fd,  "// Process group with 10 CNs \n");
+
+ // Process group with 10 CNs
+
+    if (lut_numBnInBnGroups[9] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[9] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[9]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"       zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"       zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<10; k++)
+        {
+        fprintf(fd,"       zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"       zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"       zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "      zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"       zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"       zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"       zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"       zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"       zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n");
+            //zmm0     = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+
+    // =====================================================================
+
+fprintf(fd,  "// Process group with 11 CNs \n");
+
+
+
+ // Process group with 2 CNs
+
+    if (lut_numBnInBnGroups[10] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[10] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[10]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"            for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"           zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"           zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<11; k++)
+        {
+        fprintf(fd,"           zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"           zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"           zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "          zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"           zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"           zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"           zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"           zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"           zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n");
+            //zmm0     = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+      // =====================================================================
+    // Process group with 2 CNs
+
+
+fprintf(fd,  "// Process group with 12 CNs \n");
+
+ // Process group with 2 CNs
+
+    if (lut_numBnInBnGroups[11] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[11] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[11]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"            for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"           zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"           zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<12; k++)
+        {
+        fprintf(fd,"           zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"           zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"           zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "          zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"           zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"           zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"           zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"           zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"           zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n");
+            //zmm0     = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+    // =====================================================================
+    // Process group with 13 CNs
+
+
+fprintf(fd,  "// Process group with 13 CNs \n");
+
+ // Process group with 3 CNs
+
+    if (lut_numBnInBnGroups[12] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[12] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[12]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"       zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"       zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<13; k++)
+        {
+        fprintf(fd,"       zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"       zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"       zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd,"       zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n");
+            }
+
+            // Add LLR from receiver input
+        fprintf(fd,"       zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"       zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"       zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"       zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"       zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n");
+            //zmm0     = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+
+    // =====================================================================
+    // Process group with 4 CNs
+
+fprintf(fd,  "// Process group with 14 CNs \n");
+
+ // Process group with 4 CNs
+
+    if (lut_numBnInBnGroups[13] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[13] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[13]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"       zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"       zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<14; k++)
+        {
+        fprintf(fd,"       zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"       zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"       zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "      zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"       zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"       zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"       zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"       zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"       zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n");
+            //zmm0     = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+   // =====================================================================
+    // Process group with 5 CNs
+
+fprintf(fd,  "// Process group with 15 CNs \n");
+
+ // Process group with 5 CNs
+
+    if (lut_numBnInBnGroups[14] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[14] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[14]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"       zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"       zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<15; k++)
+        {
+        fprintf(fd,"       zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"       zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"       zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "      zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"       zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"       zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"       zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"       zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"       zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n");
+            //zmm0     = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]]
+         fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+
+   // =====================================================================
+    // Process group with 6 CNs
+
+fprintf(fd,  "// Process group with 16 CNs \n");
+
+ // Process group with 6 CNs
+
+    if (lut_numBnInBnGroups[15] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[15] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[15]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"       zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"       zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<16; k++)
+        {
+        fprintf(fd,"       zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"       zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"       zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "      zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"       zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"       zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"       zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"       zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"       zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n");
+            //zmm0     = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+   // =====================================================================
+    // Process group with 17 CNs
+
+fprintf(fd,  "// Process group with 17 CNs \n");
+
+ // Process group with 17 CNs
+
+    if (lut_numBnInBnGroups[16] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[16] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[16]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"       zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"       zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<17; k++)
+        {
+        fprintf(fd,"       zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"       zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"       zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "      zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"       zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"       zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"       zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"       zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"       zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n");
+            //zmm0     = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+   // =====================================================================
+    // Process group with 18 CNs
+
+fprintf(fd,  "// Process group with 18 CNs \n");
+
+ // Process group with 8 CNs
+
+    if (lut_numBnInBnGroups[17] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[17] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[17]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"       zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"       zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<18; k++)
+        {
+        fprintf(fd,"       zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"       zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"       zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "      zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"       zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"       zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"       zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"       zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"       zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n");
+            //zmm0     = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+   // =====================================================================
+    // Process group with 9 CNs
+
+fprintf(fd,  "// Process group with 19 CNs \n");
+
+ // Process group with 9 CNs
+
+    if (lut_numBnInBnGroups[18] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[18] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[18]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"       zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"       zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<19; k++)
+        {
+        fprintf(fd,"       zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"       zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"       zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "      zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"       zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"       zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"       zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"       zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"       zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n");
+            //zmm0     = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+   // =====================================================================
+    // Process group with 20 CNs
+
+fprintf(fd,  "// Process group with 20 CNs \n");
+
+ // Process group with 20 CNs
+
+    if (lut_numBnInBnGroups[19] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[19] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[19]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"       zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"       zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<20; k++)
+        {
+        fprintf(fd,"       zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"       zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"       zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "      zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"       zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"       zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"       zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"       zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"       zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n");
+            //zmm0     = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+
+
+
+    // =====================================================================
+
+fprintf(fd,  "// Process group with 21 CNs \n");
+
+
+
+ // Process group with 2 CNs
+
+    if (lut_numBnInBnGroups[20] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[20] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[20]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"            for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"           zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"           zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<21; k++)
+        {
+        fprintf(fd,"           zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"           zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"           zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "          zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"           zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"           zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"           zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"           zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"           zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n");
+            //zmm0     = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+      // =====================================================================
+    // Process group with 2 CNs
+
+
+fprintf(fd,  "// Process group with 22 CNs \n");
+
+ // Process group with 2 CNs
+
+    if (lut_numBnInBnGroups[21] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[21] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[21]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"            for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"           zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"           zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<22; k++)
+        {
+        fprintf(fd,"           zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"           zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"           zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "          zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"           zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"           zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"           zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"           zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"           zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n");
+            //zmm0     = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]]
+         fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+    // =====================================================================
+    // Process group with 13 CNs
+
+
+fprintf(fd,  "// Process group with <23 CNs \n");
+
+ // Process group with 3 CNs
+
+    if (lut_numBnInBnGroups[22] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[22] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[22]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"       zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"       zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<23; k++)
+        {
+        fprintf(fd,"       zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"       zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"       zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd,"       zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n");
+            }
+
+            // Add LLR from receiver input
+        fprintf(fd,"       zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"       zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"       zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"       zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"       zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n");
+            //zmm0     = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+
+    // =====================================================================
+    // Process group with 4 CNs
+
+fprintf(fd,  "// Process group with 24 CNs \n");
+
+ // Process group with 4 CNs
+
+    if (lut_numBnInBnGroups[23] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[23] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[23]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"       zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"       zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<24; k++)
+        {
+        fprintf(fd,"       zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"       zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"       zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "      zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"       zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"       zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"       zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"       zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"       zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n");
+            //zmm0     = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+   // =====================================================================
+    // Process group with 5 CNs
+
+fprintf(fd,  "// Process group with 25 CNs \n");
+
+ // Process group with 5 CNs
+
+    if (lut_numBnInBnGroups[24] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[24] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[24]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"       zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"       zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<25; k++)
+        {
+        fprintf(fd,"       zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"       zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"       zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "      zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"       zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"       zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"       zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"       zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"       zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n");
+            //zmm0     = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+
+   // =====================================================================
+    // Process group with 6 CNs
+
+fprintf(fd,  "// Process group with 26 CNs \n");
+
+ // Process group with 6 CNs
+
+    if (lut_numBnInBnGroups[25] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[25] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[25]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"       zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"       zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<26; k++)
+        {
+        fprintf(fd,"       zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"       zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"       zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "      zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"       zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"       zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"       zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"       zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"       zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n");
+            //zmm0     = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+   // =====================================================================
+    // Process group with 17 CNs
+
+fprintf(fd,  "// Process group with 27 CNs \n");
+
+ // Process group with 17 CNs
+
+    if (lut_numBnInBnGroups[26] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[26] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[26]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"       zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"       zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<27; k++)
+        {
+        fprintf(fd,"       zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"       zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"       zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "      zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"       zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"       zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"       zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"       zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"       zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n");
+            //zmm0     = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+   // =====================================================================
+    // Process group with 18 CNs
+
+fprintf(fd,  "// Process group with 28 CNs \n");
+
+ // Process group with 8 CNs
+
+    if (lut_numBnInBnGroups[27] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[27] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[27]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"       zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"       zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<28; k++)
+        {
+        fprintf(fd,"       zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"       zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"       zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "      zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"       zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"       zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"       zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"       zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"       zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n");
+            //zmm0     = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+   // =====================================================================
+    // Process group with 9 CNs
+
+fprintf(fd,  "// Process group with 29 CNs \n");
+
+ // Process group with 9 CNs
+
+    if (lut_numBnInBnGroups[28] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[28] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[28]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"       zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"       zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<29; k++)
+        {
+        fprintf(fd,"       zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"       zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"       zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "      zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"       zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"       zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"       zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"       zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"       zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n");
+            //zmm0     = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+
+   // =====================================================================
+    // Process group with 20 CNs
+
+fprintf(fd,  "// Process group with 30 CNs \n");
+
+ // Process group with 20 CNs
+
+    if (lut_numBnInBnGroups[29] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[29] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[29]*NR_LDPC_ZMAX)>>5;
+
+        // Set pointers to start of group 2
+        fprintf(fd,"    p_bnProcBuf     = (__m256i*) &bnProcBuf    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        fprintf(fd,"    p_llrProcBuf    = (__m256i*) &llrProcBuf   [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        fprintf(fd,"    p_llrRes        = (__m512i*) &llrRes       [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
+        // Loop over BNs
+        fprintf(fd,"        for (int i=0,j=0;i<M;i++,j+=2) {\n");
+            // First 16 LLRs of first CN
+        fprintf(fd,"       zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n");
+        fprintf(fd,"       zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n");
+
+            // Loop over CNs
+        for (k=1; k<30; k++)
+        {
+        fprintf(fd,"       zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
+        fprintf(fd,"       zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"       zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
+
+        fprintf(fd, "      zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n");
+        }
+
+            // Add LLR from receiver input
+        fprintf(fd,"       zmm0    = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n");
+        fprintf(fd,"       zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n");
+
+        fprintf(fd,"       zmm1    = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
+        fprintf(fd,"       zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n");
+
+            // Pack results back to epi8
+        fprintf(fd,"       zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n");
+            //zmm0     = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]]
+            // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]]
+        fprintf(fd,"            p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n");
+
+        fprintf(fd,"}\n");
+    }
+
+    fprintf(fd,"}\n");
+  fclose(fd);
+}//end of the function  nrLDPC_bnProcPc_BG2
+
+
+
+
+
+
+
+
+
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/bnProc_gen_BG1_avx512.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/bnProc_gen_BG1_avx512.c
new file mode 100644
index 0000000000000000000000000000000000000000..2c049842208f982d6879379128499f4f6ad6d0bb
--- /dev/null
+++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/bnProc_gen_BG1_avx512.c
@@ -0,0 +1,1112 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <immintrin.h>
+#include "../../nrLDPCdecoder_defs.h"
+#include "../../nrLDPC_types.h"
+
+
+void nrLDPC_bnProc_BG1_generator_AVX512(const char *dir, int R)
+{
+  const char *ratestr[3]={"13","23","89"};
+
+  if (R<0 || R>2) {printf("Illegal R %d\n",R); abort();}
+
+
+ // system("mkdir -p ../ldpc_gen_files");
+
+  char fname[FILENAME_MAX+1];
+  snprintf(fname, sizeof(fname), "%s/bnProc_avx512/nrLDPC_bnProc_BG1_R%s_AVX512.h", dir, ratestr[R]);
+  FILE *fd=fopen(fname,"w");
+  if (fd == NULL) {
+    printf("Cannot create file %s\n", fname);
+    abort();
+  }
+
+  //fprintf(fd,"#include <stdint.h>\n");
+  //fprintf(fd,"#include <immintrin.h>\n");
+
+
+    fprintf(fd,"static inline void nrLDPC_bnProc_BG1_R%s_AVX512(int8_t* bnProcBuf,int8_t* bnProcBufRes,  int8_t* llrRes, uint16_t Z ) {\n", ratestr[R]);
+
+    const uint8_t*  lut_numBnInBnGroups;
+    const uint32_t* lut_startAddrBnGroups;
+    const uint16_t* lut_startAddrBnGroupsLlr;
+    if (R==0) {
+
+
+      lut_numBnInBnGroups =  lut_numBnInBnGroups_BG1_R13;
+      lut_startAddrBnGroups = lut_startAddrBnGroups_BG1_R13;
+      lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG1_R13;
+
+    }
+    else if (R==1){
+
+      lut_numBnInBnGroups =  lut_numBnInBnGroups_BG1_R23;
+      lut_startAddrBnGroups = lut_startAddrBnGroups_BG1_R23;
+      lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG1_R23;
+    }
+    else if (R==2) {
+
+      lut_numBnInBnGroups = lut_numBnInBnGroups_BG1_R89;
+      lut_startAddrBnGroups = lut_startAddrBnGroups_BG1_R89;
+      lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG1_R89;
+    }
+  else { printf("aborting, illegal R %d\n",R); fclose(fd);abort();}
+
+
+    //uint32_t M;
+    //uint32_t M32rem;
+   // uint32_t i;
+    uint32_t k;
+    // Offset to each bit within a group in terms of 32 Byte
+    uint32_t cnOffsetInGroup;
+    uint8_t idxBnGroup = 0;
+    fprintf(fd,"        uint32_t M, i; \n");
+
+
+
+// =====================================================================
+    // Process group with 1 CN
+    // Already done in bnProcBufPc
+
+    // =====================================================================
+
+fprintf(fd,  "// Process group with 2 CNs \n");
+
+    if (lut_numBnInBnGroups[1] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs or parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[1] );
+
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[1]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<2; k++)
+        {
+    
+          // Loop over BNs
+        fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+
+
+
+    }
+
+    // =====================================================================
+
+
+fprintf(fd,  "// Process group with 3 CNs \n");
+
+
+
+    if (lut_numBnInBnGroups[2] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+         fprintf(fd,"       M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[2] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[2]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+        //fprintf(fd,"    ((__m512i*) bnProcBuf)     = ((__m512i*) &bnProcBuf)    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        
+
+        for (k=0; k<3; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+        }
+    }
+
+
+
+    // =====================================================================
+
+
+fprintf(fd,  "// Process group with 4 CNs \n");
+
+
+
+    if (lut_numBnInBnGroups[3] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[3] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[3]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+      
+    
+
+        for (k=0; k<4; k++)
+        {
+  
+          // Loop over BNs
+        fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",((lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup),(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), ((lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup));
+
+         fprintf(fd,"}\n");
+        }
+    }
+
+
+   // =====================================================================
+
+
+    fprintf(fd,  "// Process group with 5 CNs \n");
+
+
+
+    if (lut_numBnInBnGroups[4] > 0)
+    {
+    // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[4] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[4]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<5; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+
+   // =====================================================================
+
+
+fprintf(fd,  "// Process group with 6 CNs \n");
+
+ // Process group with 6 CNs
+
+    if (lut_numBnInBnGroups[5] > 0)
+    {
+  // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[5] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[5]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<6; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+   // =====================================================================
+
+
+fprintf(fd,  "// Process group with 7 CNs \n");
+
+ // Process group with 7 CNs
+
+    if (lut_numBnInBnGroups[6] > 0)
+    {
+  // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[6] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[6]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<7; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+   // =====================================================================
+
+
+fprintf(fd,  "// Process group with 8 CNs \n");
+
+ // Process group with 8 CNs
+
+    if (lut_numBnInBnGroups[7] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[7] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[7]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<8; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+   // =====================================================================
+
+
+fprintf(fd,  "// Process group with 9 CNs \n");
+
+ // Process group with 9 CNs
+
+    if (lut_numBnInBnGroups[8] > 0)
+    {
+  // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[8] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[8]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<9; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+   // =====================================================================
+
+fprintf(fd,  "// Process group with 10 CNs \n");
+
+ // Process group with 10 CNs
+
+    if (lut_numBnInBnGroups[9] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[9] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[9]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<10; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+
+    // =====================================================================
+
+fprintf(fd,  "// Process group with 11 CNs \n");
+
+    if (lut_numBnInBnGroups[10] > 0)
+    {
+  // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[10] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[10]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<11; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+      // =====================================================================
+
+
+
+fprintf(fd,  "// Process group with 12 CNs \n");
+
+
+    if (lut_numBnInBnGroups[11] > 0)
+    {
+  // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[11] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[11]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<12; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+    // =====================================================================
+
+
+
+fprintf(fd,  "// Process group with 13 CNs \n");
+
+
+
+    if (lut_numBnInBnGroups[12] > 0)
+    {
+  // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[12] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[12]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<13; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+
+    // =====================================================================
+
+
+fprintf(fd,  "// Process group with 14 CNs \n");
+
+
+
+    if (lut_numBnInBnGroups[13] > 0)
+    {
+  // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[13] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[13]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<14; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+   // =====================================================================
+
+
+fprintf(fd,  "// Process group with 15 CNs \n");
+
+
+
+    if (lut_numBnInBnGroups[14] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[14] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[14]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<15; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+
+   // =====================================================================
+
+
+fprintf(fd,  "// Process group with 16 CNs \n");
+
+
+
+    if (lut_numBnInBnGroups[15] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[15] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[15]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<16; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+   // =====================================================================
+    // Process group with 17 CNs
+
+fprintf(fd,  "// Process group with 17 CNs \n");
+
+ // Process group with 17 CNs
+
+    if (lut_numBnInBnGroups[16] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[16] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[16]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<17; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+   // =====================================================================
+
+
+fprintf(fd,  "// Process group with 18 CNs \n");
+
+ // Process group with 8 CNs
+
+    if (lut_numBnInBnGroups[17] > 0)
+    {
+  // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[17] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[17]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<18; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+   // =====================================================================
+
+
+fprintf(fd,  "// Process group with 19 CNs \n");
+
+
+
+    if (lut_numBnInBnGroups[18] > 0)
+    {
+  // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[18] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[18]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<19; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+   // =====================================================================
+
+
+fprintf(fd,  "// Process group with 20 CNs \n");
+
+
+
+    if (lut_numBnInBnGroups[19] > 0)
+    {
+  // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[19] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[19]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<20; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+
+
+
+    // =====================================================================
+
+fprintf(fd,  "// Process group with 21 CNs \n");
+
+
+
+
+
+    if (lut_numBnInBnGroups[20] > 0)
+    {
+  // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[20] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[20]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<21; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+      // =====================================================================
+
+
+
+fprintf(fd,  "// Process group with 22 CNs \n");
+
+
+    if (lut_numBnInBnGroups[21] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[21] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[21]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<22; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+    // =====================================================================
+
+
+
+fprintf(fd,  "// Process group with <23 CNs \n");
+
+
+
+    if (lut_numBnInBnGroups[22] > 0)
+    {
+  // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[22] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[22]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<23; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+
+    // =====================================================================
+
+
+fprintf(fd,  "// Process group with 24 CNs \n");
+
+ // Process group with 4 CNs
+
+    if (lut_numBnInBnGroups[23] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[23] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[23]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<24; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+   // =====================================================================
+
+
+fprintf(fd,  "// Process group with 25 CNs \n");
+
+
+
+    if (lut_numBnInBnGroups[24] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[24] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[24]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<25; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup);
+
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+
+   // =====================================================================
+
+
+fprintf(fd,  "// Process group with 26 CNs \n");
+
+
+
+    if (lut_numBnInBnGroups[25] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[25] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[25]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<26; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+   // =====================================================================
+
+
+fprintf(fd,  "// Process group with 27 CNs \n");
+
+ // Process group with 17 CNs
+
+    if (lut_numBnInBnGroups[26] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[26] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[26]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<27; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+   // =====================================================================
+
+
+fprintf(fd,  "// Process group with 28 CNs \n");
+
+ // Process group with 8 CNs
+
+    if (lut_numBnInBnGroups[27] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[27] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[27]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<28; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+   // =====================================================================
+
+fprintf(fd,  "// Process group with 29 CNs \n");
+
+ // Process group with 9 CNs
+
+    if (lut_numBnInBnGroups[28] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[28] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[28]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<29; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+   // =====================================================================
+
+fprintf(fd,  "// Process group with 30 CNs \n");
+
+ // Process group with 20 CNs
+
+    if (lut_numBnInBnGroups[29] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[29] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[29]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<30; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+    fprintf(fd,"}\n");
+  fclose(fd);
+}//end of the function  nrLDPC_bnProc_BG1
+
+
+
+
+
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/bnProc_gen_BG2_avx512.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/bnProc_gen_BG2_avx512.c
new file mode 100644
index 0000000000000000000000000000000000000000..bcd1179b126fa11572349cd81359db68f46a8f4d
--- /dev/null
+++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/bnProc_gen_BG2_avx512.c
@@ -0,0 +1,1108 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <immintrin.h>
+#include "../../nrLDPCdecoder_defs.h"
+#include "../../nrLDPC_types.h"
+
+
+void nrLDPC_bnProc_BG2_generator_AVX512(const char *dir, int R)
+{
+  const char *ratestr[3]={"15","13","23"};
+
+  if (R<0 || R>2) {printf("Illegal R %d\n",R); abort();}
+
+
+ // system("mkdir -p ../ldpc_gen_files");
+
+  char fname[FILENAME_MAX+1];
+  snprintf(fname, sizeof(fname), "%s/bnProc_avx512/nrLDPC_bnProc_BG2_R%s_AVX512.h", dir, ratestr[R]);
+  FILE *fd=fopen(fname,"w");
+  if (fd == NULL) {
+    printf("Cannot create file %s\n", fname);
+    abort();
+  }
+
+  fprintf(fd,"#include <stdint.h>\n");
+  fprintf(fd,"#include <immintrin.h>\n");
+
+    fprintf(fd,"void nrLDPC_bnProc_BG2_R%s_AVX512(int8_t* bnProcBuf,int8_t* bnProcBufRes,  int8_t* llrRes, uint16_t Z  ) {\n",ratestr[R]);
+    const uint8_t*  lut_numBnInBnGroups;
+    const uint32_t* lut_startAddrBnGroups;
+    const uint16_t* lut_startAddrBnGroupsLlr;
+    if (R==0) {
+
+
+      lut_numBnInBnGroups =  lut_numBnInBnGroups_BG2_R15;
+      lut_startAddrBnGroups = lut_startAddrBnGroups_BG2_R15;
+      lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG2_R15;
+
+    }
+    else if (R==1){
+
+      lut_numBnInBnGroups =  lut_numBnInBnGroups_BG2_R13;
+      lut_startAddrBnGroups = lut_startAddrBnGroups_BG2_R13;
+      lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG2_R13;
+    }
+    else if (R==2) {
+
+      lut_numBnInBnGroups = lut_numBnInBnGroups_BG2_R23;
+      lut_startAddrBnGroups = lut_startAddrBnGroups_BG2_R23;
+      lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG2_R23;
+    }
+  else { printf("aborting, illegal R %d\n",R); fclose(fd);abort();}
+
+
+
+    uint32_t k;
+    // Offset to each bit within a group in terms of 32 Byte
+    uint32_t cnOffsetInGroup;
+    uint8_t idxBnGroup = 0;
+    fprintf(fd,"        uint32_t M, i; \n");
+
+
+
+// =====================================================================
+    // Process group with 1 CN
+    // Already done in bnProcBufPc
+
+    // =====================================================================
+
+fprintf(fd,  "// Process group with 2 CNs \n");
+
+    if (lut_numBnInBnGroups[1] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs or parallel processing
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[1] );
+
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[1]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<2; k++)
+        {
+    
+          // Loop over BNs
+        fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+
+
+
+    }
+
+    // =====================================================================
+
+
+fprintf(fd,  "// Process group with 3 CNs \n");
+
+
+
+    if (lut_numBnInBnGroups[2] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+         fprintf(fd,"       M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[2] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[2]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+        //fprintf(fd,"    ((__m512i*) bnProcBuf)     = ((__m512i*) &bnProcBuf)    [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
+        
+
+        for (k=0; k<3; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+        }
+    }
+
+
+
+    // =====================================================================
+
+
+fprintf(fd,  "// Process group with 4 CNs \n");
+
+
+
+    if (lut_numBnInBnGroups[3] > 0)
+    {
+        // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[3] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[3]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+      
+    
+
+        for (k=0; k<4; k++)
+        {
+  
+          // Loop over BNs
+        fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",((lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup),(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), ((lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup));
+
+         fprintf(fd,"}\n");
+        }
+    }
+
+
+   // =====================================================================
+
+
+    fprintf(fd,  "// Process group with 5 CNs \n");
+
+
+
+    if (lut_numBnInBnGroups[4] > 0)
+    {
+    // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[4] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[4]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<5; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+
+   // =====================================================================
+
+
+fprintf(fd,  "// Process group with 6 CNs \n");
+
+ // Process group with 6 CNs
+
+    if (lut_numBnInBnGroups[5] > 0)
+    {
+  // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[5] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[5]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<6; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+   // =====================================================================
+
+
+fprintf(fd,  "// Process group with 7 CNs \n");
+
+ // Process group with 7 CNs
+
+    if (lut_numBnInBnGroups[6] > 0)
+    {
+  // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[6] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[6]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<7; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+   // =====================================================================
+
+
+fprintf(fd,  "// Process group with 8 CNs \n");
+
+ // Process group with 8 CNs
+
+    if (lut_numBnInBnGroups[7] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[7] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[7]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<8; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+   // =====================================================================
+
+
+fprintf(fd,  "// Process group with 9 CNs \n");
+
+ // Process group with 9 CNs
+
+    if (lut_numBnInBnGroups[8] > 0)
+    {
+  // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[8] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[8]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<9; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+   // =====================================================================
+
+fprintf(fd,  "// Process group with 10 CNs \n");
+
+ // Process group with 10 CNs
+
+    if (lut_numBnInBnGroups[9] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[9] );
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[9]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<10; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+
+    // =====================================================================
+
+fprintf(fd,  "// Process group with 11 CNs \n");
+
+    if (lut_numBnInBnGroups[10] > 0)
+    {
+  // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[10] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[10]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<11; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+      // =====================================================================
+
+
+
+fprintf(fd,  "// Process group with 12 CNs \n");
+
+
+    if (lut_numBnInBnGroups[11] > 0)
+    {
+  // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[11] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[11]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<12; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+    // =====================================================================
+
+
+
+fprintf(fd,  "// Process group with 13 CNs \n");
+
+
+
+    if (lut_numBnInBnGroups[12] > 0)
+    {
+  // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[12] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[12]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<13; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+
+    // =====================================================================
+
+
+fprintf(fd,  "// Process group with 14 CNs \n");
+
+
+
+    if (lut_numBnInBnGroups[13] > 0)
+    {
+  // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[13] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[13]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<14; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+   // =====================================================================
+
+
+fprintf(fd,  "// Process group with 15 CNs \n");
+
+
+
+    if (lut_numBnInBnGroups[14] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[14] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[14]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<15; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+
+   // =====================================================================
+
+
+fprintf(fd,  "// Process group with 16 CNs \n");
+
+
+
+    if (lut_numBnInBnGroups[15] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[15] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[15]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<16; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+   // =====================================================================
+    // Process group with 17 CNs
+
+fprintf(fd,  "// Process group with 17 CNs \n");
+
+ // Process group with 17 CNs
+
+    if (lut_numBnInBnGroups[16] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[16] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[16]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<17; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+   // =====================================================================
+
+
+fprintf(fd,  "// Process group with 18 CNs \n");
+
+ // Process group with 8 CNs
+
+    if (lut_numBnInBnGroups[17] > 0)
+    {
+  // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[17] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[17]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<18; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+   // =====================================================================
+
+
+fprintf(fd,  "// Process group with 19 CNs \n");
+
+
+
+    if (lut_numBnInBnGroups[18] > 0)
+    {
+  // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[18] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[18]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<19; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+   // =====================================================================
+
+
+fprintf(fd,  "// Process group with 20 CNs \n");
+
+
+
+    if (lut_numBnInBnGroups[19] > 0)
+    {
+  // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[19] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[19]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<20; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+
+
+
+    // =====================================================================
+
+fprintf(fd,  "// Process group with 21 CNs \n");
+
+
+
+
+
+    if (lut_numBnInBnGroups[20] > 0)
+    {
+  // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[20] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[20]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<21; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+      // =====================================================================
+
+
+
+fprintf(fd,  "// Process group with 22 CNs \n");
+
+
+    if (lut_numBnInBnGroups[21] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[21] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[21]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<22; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+    // =====================================================================
+
+
+
+fprintf(fd,  "// Process group with <23 CNs \n");
+
+
+
+    if (lut_numBnInBnGroups[22] > 0)
+    {
+  // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[22] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[22]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<23; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+
+    // =====================================================================
+
+
+fprintf(fd,  "// Process group with 24 CNs \n");
+
+ // Process group with 4 CNs
+
+    if (lut_numBnInBnGroups[23] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[23] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[23]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<24; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+   // =====================================================================
+
+
+fprintf(fd,  "// Process group with 25 CNs \n");
+
+
+
+    if (lut_numBnInBnGroups[24] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[24] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[24]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<25; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup);
+
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+
+   // =====================================================================
+
+
+fprintf(fd,  "// Process group with 26 CNs \n");
+
+
+
+    if (lut_numBnInBnGroups[25] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[25] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[25]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<26; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+   // =====================================================================
+
+
+fprintf(fd,  "// Process group with 27 CNs \n");
+
+ // Process group with 17 CNs
+
+    if (lut_numBnInBnGroups[26] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[26] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[26]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<27; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+   // =====================================================================
+
+
+fprintf(fd,  "// Process group with 28 CNs \n");
+
+ // Process group with 8 CNs
+
+    if (lut_numBnInBnGroups[27] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[27] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[27]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<28; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+   // =====================================================================
+
+fprintf(fd,  "// Process group with 29 CNs \n");
+
+ // Process group with 9 CNs
+
+    if (lut_numBnInBnGroups[28] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[28] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[28]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<29; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+
+   // =====================================================================
+
+fprintf(fd,  "// Process group with 30 CNs \n");
+
+ // Process group with 20 CNs
+
+    if (lut_numBnInBnGroups[29] > 0)
+    {
+ // If elements in group move to next address
+        idxBnGroup++;
+
+        // Number of groups of 32 BNs for parallel processing
+        fprintf(fd,"       M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[29] );;
+
+        // Set the offset to each CN within a group in terms of 16 Byte
+        cnOffsetInGroup = (lut_numBnInBnGroups[29]*NR_LDPC_ZMAX)>>6;
+
+        // Set pointers to start of group 2
+  
+            // Loop over CNs
+        for (k=0; k<30; k++)
+        {
+  
+
+          // Loop over BNs
+       fprintf(fd,"            for (i=0;i<M;i++) {\n");
+        fprintf(fd,"            ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup);
+
+         fprintf(fd,"}\n");
+
+        }
+    }
+
+    fprintf(fd,"}\n");
+  fclose(fd);
+}//end of the function  nrLDPC_bnProc_BG1
+
+
+
+
+
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/main.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/main.c
new file mode 100644
index 0000000000000000000000000000000000000000..8db03d8f51a8c9ff3951b01d8b144741d59024a2
--- /dev/null
+++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/main.c
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#define NB_R  3
+void nrLDPC_bnProc_BG1_generator_AVX512(const char *, int);
+void nrLDPC_bnProc_BG2_generator_AVX512(const char *, int);
+void nrLDPC_bnProcPc_BG1_generator_AVX512(const char *, int);
+void nrLDPC_bnProcPc_BG2_generator_AVX512(const char *, int);
+
+const char *__asan_default_options()
+{
+  /* don't do leak checking in nr_ulsim, creates problems in the CI */
+  return "detect_leaks=0";
+}
+
+int main(int argc, char *argv[])
+{
+  if (argc != 2) {
+    fprintf(stderr, "usage: %s <output-dir>\n", argv[0]);
+    return 1;
+  }
+  const char *dir = argv[1];
+
+  int R[NB_R]={0,1,2};
+  for(int i=0; i<NB_R;i++){
+    nrLDPC_bnProc_BG1_generator_AVX512(dir, R[i]);
+    nrLDPC_bnProc_BG2_generator_AVX512(dir, R[i]);
+
+    nrLDPC_bnProcPc_BG1_generator_AVX512(dir, R[i]);
+    nrLDPC_bnProcPc_BG2_generator_AVX512(dir, R[i]);
+  }
+
+  return(0);
+}
+
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc/CMakeLists.txt b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..d78dfc4436c88de79fd9736251579bceefc5eee9
--- /dev/null
+++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc/CMakeLists.txt
@@ -0,0 +1,25 @@
+add_executable(cnProc_gen_avx2
+               cnProc_gen_BG1_avx2.c
+               cnProc_gen_BG2_avx2.c
+               main.c)
+target_compile_options(cnProc_gen_avx2 PRIVATE -W -Wall -mavx2)
+
+#set(cnProc_headers
+#    cnProc/rLDPC_cnProc_BG1_R13_AVX2.h
+#    cnProc/rLDPC_cnProc_BG1_R23_AVX2.h
+#    cnProc/rLDPC_cnProc_BG1_R89_AVX2.h
+#    cnProc/rLDPC_cnProc_BG2_R13_AVX2.h
+#    cnProc/rLDPC_cnProc_BG2_R15_AVX2.h
+#    cnProc/rLDPC_cnProc_BG2_R23_AVX2.h)
+
+add_custom_command(TARGET cnProc_gen_avx2 POST_BUILD
+  #OUTPUT ${cnProc_headers}
+  COMMAND ${CMAKE_COMMAND} -E make_directory cnProc
+  COMMAND cnProc_gen_avx2 .
+  DEPENDS cnProc_gen_avx2
+  COMMENT "Generating LDPC cnProc header files for AVX2"
+)
+
+add_library(cnProc_gen_avx2_HEADERS INTERFACE)
+target_include_directories(cnProc_gen_avx2_HEADERS INTERFACE ${CMAKE_CURRENT_BINARY_DIR})
+add_dependencies(cnProc_gen_avx2_HEADERS cnProc_gen_avx2)
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc/cnProc_gen_BG1_avx2.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc/cnProc_gen_BG1_avx2.c
new file mode 100644
index 0000000000000000000000000000000000000000..f998f138593a7086b8ddfce73401cd9081984343
--- /dev/null
+++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc/cnProc_gen_BG1_avx2.c
@@ -0,0 +1,693 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdint.h>
+#include "../../nrLDPCdecoder_defs.h"
+
+void nrLDPC_cnProc_BG1_generator_AVX2(const char* dir, int R)
+{
+  const char *ratestr[3]={"13","23","89"};
+
+  if (R<0 || R>2) {printf("Illegal R %d\n",R); abort();}
+
+
+ // system("mkdir -p ../ldpc_gen_files");
+
+  char fname[FILENAME_MAX+1];
+  snprintf(fname, sizeof(fname), "%s/cnProc/nrLDPC_cnProc_BG1_R%s_AVX2.h", dir, ratestr[R]);
+  FILE *fd=fopen(fname,"w");
+  if (fd == NULL) {
+    printf("Cannot create file %s\n", fname);
+    abort();
+  }
+
+  fprintf(fd,"#include <stdint.h>\n");
+  fprintf(fd,"#include <immintrin.h>\n");
+
+
+  fprintf(fd,"static inline void nrLDPC_cnProc_BG1_R%s_AVX2(int8_t* cnProcBuf, int8_t* cnProcBufRes, uint16_t Z) {\n",ratestr[R]);
+
+  const uint8_t*  lut_numCnInCnGroups;
+  const uint32_t* lut_startAddrCnGroups = lut_startAddrCnGroups_BG1;
+
+  if (R==0)      lut_numCnInCnGroups = lut_numCnInCnGroups_BG1_R13;
+  else if (R==1) lut_numCnInCnGroups = lut_numCnInCnGroups_BG1_R23;
+  else if (R==2) lut_numCnInCnGroups = lut_numCnInCnGroups_BG1_R89;
+  else { printf("aborting, illegal R %d\n",R); fclose(fd);abort();}
+
+
+
+  //__m256i* p_cnProcBuf;
+  //__m256i* p_cnProcBufRes;
+
+  // Number of CNs in Groups
+  //uint32_t M;
+  uint32_t j;
+  uint32_t k;
+  // Offset to each bit within a group in terms of 32 Byte
+  uint32_t bitOffsetInGroup;
+
+  //__m256i ymm0, min, sgn;
+  //__m256i* p_cnProcBufResBit;
+
+  // const __m256i* p_ones   = (__m256i*) ones256_epi8;
+  // const __m256i* p_maxLLR = (__m256i*) maxLLR256_epi8;
+
+  // LUT with offsets for bits that need to be processed
+  // 1. bit proc requires LLRs of 2. and 3. bit, 2.bits of 1. and 3. etc.
+  // Offsets are in units of bitOffsetInGroup (1*384/32)
+  //    const uint8_t lut_idxCnProcG3[3][2] = {{12,24}, {0,24}, {0,12}};
+
+  // =====================================================================
+  // Process group with 3 BNs
+  fprintf(fd,"//Process group with 3 BNs\n");
+  // LUT with offsets for bits that need to be processed
+  // 1. bit proc requires LLRs of 2. and 3. bit, 2.bits of 1. and 3. etc.
+  // Offsets are in units of bitOffsetInGroup (1*384/32)
+  const uint8_t lut_idxCnProcG3[3][2] = {{12,24}, {0,24}, {0,12}};
+
+  fprintf(fd,"                __m256i ymm0, min, sgn,ones,maxLLR;\n");
+  fprintf(fd,"                ones   = _mm256_set1_epi8((char)1);\n");
+  fprintf(fd,"                maxLLR = _mm256_set1_epi8((char)127);\n");
+
+  fprintf(fd,"                uint32_t  M;\n");
+
+  if (lut_numCnInCnGroups[0] > 0)
+    {
+      // Number of groups of 32 CNs for parallel processing
+      // Ceil for values not divisible by 32
+       fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numCnInCnGroups[0] );
+
+      // Set the offset to each bit within a group in terms of 32 Byte
+      bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[0]*NR_LDPC_ZMAX)>>5;
+
+
+      // Set pointers to start of group 3
+      //p_cnProcBuf    = (__m256i*) &cnProcBuf   [lut_startAddrCnGroups[0]];
+      //p_cnProcBufRes = (__m256i*) &cnProcBufRes[lut_startAddrCnGroups[0]];
+
+      // Loop over every BN
+      
+      for (j=0; j<3; j++)
+        {
+	  // Set of results pointer to correct BN address
+	  //p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup);
+
+	  // Loop over CNs
+	  //	  for (i=0; i<M; i++,iprime++)
+	  //            {
+	  
+	  fprintf(fd,"            for (int i=0;i<M;i++) {\n");
+	  // Abs and sign of 32 CNs (first BN)
+	  //                ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
+	  fprintf(fd,"                ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[0]>>5)+lut_idxCnProcG3[j][0]);
+	  //                sgn  = _mm256_sign_epi8(ones, ymm0);
+	  fprintf(fd,"                sgn  = _mm256_sign_epi8(ones, ymm0);\n");
+	  //                min  = _mm256_abs_epi8(ymm0);
+	  fprintf(fd,"                min  = _mm256_abs_epi8(ymm0);\n");
+	  
+	  // 32 CNs of second BN
+	  //                ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][1] + i];
+	  fprintf(fd,"                ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[0]>>5)+lut_idxCnProcG3[j][1]);
+	  
+	  //                min  = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
+	  fprintf(fd,"                min  = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));\n");
+	  
+	  //                sgn  = _mm256_sign_epi8(sgn, ymm0);
+	  fprintf(fd,"                sgn  = _mm256_sign_epi8(sgn, ymm0);\n");
+	  
+	  // Store result
+	  //                min = _mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127
+	  fprintf(fd,"                min = _mm256_min_epu8(min, maxLLR);\n");
+	  //                *p_cnProcBufResBit = _mm256_sign_epi8(min, sgn);
+	  //                p_cnProcBufResBit++;
+	  fprintf(fd,"                ((__m256i*)cnProcBufRes)[%d+i] = _mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[0]>>5)+(j*bitOffsetInGroup));
+	  fprintf(fd,"            }\n");
+        }
+    }
+
+  // =====================================================================
+  // Process group with 4 BNs
+  fprintf(fd,"//Process group with 4 BNs\n");
+  // Offset is 5*384/32 = 60
+  const uint8_t lut_idxCnProcG4[4][3] = {{60,120,180}, {0,120,180}, {0,60,180}, {0,60,120}};
+
+  if (lut_numCnInCnGroups[1] > 0)
+    {
+      // Number of groups of 32 CNs for parallel processing
+      // Ceil for values not divisible by 32
+      fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numCnInCnGroups[1] );
+
+      // Set the offset to each bit within a group in terms of 32 Byte
+      bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[1]*NR_LDPC_ZMAX)>>5;
+
+
+      // Set pointers to start of group 4
+      //p_cnProcBuf    = (__m256i*) &cnProcBuf   [lut_startAddrCnGroups[1]];
+      //p_cnProcBufRes = (__m256i*) &cnProcBufRes[lut_startAddrCnGroups[1]];
+
+      // Loop over every BN
+      
+      for (j=0; j<4; j++)
+        {
+	  // Set of results pointer to correct BN address
+	  //p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup);
+
+	  // Loop over CNs
+	  //	  for (i=0; i<M; i++,iprime++)
+	  //            {
+	  fprintf(fd,"            for (int i=0;i<M;i++) {\n");
+	  // Abs and sign of 32 CNs (first BN)
+	  //                ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
+	  fprintf(fd,"                ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[1]>>5)+lut_idxCnProcG4[j][0]);
+	  //                sgn  = _mm256_sign_epi8(ones, ymm0);
+	  fprintf(fd,"                sgn  = _mm256_sign_epi8(ones, ymm0);\n");
+	  //                min  = _mm256_abs_epi8(ymm0);
+	  fprintf(fd,"                min  = _mm256_abs_epi8(ymm0);\n");
+	  
+	  
+	  // Loop over BNs
+	  for (k=1; k<3; k++)
+	    {
+	      fprintf(fd,"                ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[1]>>5)+lut_idxCnProcG4[j][k]);
+	      
+	      //                min  = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
+	      fprintf(fd,"                min  = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));\n");
+	      
+	      //                sgn  = _mm256_sign_epi8(sgn, ymm0);
+	      fprintf(fd,"                sgn  = _mm256_sign_epi8(sgn, ymm0);\n");
+	    }
+	  
+	  // Store result
+	  //                min = _mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127
+	  fprintf(fd,"                min = _mm256_min_epu8(min, maxLLR);\n");
+	  //                *p_cnProcBufResBit = _mm256_sign_epi8(min, sgn);
+	      //                p_cnProcBufResBit++;
+	  fprintf(fd,"                ((__m256i*)cnProcBufRes)[%d+i] = _mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[1]>>5)+(j*bitOffsetInGroup));
+	  fprintf(fd,"            }\n");
+        }
+    }
+
+
+  // =====================================================================
+  // Process group with 5 BNs
+  fprintf(fd,"//Process group with 5 BNs\n");
+  // Offset is 18*384/32 = 216
+  const uint16_t lut_idxCnProcG5[5][4] = {{216,432,648,864}, {0,432,648,864},
+					  {0,216,648,864}, {0,216,432,864}, {0,216,432,648}};
+
+
+  if (lut_numCnInCnGroups[2] > 0)
+    {
+      // Number of groups of 32 CNs for parallel processing
+      // Ceil for values not divisible by 32
+      fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numCnInCnGroups[2] );
+
+      // Set the offset to each bit within a group in terms of 32 Byte
+      bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[2]*NR_LDPC_ZMAX)>>5;
+
+
+      // Set pointers to start of group 4
+      //p_cnProcBuf    = (__m256i*) &cnProcBuf   [lut_startAddrCnGroups[1]];
+      //p_cnProcBufRes = (__m256i*) &cnProcBufRes[lut_startAddrCnGroups[1]];
+
+      // Loop over every BN
+      
+      for (j=0; j<5; j++)
+	{
+	  // Set of results pointer to correct BN address
+	  //p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup);
+
+	  // Loop over CNs
+	  //	  for (i=0; i<M; i++,iprime++)
+	  //            {
+	  fprintf(fd,"            for (int i=0;i<M;i++) {\n");
+	  // Abs and sign of 32 CNs (first BN)
+	  //                ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
+	  fprintf(fd,"                ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[2]>>5)+lut_idxCnProcG5[j][0]);
+	  //                sgn  = _mm256_sign_epi8(ones, ymm0);
+	  fprintf(fd,"                sgn  = _mm256_sign_epi8(ones, ymm0);\n");
+	  //                min  = _mm256_abs_epi8(ymm0);
+	  fprintf(fd,"                min  = _mm256_abs_epi8(ymm0);\n");
+	  
+	  
+	  // Loop over BNs
+	  for (k=1; k<4; k++)
+	    {
+	      fprintf(fd,"                ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[2]>>5)+lut_idxCnProcG5[j][k]);
+	      
+	      //                min  = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
+	      fprintf(fd,"                min  = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));\n");
+	      
+	      //                sgn  = _mm256_sign_epi8(sgn, ymm0);
+	      fprintf(fd,"                sgn  = _mm256_sign_epi8(sgn, ymm0);\n");
+	    }
+	  
+	  // Store result
+	  //                min = _mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127
+	  fprintf(fd,"                min = _mm256_min_epu8(min, maxLLR);\n");
+	  //                *p_cnProcBufResBit = _mm256_sign_epi8(min, sgn);
+	  //                p_cnProcBufResBit++;
+	  fprintf(fd,"                ((__m256i*)cnProcBufRes)[%d+i] = _mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[2]>>5)+(j*bitOffsetInGroup));
+	  fprintf(fd,"           }\n");
+        }
+    }
+
+  // =====================================================================
+  // Process group with 6 BNs
+  fprintf(fd,"//Process group with 6 BNs\n");
+  // Offset is 8*384/32 = 96
+  const uint16_t lut_idxCnProcG6[6][5] = {{96,192,288,384,480}, {0,192,288,384,480},
+					  {0,96,288,384,480}, {0,96,192,384,480},
+					  {0,96,192,288,480}, {0,96,192,288,384}};
+
+
+  if (lut_numCnInCnGroups[3] > 0)
+    {
+      // Number of groups of 32 CNs for parallel processing
+      // Ceil for values not divisible by 32
+     fprintf(fd, "M = (%d*Z + 31)>>5;\n",lut_numCnInCnGroups[3] );
+
+      // Set the offset to each bit within a group in terms of 32 Byte
+      bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[3]*NR_LDPC_ZMAX)>>5;
+
+
+      // Set pointers to start of group 4
+      //p_cnProcBuf    = (__m256i*) &cnProcBuf   [lut_startAddrCnGroups[1]];
+      //p_cnProcBufRes = (__m256i*) &cnProcBufRes[lut_startAddrCnGroups[1]];
+
+      // Loop over every BN
+      
+      for (j=0; j<6; j++)
+        {
+	  // Set of results pointer to correct BN address
+	  //p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup);
+
+	  // Loop over CNs
+	  //	  for (i=0; i<M; i++,iprime++)
+	  //            {
+	  fprintf(fd,"            for (int i=0;i<M;i++) {\n");
+	  // Abs and sign of 32 CNs (first BN)
+	  //                ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
+	  fprintf(fd,"                ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[3]>>5)+lut_idxCnProcG6[j][0]);
+	  //                sgn  = _mm256_sign_epi8(ones, ymm0);
+	  fprintf(fd,"                sgn  = _mm256_sign_epi8(ones, ymm0);\n");
+	  //                min  = _mm256_abs_epi8(ymm0);
+	  fprintf(fd,"                min  = _mm256_abs_epi8(ymm0);\n");
+	  
+	  
+	  // Loop over BNs
+	  for (k=1; k<5; k++)
+	    {
+	      fprintf(fd,"                ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[3]>>5)+lut_idxCnProcG6[j][k]);
+	      
+	      //                min  = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
+	      fprintf(fd,"                min  = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));\n");
+	      
+	      //                sgn  = _mm256_sign_epi8(sgn, ymm0);
+	      fprintf(fd,"                sgn  = _mm256_sign_epi8(sgn, ymm0);\n");
+	    }
+	  
+	  // Store result
+	  //                min = _mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127
+	  fprintf(fd,"                min = _mm256_min_epu8(min, maxLLR);\n");
+	  //                *p_cnProcBufResBit = _mm256_sign_epi8(min, sgn);
+	  //                p_cnProcBufResBit++;
+	  fprintf(fd,"                ((__m256i*)cnProcBufRes)[%d+i] = _mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[3]>>5)+(j*bitOffsetInGroup));
+	  fprintf(fd,"            }\n");
+	}
+    }
+
+
+  // =====================================================================
+  // Process group with 7 BNs
+  fprintf(fd,"//Process group with 7 BNs\n");
+  // Offset is 5*384/32 = 60
+  const uint16_t lut_idxCnProcG7[7][6] = {{60,120,180,240,300,360}, {0,120,180,240,300,360},
+					  {0,60,180,240,300,360},   {0,60,120,240,300,360},
+					  {0,60,120,180,300,360},   {0,60,120,180,240,360},
+					  {0,60,120,180,240,300}};
+
+
+
+  if (lut_numCnInCnGroups[4] > 0)
+    {
+      // Number of groups of 32 CNs for parallel processing
+      // Ceil for values not divisible by 32
+      fprintf(fd, "M = (%d*Z + 31)>>5;\n",lut_numCnInCnGroups[4] );
+
+      // Set the offset to each bit within a group in terms of 32 Byte
+      bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[4]*NR_LDPC_ZMAX)>>5;
+
+
+      // Set pointers to start of group 4
+      //p_cnProcBuf    = (__m256i*) &cnProcBuf   [lut_startAddrCnGroups[1]];
+      //p_cnProcBufRes = (__m256i*) &cnProcBufRes[lut_startAddrCnGroups[1]];
+
+      // Loop over every BN
+      
+      for (j=0; j<7; j++)
+        {
+	  // Set of results pointer to correct BN address
+	  //p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup);
+
+	  // Loop over CNs
+	  //	  for (i=0; i<M; i++,iprime++)
+	  //            {
+	  fprintf(fd,"            for (int i=0;i<M;i++) {\n");
+	  // Abs and sign of 32 CNs (first BN)
+	  //                ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
+	  fprintf(fd,"                ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[4]>>5)+lut_idxCnProcG7[j][0]);
+	  //                sgn  = _mm256_sign_epi8(ones, ymm0);
+	  fprintf(fd,"                sgn  = _mm256_sign_epi8(ones, ymm0);\n");
+	  //                min  = _mm256_abs_epi8(ymm0);
+	  fprintf(fd,"                min  = _mm256_abs_epi8(ymm0);\n");
+	  
+	  
+	  // Loop over BNs
+	  for (k=1; k<6; k++)
+	    {
+	      fprintf(fd,"                ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[4]>>5)+lut_idxCnProcG7[j][k]);
+	      
+	      //                min  = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
+	      fprintf(fd,"                min  = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));\n");
+	      
+	      //                sgn  = _mm256_sign_epi8(sgn, ymm0);
+	      fprintf(fd,"                sgn  = _mm256_sign_epi8(sgn, ymm0);\n");
+	    }
+	  
+	  // Store result
+	  //                min = _mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127
+	  fprintf(fd,"                min = _mm256_min_epu8(min, maxLLR);\n");
+	  //                *p_cnProcBufResBit = _mm256_sign_epi8(min, sgn);
+	  //                p_cnProcBufResBit++;
+	  fprintf(fd,"                ((__m256i*)cnProcBufRes)[%d+i] = _mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[4]>>5)+(j*bitOffsetInGroup));
+	  fprintf(fd,"            }\n");
+	}
+    }
+
+
+  // =====================================================================
+  // Process group with 8 BNs
+  fprintf(fd,"//Process group with 8 BNs\n");
+  // Offset is 2*384/32 = 24
+  const uint8_t lut_idxCnProcG8[8][7] = {{24,48,72,96,120,144,168}, {0,48,72,96,120,144,168},
+					 {0,24,72,96,120,144,168}, {0,24,48,96,120,144,168},
+					 {0,24,48,72,120,144,168}, {0,24,48,72,96,144,168},
+					 {0,24,48,72,96,120,168},  {0,24,48,72,96,120,144}};
+
+
+
+
+  if (lut_numCnInCnGroups[5] > 0)
+    {
+      // Number of groups of 32 CNs for parallel processing
+      // Ceil for values not divisible by 32
+     fprintf(fd, "M = (%d*Z + 31)>>5;\n",lut_numCnInCnGroups[5] );
+
+      // Set the offset to each bit within a group in terms of 32 Byte
+      bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[5]*NR_LDPC_ZMAX)>>5;
+
+
+      // Set pointers to start of group 4
+      //p_cnProcBuf    = (__m256i*) &cnProcBuf   [lut_startAddrCnGroups[1]];
+      //p_cnProcBufRes = (__m256i*) &cnProcBufRes[lut_startAddrCnGroups[1]];
+
+      // Loop over every BN
+      
+      for (j=0; j<8; j++)
+        {
+	  // Set of results pointer to correct BN address
+	  //p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup);
+
+	  // Loop over CNs
+	  //	  for (i=0; i<M; i++,iprime++)
+	  //            {
+	  fprintf(fd,"            for (int i=0;i<M;i++) {\n");
+	  // Abs and sign of 32 CNs (first BN)
+	  //                ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
+	  fprintf(fd,"                ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[5]>>5)+lut_idxCnProcG8[j][0]);
+	  //                sgn  = _mm256_sign_epi8(ones, ymm0);
+	  fprintf(fd,"                sgn  = _mm256_sign_epi8(ones, ymm0);\n");
+	  //                min  = _mm256_abs_epi8(ymm0);
+	  fprintf(fd,"                min  = _mm256_abs_epi8(ymm0);\n");
+	  
+	  
+	  // Loop over BNs
+	  for (k=1; k<7; k++)
+	    {
+	      fprintf(fd,"                ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[5]>>5)+lut_idxCnProcG8[j][k]);
+	      
+	      //                min  = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
+	      fprintf(fd,"                min  = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));\n");
+	      
+	      //                sgn  = _mm256_sign_epi8(sgn, ymm0);
+	      fprintf(fd,"                sgn  = _mm256_sign_epi8(sgn, ymm0);\n");
+	    }
+	  
+	  // Store result
+	  //                min = _mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127
+	  fprintf(fd,"                min = _mm256_min_epu8(min, maxLLR);\n");
+	  //                *p_cnProcBufResBit = _mm256_sign_epi8(min, sgn);
+	  //                p_cnProcBufResBit++;
+	  fprintf(fd,"                ((__m256i*)cnProcBufRes)[%d+i] = _mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[5]>>5)+(j*bitOffsetInGroup));
+	  fprintf(fd,"              }\n");
+        }
+    }
+
+  // =====================================================================
+  // Process group with 9 BNs
+  fprintf(fd,"//Process group with 9 BNs\n");
+  // Offset is 2*384/32 = 24
+  const uint8_t lut_idxCnProcG9[9][8] = {{24,48,72,96,120,144,168,192}, {0,48,72,96,120,144,168,192},
+					 {0,24,72,96,120,144,168,192}, {0,24,48,96,120,144,168,192},
+					 {0,24,48,72,120,144,168,192}, {0,24,48,72,96,144,168,192},
+					 {0,24,48,72,96,120,168,192}, {0,24,48,72,96,120,144,192},
+					 {0,24,48,72,96,120,144,168}};
+
+
+
+
+
+  if (lut_numCnInCnGroups[6] > 0)
+    {
+      // Number of groups of 32 CNs for parallel processing
+      // Ceil for values not divisible by 32
+      fprintf(fd, "M = (%d*Z + 31)>>5;\n",lut_numCnInCnGroups[6] );
+      // Set the offset to each bit within a group in terms of 32 Byte
+      bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[6]*NR_LDPC_ZMAX)>>5;
+
+
+      // Set pointers to start of group 9
+      //p_cnProcBuf    = (__m256i*) &cnProcBuf   [lut_startAddrCnGroups[1]];
+      //p_cnProcBufRes = (__m256i*) &cnProcBufRes[lut_startAddrCnGroups[1]];
+
+      // Loop over every BN
+     
+      for (j=0; j<9; j++)
+        {
+	  // Set of results pointer to correct BN address
+	  //p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup);
+
+	  // Loop over CNs
+	  //	  for (i=0; i<M; i++,iprime++)
+	  //            {
+	  fprintf(fd,"            for (int i=0;i<M;i++) {\n");
+	  // Abs and sign of 32 CNs (first BN)
+	  //                ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
+	  fprintf(fd,"                ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[6]>>5)+lut_idxCnProcG9[j][0]);
+	  //                sgn  = _mm256_sign_epi8(ones, ymm0);
+	  fprintf(fd,"                sgn  = _mm256_sign_epi8(ones, ymm0);\n");
+	  //                min  = _mm256_abs_epi8(ymm0);
+	  fprintf(fd,"                min  = _mm256_abs_epi8(ymm0);\n");
+	  
+	  
+	  // Loop over BNs
+	  for (k=1; k<8; k++)
+	    {
+	      fprintf(fd,"                ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[6]>>5)+lut_idxCnProcG9[j][k]);
+	      
+	      //                min  = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
+	      fprintf(fd,"                min  = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));\n");
+	      
+	      //                sgn  = _mm256_sign_epi8(sgn, ymm0);
+	      fprintf(fd,"                sgn  = _mm256_sign_epi8(sgn, ymm0);\n");
+	    }
+	  
+	  // Store result
+	  //                min = _mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127
+	  fprintf(fd,"                min = _mm256_min_epu8(min, maxLLR);\n");
+	  //                *p_cnProcBufResBit = _mm256_sign_epi8(min, sgn);
+	  //                p_cnProcBufResBit++;
+	  fprintf(fd,"                ((__m256i*)cnProcBufRes)[%d+i] = _mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[6]>>5)+(j*bitOffsetInGroup));
+	  fprintf(fd,"            }\n");
+	}
+    }
+
+  // =====================================================================
+  // Process group with 10 BNs
+  fprintf(fd,"//Process group with 10 BNs\n");
+  // Offset is 1*384/32 = 12
+  const uint8_t lut_idxCnProcG10[10][9] = {{12,24,36,48,60,72,84,96,108}, {0,24,36,48,60,72,84,96,108},
+					   {0,12,36,48,60,72,84,96,108}, {0,12,24,48,60,72,84,96,108},
+					   {0,12,24,36,60,72,84,96,108}, {0,12,24,36,48,72,84,96,108},
+					   {0,12,24,36,48,60,84,96,108}, {0,12,24,36,48,60,72,96,108},
+					   {0,12,24,36,48,60,72,84,108}, {0,12,24,36,48,60,72,84,96}};
+
+
+
+
+
+  if (lut_numCnInCnGroups[7] > 0)
+    {
+      // Number of groups of 32 CNs for parallel processing
+      // Ceil for values not divisible by 32
+      fprintf(fd, " M = (%d*Z + 31)>>5;\n",lut_numCnInCnGroups[7] );
+
+      // Set the offset to each bit within a group in terms of 32 Byte
+      bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[7]*NR_LDPC_ZMAX)>>5;
+
+
+      // Set pointers to start of group 10
+      //p_cnProcBuf    = (__m256i*) &cnProcBuf   [lut_startAddrCnGroups[1]];
+      //p_cnProcBufRes = (__m256i*) &cnProcBufRes[lut_startAddrCnGroups[1]];
+
+      // Loop over every BN
+      
+      for (j=0; j<10; j++)
+        {
+	  // Set of results pointer to correct BN address
+	  //p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup);
+
+	  // Loop over CNs
+	  //	  for (i=0; i<M; i++,iprime++)
+	  //            {
+	  fprintf(fd,"            for (int i=0;i<M;i++) {\n");
+	  // Abs and sign of 32 CNs (first BN)
+	  //                ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
+	  fprintf(fd,"                ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[7]>>5)+lut_idxCnProcG10[j][0]);
+	  //                sgn  = _mm256_sign_epi8(ones, ymm0);
+	  fprintf(fd,"                sgn  = _mm256_sign_epi8(ones, ymm0);\n");
+	  //                min  = _mm256_abs_epi8(ymm0);
+	  fprintf(fd,"                min  = _mm256_abs_epi8(ymm0);\n");
+	  
+	  
+	  // Loop over BNs
+	  for (k=1; k<9; k++)
+	    {
+	      fprintf(fd,"                ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[7]>>5)+lut_idxCnProcG10[j][k]);
+	      
+	      //                min  = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
+	      fprintf(fd,"                min  = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));\n");
+	      
+	      //                sgn  = _mm256_sign_epi8(sgn, ymm0);
+	      fprintf(fd,"                sgn  = _mm256_sign_epi8(sgn, ymm0);\n");
+	    }
+	  
+	  // Store result
+	  //                min = _mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127
+	  fprintf(fd,"                min = _mm256_min_epu8(min, maxLLR);\n");
+	  //                *p_cnProcBufResBit = _mm256_sign_epi8(min, sgn);
+	  //                p_cnProcBufResBit++;
+	  fprintf(fd,"                ((__m256i*)cnProcBufRes)[%d+i] = _mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[7]>>5)+(j*bitOffsetInGroup));
+	  fprintf(fd,"            }\n");
+        }
+    }
+
+
+  // =====================================================================
+  // Process group with 19 BNs
+  fprintf(fd,"//Process group with 19 BNs\n");
+  // Offset is 4*384/32 = 12
+  const uint16_t lut_idxCnProcG19[19][18] = {{48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, {0,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864},
+					     {0,48,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, {0,48,96,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864},
+					     {0,48,96,144,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, {0,48,96,144,192,288,336,384,432,480,528,576,624,672,720,768,816,864},
+					     {0,48,96,144,192,240,336,384,432,480,528,576,624,672,720,768,816,864}, {0,48,96,144,192,240,288,384,432,480,528,576,624,672,720,768,816,864},
+					     {0,48,96,144,192,240,288,336,432,480,528,576,624,672,720,768,816,864}, {0,48,96,144,192,240,288,336,384,480,528,576,624,672,720,768,816,864},
+					     {0,48,96,144,192,240,288,336,384,432,528,576,624,672,720,768,816,864}, {0,48,96,144,192,240,288,336,384,432,480,576,624,672,720,768,816,864},
+					     {0,48,96,144,192,240,288,336,384,432,480,528,624,672,720,768,816,864}, {0,48,96,144,192,240,288,336,384,432,480,528,576,672,720,768,816,864},
+					     {0,48,96,144,192,240,288,336,384,432,480,528,576,624,720,768,816,864}, {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,768,816,864},
+					     {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,816,864}, {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,864},
+					     {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816}};
+
+
+  if (lut_numCnInCnGroups[8] > 0)
+    {
+      // Number of groups of 32 CNs for parallel processing
+      // Ceil for values not divisible by 32
+     fprintf(fd, " M = (%d*Z + 31)>>5;\n",lut_numCnInCnGroups[8] );
+
+      // Set the offset to each bit within a group in terms of 32 Byte
+      bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[8]*NR_LDPC_ZMAX)>>5;
+
+
+      // Set pointers to start of group 19
+      //p_cnProcBuf    = (__m256i*) &cnProcBuf   [lut_startAddrCnGroups[1]];
+      //p_cnProcBufRes = (__m256i*) &cnProcBufRes[lut_startAddrCnGroups[1]];
+
+      // Loop over every BN
+      
+      for (j=0; j<19; j++)
+        {
+	  // Set of results pointer to correct BN address
+	  //p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup);
+
+	  // Loop over CNs
+	  //	  for (i=0; i<M; i++,iprime++)
+	  //            {
+	  fprintf(fd,"            for (int i=0;i<M;i++) {\n");
+	  // Abs and sign of 32 CNs (first BN)
+	  //                ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
+	  fprintf(fd,"                ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[8]>>5)+lut_idxCnProcG19[j][0]);
+	  //                sgn  = _mm256_sign_epi8(ones, ymm0);
+	  fprintf(fd,"                sgn  = _mm256_sign_epi8(ones, ymm0);\n");
+	  //                min  = _mm256_abs_epi8(ymm0);
+	  fprintf(fd,"                min  = _mm256_abs_epi8(ymm0);\n");
+	  
+	  
+	  // Loop over BNs
+	  for (k=1; k<18; k++)
+	    {
+	      fprintf(fd,"                ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[8]>>5)+lut_idxCnProcG19[j][k]);
+	      
+	      //                min  = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
+	      fprintf(fd,"                min  = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));\n");
+	      
+	      //                sgn  = _mm256_sign_epi8(sgn, ymm0);
+	      fprintf(fd,"                sgn  = _mm256_sign_epi8(sgn, ymm0);\n");
+	    }
+	  
+	  // Store result
+	  //                min = _mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127
+	  fprintf(fd,"                min = _mm256_min_epu8(min, maxLLR);\n");
+	  //                *p_cnProcBufResBit = _mm256_sign_epi8(min, sgn);
+	  //                p_cnProcBufResBit++;
+	  fprintf(fd,"                ((__m256i*)cnProcBufRes)[%d+i] = _mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[8]>>5)+(j*bitOffsetInGroup));
+	  fprintf(fd,"            }\n");
+        }
+    }
+
+  fprintf(fd,"}\n");
+  fclose(fd);
+}//end of the function  nrLDPC_cnProc_BG1
+
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc/cnProc_gen_BG2_avx2.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc/cnProc_gen_BG2_avx2.c
new file mode 100644
index 0000000000000000000000000000000000000000..9a5ff84c868eefd34d53e0fe4b4e5cbffdd18858
--- /dev/null
+++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc/cnProc_gen_BG2_avx2.c
@@ -0,0 +1,436 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include "../../nrLDPCdecoder_defs.h"
+#include "../../nrLDPC_types.h"                                                                                           
+#include "../../nrLDPC_bnProc.h"
+
+
+void nrLDPC_cnProc_BG2_generator_AVX2(const char* dir, int R)
+{
+  const char *ratestr[3]={"15","13","23"};
+
+  if (R<0 || R>2) {printf("Illegal R %d\n",R); abort();}
+
+
+//  system("mkdir -p ldpc_gen_files/avx2");
+
+  char fname[FILENAME_MAX+1];
+  snprintf(fname, sizeof(fname), "%s/cnProc/nrLDPC_cnProc_BG2_R%s_AVX2.h", dir, ratestr[R]);
+  FILE *fd=fopen(fname,"w");
+  if (fd == NULL) {
+    printf("Cannot create file %s\n", fname);
+    abort();
+  }
+
+  fprintf(fd,"#include <stdint.h>\n");
+  fprintf(fd,"#include <immintrin.h>\n");
+  fprintf(fd,"static inline void nrLDPC_cnProc_BG2_R%s_AVX2(int8_t* cnProcBuf, int8_t* cnProcBufRes, uint16_t Z) {\n",ratestr[R]);
+
+  const uint8_t*  lut_numCnInCnGroups;
+  const uint32_t* lut_startAddrCnGroups = lut_startAddrCnGroups_BG2;
+
+  if (R==0)      lut_numCnInCnGroups = lut_numCnInCnGroups_BG2_R15;
+  else if (R==1) lut_numCnInCnGroups = lut_numCnInCnGroups_BG2_R13;
+  else if (R==2) lut_numCnInCnGroups = lut_numCnInCnGroups_BG2_R23;
+  else { printf("aborting, illegal R %d\n",R); fclose(fd);abort();}
+
+
+  // Number of CNs in Groups
+  //uint32_t M;
+  uint32_t j;
+  uint32_t k;
+  // Offset to each bit within a group in terms of 32 byte
+  uint32_t bitOffsetInGroup;
+
+  // Offsets are in units of bitOffsetInGroup (1*384/32)
+  //    const uint8_t lut_idxCnProcG3[3][2] = {{12,24}, {0,24}, {0,12}};
+
+  // =====================================================================
+  // Process group with 3 BNs
+  fprintf(fd,"//Process group with 3 BNs\n");
+  // LUT with offsets for bits that need to be processed
+  // 1. bit proc requires LLRs of 2. and 3. bit, 2.bits of 1. and 3. etc.
+    // Offsets are in units of bitOffsetInGroup
+    const uint8_t lut_idxCnProcG3[3][2] = {{72,144}, {0,144}, {0,72}};
+
+
+  fprintf(fd,"                __m256i ymm0, min, sgn,ones,maxLLR;\n");
+  fprintf(fd,"                ones   = _mm256_set1_epi8((char)1);\n");
+  fprintf(fd,"                maxLLR = _mm256_set1_epi8((char)127);\n");
+    fprintf(fd,"                uint32_t M;\n");
+ 
+
+  if (lut_numCnInCnGroups[0] > 0)
+    {
+      // Number of groups of 32 CNs for parallel processing
+      // Ceil for values not divisible by 32
+     fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numCnInCnGroups[0] );
+
+      // Set the offset to each bit within a group in terms of 32 byte
+      bitOffsetInGroup = (lut_numCnInCnGroups_BG2_R15[0]*NR_LDPC_ZMAX)>>5;
+
+      // Loop over every BN
+      
+      for (j=0; j<3; j++)
+        {
+
+            fprintf(fd,"            for (int i=0;i<M;i+=2) {\n");
+            // Abs and sign of 32 CNs (first BN)
+            //                ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
+            fprintf(fd,"                ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[0]>>5)+lut_idxCnProcG3[j][0]);
+            //                sgn  = _mm256_sign_epi8(ones, ymm0);
+            fprintf(fd,"                sgn  = _mm256_sign_epi8(ones, ymm0);\n");
+            //                min  = _mm256_abs_epi8(ymm0);
+            fprintf(fd,"                min  = _mm256_abs_epi8(ymm0);\n");
+            
+            // 32 CNs of second BN
+            //                ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][1] + i];
+            fprintf(fd,"                ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[0]>>5)+lut_idxCnProcG3[j][1]);
+            
+            //                min  = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
+            fprintf(fd,"                min  = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));\n");
+            
+            //                sgn  = _mm256_sign_epi8(sgn, ymm0);
+            fprintf(fd,"                sgn  = _mm256_sign_epi8(sgn, ymm0);\n");
+            
+            // Store result
+            //                min = _mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127
+            fprintf(fd,"                min = _mm256_min_epu8(min, maxLLR);\n");
+            //                *p_cnProcBufResBit = _mm256_sign_epi8(min, sgn);
+            //                p_cnProcBufResBit++;
+            fprintf(fd,"                ((__m256i*)cnProcBufRes)[%d+i] = _mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[0]>>5)+(j*bitOffsetInGroup));
+
+            // Abs and sign of 32 CNs (first BN)
+            //                ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
+            fprintf(fd,"                ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[0]>>5)+lut_idxCnProcG3[j][0]+1);
+            //                sgn  = _mm256_sign_epi8(ones, ymm0);
+            fprintf(fd,"                sgn  = _mm256_sign_epi8(ones, ymm0);\n");
+            //                min  = _mm256_abs_epi8(ymm0);
+            fprintf(fd,"                min  = _mm256_abs_epi8(ymm0);\n");
+      
+            fprintf(fd,"            }\n");
+          }
+      }
+
+  // =====================================================================
+  // Process group with 4 BNs
+  fprintf(fd,"//Process group with 4 BNs\n");
+  
+ // Offset is 20*384/32 = 240
+    const uint16_t lut_idxCnProcG4[4][3] = {{240,480,720}, {0,480,720}, {0,240,720}, {0,240,480}};
+
+    if (lut_numCnInCnGroups[1] > 0)
+    {
+            // Number of groups of 32 CNs for parallel processing
+            // Ceil for values not divisible by 32
+        fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numCnInCnGroups[1] );
+
+            // Set the offset to each bit within a group in terms of 32 byte
+            bitOffsetInGroup = (lut_numCnInCnGroups_BG2_R15[1]*NR_LDPC_ZMAX)>>5;
+
+            // Loop over every BN
+            
+          for (j=0; j<4; j++)
+          {
+
+          // Loop over CNs
+
+          fprintf(fd,"            for (int i=0;i<M;i++) {\n");
+          // Abs and sign of 32 CNs (first BN)
+          //                ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
+          fprintf(fd,"                ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[1]>>5)+lut_idxCnProcG4[j][0]);
+          //                sgn  = _mm256_sign_epi8(ones, ymm0);
+           fprintf(fd,"                sgn  = _mm256_sign_epi8(ones, ymm0);\n");
+          //                min  = _mm256_abs_epi8(ymm0);
+          fprintf(fd,"                min  = _mm256_abs_epi8(ymm0);\n");
+            
+            
+          // Loop over BNs
+            for (k=1; k<3; k++)
+            {
+            fprintf(fd,"                ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[1]>>5)+lut_idxCnProcG4[j][k]);
+                
+            //                min  = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
+            fprintf(fd,"                min  = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));\n");
+                
+            //                sgn  = _mm256_sign_epi8(sgn, ymm0);
+                fprintf(fd,"                sgn  = _mm256_sign_epi8(sgn, ymm0);\n");
+            }
+            
+            // Store result
+            //                min = _mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127
+            fprintf(fd,"                min = _mm256_min_epu8(min, maxLLR);\n");
+            //                *p_cnProcBufResBit = _mm256_sign_epi8(min, sgn);
+                //                p_cnProcBufResBit++;
+            fprintf(fd,"                ((__m256i*)cnProcBufRes)[%d+i] = _mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[1]>>5)+(j*bitOffsetInGroup));
+            fprintf(fd,"            }\n");
+          }
+      }
+
+
+  // =====================================================================
+  // Process group with 5 BNs
+    fprintf(fd,"//Process group with 5 BNs\n");
+
+    // Offset is 9*384/32 = 108
+    const uint16_t lut_idxCnProcG5[5][4] = {{108,216,324,432}, {0,216,324,432},
+                                            {0,108,324,432}, {0,108,216,432}, {0,108,216,324}};
+
+
+
+    if (lut_numCnInCnGroups[2] > 0)
+    {
+      // Number of groups of 32 CNs for parallel processing
+      // Ceil for values not divisible by 32
+    fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numCnInCnGroups[2] );
+      // Set the offset to each bit within a group in terms of 32 byte
+      bitOffsetInGroup = (lut_numCnInCnGroups_BG2_R15[2]*NR_LDPC_ZMAX)>>5;
+
+      // Loop over every BN
+      
+      for (j=0; j<5; j++)
+	    {
+
+         
+         fprintf(fd,"            for (int i=0;i<M;i++) {\n");
+        // Abs and sign of 32 CNs (first BN)
+        //                ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
+        fprintf(fd,"                ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[2]>>5)+lut_idxCnProcG5[j][0]);
+        //                sgn  = _mm256_sign_epi8(ones, ymm0);
+        fprintf(fd,"                sgn  = _mm256_sign_epi8(ones, ymm0);\n");
+        //                min  = _mm256_abs_epi8(ymm0);
+        fprintf(fd,"                min  = _mm256_abs_epi8(ymm0);\n");
+        
+        
+        // Loop over BNs
+        for (k=1; k<4; k++)
+        {
+          fprintf(fd,"                ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[2]>>5)+lut_idxCnProcG5[j][k]);
+            
+          //                min  = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
+          fprintf(fd,"                min  = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));\n");
+            
+          //                sgn  = _mm256_sign_epi8(sgn, ymm0);
+          fprintf(fd,"                sgn  = _mm256_sign_epi8(sgn, ymm0);\n");
+        }
+        
+          // Store result
+        //                min = _mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127
+        fprintf(fd,"                min = _mm256_min_epu8(min, maxLLR);\n");
+        //                *p_cnProcBufResBit = _mm256_sign_epi8(min, sgn);
+        fprintf(fd,"                ((__m256i*)cnProcBufRes)[%d+i] = _mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[2]>>5)+(j*bitOffsetInGroup));
+        fprintf(fd,"           }\n");
+      }
+    }
+
+  // =====================================================================
+  // Process group with 6 BNs
+  fprintf(fd,"//Process group with 6 BNs\n");
+    // Offset is 3*384/32 = 36
+  const uint16_t lut_idxCnProcG6[6][5] = {{36,72,108,144,180}, {0,72,108,144,180},
+                                            {0,36,108,144,180}, {0,36,72,144,180},
+                                            {0,36,72,108,180}, {0,36,72,108,144}};
+
+
+  if (lut_numCnInCnGroups[3] > 0)
+  {
+      // Number of groups of 32 CNs for parallel processing
+      // Ceil for values not divisible by 32
+      fprintf(fd, "M = (%d*Z + 31)>>5;\n",lut_numCnInCnGroups[3] );
+
+      // Set the offset to each bit within a group in terms of 32 byte
+      bitOffsetInGroup = (lut_numCnInCnGroups_BG2_R15[3]*NR_LDPC_ZMAX)>>5;
+
+      // Loop over every BN
+      
+    for (j=0; j<6; j++)
+    {
+	
+
+	    // Loop over CNs
+	 
+	    fprintf(fd,"            for (int i=0;i<M;i++) {\n");
+	    // Abs and sign of 32 CNs (first BN)
+	    //                ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
+	    fprintf(fd,"                ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[3]>>5)+lut_idxCnProcG6[j][0]);
+	    //                sgn  = _mm256_sign_epi8(ones, ymm0);
+	    fprintf(fd,"                sgn  = _mm256_sign_epi8(ones, ymm0);\n");
+	   //                min  = _mm256_abs_epi8(ymm0);
+	    fprintf(fd,"                min  = _mm256_abs_epi8(ymm0);\n");
+	  
+	  
+	    // Loop over BNs
+	    for (k=1; k<5; k++)
+	    {
+	    fprintf(fd,"                ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[3]>>5)+lut_idxCnProcG6[j][k]);
+	      
+	    //                min  = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
+	    fprintf(fd,"                min  = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));\n");
+	      
+	    //                sgn  = _mm256_sign_epi8(sgn, ymm0);
+	    fprintf(fd,"                sgn  = _mm256_sign_epi8(sgn, ymm0);\n");
+	    }
+	  
+      // Store result
+      //                min = _mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127
+      fprintf(fd,"                min = _mm256_min_epu8(min, maxLLR);\n");
+      //                *p_cnProcBufResBit = _mm256_sign_epi8(min, sgn);
+      //                p_cnProcBufResBit++;
+      fprintf(fd,"                ((__m256i*)cnProcBufRes)[%d+i] = _mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[3]>>5)+(j*bitOffsetInGroup));
+      fprintf(fd,"            }\n");
+	  }
+  }
+
+
+
+  // =====================================================================
+  // Process group with 8 BNs
+  fprintf(fd,"//Process group with 8 BNs\n");
+ // Offset is 2*384/32 = 24
+    const uint8_t lut_idxCnProcG8[8][7] = {{24,48,72,96,120,144,168}, {0,48,72,96,120,144,168},
+                                           {0,24,72,96,120,144,168}, {0,24,48,96,120,144,168},
+                                           {0,24,48,72,120,144,168}, {0,24,48,72,96,144,168},
+                                           {0,24,48,72,96,120,168}, {0,24,48,72,96,120,144}};
+
+
+
+
+
+
+    if (lut_numCnInCnGroups[4] > 0)
+    {
+      // Number of groups of 32 CNs for parallel processing
+      // Ceil for values not divisible by 32
+     fprintf(fd, "M = (%d*Z + 31)>>5;\n",lut_numCnInCnGroups[4] );
+
+      // Set the offset to each bit within a group in terms of 32 byte
+      bitOffsetInGroup = (lut_numCnInCnGroups_BG2_R15[4]*NR_LDPC_ZMAX)>>5;
+
+      // Loop over every BN
+      
+      for (j=0; j<8; j++)
+      {
+
+	      // Loop over CNs
+        fprintf(fd,"            for (int i=0;i<M;i++) {\n");
+        // Abs and sign of 32 CNs (first BN)
+        //                ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
+        fprintf(fd,"                ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[4]>>5)+lut_idxCnProcG8[j][0]);
+        //                sgn  = _mm256_sign_epi8(ones, ymm0);
+        fprintf(fd,"                sgn  = _mm256_sign_epi8(ones, ymm0);\n");
+        //                min  = _mm256_abs_epi8(ymm0);
+        fprintf(fd,"                min  = _mm256_abs_epi8(ymm0);\n");
+        
+	      // Loop over BNs
+          for (k=1; k<7; k++)
+          {
+          fprintf(fd,"                ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[4]>>5)+lut_idxCnProcG8[j][k]);
+            
+          //                min  = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
+          fprintf(fd,"                min  = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));\n");
+            
+            //                sgn  = _mm256_sign_epi8(sgn, ymm0);
+          fprintf(fd,"                sgn  = _mm256_sign_epi8(sgn, ymm0);\n");
+          
+          }
+	  
+	        // Store result
+          //                min = _mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127
+          fprintf(fd,"                min = _mm256_min_epu8(min, maxLLR);\n");
+          //                *p_cnProcBufResBit = _mm256_sign_epi8(min, sgn);
+          //                p_cnProcBufResBit++;
+          fprintf(fd,"                ((__m256i*)cnProcBufRes)[%d+i] = _mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[4]>>5)+(j*bitOffsetInGroup));
+          fprintf(fd,"              }\n");
+        }
+    }
+
+ 
+  // =====================================================================
+  // Process group with 10 BNs
+  fprintf(fd,"//Process group with 10 BNs\n");
+
+    const uint8_t lut_idxCnProcG10[10][9] = {{24,48,72,96,120,144,168,192,216}, {0,48,72,96,120,144,168,192,216},
+                                             {0,24,72,96,120,144,168,192,216}, {0,24,48,96,120,144,168,192,216},
+                                             {0,24,48,72,120,144,168,192,216}, {0,24,48,72,96,144,168,192,216},
+                                             {0,24,48,72,96,120,168,192,216}, {0,24,48,72,96,120,144,192,216},
+                                             {0,24,48,72,96,120,144,168,216}, {0,24,48,72,96,120,144,168,192}};
+
+
+
+
+
+    if (lut_numCnInCnGroups[5] > 0)
+    {
+      // Number of groups of 32 CNs for parallel processing
+      // Ceil for values not divisible by 32
+    fprintf(fd, "M = (%d*Z + 31)>>5;\n",lut_numCnInCnGroups[5] );
+
+      // Set the offset to each bit within a group in terms of 32 byte
+      bitOffsetInGroup = (lut_numCnInCnGroups_BG2_R15[5]*NR_LDPC_ZMAX)>>5;
+
+      // Loop over every BN
+      
+      for (j=0; j<10; j++)
+      {
+
+      // Loop over CNs
+
+      fprintf(fd,"            for (int i=0;i<M;i++) {\n");
+      // Abs and sign of 32 CNs (first BN)
+        //                ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
+      fprintf(fd,"                ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[5]>>5)+lut_idxCnProcG10[j][0]);
+        //                sgn  = _mm256_sign_epi8(ones, ymm0);
+      fprintf(fd,"                sgn  = _mm256_sign_epi8(ones, ymm0);\n");
+        //                min  = _mm256_abs_epi8(ymm0);
+      fprintf(fd,"                min  = _mm256_abs_epi8(ymm0);\n");
+        
+	  
+	  // Loop over BNs
+	     for (k=1; k<9; k++)
+	     {
+          fprintf(fd,"                ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[5]>>5)+lut_idxCnProcG10[j][k]);
+            
+            //                min  = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
+          fprintf(fd,"                min  = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));\n");
+            
+            //                sgn  = _mm256_sign_epi8(sgn, ymm0);
+          fprintf(fd,"                sgn  = _mm256_sign_epi8(sgn, ymm0);\n");
+        }
+	  
+          // Store result
+            //                min = _mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127
+          fprintf(fd,"                min = _mm256_min_epu8(min, maxLLR);\n");
+            //                *p_cnProcBufResBit = _mm256_sign_epi8(min, sgn);
+            //                p_cnProcBufResBit++;
+          fprintf(fd,"                ((__m256i*)cnProcBufRes)[%d+i] = _mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[5]>>5)+(j*bitOffsetInGroup));
+          fprintf(fd,"            }\n");
+      }
+    }
+
+
+  fprintf(fd,"}\n");
+  fclose(fd);
+}//end of the function  nrLDPC_cnProc_BG2
+
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc/main.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc/main.c
new file mode 100644
index 0000000000000000000000000000000000000000..9d81417749b44fb1fbfc6e6b9d5fd14ecadd5dbc
--- /dev/null
+++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc/main.c
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#define NB_R  3
+void nrLDPC_cnProc_BG1_generator_AVX2(const char*, int);
+void nrLDPC_cnProc_BG2_generator_AVX2(const char*, int);
+
+const char *__asan_default_options()
+{
+  /* don't do leak checking in nr_ulsim, creates problems in the CI */
+  return "detect_leaks=0";
+}
+
+int main(int argc, char *argv[])
+{
+  if (argc != 2) {
+    fprintf(stderr, "usage: %s <output-dir>\n", argv[0]);
+    return 1;
+  }
+  const char *dir = argv[1];
+
+  int R[NB_R]={0,1,2};
+  for(int i=0; i<NB_R;i++) {
+    nrLDPC_cnProc_BG1_generator_AVX2(dir, R[i]);
+    nrLDPC_cnProc_BG2_generator_AVX2(dir, R[i]);
+  }
+
+  return(0);
+}
+
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/CMakeLists.txt b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..7ca988f1ca2dc228343b474ce09de58f385ba978
--- /dev/null
+++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/CMakeLists.txt
@@ -0,0 +1,25 @@
+add_executable(cnProc_gen_avx512
+               cnProc_gen_BG1_avx512.c
+               cnProc_gen_BG2_avx512.c
+               main.c)
+target_compile_options(cnProc_gen_avx512 PRIVATE -W -Wall -mavx2)
+
+#set(cnProc_avx512_headers
+#    cnProc_avx512/nrLDPC_cnProc_BG1_R13_AVX512.h
+#    cnProc_avx512/nrLDPC_cnProc_BG1_R23_AVX512.h
+#    cnProc_avx512/nrLDPC_cnProc_BG1_R89_AVX512.h
+#    cnProc_avx512/nrLDPC_cnProc_BG2_R13_AVX512.h
+#    cnProc_avx512/nrLDPC_cnProc_BG2_R15_AVX512.h
+#    cnProc_avx512/nrLDPC_cnProc_BG2_R23_AVX512.h)
+
+add_custom_command(TARGET cnProc_gen_avx512 POST_BUILD
+  #OUTPUT ${cnProc_avx512_headers}
+  COMMAND ${CMAKE_COMMAND} -E make_directory cnProc_avx512
+  COMMAND cnProc_gen_avx512 .
+  DEPENDS cnProc_gen_avx512
+  COMMENT "Generating LDPC cnProc header files for AVX512"
+)
+
+add_library(cnProc_gen_avx512_HEADERS INTERFACE)
+target_include_directories(cnProc_gen_avx512_HEADERS INTERFACE ${CMAKE_CURRENT_BINARY_DIR})
+add_dependencies(cnProc_gen_avx512_HEADERS cnProc_gen_avx512)
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/cnProc_gen_BG1_avx512.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/cnProc_gen_BG1_avx512.c
new file mode 100644
index 0000000000000000000000000000000000000000..b007ac0e0bf156679463852e576636938bfec2fa
--- /dev/null
+++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/cnProc_gen_BG1_avx512.c
@@ -0,0 +1,597 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include "../../nrLDPCdecoder_defs.h"
+
+void nrLDPC_cnProc_BG1_generator_AVX512(const char *dir, int R)
+{
+  const char *ratestr[3]={"13","23","89"};
+
+  if (R<0 || R>2) {printf("Illegal R %d\n",R); abort();}
+
+
+ // system("mkdir -p ../ldpc_gen_files");
+
+  char fname[FILENAME_MAX+1];
+  snprintf(fname, sizeof(fname), "%s/cnProc_avx512/nrLDPC_cnProc_BG1_R%s_AVX512.h", dir, ratestr[R]);
+  FILE *fd=fopen(fname,"w");
+  if (fd == NULL) {
+    printf("Cannot create file %s\n", fname);
+    abort();
+  }
+
+ // fprintf(fd,"#include <stdint.h>\n");
+//  fprintf(fd,"#include <immintrin.h>\n");
+
+
+  fprintf(fd,   "#define conditional_negate(a,b,z) _mm512_mask_sub_epi8(a,_mm512_movepi8_mask(b),z,a)\n");
+
+
+  fprintf(fd,"static inline void nrLDPC_cnProc_BG1_R%s_AVX512(int8_t* cnProcBuf, int8_t* cnProcBufRes, uint16_t Z) {\n",ratestr[R]);
+
+  const uint8_t*  lut_numCnInCnGroups;
+  const uint32_t* lut_startAddrCnGroups = lut_startAddrCnGroups_BG1;
+
+  if (R==0)      lut_numCnInCnGroups = lut_numCnInCnGroups_BG1_R13;
+  else if (R==1) lut_numCnInCnGroups = lut_numCnInCnGroups_BG1_R23;
+  else if (R==2) lut_numCnInCnGroups = lut_numCnInCnGroups_BG1_R89;
+  else { printf("aborting, illegal R %d\n",R); fclose(fd);abort();}
+
+
+
+  uint32_t j;
+  uint32_t k;
+  // Offset to each bit within a group in terms of 64  Byte
+  uint32_t bitOffsetInGroup;
+
+
+  fprintf(fd,"                uint32_t M, i;\n");
+  fprintf(fd,"                __m512i zmm0, min, sgn,zeros,maxLLR, ones;\n");
+
+  fprintf(fd,"                  zeros  = _mm512_setzero_si512();\n");
+  fprintf(fd,"                  maxLLR = _mm512_set1_epi8((char)127);\n");
+  fprintf(fd,"                 ones = _mm512_set1_epi8((char)1);\n");
+
+
+
+  // =====================================================================
+  // Process group with 3 BNs
+  fprintf(fd,"//Process group with 3 BNs\n");
+  // LUT with offsets for bits that need to be processed
+  // 1. bit proc requires LLRs of 2. and 3. bit, 2.bits of 1. and 3. etc.
+  // Offsets are in units of bitOffsetInGroup (1*384/32)12
+     // Offsets are in units of bitOffsetInGroup (1*384/32)12
+
+  const uint8_t lut_idxCnProcG3[3][2] = {{12,24}, {0,24}, {0,12}};
+
+  if (lut_numCnInCnGroups[0] > 0)
+    {
+      // Number of groups of 64  CNs for parallel processing
+      // Ceil for values not divisible by 64
+      //M = (lut_numCnInCnGroups[0]*Z + 63)>>6;
+
+       fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numCnInCnGroups[0] );
+
+      // Set the offset to each bit within a group in terms of 64  Byte
+      bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[0]*NR_LDPC_ZMAX)>>6;
+
+     // Loop over every BN
+
+      for (j=0; j<3; j++)
+        {
+
+          fprintf(fd,"            for (i=0;i<M;i++) {\n");
+          // Abs and sign of 64  CNs (first BN)
+          //                zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
+            fprintf(fd,"                zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[0]>>6)+lut_idxCnProcG3[j][0]/2);
+            fprintf(fd,"                sgn  = _mm512_xor_si512(ones, zmm0);\n");
+            fprintf(fd,"                min  = _mm512_abs_epi8(zmm0);\n");
+
+
+         // for (k=1; k<2; k++)
+            //{
+              fprintf(fd,"                zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[0]>>6)+lut_idxCnProcG3[j][1]/2);
+
+              //                min  = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
+              fprintf(fd,"                min  = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
+
+              //                sgn  = _mm512_sign_epi8(*p_ones, zmm0);
+              fprintf(fd,"                sgn  = _mm512_xor_si512(sgn, zmm0);\n");
+           // }
+
+          // Store result
+          //                min = _mm512_min_epu8(min, *maxLLR); // 128 in epi8 is -127
+          fprintf(fd,"                min = _mm512_min_epu8(min, maxLLR);\n");
+          //                *p_cnProcBufResBit = _mm512_sign_epi8(min, sgn);
+              //                p_cnProcBufResBit++;
+          fprintf(fd,"                ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[0]>>6)+(j*bitOffsetInGroup));
+          fprintf(fd,"            }\n");
+        }
+    
+    }
+
+  // =====================================================================
+  // Process group with 4 BNs
+  fprintf(fd,"//Process group with 4 BNs\n");
+    // Offset is 5*384/32 = 30
+  const uint8_t lut_idxCnProcG4[4][3] = {{60,120,180}, {0,120,180}, {0,60,180}, {0,60,120}};
+
+  if (lut_numCnInCnGroups[1] > 0)
+    {
+      // Number of groups of 64  CNs for parallel processing
+      // Ceil for values not divisible by 64
+      //M = (lut_numCnInCnGroups[1]*Z + 63)>>6;
+        fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numCnInCnGroups[1] );
+      // Set the offset to each bit within a group in terms of 64  Byte
+      bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[1]*NR_LDPC_ZMAX)>>6;
+
+      // Loop over every BN
+      for (j=0; j<4; j++)
+        {
+        // Loop over CNs
+          //      for (i=0; i<M; i++,iprime++)
+          //            {
+          fprintf(fd,"            for (i=0;i<M;i++) {\n");
+          // Abs and sign of 64  CNs (first BN)
+          //                zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
+          fprintf(fd,"              zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[1]>>6)+lut_idxCnProcG4[j][0]/2);
+               fprintf(fd,"                sgn  = _mm512_xor_si512(ones, zmm0);\n");
+            fprintf(fd,"                min  = _mm512_abs_epi8(zmm0);\n");
+
+
+          // Loop over BNs
+          for (k=1; k<3; k++)
+            {
+              fprintf(fd,"                zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[1]>>6)+lut_idxCnProcG4[j][k]/2);
+
+              //                min  = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
+              fprintf(fd,"                min  = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
+
+              //                sgn  = _mm512_sign_epi8(*p_ones, zmm0);
+              fprintf(fd,"                sgn  = _mm512_xor_si512(sgn, zmm0);\n");
+            }
+
+          // Store result
+          //                min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
+          fprintf(fd,"                min = _mm512_min_epu8(min, maxLLR);\n");
+          //                *p_cnProcBufResBit = _mm512_sign_epi8(min, sgn);
+              //                p_cnProcBufResBit++;
+          fprintf(fd,"                ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[1]>>6)+(j*bitOffsetInGroup));
+          fprintf(fd,"            }\n");
+        }
+    }
+
+
+  // =====================================================================
+  // Process group with 5 BNs
+  fprintf(fd,"//Process group with 5 BNs\n");
+  // Offset is 18*384/32 = 216
+  const uint16_t lut_idxCnProcG5[5][4] = {{216,432,648,864}, {0,432,648,864},
+                                          {0,216,648,864}, {0,216,432,864}, {0,216,432,648}};
+
+
+  if (lut_numCnInCnGroups[2] > 0)
+    {
+      // Number of groups of 64  CNs for parallel processing
+      // Ceil for values not divisible by 64
+      //M = (lut_numCnInCnGroups[2]*Z + 63)>>6;
+      fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numCnInCnGroups[2] );
+
+      // Set the offset to each bit within a group in terms of 64  Byte
+      bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[2]*NR_LDPC_ZMAX)>>6;
+
+      // Loop over every BN
+
+      for (j=0; j<5; j++)
+        {
+
+          fprintf(fd,"            for (i=0;i<M;i++) {\n");
+          // Abs and sign of 64  CNs (first BN)
+          //                zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
+          fprintf(fd,"                zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[2]>>6)+lut_idxCnProcG5[j][0]/2);
+           fprintf(fd,"                sgn  = _mm512_xor_si512(ones, zmm0);\n");
+           fprintf(fd,"                min  = _mm512_abs_epi8(zmm0);\n");
+
+
+          // Loop over BNs
+          for (k=1; k<4; k++)
+            {
+              fprintf(fd,"                zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[2]>>6)+lut_idxCnProcG5[j][k]/2);
+
+              //                min  = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
+              fprintf(fd,"                min  = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
+
+              //                sgn  = _mm512_sign_epi8(*p_ones, zmm0);
+              fprintf(fd,"                sgn  = _mm512_xor_si512(sgn, zmm0);\n");
+            }
+
+          // Store result
+          //                min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
+          fprintf(fd,"                min = _mm512_min_epu8(min, maxLLR);\n");
+
+          fprintf(fd,"                ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[2]>>6)+(j*bitOffsetInGroup));
+          fprintf(fd,"           }\n");
+        }
+    }
+
+  // =====================================================================
+  // Process group with 6 BNs
+  fprintf(fd,"//Process group with 6 BNs\n");
+    // Offset is 8*384/32 = 48
+  const uint16_t lut_idxCnProcG6[6][5] = {{96,192,288,384,480}, {0,192,288,384,480},
+                                          {0,96,288,384,480}, {0,96,192,384,480},
+                                          {0,96,192,288,480}, {0,96,192,288,384}};
+
+
+  if (lut_numCnInCnGroups[3] > 0)
+    {
+      // Number of groups of 64  CNs for parallel processing
+      // Ceil for values not divisible by 64
+      //M = (lut_numCnInCnGroups[3]*Z + 63)>>6;
+
+      fprintf(fd, "M = (%d*Z + 63)>>6;\n",lut_numCnInCnGroups[3] );
+
+      // Set the offset to each bit within a group in terms of 64  Byte
+      bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[3]*NR_LDPC_ZMAX)>>6;
+
+      // Loop over every BN
+
+      for (j=0; j<6; j++)
+        {
+
+          fprintf(fd,"            for (i=0;i<M;i++) {\n");
+          // Abs and sign of 64  CNs (first BN)
+          //                zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
+          fprintf(fd,"                zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[3]>>6)+lut_idxCnProcG6[j][0]/2);
+           fprintf(fd,"                sgn  = _mm512_xor_si512(ones, zmm0);\n");
+           fprintf(fd,"                min  = _mm512_abs_epi8(zmm0);\n");
+
+
+          // Loop over BNs
+          for (k=1; k<5; k++)
+            {
+              fprintf(fd,"                zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[3]>>6)+lut_idxCnProcG6[j][k]/2);
+
+              //                min  = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
+              fprintf(fd,"                min  = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
+
+              //                sgn  = _mm512_sign_epi8(*p_ones, zmm0);
+              fprintf(fd,"                sgn  = _mm512_xor_si512(sgn, zmm0);\n");
+            }
+
+          // Store result
+          //                min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
+          fprintf(fd,"                min = _mm512_min_epu8(min, maxLLR);\n");
+
+          fprintf(fd,"                ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[3]>>6)+(j*bitOffsetInGroup));
+          fprintf(fd,"            }\n");
+        }
+    }
+
+
+  // =====================================================================
+  // Process group with 7 BNs
+  fprintf(fd,"//Process group with 7 BNs\n");
+    // Offset is 5*384/32 = 30
+  const uint16_t lut_idxCnProcG7[7][6] = {{60,120,180,240,300,360}, {0,120,180,240,300,360},
+                                          {0,60,180,240,300,360},   {0,60,120,240,300,360},
+                                          {0,60,120,180,300,360},   {0,60,120,180,240,360},
+                                          {0,60,120,180,240,300}};
+
+
+  if (lut_numCnInCnGroups[4] > 0)
+    {
+      // Number of groups of 64  CNs for parallel processing
+      // Ceil for values not divisible by 64
+     // M = (lut_numCnInCnGroups[4]*Z + 63)>>6;
+     fprintf(fd, "M = (%d*Z + 63)>>6;\n",lut_numCnInCnGroups[4] );
+
+      // Set the offset to each bit within a group in terms of 64  Byte
+      bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[4]*NR_LDPC_ZMAX)>>6;
+
+      // Loop over every BN
+
+      for (j=0; j<7; j++)
+        {
+          // Loop over CNs
+          //      for (i=0; i<M; i++,iprime++)
+          //            {
+          fprintf(fd,"            for (i=0;i<M;i++) {\n");
+          // Abs and sign of 64  CNs (first BN)
+          //                zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
+          fprintf(fd,"                zmm0= ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[4]>>6)+lut_idxCnProcG7[j][0]/2);
+           fprintf(fd,"                sgn  = _mm512_xor_si512(ones, zmm0);\n");
+           fprintf(fd,"                min  = _mm512_abs_epi8(zmm0);\n");
+
+
+          // Loop over BNs
+          for (k=1; k<6; k++)
+            {
+              fprintf(fd,"                zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[4]>>6)+lut_idxCnProcG7[j][k]/2);
+
+              //                min  = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
+              fprintf(fd,"                min  = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
+
+              //                sgn  = _mm512_sign_epi8(*p_ones, zmm0);
+              fprintf(fd,"                sgn  = _mm512_xor_si512(sgn, zmm0);\n");
+            }
+
+          // Store result
+          //                min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
+          fprintf(fd,"                min = _mm512_min_epu8(min, maxLLR);\n");
+
+          fprintf(fd,"                ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[4]>>6)+(j*bitOffsetInGroup));
+          fprintf(fd,"            }\n");
+        }
+    }
+
+
+  // =====================================================================
+  // Process group with 8 BNs
+  fprintf(fd,"//Process group with 8 BNs\n");
+    // Offset is 2*384/32 = 24
+    const uint8_t lut_idxCnProcG8[8][7] = {{24,48,72,96,120,144,168}, {0,48,72,96,120,144,168},
+                                           {0,24,72,96,120,144,168}, {0,24,48,96,120,144,168},
+                                           {0,24,48,72,120,144,168}, {0,24,48,72,96,144,168},
+                                           {0,24,48,72,96,120,168}, {0,24,48,72,96,120,144}};
+
+ 
+  if (lut_numCnInCnGroups[5] > 0)
+    {
+      // Number of groups of 64  CNs for parallel processing
+      // Ceil for values not divisible by 64
+     // M = (lut_numCnInCnGroups[5]*Z + 63)>>6;
+     fprintf(fd, "M = (%d*Z + 63)>>6;\n",lut_numCnInCnGroups[5] );
+
+      // Set the offset to each bit within a group in terms of 64  Byte
+      bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[5]*NR_LDPC_ZMAX)>>6;
+
+      // Loop over every BN
+
+      for (j=0; j<8; j++)
+        {
+          // Loop over CNs
+          //      for (i=0; i<M; i++,iprime++)
+          //            {
+          fprintf(fd,"            for (i=0;i<M;i++) {\n");
+          // Abs and sign of 64  CNs (first BN)
+          //                zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
+          fprintf(fd,"                zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[5]>>6)+lut_idxCnProcG8[j][0]/2);
+           fprintf(fd,"                sgn  = _mm512_xor_si512(ones, zmm0);\n");
+           fprintf(fd,"                min  = _mm512_abs_epi8(zmm0);\n");
+
+
+          // Loop over BNs
+          for (k=1; k<7; k++)
+            {
+              fprintf(fd,"                zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[5]>>6)+lut_idxCnProcG8[j][k]/2);
+
+              //                min  = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
+              fprintf(fd,"                min  = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
+
+              //                sgn  = _mm512_sign_epi8(*p_ones, zmm0);
+              fprintf(fd,"                sgn  = _mm512_xor_si512(sgn, zmm0);\n");
+            }
+
+          // Store result
+          //                min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
+          fprintf(fd,"                min = _mm512_min_epu8(min, maxLLR);\n");
+
+          fprintf(fd,"                ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[5]>>6)+(j*bitOffsetInGroup));
+          fprintf(fd,"              }\n");
+        }
+    }
+
+
+ // =====================================================================
+  // Process group with 9 BNs
+
+  fprintf(fd,"//Process group with 9 BNs\n");
+    // Offset is 2*384/32 = 12
+  const uint8_t lut_idxCnProcG9[9][8] = {{24,48,72,96,120,144,168,192}, {0,48,72,96,120,144,168,192},
+                                         {0,24,72,96,120,144,168,192}, {0,24,48,96,120,144,168,192},
+                                         {0,24,48,72,120,144,168,192}, {0,24,48,72,96,144,168,192},
+                                         {0,24,48,72,96,120,168,192}, {0,24,48,72,96,120,144,192},
+                                         {0,24,48,72,96,120,144,168}};
+
+
+  if (lut_numCnInCnGroups[6] > 0)
+    {
+      // Number of groups of 64  CNs for parallel processing
+      // Ceil for values not divisible by 64
+     // M = (lut_numCnInCnGroups[5]*Z + 63)>>6;
+     fprintf(fd, "M = (%d*Z + 63)>>6;\n",lut_numCnInCnGroups[6] );
+
+      // Set the offset to each bit within a group in terms of 64  Byte
+      bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[6]*NR_LDPC_ZMAX)>>6;
+
+      // Loop over every BN
+
+      for (j=0; j<9; j++)
+        {
+          // Loop over CNs
+          //      for (i=0; i<M; i++,iprime++)
+          //            {
+          fprintf(fd,"            for (i=0;i<M;i++) {\n");
+          // Abs and sign of 64  CNs (first BN)
+          //                zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
+          fprintf(fd,"                zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[6]>>6)+lut_idxCnProcG9[j][0]/2);
+           fprintf(fd,"                sgn  = _mm512_xor_si512(ones, zmm0);\n");
+           fprintf(fd,"                min  = _mm512_abs_epi8(zmm0);\n");
+
+
+          // Loop over BNs
+          for (k=1; k<8; k++)
+            {
+              fprintf(fd,"                zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[6]>>6)+lut_idxCnProcG9[j][k]/2);
+
+              //                min  = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
+              fprintf(fd,"                min  = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
+
+              //                sgn  = _mm512_sign_epi8(*p_ones, zmm0);
+              fprintf(fd,"                sgn  = _mm512_xor_si512(sgn, zmm0);\n");
+            }
+
+          // Store result
+          //                min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
+          fprintf(fd,"                min = _mm512_min_epu8(min, maxLLR);\n");
+
+          fprintf(fd,"                ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[6]>>6)+(j*bitOffsetInGroup));
+          fprintf(fd,"              }\n");
+        }
+    }
+
+
+
+
+
+
+  // =====================================================================
+  // Process group with 10 BNs
+  fprintf(fd,"//Process group with 10 BNs\n");
+        // Offset is 1*384/32 = 6
+  const uint8_t lut_idxCnProcG10[10][9] = {{12,24,36,48,60,72,84,96,108}, {0,24,36,48,60,72,84,96,108},
+                                           {0,12,36,48,60,72,84,96,108}, {0,12,24,48,60,72,84,96,108},
+                                           {0,12,24,36,60,72,84,96,108}, {0,12,24,36,48,72,84,96,108},
+                                           {0,12,24,36,48,60,84,96,108}, {0,12,24,36,48,60,72,96,108},
+                                           {0,12,24,36,48,60,72,84,108}, {0,12,24,36,48,60,72,84,96}};
+
+  if (lut_numCnInCnGroups[7] > 0)
+    {
+      // Number of groups of 64  CNs for parallel processing
+      // Ceil for values not divisible by 64
+      //M = (lut_numCnInCnGroups[7]*Z + 63)>>6;
+      fprintf(fd, " M = (%d*Z + 63)>>6;\n",lut_numCnInCnGroups[7] );
+
+      // Set the offset to each bit within a group in terms of 64  Byte
+      bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[7]*NR_LDPC_ZMAX)>>6;
+
+
+      // Loop over every BN
+
+      for (j=0; j<10; j++)
+        {
+          // Loop over CNs
+          //      for (i=0; i<M; i++,iprime++)
+          //            {
+          fprintf(fd,"            for (i=0;i<M;i++) {\n");
+          // Abs and sign of 64  CNs (first BN)
+          //                zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
+          fprintf(fd,"                zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[7]>>6)+lut_idxCnProcG10[j][0]/2);
+           fprintf(fd,"                sgn  = _mm512_xor_si512(ones, zmm0);\n");
+           fprintf(fd,"                min  = _mm512_abs_epi8(zmm0);\n");
+
+
+          // Loop over BNs
+          for (k=1; k<9; k++)
+            {
+              fprintf(fd,"                zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[7]>>6)+lut_idxCnProcG10[j][k]/2);
+
+              //                min  = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
+              fprintf(fd,"                min  = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
+
+              //                sgn  = _mm512_sign_epi8(*p_ones, zmm0);
+              fprintf(fd,"                sgn  = _mm512_xor_si512(sgn, zmm0);\n");
+            }
+
+          // Store result
+          //                min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
+          fprintf(fd,"                min = _mm512_min_epu8(min, maxLLR);\n");
+
+          fprintf(fd,"                ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min,sgn,zeros);\n",(lut_startAddrCnGroups[7]>>6)+(j*bitOffsetInGroup));
+          fprintf(fd,"            }\n");
+        }
+    }
+
+
+  // =====================================================================
+  // Process group with 19 BNs
+  fprintf(fd,"//Process group with 19 BNs\n");
+  // Offset is 4*384/32 = 24
+  const uint16_t lut_idxCnProcG19[19][18] = {{48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, {0,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864},
+                                             {0,48,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, {0,48,96,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864},
+                                             {0,48,96,144,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, {0,48,96,144,192,288,336,384,432,480,528,576,624,672,720,768,816,864},
+                                             {0,48,96,144,192,240,336,384,432,480,528,576,624,672,720,768,816,864}, {0,48,96,144,192,240,288,384,432,480,528,576,624,672,720,768,816,864},
+                                             {0,48,96,144,192,240,288,336,432,480,528,576,624,672,720,768,816,864}, {0,48,96,144,192,240,288,336,384,480,528,576,624,672,720,768,816,864},
+                                             {0,48,96,144,192,240,288,336,384,432,528,576,624,672,720,768,816,864}, {0,48,96,144,192,240,288,336,384,432,480,576,624,672,720,768,816,864},
+                                             {0,48,96,144,192,240,288,336,384,432,480,528,624,672,720,768,816,864}, {0,48,96,144,192,240,288,336,384,432,480,528,576,672,720,768,816,864},
+                                             {0,48,96,144,192,240,288,336,384,432,480,528,576,624,720,768,816,864}, {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,768,816,864},
+                                             {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,816,864}, {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,864},
+                                             {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816}};
+
+
+  if (lut_numCnInCnGroups[8] > 0)
+    {
+      // Number of groups of 64  CNs for parallel processing
+      // Ceil for values not divisible by 64
+     // M = (lut_numCnInCnGroups[8]*Z + 63)>>6;
+     fprintf(fd, " M = (%d*Z + 63)>>6;\n",lut_numCnInCnGroups[8] );
+
+      // Set the offset to each bit within a group in terms of 64  Byte
+      bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[8]*NR_LDPC_ZMAX)>>6;
+
+      // Loop over every BN
+
+      for (j=0; j<19; j++)
+        {
+          // Loop over CNs
+          //      for (i=0; i<M; i++,iprime++)
+          //            {
+          fprintf(fd,"            for (i=0;i<M;i++) {\n");
+          // Abs and sign of 64  CNs (first BN)
+          //                zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
+          fprintf(fd,"                zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[8]>>6)+lut_idxCnProcG19[j][0]/2);
+           fprintf(fd,"                sgn  = _mm512_xor_si512(ones, zmm0);\n");
+           fprintf(fd,"                min  = _mm512_abs_epi8(zmm0);\n");
+
+
+          // Loop over BNs
+          for (k=1; k<18; k++)
+            {
+              fprintf(fd,"                zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[8]>>6)+lut_idxCnProcG19[j][k]/2);
+
+              //                min  = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
+              fprintf(fd,"                min  = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
+
+              //                sgn  = _mm512_sign_epi8(*p_ones, zmm0);
+              fprintf(fd,"                sgn  = _mm512_xor_si512(sgn, zmm0);\n");
+            }
+
+          // Store result
+          //                min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
+          fprintf(fd,"                min = _mm512_min_epu8(min, maxLLR);\n");
+
+          fprintf(fd,"                ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[8]>>6)+(j*bitOffsetInGroup));
+          fprintf(fd,"            }\n");
+        }
+    }
+
+  fprintf(fd,"}\n");
+  fclose(fd);
+}//end of the function  nrLDPC_cnProc_BG1
+
+
+
+
+
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/cnProc_gen_BG2_avx512.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/cnProc_gen_BG2_avx512.c
new file mode 100644
index 0000000000000000000000000000000000000000..8a9e592f6f707669a64a42920551f70ff1cfd83a
--- /dev/null
+++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/cnProc_gen_BG2_avx512.c
@@ -0,0 +1,414 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdint.h>
+#include "../../nrLDPCdecoder_defs.h"
+
+void nrLDPC_cnProc_BG2_generator_AVX512(const char *dir, int R)
+{
+  const char *ratestr[3]={"15","13","23"};
+
+  if (R<0 || R>2) {printf("Illegal R %d\n",R); abort();}
+
+
+ // system("mkdir -p ../ldpc_gen_files");
+
+  char fname[FILENAME_MAX+1];
+  snprintf(fname, sizeof(fname), "%s/cnProc_avx512/nrLDPC_cnProc_BG2_R%s_AVX512.h", dir, ratestr[R]);
+  FILE *fd=fopen(fname,"w");
+  if (fd == NULL) {
+    printf("Cannot create file %s\n", fname);
+    abort();
+  }
+
+  //fprintf(fd,"#include <stdint.h>\n");
+//  fprintf(fd,"#include <immintrin.h>\n");
+
+
+  fprintf(fd,   "#define conditional_negate(a,b,z) _mm512_mask_sub_epi8(a,_mm512_movepi8_mask(b),z,a)\n");
+
+
+
+ fprintf(fd,"static inline void nrLDPC_cnProc_BG2_R%s_AVX512(int8_t* cnProcBuf, int8_t* cnProcBufRes, uint16_t Z) {\n",ratestr[R]);
+  const uint8_t*  lut_numCnInCnGroups;
+  const uint32_t* lut_startAddrCnGroups = lut_startAddrCnGroups_BG2;
+
+  if (R==0)      lut_numCnInCnGroups = lut_numCnInCnGroups_BG2_R15;
+  else if (R==1) lut_numCnInCnGroups = lut_numCnInCnGroups_BG2_R13;
+  else if (R==2) lut_numCnInCnGroups = lut_numCnInCnGroups_BG2_R23;
+  else { printf("aborting, illegal R %d\n",R); fclose(fd);abort();}
+
+
+  // Number of CNs in Groups
+  //uint32_t M;
+  uint32_t j;
+  uint32_t k;
+  // Offset to each bit within a group in terms of 64  Byte
+  uint32_t bitOffsetInGroup;
+
+ fprintf(fd,"                uint32_t M;\n");
+  fprintf(fd,"                __m512i zmm0, min, sgn,zeros,ones,maxLLR;\n");
+  fprintf(fd,"                zeros  = _mm512_setzero_si512();\n");
+  fprintf(fd,"                maxLLR = _mm512_set1_epi8((char)127);\n");
+    fprintf(fd,"               ones = _mm512_set1_epi8((char)1);\n");
+  // =====================================================================
+  // Process group with 3 BNs
+  fprintf(fd,"//Process group with 3 BNs\n");
+  // LUT with offsets for bits that need to be processed
+  // 1. bit proc requires LLRs of 2. and 3. bit, 2.bits of 1. and 3. etc.
+  // Offsets are in units of bitOffsetInGroup
+   const uint8_t lut_idxCnProcG3[3][2] = {{72,144}, {0,144}, {0,72}};
+
+
+  if (lut_numCnInCnGroups[0] > 0)
+    {
+      // Number of groups of 64  CNs for parallel processing
+      // Ceil for values not divisible by 64
+       fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numCnInCnGroups[0] );
+
+      // Set the offset to each bit within a group in terms of 64  Byte
+      bitOffsetInGroup = (lut_numCnInCnGroups_BG2_R15[0]*NR_LDPC_ZMAX)>>6;
+
+
+      // Loop over every BN
+
+      for (j=0; j<3; j++)
+        {
+
+
+
+          fprintf(fd,"            for (int i=0;i<M;i++) {\n");
+          // Abs and sign of 64  CNs (first BN)
+          //                zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
+            fprintf(fd,"                zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[0]>>6)+lut_idxCnProcG3[j][0]/2);
+            fprintf(fd,"                sgn  = _mm512_xor_si512(ones, zmm0);\n");
+            fprintf(fd,"                min  = _mm512_abs_epi8(zmm0);\n");
+
+
+         // for (k=1; k<2; k++)
+            //{
+              fprintf(fd,"                zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[0]>>6)+lut_idxCnProcG3[j][1]/2);
+
+              //                min  = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
+              fprintf(fd,"                min  = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
+
+              //                sgn  = _mm512_sign_epi8(*p_ones, zmm0);
+              fprintf(fd,"                sgn  = _mm512_xor_si512(sgn, zmm0);\n");
+           // }
+
+          // Store result
+          //                min = _mm512_min_epu8(min, *maxLLR); // 128 in epi8 is -127
+          fprintf(fd,"                min = _mm512_min_epu8(min, maxLLR);\n");
+          //                *p_cnProcBufResBit = _mm512_sign_epi8(min, sgn);
+              //                p_cnProcBufResBit++;
+          fprintf(fd,"                ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[0]>>6)+(j*bitOffsetInGroup));
+          fprintf(fd,"            }\n");
+        }
+
+    }
+
+
+  // =====================================================================
+  // Process group with 4 BNs
+  fprintf(fd,"//Process group with 4 BNs\n");
+ // Offset is 20*384/32 = 240
+    const uint16_t lut_idxCnProcG4[4][3] = {{240,480,720}, {0,480,720}, {0,240,720}, {0,240,480}};
+
+
+  if (lut_numCnInCnGroups[1] > 0)
+    {
+      // Number of groups of 64  CNs for parallel processing
+      // Ceil for values not divisible by 64
+      fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numCnInCnGroups[1] );
+
+      // Set the offset to each bit within a group in terms of 64  Byte
+      bitOffsetInGroup = (lut_numCnInCnGroups_BG2_R15[1]*NR_LDPC_ZMAX)>>6;
+
+      // Loop over every BN
+      for (j=0; j<4; j++)
+        {
+          fprintf(fd,"            for (int i=0;i<M;i++) {\n");
+          // Abs and sign of 64  CNs (first BN)
+          //                zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
+          fprintf(fd,"                zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[1]>>6)+lut_idxCnProcG4[j][0]/2);
+            fprintf(fd,"                sgn  = _mm512_xor_si512(ones, zmm0);\n");
+          fprintf(fd,"                min  = _mm512_abs_epi8(zmm0);\n");
+
+
+          // Loop over BNs
+          for (k=1; k<3; k++)
+            {
+              fprintf(fd,"                zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[1]>>6)+lut_idxCnProcG4[j][k]/2);
+
+              //                min  = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
+              fprintf(fd,"                min  = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
+
+              //                sgn  = _mm512_sign_epi8(sgn, zmm0);
+              fprintf(fd,"                sgn  = _mm512_xor_si512(sgn, zmm0);\n");
+            }
+
+          // Store result
+          //                min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
+          fprintf(fd,"                min = _mm512_min_epu8(min, maxLLR);\n");
+          //                *p_cnProcBufResBit = _mm512_sign_epi8(min, sgn);
+              //                p_cnProcBufResBit++;
+          fprintf(fd,"                ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[1]>>6)+(j*bitOffsetInGroup));
+          fprintf(fd,"            }\n");
+        }
+    }
+
+
+  // =====================================================================
+  // Process group with 5 BNs
+  fprintf(fd,"//Process group with 5 BNs\n");
+    // Offset is 9*384/32 = 108
+    const uint16_t lut_idxCnProcG5[5][4] = {{108,216,324,432}, {0,216,324,432},
+                                            {0,108,324,432}, {0,108,216,432}, {0,108,216,324}};
+                                            
+
+
+
+  if (lut_numCnInCnGroups[2] > 0)
+    {
+      // Number of groups of 64  CNs for parallel processing
+      // Ceil for values not divisible by 64
+       fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numCnInCnGroups[2] );
+
+      // Set the offset to each bit within a group in terms of 64  Byte
+      bitOffsetInGroup = (lut_numCnInCnGroups_BG2_R15[2]*NR_LDPC_ZMAX)>>6;
+
+      // Loop over every BN
+
+      for (j=0; j<5; j++)
+        {
+
+          fprintf(fd,"            for (int i=0;i<M;i++) {\n");
+          // Abs and sign of 64  CNs (first BN)
+          //                zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
+          fprintf(fd,"                zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[2]>>6)+lut_idxCnProcG5[j][0]/2);
+            fprintf(fd,"                sgn  = _mm512_xor_si512(ones, zmm0);\n");
+          fprintf(fd,"                min  = _mm512_abs_epi8(zmm0);\n");
+
+
+          // Loop over BNs
+          for (k=1; k<4; k++)
+            {
+              fprintf(fd,"                zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[2]>>6)+lut_idxCnProcG5[j][k]/2);
+
+              //                min  = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
+              fprintf(fd,"                min  = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
+
+              //                sgn  = _mm512_sign_epi8(sgn, zmm0);
+              fprintf(fd,"                sgn  = _mm512_xor_si512(sgn, zmm0);\n");
+            }
+
+          // Store result
+          //                min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
+          fprintf(fd,"                min = _mm512_min_epu8(min, maxLLR);\n");
+
+          fprintf(fd,"                ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[2]>>6)+(j*bitOffsetInGroup));
+          fprintf(fd,"           }\n");
+        }
+    }
+
+  // =====================================================================
+  // Process group with 6 BNs
+  fprintf(fd,"//Process group with 6 BNs\n");
+    // Offset is 3*384/32 = 36
+  const uint16_t lut_idxCnProcG6[6][5] = {{36,72,108,144,180}, {0,72,108,144,180},
+                                            {0,36,108,144,180}, {0,36,72,144,180},
+                                            {0,36,72,108,180}, {0,36,72,108,144}};
+                                            
+
+
+
+  if (lut_numCnInCnGroups[3] > 0)
+    {
+      // Number of groups of 64  CNs for parallel processing
+      // Ceil for values not divisible by 64
+       fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numCnInCnGroups[3] );
+
+      // Set the offset to each bit within a group in terms of 64  Byte
+      bitOffsetInGroup = (lut_numCnInCnGroups_BG2_R15[3]*NR_LDPC_ZMAX)>>6;
+
+      // Loop over every BN
+
+      for (j=0; j<6; j++)
+        {
+
+          fprintf(fd,"            for (int i=0;i<M;i++) {\n");
+          // Abs and sign of 64  CNs (first BN)
+          //                zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
+          fprintf(fd,"                zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[3]>>6)+lut_idxCnProcG6[j][0]/2);
+            fprintf(fd,"                sgn  = _mm512_xor_si512(ones, zmm0);\n");
+          fprintf(fd,"                min  = _mm512_abs_epi8(zmm0);\n");
+
+
+          // Loop over BNs
+          for (k=1; k<5; k++)
+            {
+              fprintf(fd,"                zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[3]>>6)+lut_idxCnProcG6[j][k]/2);
+
+              //                min  = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
+              fprintf(fd,"                min  = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
+
+              //                sgn  = _mm512_sign_epi8(sgn, zmm0);
+              fprintf(fd,"                sgn  = _mm512_xor_si512(sgn, zmm0);\n");
+            }
+
+          // Store result
+          //                min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
+          fprintf(fd,"                min = _mm512_min_epu8(min, maxLLR);\n");
+
+          fprintf(fd,"                ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[3]>>6)+(j*bitOffsetInGroup));
+          fprintf(fd,"            }\n");
+        }
+    }
+
+
+
+  // =====================================================================
+  // Process group with 8 BNs
+  fprintf(fd,"//Process group with 8 BNs\n");
+ // Offset is 2*384/32 = 24
+    const uint8_t lut_idxCnProcG8[8][7] = {{24,48,72,96,120,144,168}, {0,48,72,96,120,144,168},
+                                           {0,24,72,96,120,144,168}, {0,24,48,96,120,144,168},
+                                           {0,24,48,72,120,144,168}, {0,24,48,72,96,144,168},
+                                           {0,24,48,72,96,120,168}, {0,24,48,72,96,120,144}};
+
+                                           
+
+
+  if (lut_numCnInCnGroups[4] > 0)
+    {
+      // Number of groups of 64  CNs for parallel processing
+      // Ceil for values not divisible by 64
+       fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numCnInCnGroups[4] );
+
+      // Set the offset to each bit within a group in terms of 64  Byte
+      bitOffsetInGroup = (lut_numCnInCnGroups_BG2_R15[4]*NR_LDPC_ZMAX)>>6;
+
+      // Loop over every BN
+
+      for (j=0; j<8; j++)
+        {
+
+          fprintf(fd,"            for (int i=0;i<M;i++) {\n");
+          // Abs and sign of 64  CNs (first BN)
+          //                zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
+          fprintf(fd,"                zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[4]>>6)+lut_idxCnProcG8[j][0]/2);
+            fprintf(fd,"                sgn  = _mm512_xor_si512(ones, zmm0);\n");
+          fprintf(fd,"                min  = _mm512_abs_epi8(zmm0);\n");
+
+
+          // Loop over BNs
+          for (k=1; k<7; k++)
+            {
+              fprintf(fd,"                zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[4]>>6)+lut_idxCnProcG8[j][k]/2);
+
+              //                min  = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
+              fprintf(fd,"                min  = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
+
+              //                sgn  = _mm512_sign_epi8(sgn, zmm0);
+              fprintf(fd,"                sgn  = _mm512_xor_si512(sgn, zmm0);\n");
+            }
+
+          // Store result
+          //                min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
+          fprintf(fd,"                min = _mm512_min_epu8(min, maxLLR);\n");
+
+          fprintf(fd,"                ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[4]>>6)+(j*bitOffsetInGroup));
+          fprintf(fd,"              }\n");
+        }
+    }
+
+
+  // =====================================================================
+  // Process group with 10 BNs
+  fprintf(fd,"//Process group with 10 BNs\n");
+
+  const uint8_t lut_idxCnProcG10[10][9] = {{24,48,72,96,120,144,168,192,216}, {0,48,72,96,120,144,168,192,216},
+                                             {0,24,72,96,120,144,168,192,216}, {0,24,48,96,120,144,168,192,216},
+                                             {0,24,48,72,120,144,168,192,216}, {0,24,48,72,96,144,168,192,216},
+                                             {0,24,48,72,96,120,168,192,216}, {0,24,48,72,96,120,144,192,216},
+                                             {0,24,48,72,96,120,144,168,216}, {0,24,48,72,96,120,144,168,192}};
+
+                                             
+
+
+  if (lut_numCnInCnGroups[5] > 0)
+    {
+      // Number of groups of 64  CNs for parallel processing
+      // Ceil for values not divisible by 64
+       fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numCnInCnGroups[5] );
+
+      // Set the offset to each bit within a group in terms of 64  Byte
+      bitOffsetInGroup = (lut_numCnInCnGroups_BG2_R15[5]*NR_LDPC_ZMAX)>>6;
+
+     // Loop over every BN
+
+      for (j=0; j<10; j++)
+        {
+
+          fprintf(fd,"            for (int i=0;i<M;i++) {\n");
+          // Abs and sign of 64  CNs (first BN)
+          //                zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
+          fprintf(fd,"                zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[5]>>6)+lut_idxCnProcG10[j][0]/2);
+            fprintf(fd,"                sgn  = _mm512_xor_si512(ones, zmm0);\n");
+          fprintf(fd,"                min  = _mm512_abs_epi8(zmm0);\n");
+
+
+          // Loop over BNs
+          for (k=1; k<9; k++)
+            {
+              fprintf(fd,"                zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[5]>>6)+lut_idxCnProcG10[j][k]/2);
+
+              //                min  = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
+              fprintf(fd,"                min  = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
+
+              //                sgn  = _mm512_sign_epi8(sgn, zmm0);
+              fprintf(fd,"                sgn  = _mm512_xor_si512(sgn, zmm0);\n");
+            }
+
+          // Store result
+          //                min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
+          fprintf(fd,"                min = _mm512_min_epu8(min, maxLLR);\n");
+
+          fprintf(fd,"                ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min,sgn,zeros);\n",(lut_startAddrCnGroups[5]>>6)+(j*bitOffsetInGroup));
+          fprintf(fd,"            }\n");
+        }
+    }
+
+
+  fprintf(fd,"}\n");
+  fclose(fd);
+}//end of the function  nrLDPC_cnProc_BG2
+
+
+
+
+
+
+
+
+
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/main.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/main.c
new file mode 100644
index 0000000000000000000000000000000000000000..04a6527c694924606028fa838a446eff0e033863
--- /dev/null
+++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/main.c
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#define NB_R  3
+void nrLDPC_cnProc_BG1_generator_AVX512(const char *, int);
+void nrLDPC_cnProc_BG2_generator_AVX512(const char *, int);
+
+const char *__asan_default_options()
+{
+  /* don't do leak checking in nr_ulsim, creates problems in the CI */
+  return "detect_leaks=0";
+}
+
+int main(int argc, char *argv[])
+{
+  if (argc != 2) {
+    fprintf(stderr, "usage: %s <output-dir>\n", argv[0]);
+    return 1;
+  }
+  const char *dir = argv[1];
+
+  int R[NB_R]={0,1,2};
+  for(int i=0; i<NB_R;i++){
+    nrLDPC_cnProc_BG1_generator_AVX512(dir, R[i]);
+    nrLDPC_cnProc_BG2_generator_AVX512(dir, R[i]);
+  }
+
+  return(0);
+}
+
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/run_ldpc_generators.sh b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/run_ldpc_generators.sh
new file mode 100755
index 0000000000000000000000000000000000000000..091034b9787eef886df4266df4431a2c6b40157d
--- /dev/null
+++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/run_ldpc_generators.sh
@@ -0,0 +1,11 @@
+#!/bin/bash
+
+echo "to build the LDPC decoder headers: go to the build directory, and type"
+echo "make/ninja ldpc_generators"
+echo
+echo "assuming your build directory is ran_build/build, I trigger building for"
+echo "you now. The generated headers will be in ran_build/build/ldpc/generator_*/"
+echo
+
+cd $OPENAIR_HOME/cmake_targets/ran_build/build
+make ldpc_generators || ninja ldpc_generators
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_types.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_types.h
index b7b15b5d334e78546aa2130dc2290377c3ab4650..fb52c5b42849c4991f5426ed987b59a3111332e5 100644
--- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_types.h
+++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_types.h
@@ -30,8 +30,9 @@
 
 #ifndef __NR_LDPC_TYPES__H__
 #define __NR_LDPC_TYPES__H__
-
+#ifndef CODEGEN
 #include "time_meas.h"
+#endif
 #include "nrLDPCdecoder_defs.h"
 // ==============================================================================
 // TYPES
@@ -77,6 +78,7 @@ typedef struct nrLDPC_dec_params {
 /**
    Structure containing LDPC decoder processing time statistics.
  */
+#ifndef CODEGEN
 typedef struct nrLDPC_time_stats {
     time_stats_t llr2llrProcBuf; /**< Statistics for function llr2llrProcBuf */
     time_stats_t llr2CnProcBuf; /**< Statistics for function llr2CnProcBuf */
@@ -90,7 +92,7 @@ typedef struct nrLDPC_time_stats {
     time_stats_t llr2bit; /**< Statistics for function llr2bit */
     time_stats_t total; /**< Statistics for total processing time */
 } t_nrLDPC_time_stats;
-
+#endif
 /**
    Structure containing the processing buffers
  */
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPCdecoder_defs.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPCdecoder_defs.h
index c35f93e0fe79c02652e7cf25ebeb9390f5b3c445..083fe39bff7187710ca0e7b9872d05048dd289ba 100644
--- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPCdecoder_defs.h
+++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPCdecoder_defs.h
@@ -198,4 +198,14 @@ static const int8_t zeros256_epi8[32] __attribute__ ((aligned(32))) = {0,0,0,0,0
 /** Vector of 32 '127' in int8 for application with AVX2 */
 static const int8_t maxLLR256_epi8[32] __attribute__ ((aligned(32))) = {127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127};
 
+/** Vector of 64 '1' in int8 for application with AVX512 */
+static const int8_t ones512_epi8[64] __attribute__ ((aligned(64))) = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
+/** Vector of 64 '0' in int8 for application with AVX512 */
+static const int8_t zeros512_epi8[64] __attribute__ ((aligned(64))) = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+/** Vector of 64 '127' in int8 for application with AVX512 */
+static const int8_t maxLLR512_epi8[64] __attribute__ ((aligned(64))) = {127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127};
+
+
+
+
 #endif
diff --git a/openair1/PHY/CODING/nr_rate_matching.c b/openair1/PHY/CODING/nr_rate_matching.c
index 782bb390243c65b73569d0b732773c18a4884a82..06dfcaa4a943e35d9c121490a30c0a7fd69510f8 100644
--- a/openair1/PHY/CODING/nr_rate_matching.c
+++ b/openair1/PHY/CODING/nr_rate_matching.c
@@ -387,8 +387,7 @@ void nr_deinterleaving_ldpc(uint32_t E, uint8_t Qm, int16_t *e,int16_t *f)
 }
 
 
-int nr_rate_matching_ldpc(uint8_t Ilbrm,
-                          uint32_t Tbslbrm,
+int nr_rate_matching_ldpc(uint32_t Tbslbrm,
                           uint8_t BG,
                           uint16_t Z,
                           uint8_t *w,
@@ -409,7 +408,7 @@ int nr_rate_matching_ldpc(uint8_t Ilbrm,
   //Bit selection
   N = (BG==1)?(66*Z):(50*Z);
 
-  if (Ilbrm == 0)
+  if (Tbslbrm == 0)
       Ncb = N;
   else {
       Nref = 3*Tbslbrm/(2*C); //R_LBRM = 2/3
@@ -419,11 +418,11 @@ int nr_rate_matching_ldpc(uint8_t Ilbrm,
   ind = (index_k0[BG-1][rvidx]*Ncb/N)*Z;
 
 #ifdef RM_DEBUG
-  printf("nr_rate_matching_ldpc: E %d, F %d, Foffset %d, k0 %d, Ncb %d, rvidx %d, Ilbrm %d\n", E, F, Foffset,ind, Ncb, rvidx, Ilbrm);
+  printf("nr_rate_matching_ldpc: E %d, F %d, Foffset %d, k0 %d, Ncb %d, rvidx %d, Tbslbrm %d\n", E, F, Foffset,ind, Ncb, rvidx, Tbslbrm);
 #endif
 
   if (Foffset > E) {
-    LOG_E(PHY,"nr_rate_matching: invalid parameters (Foffset %d > E %d) F %d, k0 %d, Ncb %d, rvidx %d, Ilbrm %d\n",Foffset,E,F, ind, Ncb, rvidx, Ilbrm);
+    LOG_E(PHY,"nr_rate_matching: invalid parameters (Foffset %d > E %d) F %d, k0 %d, Ncb %d, rvidx %d, Tbslbrm %d\n",Foffset,E,F, ind, Ncb, rvidx, Tbslbrm);
     return -1;
   }
   if (Foffset > Ncb) {
@@ -471,8 +470,7 @@ int nr_rate_matching_ldpc(uint8_t Ilbrm,
   return 0;
 }
 
-int nr_rate_matching_ldpc_rx(uint8_t Ilbrm,
-                             uint32_t Tbslbrm,
+int nr_rate_matching_ldpc_rx(uint32_t Tbslbrm,
                              uint8_t BG,
                              uint16_t Z,
                              int16_t *w,
@@ -498,7 +496,7 @@ int nr_rate_matching_ldpc_rx(uint8_t Ilbrm,
   //Bit selection
   N = (BG==1)?(66*Z):(50*Z);
 
-  if (Ilbrm == 0)
+  if (Tbslbrm == 0)
       Ncb = N;
   else {
       Nref = (3*Tbslbrm/(2*C)); //R_LBRM = 2/3
@@ -516,7 +514,7 @@ int nr_rate_matching_ldpc_rx(uint8_t Ilbrm,
   }
 
 #ifdef RM_DEBUG
-  printf("nr_rate_matching_ldpc_rx: Clear %d, E %d, k0 %d, Ncb %d, rvidx %d, Ilbrm %d\n", clear, E, ind, Ncb, rvidx, Ilbrm);
+  printf("nr_rate_matching_ldpc_rx: Clear %d, E %d, k0 %d, Ncb %d, rvidx %d, Tbslbrm %d\n", clear, E, ind, Ncb, rvidx, Tbslbrm);
 #endif
 
   if (clear==1) memset(w,0,Ncb*sizeof(int16_t));
diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c
index 680d3684efeb7b6456e4b63c6e80f642daf64035..b6427f5cf090c706d0c111f3dcdb72c6e489b95a 100644
--- a/openair1/PHY/INIT/nr_init.c
+++ b/openair1/PHY/INIT/nr_init.c
@@ -136,7 +136,7 @@ int init_codebook_gNB(PHY_VARS_gNB *gNB) {
         }
       }
 
-      int max_mimo_layers =(CSI_RS_antenna_ports<NR_MAX_NB_LAYERS) ? CSI_RS_antenna_ports : NR_MAX_NB_LAYERS;
+      int max_mimo_layers = (CSI_RS_antenna_ports<NR_MAX_NB_LAYERS) ? CSI_RS_antenna_ports : NR_MAX_NB_LAYERS;
 
       gNB->nr_mimo_precoding_matrix = (int32_t ***)malloc16(max_mimo_layers* sizeof(int32_t **));
       int32_t ***mat = gNB->nr_mimo_precoding_matrix;
@@ -236,7 +236,7 @@ int init_codebook_gNB(PHY_VARS_gNB *gNB) {
                 if((llb != ll) || (mmb != mm) || ((N1 == 1) && (N2 == 1))){
                   pmiq += 1;
                   mat[1][pmiq] = (int32_t *)malloc16((2*N1*N2)*(2)*sizeof(int32_t));
-                  LOG_I(PHY, "layer 2 Codebook pmiq = %d\n",pmiq);
+                  LOG_D(PHY, "layer 2 Codebook pmiq = %d\n",pmiq);
                   for(int j_col=0; j_col<2; j_col++) {
                     if (j_col==0) {
                       llc = llb;
@@ -320,7 +320,7 @@ int init_codebook_gNB(PHY_VARS_gNB *gNB) {
                   if((llb != ll) || (mmb != mm)){
                     pmiq += 1;
                     mat[2][pmiq] = (int32_t *)malloc16((2*N1*N2)*(3)*sizeof(int32_t));
-                    LOG_I(PHY, "layer 3 Codebook pmiq = %d\n",pmiq);
+                    LOG_D(PHY, "layer 3 Codebook pmiq = %d\n",pmiq);
                     for(int j_col=0; j_col<3; j_col++) {
                       if (j_col==0) {
                         llc = llb;
@@ -411,7 +411,7 @@ int init_codebook_gNB(PHY_VARS_gNB *gNB) {
                   if((llb != ll) || (mmb != mm)){
                     pmiq += 1;
                     mat[3][pmiq] = (int32_t *)malloc16((2*N1*N2)*4*sizeof(int32_t));
-                    LOG_I(PHY, "layer 4 pmiq = %d\n",pmiq);
+                    LOG_D(PHY, "layer 4 pmiq = %d\n",pmiq);
                     for(int j_col=0; j_col<4; j_col++) {
                       if (j_col==0) {
                         llc = llb;
@@ -544,8 +544,8 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB,
   gNB->nr_gold_pdsch_dmrs = (uint32_t ****)malloc16(fp->slots_per_frame*sizeof(uint32_t ***));
   uint32_t ****pdsch_dmrs             = gNB->nr_gold_pdsch_dmrs;
 
-  // ceil(((NB_RB*6(k)*2(QPSK)/32) // 3 RE *2(QPSK)
-  int pdsch_dmrs_init_length =  ((fp->N_RB_DL*12)>>5)+1;
+  // ceil(((NB_RB*12(k)*2(QPSK)/32) // 3 RE *2(QPSK)
+  const int pdsch_dmrs_init_length =  ((fp->N_RB_DL*24)>>5)+1;
   for (int slot=0; slot<fp->slots_per_frame; slot++) {
     pdsch_dmrs[slot] = (uint32_t ***)malloc16(fp->symbols_per_slot*sizeof(uint32_t **));
     AssertFatal(pdsch_dmrs[slot]!=NULL, "NR init: pdsch_dmrs for slot %d - malloc failed\n", slot);
@@ -593,26 +593,23 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB,
     nr_gold_pusch(gNB, nscid, gNB->pusch_gold_init[nscid]);
   }
 
-  //CSI RS init
-  gNB->nr_gold_csi_rs = (uint32_t ***)malloc16(fp->slots_per_frame*sizeof(uint32_t **));
-  uint32_t ***csi_rs = gNB->nr_gold_csi_rs;
-  AssertFatal(csi_rs!=NULL, "NR init: csi reference signal malloc failed\n");
-
+  // CSI RS init
   // ceil((NB_RB*8(max allocation per RB)*2(QPSK))/32)
   int csi_dmrs_init_length =  ((fp->N_RB_DL<<4)>>5)+1;
-
+  gNB->nr_csi_info = (nr_csi_info_t *)malloc16_clear(sizeof(nr_csi_info_t));
+  gNB->nr_csi_info->nr_gold_csi_rs = (uint32_t ***)malloc16(fp->slots_per_frame * sizeof(uint32_t **));
+  AssertFatal(gNB->nr_csi_info->nr_gold_csi_rs != NULL, "NR init: csi reference signal malloc failed\n");
   for (int slot=0; slot<fp->slots_per_frame; slot++) {
-    csi_rs[slot] = (uint32_t **)malloc16(fp->symbols_per_slot*sizeof(uint32_t *));
-    AssertFatal(csi_rs[slot]!=NULL, "NR init: csi reference signal for slot %d - malloc failed\n", slot);
-
+    gNB->nr_csi_info->nr_gold_csi_rs[slot] = (uint32_t **)malloc16(fp->symbols_per_slot * sizeof(uint32_t *));
+    AssertFatal(gNB->nr_csi_info->nr_gold_csi_rs[slot] != NULL, "NR init: csi reference signal for slot %d - malloc failed\n", slot);
     for (int symb=0; symb<fp->symbols_per_slot; symb++) {
-      csi_rs[slot][symb] = (uint32_t *)malloc16(csi_dmrs_init_length*sizeof(uint32_t));
-      AssertFatal(csi_rs[slot][symb]!=NULL, "NR init: csi reference signal for slot %d symbol %d - malloc failed\n", slot, symb);
+      gNB->nr_csi_info->nr_gold_csi_rs[slot][symb] = (uint32_t *)malloc16(csi_dmrs_init_length * sizeof(uint32_t));
+      AssertFatal(gNB->nr_csi_info->nr_gold_csi_rs[slot][symb] != NULL, "NR init: csi reference signal for slot %d symbol %d - malloc failed\n", slot, symb);
     }
   }
 
-  gNB->csi_gold_init = cfg->cell_config.phy_cell_id.value;
-  nr_init_csi_rs(gNB, cfg->cell_config.phy_cell_id.value);
+  gNB->nr_csi_info->csi_gold_init = cfg->cell_config.phy_cell_id.value;
+  nr_init_csi_rs(&gNB->frame_parms, gNB->nr_csi_info->nr_gold_csi_rs, cfg->cell_config.phy_cell_id.value);
 
   //PRS init
   gNB->nr_gold_prs = (uint32_t ****)malloc16(gNB->prs_vars.NumPRSResources*sizeof(uint32_t ***));
@@ -637,21 +634,6 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB,
 
   for (int id=0; id<NUMBER_OF_NR_SRS_MAX; id++) {
     gNB->nr_srs_info[id] = (nr_srs_info_t *)malloc16_clear(sizeof(nr_srs_info_t));
-    gNB->nr_srs_info[id]->sc_list = (uint16_t *) malloc16_clear(6*fp->N_RB_UL*sizeof(uint16_t));
-    gNB->nr_srs_info[id]->srs_generated_signal = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t));
-    gNB->nr_srs_info[id]->noise_power = (uint32_t*)malloc16_clear(sizeof(uint32_t));
-    gNB->nr_srs_info[id]->srs_received_signal = (int32_t **)malloc16(Prx*sizeof(int32_t*));
-    gNB->nr_srs_info[id]->srs_ls_estimated_channel = (int32_t **)malloc16(Prx*sizeof(int32_t*));
-    gNB->nr_srs_info[id]->srs_estimated_channel_freq = (int32_t **)malloc16(Prx*sizeof(int32_t*));
-    gNB->nr_srs_info[id]->srs_estimated_channel_time = (int32_t **)malloc16(Prx*sizeof(int32_t*));
-    gNB->nr_srs_info[id]->srs_estimated_channel_time_shifted = (int32_t **)malloc16(Prx*sizeof(int32_t*));
-    for (i=0;i<Prx;i++){
-      gNB->nr_srs_info[id]->srs_received_signal[i] = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t));
-      gNB->nr_srs_info[id]->srs_ls_estimated_channel[i] = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t));
-      gNB->nr_srs_info[id]->srs_estimated_channel_freq[i] = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t));
-      gNB->nr_srs_info[id]->srs_estimated_channel_time[i] = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t));
-      gNB->nr_srs_info[id]->srs_estimated_channel_time_shifted[i] = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t));
-    }
   }
 
   generate_ul_reference_signal_sequences(SHRT_MAX);
@@ -694,14 +676,18 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB,
   int N_RB_UL = cfg->carrier_config.ul_grid_size[cfg->ssb_config.scs_common.value].value;
   int n_buf = Prx*max_ul_mimo_layers;
 
+  int nb_re_pusch = N_RB_UL * NR_NB_SC_PER_RB;
+#ifdef __AVX2__
+  int nb_re_pusch2 = nb_re_pusch + (nb_re_pusch&7);
+#else
+  int nb_re_pusch2 = nb_re_pusch;
+#endif
+
   for (int ULSCH_id=0; ULSCH_id<gNB->number_of_nr_ulsch_max; ULSCH_id++) {
     pusch_vars[ULSCH_id] = (NR_gNB_PUSCH *)malloc16_clear( sizeof(NR_gNB_PUSCH) );
     pusch_vars[ULSCH_id]->rxdataF_ext           = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
-    pusch_vars[ULSCH_id]->rxdataF_ext2          = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
     pusch_vars[ULSCH_id]->ul_ch_estimates       = (int32_t **)malloc16(n_buf*sizeof(int32_t *) );
     pusch_vars[ULSCH_id]->ul_ch_estimates_ext   = (int32_t **)malloc16(n_buf*sizeof(int32_t *) );
-    pusch_vars[ULSCH_id]->ul_ch_ptrs_estimates     = (int32_t **)malloc16(n_buf*sizeof(int32_t *) );
-    pusch_vars[ULSCH_id]->ul_ch_ptrs_estimates_ext = (int32_t **)malloc16(n_buf*sizeof(int32_t *) );
     pusch_vars[ULSCH_id]->ptrs_phase_per_slot   = (int32_t **)malloc16(n_buf*sizeof(int32_t *) );
     pusch_vars[ULSCH_id]->ul_ch_estimates_time  = (int32_t **)malloc16(n_buf*sizeof(int32_t *) );
     pusch_vars[ULSCH_id]->rxdataF_comp          = (int32_t **)malloc16(n_buf*sizeof(int32_t *) );
@@ -709,25 +695,33 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB,
     pusch_vars[ULSCH_id]->ul_ch_magb0           = (int32_t **)malloc16(n_buf*sizeof(int32_t *) );
     pusch_vars[ULSCH_id]->ul_ch_mag             = (int32_t **)malloc16(n_buf*sizeof(int32_t *) );
     pusch_vars[ULSCH_id]->ul_ch_magb            = (int32_t **)malloc16(n_buf*sizeof(int32_t *) );
-    pusch_vars[ULSCH_id]->rho                   = (int32_t **)malloc16_clear(n_buf*sizeof(int32_t*) );
+    pusch_vars[ULSCH_id]->rho                   = (int32_t ***)malloc16(Prx*sizeof(int32_t **) );
+    pusch_vars[ULSCH_id]->llr_layers            = (int16_t **)malloc16(max_ul_mimo_layers*sizeof(int32_t *) );
 
     for (i=0; i<Prx; i++) {
-      pusch_vars[ULSCH_id]->rxdataF_ext[i]           = (int32_t *)malloc16_clear( sizeof(int32_t)*N_RB_UL*12*fp->symbols_per_slot );
-      pusch_vars[ULSCH_id]->rxdataF_ext2[i]          = (int32_t *)malloc16_clear( sizeof(int32_t)*N_RB_UL*12*fp->symbols_per_slot );
+      pusch_vars[ULSCH_id]->rxdataF_ext[i]           = (int32_t *)malloc16_clear( sizeof(int32_t)*nb_re_pusch2*fp->symbols_per_slot );
+      pusch_vars[ULSCH_id]->rho[i]                   = (int32_t **)malloc16_clear(NR_MAX_NB_LAYERS*NR_MAX_NB_LAYERS*sizeof(int32_t*));
+
+      for (int j=0; j< max_ul_mimo_layers; j++) {
+        for (int k=0; k<max_ul_mimo_layers; k++) {
+          pusch_vars[ULSCH_id]->rho[i][j*max_ul_mimo_layers+k]=(int32_t *)malloc16_clear( sizeof(int32_t)*nb_re_pusch2*fp->symbols_per_slot );
+        }
+      }
     }
     for (i=0; i<n_buf; i++) {
-      pusch_vars[ULSCH_id]->ul_ch_estimates[i]       = (int32_t *)malloc16_clear( sizeof(int32_t)*fp->ofdm_symbol_size*2*fp->symbols_per_slot );
-      pusch_vars[ULSCH_id]->ul_ch_estimates_ext[i]   = (int32_t *)malloc16_clear( sizeof(int32_t)*N_RB_UL*12*fp->symbols_per_slot );
-      pusch_vars[ULSCH_id]->ul_ch_estimates_time[i]  = (int32_t *)malloc16_clear( 2*sizeof(int32_t)*fp->ofdm_symbol_size );
-      pusch_vars[ULSCH_id]->ul_ch_ptrs_estimates[i]       = (int32_t *)malloc16_clear( sizeof(int32_t)*fp->ofdm_symbol_size*2*fp->symbols_per_slot ); // max intensity in freq is 1 sc every 2 RBs
-      pusch_vars[ULSCH_id]->ul_ch_ptrs_estimates_ext[i]   = (int32_t *)malloc16_clear( sizeof(int32_t)*N_RB_UL*12*fp->symbols_per_slot );
+      pusch_vars[ULSCH_id]->ul_ch_estimates[i]       = (int32_t *)malloc16_clear( sizeof(int32_t)*fp->ofdm_symbol_size*fp->symbols_per_slot );
+      pusch_vars[ULSCH_id]->ul_ch_estimates_ext[i]   = (int32_t *)malloc16_clear( sizeof(int32_t)*nb_re_pusch2*fp->symbols_per_slot );
+      pusch_vars[ULSCH_id]->ul_ch_estimates_time[i]  = (int32_t *)malloc16_clear( sizeof(int32_t)*fp->ofdm_symbol_size );
       pusch_vars[ULSCH_id]->ptrs_phase_per_slot[i]   = (int32_t *)malloc16_clear( sizeof(int32_t)*fp->symbols_per_slot); // symbols per slot
-      pusch_vars[ULSCH_id]->rxdataF_comp[i]          = (int32_t *)malloc16_clear( sizeof(int32_t)*N_RB_UL*12*fp->symbols_per_slot );
-      pusch_vars[ULSCH_id]->ul_ch_mag0[i]            = (int32_t *)malloc16_clear( fp->symbols_per_slot*sizeof(int32_t)*N_RB_UL*12 );
-      pusch_vars[ULSCH_id]->ul_ch_magb0[i]           = (int32_t *)malloc16_clear( fp->symbols_per_slot*sizeof(int32_t)*N_RB_UL*12 );
-      pusch_vars[ULSCH_id]->ul_ch_mag[i]             = (int32_t *)malloc16_clear( fp->symbols_per_slot*sizeof(int32_t)*N_RB_UL*12 );
-      pusch_vars[ULSCH_id]->ul_ch_magb[i]            = (int32_t *)malloc16_clear( fp->symbols_per_slot*sizeof(int32_t)*N_RB_UL*12 );
-      pusch_vars[ULSCH_id]->rho[i]                   = (int32_t *)malloc16_clear( sizeof(int32_t)*(fp->N_RB_UL*12*7*2) );
+      pusch_vars[ULSCH_id]->rxdataF_comp[i]          = (int32_t *)malloc16_clear( sizeof(int32_t)*nb_re_pusch2*fp->symbols_per_slot );
+      pusch_vars[ULSCH_id]->ul_ch_mag0[i]            = (int32_t *)malloc16_clear( sizeof(int32_t)*nb_re_pusch2*fp->symbols_per_slot );
+      pusch_vars[ULSCH_id]->ul_ch_magb0[i]           = (int32_t *)malloc16_clear( sizeof(int32_t)*nb_re_pusch2*fp->symbols_per_slot );
+      pusch_vars[ULSCH_id]->ul_ch_mag[i]             = (int32_t *)malloc16_clear( sizeof(int32_t)*nb_re_pusch2*fp->symbols_per_slot );
+      pusch_vars[ULSCH_id]->ul_ch_magb[i]            = (int32_t *)malloc16_clear( sizeof(int32_t)*nb_re_pusch2*fp->symbols_per_slot );
+    }
+
+    for (i=0; i< max_ul_mimo_layers; i++) {
+      pusch_vars[ULSCH_id]->llr_layers[i] = (int16_t *)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) ); // [hna] 6144 is LTE and (8*((3*8*6144)+12)) is not clear
     }
     pusch_vars[ULSCH_id]->llr = (int16_t *)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) ); // [hna] 6144 is LTE and (8*((3*8*6144)+12)) is not clear
     pusch_vars[ULSCH_id]->ul_valid_re_per_slot  = (int16_t *)malloc16_clear( sizeof(int16_t)*fp->symbols_per_slot);
@@ -787,30 +781,16 @@ void phy_free_nr_gNB(PHY_VARS_gNB *gNB)
   }
   free_and_zero(pusch_dmrs);
 
-  uint32_t ***csi_rs = gNB->nr_gold_csi_rs;
+  uint32_t ***nr_gold_csi_rs = gNB->nr_csi_info->nr_gold_csi_rs;
   for (int slot = 0; slot < fp->slots_per_frame; slot++) {
     for (int symb = 0; symb < fp->symbols_per_slot; symb++)
-      free_and_zero(csi_rs[slot][symb]);
-    free_and_zero(csi_rs[slot]);
+      free_and_zero(nr_gold_csi_rs[slot][symb]);
+    free_and_zero(nr_gold_csi_rs[slot]);
   }
-  free_and_zero(csi_rs);
+  free_and_zero(nr_gold_csi_rs);
+  free_and_zero(gNB->nr_csi_info);
 
   for (int id = 0; id < NUMBER_OF_NR_SRS_MAX; id++) {
-    for (int i = 0; i < Prx; i++) {
-      free_and_zero(gNB->nr_srs_info[id]->srs_received_signal[i]);
-      free_and_zero(gNB->nr_srs_info[id]->srs_ls_estimated_channel[i]);
-      free_and_zero(gNB->nr_srs_info[id]->srs_estimated_channel_freq[i]);
-      free_and_zero(gNB->nr_srs_info[id]->srs_estimated_channel_time[i]);
-      free_and_zero(gNB->nr_srs_info[id]->srs_estimated_channel_time_shifted[i]);
-    }
-    free_and_zero(gNB->nr_srs_info[id]->sc_list);
-    free_and_zero(gNB->nr_srs_info[id]->srs_generated_signal);
-    free_and_zero(gNB->nr_srs_info[id]->noise_power);
-    free_and_zero(gNB->nr_srs_info[id]->srs_received_signal);
-    free_and_zero(gNB->nr_srs_info[id]->srs_ls_estimated_channel);
-    free_and_zero(gNB->nr_srs_info[id]->srs_estimated_channel_freq);
-    free_and_zero(gNB->nr_srs_info[id]->srs_estimated_channel_time);
-    free_and_zero(gNB->nr_srs_info[id]->srs_estimated_channel_time_shifted);
     free_and_zero(gNB->nr_srs_info[id]);
   }
 
@@ -844,30 +824,31 @@ void phy_free_nr_gNB(PHY_VARS_gNB *gNB)
 
   NR_gNB_PUSCH** pusch_vars = gNB->pusch_vars;
   for (int ULSCH_id=0; ULSCH_id<gNB->number_of_nr_ulsch_max; ULSCH_id++) {
+    for (int i=0; i< max_ul_mimo_layers; i++)
+      free_and_zero(pusch_vars[ULSCH_id]->llr_layers[i]);
     for (int i = 0; i < Prx; i++) {
       free_and_zero(pusch_vars[ULSCH_id]->rxdataF_ext[i]);
-      free_and_zero(pusch_vars[ULSCH_id]->rxdataF_ext2[i]);
+      for (int j=0; j< max_ul_mimo_layers; j++) {
+        for (int k=0; k<max_ul_mimo_layers; k++)
+          free_and_zero(pusch_vars[ULSCH_id]->rho[i][j*max_ul_mimo_layers+k]);
+      }
+      free_and_zero(pusch_vars[ULSCH_id]->rho[i]);
     }
     for (int i = 0; i < n_buf; i++) {
       free_and_zero(pusch_vars[ULSCH_id]->ul_ch_estimates[i]);
       free_and_zero(pusch_vars[ULSCH_id]->ul_ch_estimates_ext[i]);
       free_and_zero(pusch_vars[ULSCH_id]->ul_ch_estimates_time[i]);
-      free_and_zero(pusch_vars[ULSCH_id]->ul_ch_ptrs_estimates[i]);
-      free_and_zero(pusch_vars[ULSCH_id]->ul_ch_ptrs_estimates_ext[i]);
       free_and_zero(pusch_vars[ULSCH_id]->ptrs_phase_per_slot[i]);
       free_and_zero(pusch_vars[ULSCH_id]->rxdataF_comp[i]);
       free_and_zero(pusch_vars[ULSCH_id]->ul_ch_mag0[i]);
       free_and_zero(pusch_vars[ULSCH_id]->ul_ch_magb0[i]);
       free_and_zero(pusch_vars[ULSCH_id]->ul_ch_mag[i]);
       free_and_zero(pusch_vars[ULSCH_id]->ul_ch_magb[i]);
-      free_and_zero(pusch_vars[ULSCH_id]->rho[i]);
     }
+    free_and_zero(pusch_vars[ULSCH_id]->llr_layers);
     free_and_zero(pusch_vars[ULSCH_id]->rxdataF_ext);
-    free_and_zero(pusch_vars[ULSCH_id]->rxdataF_ext2);
     free_and_zero(pusch_vars[ULSCH_id]->ul_ch_estimates);
     free_and_zero(pusch_vars[ULSCH_id]->ul_ch_estimates_ext);
-    free_and_zero(pusch_vars[ULSCH_id]->ul_ch_ptrs_estimates);
-    free_and_zero(pusch_vars[ULSCH_id]->ul_ch_ptrs_estimates_ext);
     free_and_zero(pusch_vars[ULSCH_id]->ptrs_phase_per_slot);
     free_and_zero(pusch_vars[ULSCH_id]->ul_ch_estimates_time);
     free_and_zero(pusch_vars[ULSCH_id]->ul_valid_re_per_slot);
@@ -931,7 +912,12 @@ void nr_phy_config_request_sim(PHY_VARS_gNB *gNB,
   //gNB_config->subframe_config.dl_cyclic_prefix_type.value = (fp->Ncp == NORMAL) ? NFAPI_CP_NORMAL : NFAPI_CP_EXTENDED;
 
   gNB->mac_enabled   = 1;
-  if (mu==1) {
+  if (mu==0) {
+    fp->dl_CarrierFreq = 2600000000;//from_nrarfcn(gNB_config->nfapi_config.rf_bands.rf_band[0],gNB_config->nfapi_config.nrarfcn.value);
+    fp->ul_CarrierFreq = 2600000000;//fp->dl_CarrierFreq - (get_uldl_offset(gNB_config->nfapi_config.rf_bands.rf_band[0])*100000);
+    fp->nr_band = 38;
+    //  fp->threequarter_fs= 0;
+  } else if (mu==1) {
     fp->dl_CarrierFreq = 3600000000;//from_nrarfcn(gNB_config->nfapi_config.rf_bands.rf_band[0],gNB_config->nfapi_config.nrarfcn.value);
     fp->ul_CarrierFreq = 3600000000;//fp->dl_CarrierFreq - (get_uldl_offset(gNB_config->nfapi_config.rf_bands.rf_band[0])*100000);
     fp->nr_band = 78;
@@ -1053,9 +1039,9 @@ void init_nr_transport(PHY_VARS_gNB *gNB) {
 
   for (int i=0; i<gNB->number_of_nr_ulsch_max; i++) {
 
-    LOG_I(PHY,"Allocating Transport Channel Buffer for ULSCH  %d/%d\n",i,gNB->number_of_nr_ulsch_max);
+    LOG_I(PHY,"Allocating Transport Channel Buffers for ULSCH  %d/%d\n",i,gNB->number_of_nr_ulsch_max);
 
-    gNB->ulsch[i] = new_gNB_ulsch(MAX_LDPC_ITERATIONS, fp->N_RB_UL);
+    gNB->ulsch[i] = new_gNB_ulsch(gNB->max_ldpc_iterations, fp->N_RB_UL);
 
     if (!gNB->ulsch[i]) {
       LOG_E(PHY,"Can't get gNB ulsch structures\n");
diff --git a/openair1/PHY/INIT/nr_init_ru.c b/openair1/PHY/INIT/nr_init_ru.c
index 07f1d3b9e3c4578dd9495bfea3b6213b22e5b51d..75d78738fc6fa74f9d3e821087ea5479a43654ea 100644
--- a/openair1/PHY/INIT/nr_init_ru.c
+++ b/openair1/PHY/INIT/nr_init_ru.c
@@ -41,7 +41,7 @@ int nr_phy_init_RU(RU_t *ru) {
   int p;
   int re;
 
-  LOG_I(PHY,"Initializing RU signal buffers (if_south %s) nb_tx %d\n",ru_if_types[ru->if_south],ru->nb_tx);
+  LOG_I(PHY,"Initializing RU signal buffers (if_south %s) nb_tx %d, nb_rx %d\n",ru_if_types[ru->if_south],ru->nb_tx, ru->nb_rx);
 
   nfapi_nr_config_request_scf_t *cfg;
   ru->nb_log_antennas=0;
@@ -60,7 +60,7 @@ int nr_phy_init_RU(RU_t *ru) {
 
     for (i=0; i<ru->nb_tx; i++) {
       // Allocate 10 subframes of I/Q TX signal data (time) if not
-      ru->common.txdata[i]  = (int32_t*)malloc16_clear( ru->sf_extension + (fp->samples_per_frame*sizeof(int32_t) ));
+      ru->common.txdata[i]  = (int32_t*)malloc16_clear((ru->sf_extension + fp->samples_per_frame)*sizeof(int32_t));
       LOG_I(PHY,"[INIT] common.txdata[%d] = %p (%lu bytes,sf_extension %d)\n",i,ru->common.txdata[i],
 	     (ru->sf_extension + fp->samples_per_frame)*sizeof(int32_t),ru->sf_extension);
       ru->common.txdata[i] =  &ru->common.txdata[i][ru->sf_extension];
@@ -124,9 +124,10 @@ int nr_phy_init_RU(RU_t *ru) {
 		ru->num_gNB,NUMBER_OF_gNB_MAX);
 
     LOG_I(PHY,"[INIT] %s() ru->num_gNB:%d \n", __FUNCTION__, ru->num_gNB);
-    if (ru->do_precoding == 1) { 
+
+    if (ru->do_precoding == 1) {
       int beam_count = 0;
-      if (ru->nb_tx>1) {//Enable beamforming when nb_tx > 1
+      if (ru->nb_tx>1) { //Enable beamforming when nb_tx > 1
 
         for (p=0;p<ru->nb_log_antennas;p++) {
           //if ((fp->L_ssb >> (63-p)) & 0x01)//64 bit-map with the MSB @2⁶³ corresponds to SSB ssb_index 0
@@ -149,7 +150,7 @@ int nr_phy_init_RU(RU_t *ru) {
             } // for j
           //}
           } // for p
-        } //for i
+        } // for i
       }
 
       ru->common.beam_id = (uint8_t**)malloc16_clear(ru->nb_tx*sizeof(uint8_t*));
@@ -205,12 +206,11 @@ void nr_phy_free_RU(RU_t *ru)
 	free_and_zero(ru->prach_rxsigF[j][i]);
       free_and_zero(ru->prach_rxsigF[j]);
     }
-
     if (ru->do_precoding == 1) {
       for (i = 0; i < ru->num_gNB; i++) {
         for (p = 0; p < ru->nb_log_antennas; p++) {
-            for (j=0; j<ru->nb_tx; j++) free_and_zero(ru->beam_weights[i][p][j]);
-            free_and_zero(ru->beam_weights[i][p]);
+          for (j=0; j<ru->nb_tx; j++) free_and_zero(ru->beam_weights[i][p][j]);
+          free_and_zero(ru->beam_weights[i][p]);
         }
       }
       for(i=0; i< ru->nb_tx; ++i)
diff --git a/openair1/PHY/INIT/nr_init_ue.c b/openair1/PHY/INIT/nr_init_ue.c
index 05375c46cedd074796840ca92c1bf3cd142a64d6..73cdaf0faeb43b3a5f03406d137864c61d094ace 100644
--- a/openair1/PHY/INIT/nr_init_ue.c
+++ b/openair1/PHY/INIT/nr_init_ue.c
@@ -34,19 +34,6 @@
 #include "PHY/NR_REFSIG/nr_refsig.h"
 #include "PHY/MODULATION/nr_modulation.h"
 
-#if 0
-void phy_config_harq_ue(module_id_t Mod_id,
-                        int CC_id,
-                        uint8_t gNB_id,
-                        uint16_t max_harq_tx) {
-  int num_of_threads,num_of_code_words;
-  PHY_VARS_NR_UE *phy_vars_ue = PHY_vars_UE_g[Mod_id][CC_id];
-
-  for (num_of_threads=0; num_of_threads<RX_NB_TH_MAX; num_of_threads++)
-    for (num_of_code_words=0; num_of_code_words<NR_MAX_NB_CODEWORDS; num_of_code_words++)
-      phy_vars_ue->ulsch[num_of_threads][gNB_id][num_of_code_words]->Mlimit = max_harq_tx;
-}
-#endif
 
 extern uint16_t beta_cqi[16];
 
@@ -76,7 +63,6 @@ void phy_init_nr_ue_PDSCH(NR_UE_PDSCH *const pdsch,
   pdsch->dl_ch_magr0            = (int32_t **)malloc16_clear( NR_MAX_NB_LAYERS*fp->nb_antennas_rx*sizeof(int32_t *) );
   pdsch->ptrs_phase_per_slot    = (int32_t **)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t *) );
   pdsch->ptrs_re_per_slot       = (int32_t **)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t *) );
-  pdsch->dl_ch_ptrs_estimates_ext = (int32_t **)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t *) );
   // the allocated memory size is fixed:
   AssertFatal( fp->nb_antennas_rx <= 4, "nb_antennas_rx > 4" );//Extend the max number of UE Rx antennas to 4
 
@@ -86,7 +72,6 @@ void phy_init_nr_ue_PDSCH(NR_UE_PDSCH *const pdsch,
     pdsch->rxdataF_uespec_pilots[i]    = (int32_t *)malloc16_clear( sizeof(int32_t) * fp->N_RB_DL*12);
     pdsch->ptrs_phase_per_slot[i]      = (int32_t *)malloc16_clear( sizeof(int32_t) * 14 );
     pdsch->ptrs_re_per_slot[i]         = (int32_t *)malloc16_clear( sizeof(int32_t) * 14);
-    pdsch->dl_ch_ptrs_estimates_ext[i] = (int32_t *)malloc16_clear( sizeof(int32_t) * num);
     pdsch->rho[i]                      = (int32_t **)malloc16_clear( NR_MAX_NB_LAYERS*NR_MAX_NB_LAYERS*sizeof(int32_t *) );
 
     for (int j=0; j<NR_MAX_NB_LAYERS; j++) {
@@ -126,7 +111,6 @@ void phy_term_nr_ue__PDSCH(NR_UE_PDSCH* pdsch, const NR_DL_FRAME_PARMS *const fp
     free_and_zero(pdsch->rxdataF_uespec_pilots[i]);
     free_and_zero(pdsch->ptrs_phase_per_slot[i]);
     free_and_zero(pdsch->ptrs_re_per_slot[i]);
-    free_and_zero(pdsch->dl_ch_ptrs_estimates_ext[i]);
     free_and_zero(pdsch->rho[i]);
   }
   free_and_zero(pdsch->pmi_ext);
@@ -149,7 +133,6 @@ void phy_term_nr_ue__PDSCH(NR_UE_PDSCH* pdsch, const NR_DL_FRAME_PARMS *const fp
   free_and_zero(pdsch->dl_ch_magr0);
   free_and_zero(pdsch->ptrs_phase_per_slot);
   free_and_zero(pdsch->ptrs_re_per_slot);
-  free_and_zero(pdsch->dl_ch_ptrs_estimates_ext);
 }
 
 int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB)
@@ -160,8 +143,11 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB)
   NR_UE_PBCH  **const pbch_vars          = ue->pbch_vars;
   NR_UE_PRS   **const prs_vars           = ue->prs_vars;
   NR_UE_PRACH **const prach_vars         = ue->prach_vars;
+  NR_UE_CSI_IM **const csiim_vars        = ue->csiim_vars;
+  NR_UE_CSI_RS **const csirs_vars        = ue->csirs_vars;
   NR_UE_SRS **const srs_vars             = ue->srs_vars;
-  int i,slot,symb, gNB_id, th_id;
+
+  int i, slot, symb, gNB_id, th_id;
 
   LOG_I(PHY, "Initializing UE vars for gNB TXant %u, UE RXant %u\n", fp->nb_antennas_tx, fp->nb_antennas_rx);
 
@@ -389,26 +375,33 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB)
 
     prach_vars[gNB_id] = (NR_UE_PRACH *)malloc16_clear(sizeof(NR_UE_PRACH));
     pbch_vars[gNB_id] = (NR_UE_PBCH *)malloc16_clear(sizeof(NR_UE_PBCH));
+    csiim_vars[gNB_id] = (NR_UE_CSI_IM *)malloc16_clear(sizeof(NR_UE_CSI_IM));
+    csirs_vars[gNB_id] = (NR_UE_CSI_RS *)malloc16_clear(sizeof(NR_UE_CSI_RS));
     srs_vars[gNB_id] = (NR_UE_SRS *)malloc16_clear(sizeof(NR_UE_SRS));
 
+    csiim_vars[gNB_id]->active = false;
+    csirs_vars[gNB_id]->active = false;
     srs_vars[gNB_id]->active = false;
-    ue->nr_srs_info = (nr_srs_info_t *)malloc16_clear(sizeof(nr_srs_info_t));
-    ue->nr_srs_info->sc_list = (uint16_t *) malloc16_clear(6*fp->N_RB_UL*sizeof(uint16_t));
-    ue->nr_srs_info->srs_generated_signal = (int32_t *) malloc16_clear( (2*(fp->samples_per_frame)+2048)*sizeof(int32_t) );
-    ue->nr_srs_info->noise_power = (uint32_t*)malloc16_clear(sizeof(uint32_t));
-    ue->nr_srs_info->srs_received_signal = (int32_t **)malloc16( fp->nb_antennas_rx*sizeof(int32_t *) );
-    ue->nr_srs_info->srs_ls_estimated_channel = (int32_t **)malloc16( fp->nb_antennas_rx*sizeof(int32_t *) );
-    ue->nr_srs_info->srs_estimated_channel_freq = (int32_t **)malloc16( fp->nb_antennas_rx*sizeof(int32_t *) );
-    ue->nr_srs_info->srs_estimated_channel_time = (int32_t **)malloc16( fp->nb_antennas_rx*sizeof(int32_t *) );
-    ue->nr_srs_info->srs_estimated_channel_time_shifted = (int32_t **)malloc16( fp->nb_antennas_rx*sizeof(int32_t *) );
-    for (i=0; i<fp->nb_antennas_rx; i++) {
-      ue->nr_srs_info->srs_received_signal[i] = (int32_t *) malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t));
-      ue->nr_srs_info->srs_ls_estimated_channel[i] = (int32_t *) malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t));
-      ue->nr_srs_info->srs_estimated_channel_freq[i] = (int32_t *) malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t));
-      ue->nr_srs_info->srs_estimated_channel_time[i] = (int32_t *) malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t));
-      ue->nr_srs_info->srs_estimated_channel_time_shifted[i] = (int32_t *) malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t));
+
+    // ceil((NB_RB*8(max allocation per RB)*2(QPSK))/32)
+    int csi_dmrs_init_length =  ((fp->N_RB_DL<<4)>>5)+1;
+    ue->nr_csi_info = (nr_csi_info_t *)malloc16_clear(sizeof(nr_csi_info_t));
+    ue->nr_csi_info->nr_gold_csi_rs = (uint32_t ***)malloc16(fp->slots_per_frame * sizeof(uint32_t **));
+    AssertFatal(ue->nr_csi_info->nr_gold_csi_rs != NULL, "NR init: csi reference signal malloc failed\n");
+    for (int slot=0; slot<fp->slots_per_frame; slot++) {
+      ue->nr_csi_info->nr_gold_csi_rs[slot] = (uint32_t **)malloc16(fp->symbols_per_slot * sizeof(uint32_t *));
+      AssertFatal(ue->nr_csi_info->nr_gold_csi_rs[slot] != NULL, "NR init: csi reference signal for slot %d - malloc failed\n", slot);
+      for (int symb=0; symb<fp->symbols_per_slot; symb++) {
+        ue->nr_csi_info->nr_gold_csi_rs[slot][symb] = (uint32_t *)malloc16(csi_dmrs_init_length * sizeof(uint32_t));
+        AssertFatal(ue->nr_csi_info->nr_gold_csi_rs[slot][symb] != NULL, "NR init: csi reference signal for slot %d symbol %d - malloc failed\n", slot, symb);
+      }
+    }
+    ue->nr_csi_info->csi_rs_generated_signal = (int32_t **)malloc16(NR_MAX_NB_PORTS * sizeof(int32_t *) );
+    for (i=0; i<NR_MAX_NB_PORTS; i++) {
+      ue->nr_csi_info->csi_rs_generated_signal[i] = (int32_t *) malloc16_clear(fp->samples_per_frame_wCP * sizeof(int32_t));
     }
 
+    ue->nr_srs_info = (nr_srs_info_t *)malloc16_clear(sizeof(nr_srs_info_t));
 
     // RACH
     prach_vars[gNB_id]->prachF             = (int16_t *)malloc16_clear( sizeof(int)*(7*2*sizeof(int)*(fp->ofdm_symbol_size*12)) );
@@ -502,31 +495,30 @@ void term_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB)
       free_and_zero(ue->pdsch_vars[th_id][gNB_id]);
     }
   }
-  
+
   for (int gNB_id = 0; gNB_id < ue->n_connected_gNB; gNB_id++) {
 
     for (int th_id = 0; th_id < RX_NB_TH_MAX; th_id++) {
-
       free_and_zero(ue->pdcch_vars[th_id][gNB_id]);
     }
 
-    for (int i = 0; i < fp->nb_antennas_rx; i++) {
-      free_and_zero(ue->nr_srs_info->srs_received_signal[i]);
-      free_and_zero(ue->nr_srs_info->srs_ls_estimated_channel[i]);
-      free_and_zero(ue->nr_srs_info->srs_estimated_channel_freq[i]);
-      free_and_zero(ue->nr_srs_info->srs_estimated_channel_time[i]);
-      free_and_zero(ue->nr_srs_info->srs_estimated_channel_time_shifted[i]);
+    for (int i=0; i<NR_MAX_NB_PORTS; i++) {
+      free_and_zero(ue->nr_csi_info->csi_rs_generated_signal[i]);
     }
-    free_and_zero(ue->nr_srs_info->sc_list);
-    free_and_zero(ue->nr_srs_info->srs_generated_signal);
-    free_and_zero(ue->nr_srs_info->noise_power);
-    free_and_zero(ue->nr_srs_info->srs_received_signal);
-    free_and_zero(ue->nr_srs_info->srs_ls_estimated_channel);
-    free_and_zero(ue->nr_srs_info->srs_estimated_channel_freq);
-    free_and_zero(ue->nr_srs_info->srs_estimated_channel_time);
-    free_and_zero(ue->nr_srs_info->srs_estimated_channel_time_shifted);
+    free_and_zero(ue->nr_csi_info->csi_rs_generated_signal);
+    for (int slot=0; slot<fp->slots_per_frame; slot++) {
+      for (int symb=0; symb<fp->symbols_per_slot; symb++) {
+        free_and_zero(ue->nr_csi_info->nr_gold_csi_rs[slot][symb]);
+      }
+      free_and_zero(ue->nr_csi_info->nr_gold_csi_rs[slot]);
+    }
+    free_and_zero(ue->nr_csi_info->nr_gold_csi_rs);
+    free_and_zero(ue->nr_csi_info);
+
     free_and_zero(ue->nr_srs_info);
 
+    free_and_zero(ue->csiim_vars[gNB_id]);
+    free_and_zero(ue->csirs_vars[gNB_id]);
     free_and_zero(ue->srs_vars[gNB_id]);
 
     free_and_zero(ue->pbch_vars[gNB_id]);
@@ -547,7 +539,7 @@ void term_nr_ue_transport(PHY_VARS_NR_UE *ue)
       for (int k = 0; k < RX_NB_TH_MAX; k++) {
         free_nr_ue_dlsch(&ue->dlsch[k][i][j], N_RB_DL);
         if (j==0)
-          free_nr_ue_ulsch(&ue->ulsch[k][i], N_RB_DL);
+          free_nr_ue_ulsch(&ue->ulsch[k][i], N_RB_DL, &ue->frame_parms);
       }
     }
 
@@ -565,17 +557,17 @@ void init_nr_ue_transport(PHY_VARS_NR_UE *ue) {
   for (int i = 0; i < NUMBER_OF_CONNECTED_gNB_MAX; i++) {
     for (int j=0; j<num_codeword; j++) {
       for (int k=0; k<RX_NB_TH_MAX; k++) {
-        AssertFatal((ue->dlsch[k][i][j]  = new_nr_ue_dlsch(1,NR_MAX_DLSCH_HARQ_PROCESSES,NSOFT,MAX_LDPC_ITERATIONS,ue->frame_parms.N_RB_DL))!=NULL,"Can't get ue dlsch structures\n");
+        AssertFatal((ue->dlsch[k][i][j]  = new_nr_ue_dlsch(1,NR_MAX_DLSCH_HARQ_PROCESSES,NSOFT,ue->max_ldpc_iterations,ue->frame_parms.N_RB_DL))!=NULL,"Can't get ue dlsch structures\n");
         LOG_D(PHY,"dlsch[%d][%d][%d] => %p\n",k,i,j,ue->dlsch[k][i][j]);
         if (j==0) {
-          AssertFatal((ue->ulsch[k][i] = new_nr_ue_ulsch(ue->frame_parms.N_RB_UL, NR_MAX_ULSCH_HARQ_PROCESSES))!=NULL,"Can't get ue ulsch structures\n");
+          AssertFatal((ue->ulsch[k][i] = new_nr_ue_ulsch(ue->frame_parms.N_RB_UL, NR_MAX_ULSCH_HARQ_PROCESSES,&ue->frame_parms))!=NULL,"Can't get ue ulsch structures\n");
           LOG_D(PHY,"ulsch[%d][%d] => %p\n",k,i,ue->ulsch[k][i]);
         }
       }
     }
 
-    ue->dlsch_SI[i]  = new_nr_ue_dlsch(1,1,NSOFT,MAX_LDPC_ITERATIONS,ue->frame_parms.N_RB_DL);
-    ue->dlsch_ra[i]  = new_nr_ue_dlsch(1,1,NSOFT,MAX_LDPC_ITERATIONS,ue->frame_parms.N_RB_DL);
+    ue->dlsch_SI[i]  = new_nr_ue_dlsch(1,1,NSOFT,ue->max_ldpc_iterations,ue->frame_parms.N_RB_DL);
+    ue->dlsch_ra[i]  = new_nr_ue_dlsch(1,1,NSOFT,ue->max_ldpc_iterations,ue->frame_parms.N_RB_DL);
     ue->transmission_mode[i] = ue->frame_parms.nb_antenna_ports_gNB==1 ? 1 : 2;
   }
 
diff --git a/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c b/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c
index c867292942f840d3bffd2891769ddf9b0d4dc7ca..9327fe9fe89a255249794470e4160ec440732406 100644
--- a/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c
+++ b/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c
@@ -41,10 +41,10 @@ extern int16_t *ul_ref_sigs_rx[30][2][34];
 
 int32_t lte_ul_channel_estimation(LTE_DL_FRAME_PARMS *frame_parms,
                                   L1_rxtx_proc_t *proc,
-                        				  LTE_eNB_ULSCH_t * ulsch,
-				                          int32_t **ul_ch_estimates,
-				                          int32_t **ul_ch_estimates_time,
-				                          int32_t **rxdataF_ext,
+				  LTE_eNB_ULSCH_t * ulsch,
+				  int32_t **ul_ch_estimates,
+				  int32_t **ul_ch_estimates_time,
+				  int32_t **rxdataF_ext,
                                   module_id_t UE_id,
                                   unsigned char l,
                                   unsigned char Ns) {
@@ -88,7 +88,7 @@ int32_t lte_ul_channel_estimation(LTE_DL_FRAME_PARMS *frame_parms,
   }
 
   uint16_t N_rb_alloc = ulsch->harq_processes[harq_pid]->nb_rb;
-  int32_t tmp_estimates[N_rb_alloc*12] __attribute__((aligned(16)));
+  int32_t tmp_estimates[N_rb_alloc*12] __attribute__((aligned(32)));
   Msc_RS = N_rb_alloc*12;
   cyclic_shift = (frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift +
                   ulsch->harq_processes[harq_pid]->n_DMRS2 +
@@ -334,14 +334,14 @@ int32_t lte_ul_channel_estimation(LTE_DL_FRAME_PARMS *frame_parms,
             current_phase2 = cmin(abs(current_phase2),127);
             //          msg("sym: %d, current_phase1: %d, ru: %d + j%d, current_phase2: %d, ru: %d + j%d\n",k,current_phase1,ru1[2*current_phase1],ru1[2*current_phase1+1],current_phase2,ru2[2*current_phase2],ru2[2*current_phase2+1]);
             // rotate channel estimates by estimated phase
-            rotate_cpx_vector((int16_t *) ul_ch1,
-                              &ru1[2*current_phase1],
-                              (int16_t *) &ul_ch_estimates[aa][frame_parms->N_RB_UL*12*k],
+            rotate_cpx_vector((c16_t *) ul_ch1,
+                              (c16_t *)&ru1[2*current_phase1],
+                              (c16_t *) &ul_ch_estimates[aa][frame_parms->N_RB_UL*12*k],
                               Msc_RS,
                               15);
-            rotate_cpx_vector((int16_t *) ul_ch2,
-                              &ru2[2*current_phase2],
-                              (int16_t *) &tmp_estimates[0],
+            rotate_cpx_vector((c16_t *) ul_ch2,
+                              (c16_t *)&ru2[2*current_phase2],
+                              (c16_t *) tmp_estimates,
                               Msc_RS,
                               15);
             // Combine the two rotated estimates
@@ -657,14 +657,14 @@ int32_t lte_ul_channel_estimation_RRU(LTE_DL_FRAME_PARMS *frame_parms,
           current_phase2 = cmin(abs(current_phase2),127);
           //          msg("sym: %d, current_phase1: %d, ru: %d + j%d, current_phase2: %d, ru: %d + j%d\n",k,current_phase1,ru1[2*current_phase1],ru1[2*current_phase1+1],current_phase2,ru2[2*current_phase2],ru2[2*current_phase2+1]);
           // rotate channel estimates by estimated phase
-          rotate_cpx_vector((int16_t *) ul_ch1,
-                            &ru1[2*current_phase1],
-                            (int16_t *) &ul_ch_estimates[aa][frame_parms->N_RB_UL*12*k],
+          rotate_cpx_vector((c16_t *) ul_ch1,
+                            (c16_t *) &ru1[2*current_phase1],
+                            (c16_t *) &ul_ch_estimates[aa][frame_parms->N_RB_UL*12*k],
                             Msc_RS,
                             15);
-          rotate_cpx_vector((int16_t *) ul_ch2,
-                            &ru2[2*current_phase2],
-                            (int16_t *) &tmp_estimates[0],
+          rotate_cpx_vector((c16_t *) ul_ch2,
+                            (c16_t *) &ru2[2*current_phase2],
+                            (c16_t *) &tmp_estimates[0],
                             Msc_RS,
                             15);
           // Combine the two rotated estimates
diff --git a/openair1/PHY/LTE_TRANSPORT/dci_tools.c b/openair1/PHY/LTE_TRANSPORT/dci_tools.c
index 1bbe9eb39a28159559597ae5008e4a623b5d7c68..dc73a56568edd39fc469c20fd642c604d15cd938 100644
--- a/openair1/PHY/LTE_TRANSPORT/dci_tools.c
+++ b/openair1/PHY/LTE_TRANSPORT/dci_tools.c
@@ -1997,7 +1997,7 @@ int get_narrowband_index(int N_RB_UL,int rb) {
 void fill_ulsch(PHY_VARS_eNB *eNB,int UE_id,nfapi_ul_config_ulsch_pdu *ulsch_pdu,int frame,int subframe) {
   uint8_t harq_pid;
   //uint8_t UE_id;
-  boolean_t new_ulsch = (find_ulsch(ulsch_pdu->ulsch_pdu_rel8.rnti,eNB,SEARCH_EXIST)==-1) ? TRUE : FALSE;
+  const bool new_ulsch = find_ulsch(ulsch_pdu->ulsch_pdu_rel8.rnti,eNB,SEARCH_EXIST) == -1;
   //AssertFatal((UE_id=find_ulsch(ulsch_pdu->ulsch_pdu_rel8.rnti,eNB,SEARCH_EXIST_OR_FREE))>=0,
   //        "No existing/free UE ULSCH for rnti %x\n",ulsch_pdu->ulsch_pdu_rel8.rnti);
   LTE_eNB_ULSCH_t *ulsch=eNB->ulsch[UE_id];
@@ -2063,7 +2063,7 @@ void fill_ulsch(PHY_VARS_eNB *eNB,int UE_id,nfapi_ul_config_ulsch_pdu *ulsch_pdu
 
   if ((ulsch->harq_processes[harq_pid]->status == SCH_IDLE) ||
       (ulsch->harq_processes[harq_pid]->ndi    != ulsch_pdu->ulsch_pdu_rel8.new_data_indication) ||
-      (new_ulsch == TRUE)) {
+      (new_ulsch == true)) {
     ulsch->harq_processes[harq_pid]->status        = ACTIVE;
     ulsch->harq_processes[harq_pid]->TBS           = ulsch_pdu->ulsch_pdu_rel8.size<<3;
     ulsch->harq_processes[harq_pid]->Msc_initial   = 12*ulsch_pdu->ulsch_pdu_rel8.number_of_resource_blocks;
diff --git a/openair1/PHY/LTE_TRANSPORT/dci_tools_common.c b/openair1/PHY/LTE_TRANSPORT/dci_tools_common.c
index 64e74ebfbf80341dd7d1b70d74240769b90858dd..0addfdf14c7fc0f267e05e7e8c0cd4493371983b 100644
--- a/openair1/PHY/LTE_TRANSPORT/dci_tools_common.c
+++ b/openair1/PHY/LTE_TRANSPORT/dci_tools_common.c
@@ -532,9 +532,12 @@ uint32_t conv_1C_RIV(int32_t rballoc,uint32_t N_RB_DL) {
 
 }
 
+// FIXME: this function is compting PRB outside the range, so I FORCED in the range
+// I can't understand the 3GPP spec, see below note
 uint32_t get_prb(int N_RB_DL,int odd_slot,int vrb,int Ngap) {
 
   int offset;
+  int ret=-1;
 
   switch (N_RB_DL) {
 
@@ -545,16 +548,16 @@ uint32_t get_prb(int N_RB_DL,int odd_slot,int vrb,int Ngap) {
     switch (vrb) {
     case 0:  // even: 0->0, 1->2, odd: 0->3, 1->5
     case 1:
-      return ((3*odd_slot) + 2*(vrb&3))%6;
+      ret=  ((3*odd_slot) + 2*(vrb&3))%6;
       break;
     case 2:  // even: 2->3, 3->5, odd: 2->0, 3->2
     case 3:
-      return ((3*odd_slot) + 2*(vrb&3) + 5)%6;
+      ret=  ((3*odd_slot) + 2*(vrb&3) + 5)%6;
       break;
     case 4:  // even: 4->1, odd: 4->4
-      return ((3*odd_slot) + 1)%6;
+      ret=  ((3*odd_slot) + 1)%6;
     case 5:  // even: 5->4, odd: 5->1
-      return ((3*odd_slot) + 4)%6;
+      ret=  ((3*odd_slot) + 4)%6;
       break;
     }
     break;
@@ -562,88 +565,90 @@ uint32_t get_prb(int N_RB_DL,int odd_slot,int vrb,int Ngap) {
   case 15:
     if (vrb<12) {
       if ((vrb&3) < 2)     // even: 0->0, 1->4, 4->1, 5->5, 8->2, 9->6 odd: 0->7, 1->11
-  return(((7*odd_slot) + 4*(vrb&3) + (vrb>>2))%14) + 14*(vrb/14);
+  ret= (((7*odd_slot) + 4*(vrb&3) + (vrb>>2))%14) + 14*(vrb/14);
       else if (vrb < 12) // even: 2->7, 3->11, 6->8, 7->12, 10->9, 11->13
-  return (((7*odd_slot) + 4*(vrb&3) + (vrb>>2) +13 )%14) + 14*(vrb/14);
+  ret=  (((7*odd_slot) + 4*(vrb&3) + (vrb>>2) +13 )%14) + 14*(vrb/14);
     }
     if (vrb==12)
-      return (3+(7*odd_slot)) % 14;
+      ret=  (3+(7*odd_slot)) % 14;
     if (vrb==13)
-      return (10+(7*odd_slot)) % 14;
-    return 14;
+      ret=  (10+(7*odd_slot)) % 14;
+    ret=  14;
     break;
 
+    // Formula in TS 36.211, chap 6.2.3.2
+    // Fix me: returns a PRB number > 24 when vrb is 24
   case 25:
-    return (((12*odd_slot) + 6*(vrb&3) + (vrb>>2))%24) + 24*(vrb/24);
+    ret=  (((12*odd_slot) + 6*(vrb&3) + (vrb>>2))%24) + 24*(vrb/24);
     break;
 
   case 50: // P=3
     if (Ngap==0) {
       // Nrow=12,Nnull=2,NVRBDL=46,Ngap1= 27
       if (vrb>=23)
-  offset=4;
+        offset=4;
       else
-  offset=0;
+        offset=0;
       if (vrb<44) {
-  if ((vrb&3)>=2)
-    return offset+((23*odd_slot) + 12*(vrb&3) + (vrb>>2) + 45)%46;
-  else
-    return offset+((23*odd_slot) + 12*(vrb&3) + (vrb>>2))%46;
+        if ((vrb&3)>=2)
+    ret=  offset+((23*odd_slot) + 12*(vrb&3) + (vrb>>2) + 45)%46;
+        else
+    ret=  offset+((23*odd_slot) + 12*(vrb&3) + (vrb>>2))%46;
       }
       if (vrb==44)  // even: 44->11, odd: 45->34
-  return offset+((23*odd_slot) + 22-12+1);
+        ret=  offset+((23*odd_slot) + 22-12+1);
       if (vrb==45)  // even: 45->10, odd: 45->33
-  return offset+((23*odd_slot) + 22+12);
+        ret=  offset+((23*odd_slot) + 22+12);
       if (vrb==46)
-  return offset+46+((23*odd_slot) + 23-12+1) % 46;
+        ret=  offset+46+((23*odd_slot) + 23-12+1) % 46;
       if (vrb==47)
-  return offset+46+((23*odd_slot) + 23+12) % 46;
+        ret=  offset+46+((23*odd_slot) + 23+12) % 46;
       if (vrb==48)
-  return offset+46+((23*odd_slot) + 23-12+1) % 46;
+        ret=  offset+46+((23*odd_slot) + 23-12+1) % 46;
       if (vrb==49)
-  return offset+46+((23*odd_slot) + 23+12) % 46;
+        ret=  offset+46+((23*odd_slot) + 23+12) % 46;
     }
     else {
       // Nrow=6,Nnull=6,NVRBDL=18,Ngap1= 27
       if (vrb>=9)
-  offset=18;
+        offset=18;
       else
-  offset=0;
+        offset=0;
 
       if (vrb<12) {
-  if ((vrb&3)>=2)
-    return offset+((9*odd_slot) + 6*(vrb&3) + (vrb>>2) + 17)%18;
-  else
-    return offset+((9*odd_slot) + 6*(vrb&3) + (vrb>>2))%18;
+        if ((vrb&3)>=2)
+          ret=  offset+((9*odd_slot) + 6*(vrb&3) + (vrb>>2) + 17)%18;
+        else
+          ret=  offset+((9*odd_slot) + 6*(vrb&3) + (vrb>>2))%18;
       }
       else {
-  return offset+((9*odd_slot) + 12*(vrb&1)+(vrb>>1) )%18 + 18*(vrb/18);
+        ret=  offset+((9*odd_slot) + 12*(vrb&1)+(vrb>>1) )%18 + 18*(vrb/18);
       }
     }
     break;
   case 75:
     // Ngap1 = 32, NVRBRL=64, P=4, Nrow= 16, Nnull=0
     if (Ngap ==0) {
-      return ((32*odd_slot) + 16*(vrb&3) + (vrb>>2))%64 + (vrb/64);
+      ret=  ((32*odd_slot) + 16*(vrb&3) + (vrb>>2))%64 + (vrb/64);
     } else {
       // Ngap2 = 16, NVRBDL=32, Nrow=8, Nnull=0
-      return ((16*odd_slot) + 8*(vrb&3) + (vrb>>2))%32 + (vrb/32);
+      ret=  ((16*odd_slot) + 8*(vrb&3) + (vrb>>2))%32 + (vrb/32);
     }
     break;
   case 100:
     // Ngap1 = 48, NVRBDL=96, Nrow=24, Nnull=0
     if (Ngap ==0) {
-      return ((48*odd_slot) + 24*(vrb&3) + (vrb>>2))%96 + (vrb/96);
+      ret=  ((48*odd_slot) + 24*(vrb&3) + (vrb>>2))%96 + (vrb/96);
     } else {
       // Ngap2 = 16, NVRBDL=32, Nrow=8, Nnull=0
-      return ((16*odd_slot) + 8*(vrb&3) + (vrb>>2))%32 + (vrb/32);
+      ret=  ((16*odd_slot) + 8*(vrb&3) + (vrb>>2))%32 + (vrb/32);
     }
     break;
   default:
     LOG_E(PHY,"Unknown N_RB_DL %d\n",N_RB_DL);
-    return 0;
+    ret=  0;
   }
-  return 0;
+  return ret%N_RB_DL;
 
 }
 
@@ -677,7 +682,7 @@ void generate_RIV_tables(void)
 
       //      printf("RIV %d (%d) : first_rb %d NBRB %d\n",RIV,localRIV2alloc_LUT25[RIV],RBstart,Lcrbs);
       localRIV2alloc_LUT6[RIV] = alloc0;
-      distRIV2alloc_even_LUT6[RIV]  = allocdist0_0_even;
+      distRIV2alloc_even_LUT6[RIV] = allocdist0_0_even;
       distRIV2alloc_odd_LUT6[RIV]  = allocdist0_0_odd;
       RIV2nb_rb_LUT6[RIV]      = Lcrbs;
       RIV2first_rb_LUT6[RIV]   = RBstart;
@@ -693,15 +698,14 @@ void generate_RIV_tables(void)
       nVRB = Lcrbs-1+RBstart;
       //printf("RBstart %d, len %d --> ",RBstart,Lcrbs);
       alloc0     |= (1<<nVRB);
-      allocdist0_0_even |= (1<<get_prb(25,0,nVRB,0));
-      allocdist0_0_odd  |= (1<<get_prb(25,1,nVRB,0));
+      allocdist0_0_even |= 1U << get_prb(25, 0, nVRB, 0);
+      allocdist0_0_odd  |= 1U << get_prb(25, 1, nVRB, 0);
 
       //printf("alloc 0 %x, allocdist0_even %x, allocdist0_odd %x\n",alloc0,allocdist0_0_even,allocdist0_0_odd);
       RIV=computeRIV(25,RBstart,Lcrbs);
 
       if (RIV>RIV_max25)
-        RIV_max25 = RIV;;
-
+        RIV_max25 = RIV;
 
       localRIV2alloc_LUT25[RIV]      = alloc0;
       distRIV2alloc_even_LUT25[RIV]  = allocdist0_0_even;
@@ -730,37 +734,37 @@ void generate_RIV_tables(void)
 
 
       if (nVRB<32)
-        alloc0 |= (1<<nVRB);
+        alloc0 |= 1U << nVRB;
       else
-        alloc1 |= (1<<(nVRB-32));
+        alloc1 |= 1U << (nVRB - 32);
 
       // Distributed Gap1, even slot
       nVRB_even_dist = get_prb(50,0,nVRB,0);
       if (nVRB_even_dist<32)
-        allocdist0_0_even |= (1<<nVRB_even_dist);
+        allocdist0_0_even |= 1U << nVRB_even_dist;
       else
-        allocdist1_0_even |= (1<<(nVRB_even_dist-32));
+        allocdist1_0_even |= 1U << (nVRB_even_dist - 32);
 
       // Distributed Gap1, odd slot
       nVRB_odd_dist = get_prb(50,1,nVRB,0);
       if (nVRB_odd_dist<32)
-        allocdist0_0_odd |= (1<<nVRB_odd_dist);
+        allocdist0_0_odd |= (1U <<nVRB_odd_dist);
       else
-        allocdist1_0_odd |= (1<<(nVRB_odd_dist-32));
+        allocdist1_0_odd |= (1U <<(nVRB_odd_dist-32));
 
       // Distributed Gap2, even slot
       nVRB_even_dist = get_prb(50,0,nVRB,1);
       if (nVRB_even_dist<32)
-        allocdist0_1_even |= (1<<nVRB_even_dist);
+        allocdist0_1_even |= 1U << nVRB_even_dist;
       else
-        allocdist1_1_even |= (1<<(nVRB_even_dist-32));
+        allocdist1_1_even |= 1U << (nVRB_even_dist - 32);
 
       // Distributed Gap2, odd slot
       nVRB_odd_dist = get_prb(50,1,nVRB,1);
       if (nVRB_odd_dist<32)
-        allocdist0_1_odd |= (1<<nVRB_odd_dist);
+        allocdist0_1_odd |= 1U << nVRB_odd_dist;
       else
-        allocdist1_1_odd |= (1<<(nVRB_odd_dist-32));
+        allocdist1_1_odd |= 1U << (nVRB_odd_dist - 32);
 
       RIV=computeRIV(50,RBstart,Lcrbs);
 
@@ -811,13 +815,13 @@ void generate_RIV_tables(void)
       nVRB = Lcrbs-1+RBstart;
 
       if (nVRB<32)
-        alloc0 |= (1<<nVRB);
+        alloc0 |= 1U << nVRB;
       else if (nVRB<64)
-        alloc1 |= (1<<(nVRB-32));
+        alloc1 |= 1U << (nVRB - 32);
       else if (nVRB<96)
-        alloc2 |= (1<<(nVRB-64));
+        alloc2 |= 1U << (nVRB - 64);
       else
-        alloc3 |= (1<<(nVRB-96));
+        alloc3 |= 1U << (nVRB - 96);
 
       // Distributed Gap1, even slot
       nVRB_even_dist = get_prb(100,0,nVRB,0);
@@ -825,15 +829,14 @@ void generate_RIV_tables(void)
 //      if ((RBstart==0) && (Lcrbs<=8))
 //  printf("nVRB %d => nVRB_even_dist %d\n",nVRB,nVRB_even_dist);
 
-
       if (nVRB_even_dist<32)
-        allocdist0_0_even |= (1<<nVRB_even_dist);
+        allocdist0_0_even |= 1U << nVRB_even_dist;
       else if (nVRB_even_dist<64)
-        allocdist1_0_even |= (1<<(nVRB_even_dist-32));
+        allocdist1_0_even |= 1U << (nVRB_even_dist - 32);
       else if (nVRB_even_dist<96)
-  allocdist2_0_even |= (1<<(nVRB_even_dist-64));
+        allocdist2_0_even |= 1U << (nVRB_even_dist - 64);
       else
-  allocdist3_0_even |= (1<<(nVRB_even_dist-96));
+        allocdist3_0_even |= 1U << (nVRB_even_dist - 96);
 /*      if ((RBstart==0) && (Lcrbs<=8))
   printf("rballoc =>(%08x.%08x.%08x.%08x)\n",
          allocdist0_0_even,
@@ -845,38 +848,37 @@ void generate_RIV_tables(void)
       // Distributed Gap1, odd slot
       nVRB_odd_dist = get_prb(100,1,nVRB,0);
       if (nVRB_odd_dist<32)
-        allocdist0_0_odd |= (1<<nVRB_odd_dist);
+        allocdist0_0_odd |= 1U << nVRB_odd_dist;
       else if (nVRB_odd_dist<64)
-        allocdist1_0_odd |= (1<<(nVRB_odd_dist-32));
+        allocdist1_0_odd |= 1U << (nVRB_odd_dist - 32);
       else if (nVRB_odd_dist<96)
-  allocdist2_0_odd |= (1<<(nVRB_odd_dist-64));
+        allocdist2_0_odd |= 1U << (nVRB_odd_dist - 64);
       else
-  allocdist3_0_odd |= (1<<(nVRB_odd_dist-96));
+        allocdist3_0_odd |= 1U << (nVRB_odd_dist - 96);
 
 
       // Distributed Gap2, even slot
       nVRB_even_dist = get_prb(100,0,nVRB,1);
       if (nVRB_even_dist<32)
-        allocdist0_1_even |= (1<<nVRB_even_dist);
+        allocdist0_1_even |= 1U << nVRB_even_dist;
       else if (nVRB_even_dist<64)
-        allocdist1_1_even |= (1<<(nVRB_even_dist-32));
+        allocdist1_1_even |= 1U << (nVRB_even_dist - 32);
       else if (nVRB_even_dist<96)
-  allocdist2_1_even |= (1<<(nVRB_even_dist-64));
+        allocdist2_1_even |= 1U << (nVRB_even_dist - 64);
       else
-  allocdist3_1_even |= (1<<(nVRB_even_dist-96));
+        allocdist3_1_even |= 1U << (nVRB_even_dist - 96);
 
 
       // Distributed Gap2, odd slot
       nVRB_odd_dist = get_prb(100,1,nVRB,1);
       if (nVRB_odd_dist<32)
-        allocdist0_1_odd |= (1<<nVRB_odd_dist);
+        allocdist0_1_odd |= 1U << nVRB_odd_dist;
       else if (nVRB_odd_dist<64)
-        allocdist1_1_odd |= (1<<(nVRB_odd_dist-32));
+        allocdist1_1_odd |= 1U << (nVRB_odd_dist - 32);
       else if (nVRB_odd_dist<96)
-  allocdist2_1_odd |= (1<<(nVRB_odd_dist-64));
+        allocdist2_1_odd |= 1U << (nVRB_odd_dist - 64);
       else
-  allocdist3_1_odd |= (1<<(nVRB_odd_dist-96));
-
+        allocdist3_1_odd |= 1U << (nVRB_odd_dist - 96);
 
       RIV=computeRIV(100,RBstart,Lcrbs);
 
diff --git a/openair1/PHY/LTE_TRANSPORT/defs_NB_IoT.h b/openair1/PHY/LTE_TRANSPORT/defs_NB_IoT.h
index 3574ba67405c271fefe0a43d01936fb49010efd6..d90216c3e6ace8f32baae4ccf13de9d7d4ccd345 100644
--- a/openair1/PHY/LTE_TRANSPORT/defs_NB_IoT.h
+++ b/openair1/PHY/LTE_TRANSPORT/defs_NB_IoT.h
@@ -509,7 +509,7 @@ typedef struct {
   /// Position of first CCE of the dci
   int                   firstCCE;
   /// flag to indicate that this is a RA response
-  boolean_t      ra_flag;
+  bool                  ra_flag;
   /// rnti
   rnti_t                rnti;
   /// Format
diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c b/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c
index 3ccbd8ca35ad7218ffccebfee25c00fd35816261..13109d8f5a19286d43644e2d30a63fdda4755575 100644
--- a/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c
+++ b/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c
@@ -288,7 +288,7 @@ static void TPencode(void * arg) {
   LTE_DL_eNB_HARQ_t *hadlsch=rdata->dlsch->harq_processes[harq_pid];
   
   if ( rdata-> round == 0) {
-    uint8_t tmp[96+12+3+3*6144];
+    uint8_t tmp[96+12+3+3*6144] __attribute__((aligned(32)));
     memset(tmp,LTE_NULL, TURBO_SIMD_SOFTBITS);
     start_meas(rdata->te_stats);
     encoder(rdata->input,
diff --git a/openair1/PHY/LTE_UE_TRANSPORT/dci_tools_ue.c b/openair1/PHY/LTE_UE_TRANSPORT/dci_tools_ue.c
index 088e2c0a5e29665d2d64ba86e7a374906af00c52..b5e5b490a352c5c075475f1c24263b1dbf321ab2 100644
--- a/openair1/PHY/LTE_UE_TRANSPORT/dci_tools_ue.c
+++ b/openair1/PHY/LTE_UE_TRANSPORT/dci_tools_ue.c
@@ -64,6 +64,12 @@ extern uint16_t beta_cqi[16];
 extern uint16_t beta_ri[16];
 extern uint16_t beta_ack[16];
 
+static int errorRB(int rb, char * table, int line) {
+  LOG_E(PHY,"Received %d rb, impossble in table %s, at line %d\n", rb, table, line);
+  return 0;
+}
+
+#define rbAllocCheck(RBalL, TabLe) (RBalL) > sizeof(TabLe)/sizeof(*TabLe) ? errorRB(RBalL, #TabLe, __LINE__) : TabLe[RBalL]
 void extract_dci1A_info(uint8_t N_RB_DL, frame_type_t frame_type, void *dci_pdu, DCI_INFO_EXTRACTED_t *pdci_info_extarcted)
 {
     uint8_t harq_pid=0;
@@ -974,28 +980,28 @@ int check_dci_format1_1a_coherency(DCI_format_t dci_format,
     {
         switch (N_RB_DL) {
         case 6:
-            NPRB     = RIV2nb_rb_LUT6[rballoc];//NPRB;
+            NPRB     = rbAllocCheck(rballoc, RIV2nb_rb_LUT6);
             if(rah)
               RIV_max  = RIV_max6;
             else
               RIV_max  = 0x3F;
             break;
         case 25:
-            NPRB     = RIV2nb_rb_LUT25[rballoc];//NPRB;
+            NPRB     =  rbAllocCheck(rballoc,RIV2nb_rb_LUT25);
             if(rah)
               RIV_max  = RIV_max25;
             else
               RIV_max  = 0x1FFF;
             break;
         case 50:
-            NPRB     = RIV2nb_rb_LUT50[rballoc];//NPRB;
+            NPRB     =  rbAllocCheck(rballoc,RIV2nb_rb_LUT50);
             if(rah)
               RIV_max  = RIV_max50;
             else
               RIV_max  = 0x1FFFF;
             break;
         case 100:
-            NPRB     = RIV2nb_rb_LUT100[rballoc];//NPRB;
+            NPRB     =  rbAllocCheck(rballoc,RIV2nb_rb_LUT100);
             if(rah)
               RIV_max  = RIV_max100;
             else
@@ -1034,9 +1040,14 @@ int check_dci_format1_1a_coherency(DCI_format_t dci_format,
             // this is an eNB issue
             // retransmisison but old and new TBS are different !!!
             // work around, consider it as a new transmission
-            LOG_E(PHY,"Format1A Retransmission but TBS are different: consider it as new transmission !!! \n");
+            LOG_E(PHY,
+                  "Format1A Retransmission but TBS are different: consider it as new transmission !!!, round %d, mcs 1 %d, NPRB %d \n",
+                  pdlsch0_harq->round,
+                  mcs1,
+                  NPRB);
             pdlsch0_harq->round = 0;
             //return(0); // ?? to cross check
+	  return(0); // ?? to cross check
         }
     }
 
diff --git a/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c b/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c
index 0b665737a7beb1ae27427d07a98a558a82874ed6..8f5e33d6e002467a8c13a3518d4bfafc554e7d2d 100644
--- a/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c
+++ b/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c
@@ -41,7 +41,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <linux/version.h>
-#if RHEL_RELEASE_CODE >= 1796
+#if defined RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= 1796 && RHEL_RELEASE_CODE != 2403
   #include <lapacke/lapacke_utils.h>
   #include <lapacke/lapacke.h>
 #else
diff --git a/openair1/PHY/LTE_UE_TRANSPORT/linear_preprocessing_rec.c b/openair1/PHY/LTE_UE_TRANSPORT/linear_preprocessing_rec.c
index 7d063e326effc919180e5ebe12c02fa19d85b6a2..83c74389cf2d0d92ea86a8db07fd5ae5b561637c 100644
--- a/openair1/PHY/LTE_UE_TRANSPORT/linear_preprocessing_rec.c
+++ b/openair1/PHY/LTE_UE_TRANSPORT/linear_preprocessing_rec.c
@@ -14,7 +14,7 @@ data storage. */
 #include <cblas.h>
 #include <string.h>
 #include <linux/version.h>
-#if RHEL_RELEASE_CODE >= 1796
+#if defined RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= 1796 && RHEL_RELEASE_CODE != 2403
 #include <lapacke/lapacke_utils.h>
 #include <lapacke/lapacke.h>
 #else
diff --git a/openair1/PHY/LTE_UE_TRANSPORT/transport_proto_ue.h b/openair1/PHY/LTE_UE_TRANSPORT/transport_proto_ue.h
index f5b8c6b64a0e287f90078bfbb407171ae6836705..36da4ccab0e8860d4ca875053faa38cfaf34b5cf 100644
--- a/openair1/PHY/LTE_UE_TRANSPORT/transport_proto_ue.h
+++ b/openair1/PHY/LTE_UE_TRANSPORT/transport_proto_ue.h
@@ -1272,14 +1272,6 @@ uint32_t get_TBS_DL(uint8_t mcs, uint16_t nb_rb);
     @return Transport block size */
 uint32_t get_TBS_UL(uint8_t mcs, uint16_t nb_rb);
 
-/* \brief Return bit-map of resource allocation for a given DCI rballoc (RIV format) and vrb type
-   @param N_RB_DL number of PRB on DL
-   @param indicator for even/odd slot
-   @param vrb vrb index
-   @param Ngap Gap indicator
-*/
-uint32_t get_prb(int N_RB_DL,int odd_slot,int vrb,int Ngap);
-
 /* \brief Return prb for a given vrb index
    @param vrb_type VRB type (0=localized,1=distributed)
    @param rb_alloc_dci rballoc field from DCI
diff --git a/openair1/PHY/LTE_UE_TRANSPORT/transport_ue.h b/openair1/PHY/LTE_UE_TRANSPORT/transport_ue.h
index b4ae44f6eab8b663a98de22b151338385c76bf33..5f8763414ef9ec6123d2fc52678267731704beb2 100644
--- a/openair1/PHY/LTE_UE_TRANSPORT/transport_ue.h
+++ b/openair1/PHY/LTE_UE_TRANSPORT/transport_ue.h
@@ -90,7 +90,7 @@ typedef struct {
   /// Redundancy-version of the current sub-frame
   uint8_t rvidx;
   /// Turbo-code outputs (36-212 V8.6 2009-03, p.12
-  uint8_t d[MAX_NUM_ULSCH_SEGMENTS][(96+3+(3*6144))];
+  uint8_t *d[MAX_NUM_ULSCH_SEGMENTS];
   /// Sub-block interleaver outputs (36-212 V8.6 2009-03, p.16-17)
   uint8_t w[MAX_NUM_ULSCH_SEGMENTS][3*6144];
   /// Number of code segments (for definition see 36-212 V8.6 2009-03, p.9)
diff --git a/openair1/PHY/LTE_UE_TRANSPORT/ulsch_coding.c b/openair1/PHY/LTE_UE_TRANSPORT/ulsch_coding.c
index ae3ebbce9dc0ba96df89af0ba7875bf3e7880df8..c04ec160aa1b80356a74d52dd64fbada063b4270 100644
--- a/openair1/PHY/LTE_UE_TRANSPORT/ulsch_coding.c
+++ b/openair1/PHY/LTE_UE_TRANSPORT/ulsch_coding.c
@@ -71,6 +71,7 @@ void free_ue_ulsch(LTE_UE_ULSCH_t *ulsch) {
         for (r=0; r<MAX_NUM_ULSCH_SEGMENTS; r++) {
           if (ulsch->harq_processes[i]->c[r]) {
             free16(ulsch->harq_processes[i]->c[r],((r==0)?8:0) + 3+768);
+            free16(ulsch->harq_processes[i]->d[r],0);
             ulsch->harq_processes[i]->c[r] = NULL;
           }
         }
@@ -86,7 +87,7 @@ void free_ue_ulsch(LTE_UE_ULSCH_t *ulsch) {
 
 LTE_UE_ULSCH_t *new_ue_ulsch(unsigned char N_RB_UL, uint8_t abstraction_flag) {
   LTE_UE_ULSCH_t *ulsch;
-  unsigned char exit_flag = 0,i,j,r;
+  unsigned char exit_flag = 0;
   unsigned char bw_scaling =1;
 
   switch (N_RB_UL) {
@@ -113,7 +114,7 @@ LTE_UE_ULSCH_t *new_ue_ulsch(unsigned char N_RB_UL, uint8_t abstraction_flag) {
     memset(ulsch,0,sizeof(LTE_UE_ULSCH_t));
     ulsch->Mlimit = 4;
 
-    for (i=0; i<8; i++) {
+    for (int i=0; i<8; i++) {
       ulsch->harq_processes[i] = (LTE_UL_UE_HARQ_t *)malloc16(sizeof(LTE_UL_UE_HARQ_t));
 
       //      printf("ulsch->harq_processes[%d] %p\n",i,ulsch->harq_processes[i]);
@@ -129,15 +130,11 @@ LTE_UE_ULSCH_t *new_ue_ulsch(unsigned char N_RB_UL, uint8_t abstraction_flag) {
         }
 
         if (abstraction_flag==0) {
-          for (r=0; r<MAX_NUM_ULSCH_SEGMENTS; r++) {
-            ulsch->harq_processes[i]->c[r] = (unsigned char *)malloc16(((r==0)?8:0) + 3+768); // account for filler in first segment and CRCs for multiple segment case
-
-            if (ulsch->harq_processes[i]->c[r])
-              memset(ulsch->harq_processes[i]->c[r],0,((r==0)?8:0) + 3+768);
-            else {
-              LOG_E(PHY,"Can't get c\n");
-              exit_flag=2;
-            }
+          for (int r=0; r<MAX_NUM_ULSCH_SEGMENTS; r++) {
+            ulsch->harq_processes[i]->c[r] = malloc16_clear(((r==0)?8:0) + 3+768); // account for filler in first segment and CRCs for multiple segment case
+            AssertFatal(ulsch->harq_processes[i]->c[r], "");
+            ulsch->harq_processes[i]->d[r] = malloc16_clear(96+3+(3*6144));
+            AssertFatal(ulsch->harq_processes[i]->d[r], "");
           }
         }
 
@@ -148,15 +145,7 @@ LTE_UE_ULSCH_t *new_ue_ulsch(unsigned char N_RB_UL, uint8_t abstraction_flag) {
         exit_flag=3;
       }
     }
-
-    if ((abstraction_flag == 0) && (exit_flag==0)) {
-      for (i=0; i<8; i++)
-        for (j=0; j<96; j++)
-          for (r=0; r<MAX_NUM_ULSCH_SEGMENTS; r++)
-            ulsch->harq_processes[i]->d[r][j] = LTE_NULL;
-
-      return(ulsch);
-    } else if (abstraction_flag==1)
+    if (!exit_flag)
       return(ulsch);
   }
 
@@ -191,7 +180,7 @@ uint32_t ulsch_encoding(uint8_t *a,
   uint32_t Qprime_ACK=0,Qprime_CQI=0,Qprime_RI=0,len_ACK=0,len_RI=0;
   //  uint32_t E;
   uint8_t ack_parity;
-  uint32_t i,q,j,iprime,j2;
+  uint32_t q,j,iprime,j2;
   uint16_t o_RCC;
   uint8_t o_flip[8];
   uint32_t wACK_idx;
@@ -327,6 +316,8 @@ uint32_t ulsch_encoding(uint8_t *a,
 #endif
         //  offset=0;
         start_meas(te_stats);
+        for (int z=0; z<96; z++)
+            ulsch->harq_processes[harq_pid]->d[r][z] = LTE_NULL;
         encoder(ulsch->harq_processes[harq_pid]->c[r],
                 Kr>>3,
                 &ulsch->harq_processes[harq_pid]->d[r][96],
@@ -539,8 +530,6 @@ uint32_t ulsch_encoding(uint8_t *a,
                          ulsch->q);
   }
 
-  i=0;
-
   //  Do RI coding
   if (ulsch->O_RI == 1) {
     switch (Q_m) {
@@ -691,7 +680,7 @@ uint32_t ulsch_encoding(uint8_t *a,
 
   j=0;
 
-  for (i=0; i<Qprime_RI; i++) {
+  for (int i=0; i<Qprime_RI; i++) {
     r = Rmux_prime - 1 - (i>>2);
 
     for (q=0; q<Q_m; q++)  {
@@ -725,7 +714,7 @@ uint32_t ulsch_encoding(uint8_t *a,
   }
   */
 
-  for (i=0; i<Qprime_CQI; i++) {
+  for (int i=0; i<Qprime_CQI; i++) {
     while (y[Q_m*j] != LTE_NULL) j++;
 
     for (q=0; q<Q_m; q++) {
@@ -788,7 +777,7 @@ uint32_t ulsch_encoding(uint8_t *a,
 
   j=0;
 
-  for (i=0; i<Qprime_ACK; i++) {
+  for (int i=0; i<Qprime_ACK; i++) {
     r = Rmux_prime - 1 - (i>>2);
 
     for (q=0; q<Q_m; q++) {
@@ -808,7 +797,7 @@ uint32_t ulsch_encoding(uint8_t *a,
 
   switch (Q_m) {
     case 2:
-      for (i=0; i<Cmux; i++)
+      for (int i=0; i<Cmux; i++)
         for (r=0; r<Rmux_prime; r++) {
           yptr=&y[((r*Cmux)+i)<<1];
           ulsch->h[j++] = *yptr++;
@@ -818,7 +807,7 @@ uint32_t ulsch_encoding(uint8_t *a,
       break;
 
     case 4:
-      for (i=0; i<Cmux; i++)
+      for (int i=0; i<Cmux; i++)
         for (r=0; r<Rmux_prime; r++) {
           yptr = &y[((r*Cmux)+i)<<2];
           ulsch->h[j++] = *yptr++;
@@ -830,7 +819,7 @@ uint32_t ulsch_encoding(uint8_t *a,
       break;
 
     case 6:
-      for (i=0; i<Cmux; i++)
+      for (int i=0; i<Cmux; i++)
         for (r=0; r<Rmux_prime; r++) {
           yptr = &y[((r*Cmux)+i)*6];
           ulsch->h[j++] = *yptr++;
diff --git a/openair1/PHY/MODULATION/nr_modulation.c b/openair1/PHY/MODULATION/nr_modulation.c
index b1a108f24756294a2ce77390db3d667779ae435d..1b5c4f4af0a433611d28fb8ff98a3a775d2532ae 100644
--- a/openair1/PHY/MODULATION/nr_modulation.c
+++ b/openair1/PHY/MODULATION/nr_modulation.c
@@ -226,10 +226,11 @@ void nr_modulation(uint32_t *in,
     i *= 24;
     bit_cnt = i * 8;
     while (bit_cnt < length) {
-      x = *((uint32_t*)(in_bytes+i));
-      x1 = x&4095;
+      uint32_t xx;
+      memcpy(&xx, in_bytes+i, sizeof(xx));
+      x1 = xx & 4095;
       out64[j++] = nr_64qam_mod_table[x1];
-      x1 = (x>>12)&4095;
+      x1 = (xx >> 12) & 4095;
       out64[j++] = nr_64qam_mod_table[x1];
       i += 3;
       bit_cnt += 24;
@@ -618,20 +619,20 @@ void init_symbol_rotation(NR_DL_FRAME_PARMS *fp) {
 
     double f0 = f[ll];
     double Ncpm1 = Ncp0;
-    int16_t *symbol_rotation = fp->symbol_rotation[ll];
+    c16_t *symbol_rotation = fp->symbol_rotation[ll];
 
     double tl = 0;
     double poff = 2 * M_PI * ((Ncp0 * Tc)) * f0;
     double exp_re = cos(poff);
     double exp_im = sin(-poff);
-    symbol_rotation[0] = (int16_t)floor(exp_re * 32767);
-    symbol_rotation[1] = (int16_t)floor(exp_im * 32767);
+    symbol_rotation[0].r = (int16_t)floor(exp_re * 32767);
+    symbol_rotation[0].i = (int16_t)floor(exp_im * 32767);
     LOG_I(PHY, "Doing symbol rotation calculation for gNB TX/RX, f0 %f Hz, Nsymb %d\n", f0, nsymb);
     LOG_I(PHY, "Symbol rotation %d/%d => (%d,%d)\n",
       0,
       nsymb,
-      symbol_rotation[0],
-      symbol_rotation[1]);
+      symbol_rotation[0].r,
+      symbol_rotation[0].i);
 
     for (int l = 1; l < nsymb; l++) {
 
@@ -646,15 +647,15 @@ void init_symbol_rotation(NR_DL_FRAME_PARMS *fp) {
       poff = 2 * M_PI * (tl + (Ncp * Tc)) * f0;
       exp_re = cos(poff);
       exp_im = sin(-poff);
-      symbol_rotation[l<<1] = (int16_t)floor(exp_re * 32767);
-      symbol_rotation[1 + (l<<1)] = (int16_t)floor(exp_im * 32767);
+      symbol_rotation[l].r = (int16_t)floor(exp_re * 32767);
+      symbol_rotation[l].i = (int16_t)floor(exp_im * 32767);
 
       LOG_I(PHY, "Symbol rotation %d/%d => tl %f (%d,%d) (%f)\n",
         l,
         nsymb,
         tl,
-        symbol_rotation[l<<1],
-        symbol_rotation[1 + (l<<1)],
+        symbol_rotation[l].r,
+        symbol_rotation[l].i,
         (poff / 2 / M_PI) - floor(poff / 2 / M_PI));
 
       Ncpm1 = Ncp;
@@ -665,17 +666,18 @@ void init_symbol_rotation(NR_DL_FRAME_PARMS *fp) {
 
 void init_timeshift_rotation(NR_DL_FRAME_PARMS *fp)
 {
+  const int sample_offset = fp->nb_prefix_samples / fp->ofdm_offset_divisor;
   for (int i = 0; i < fp->ofdm_symbol_size; i++) {
-    double poff = -i * 2.0 * M_PI * 144.0 / 2048.0 / fp->ofdm_offset_divisor;
+    double poff = -i * 2.0 * M_PI * sample_offset / fp->ofdm_symbol_size;
     double exp_re = cos(poff);
     double exp_im = sin(-poff);
-    fp->timeshift_symbol_rotation[i*2] = (int16_t)round(exp_re * 32767);
-    fp->timeshift_symbol_rotation[i*2+1] = (int16_t)round(exp_im * 32767);
+    fp->timeshift_symbol_rotation[i].r = (int16_t)round(exp_re * 32767);
+    fp->timeshift_symbol_rotation[i].i = (int16_t)round(exp_im * 32767);
 
     if (i < 10)
       LOG_I(PHY,"Timeshift symbol rotation %d => (%d,%d) %f\n",i,
-            fp->timeshift_symbol_rotation[i*2],
-            fp->timeshift_symbol_rotation[i*2+1],
+            fp->timeshift_symbol_rotation[i].r,
+            fp->timeshift_symbol_rotation[i].i,
             poff);
   }
 }
diff --git a/openair1/PHY/MODULATION/ofdm_mod.c b/openair1/PHY/MODULATION/ofdm_mod.c
index a2e565b61eb0982fd45906b97f4f96b850254326..4eaabe39b96b6a10acadd1f17c8e39d05c7c1ad7 100644
--- a/openair1/PHY/MODULATION/ofdm_mod.c
+++ b/openair1/PHY/MODULATION/ofdm_mod.c
@@ -46,18 +46,18 @@ void normal_prefix_mod(int32_t *txdataF,int32_t *txdata,uint8_t nsymb,LTE_DL_FRA
 
   
   PHY_ofdm_mod(txdataF,        // input
-	       txdata,         // output
-	       frame_parms->ofdm_symbol_size,                
+               txdata,         // output
+               frame_parms->ofdm_symbol_size,                
 
-	       1,                 // number of symbols
-	       frame_parms->nb_prefix_samples0,               // number of prefix samples
-	       CYCLIC_PREFIX);
+               1,                 // number of symbols
+               frame_parms->nb_prefix_samples0,               // number of prefix samples
+               CYCLIC_PREFIX);
   PHY_ofdm_mod(txdataF+frame_parms->ofdm_symbol_size,        // input
-	       txdata+OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES0,         // output
-	       frame_parms->ofdm_symbol_size,                
-	       nsymb-1,
-	       frame_parms->nb_prefix_samples,               // number of prefix samples
-	       CYCLIC_PREFIX);
+               txdata+OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES0,         // output
+               frame_parms->ofdm_symbol_size,                
+               nsymb-1,
+               frame_parms->nb_prefix_samples,               // number of prefix samples
+               CYCLIC_PREFIX);
   
 
   
@@ -345,14 +345,14 @@ void do_OFDM_mod(int32_t **txdataF, int32_t **txdata, uint32_t frame,uint16_t ne
 }
 
 void apply_nr_rotation(NR_DL_FRAME_PARMS *fp,
-		       int16_t* trxdata,
-		       int slot,
-		       int first_symbol,
-		       int nsymb,
-		       int length) {
+                       int16_t* trxdata,
+                       int slot,
+                       int first_symbol,
+                       int nsymb,
+                       int length) {
   int symb_offset = (slot%fp->slots_per_subframe)*fp->symbols_per_slot;
 
-  int16_t *symbol_rotation = fp->symbol_rotation[0];
+  c16_t *symbol_rotation = fp->symbol_rotation[0];
 
   for (int sidx=0;sidx<nsymb;sidx++) {
 
@@ -361,14 +361,14 @@ void apply_nr_rotation(NR_DL_FRAME_PARMS *fp,
       slot,
       sidx + first_symbol + symb_offset,
       length,
-      symbol_rotation[2 * (sidx + first_symbol + symb_offset)],
-      symbol_rotation[1 + 2 * (sidx + first_symbol + symb_offset)]);
+      symbol_rotation[sidx + first_symbol + symb_offset].r,
+      symbol_rotation[sidx + first_symbol + symb_offset].i);
 
-    rotate_cpx_vector(trxdata + (sidx * length * 2),
-                      &symbol_rotation[2 * (sidx + first_symbol + symb_offset)],
-                      trxdata + (sidx * length * 2),
+    rotate_cpx_vector(((c16_t*) trxdata) + sidx * length,
+                      symbol_rotation + sidx + first_symbol + symb_offset,
+                      ((c16_t*) trxdata) + sidx * length,
                       length,
                       15);
   }
 }
-		       
+                       
diff --git a/openair1/PHY/MODULATION/slot_fep_nr.c b/openair1/PHY/MODULATION/slot_fep_nr.c
index 232ddffd269e4ac0359828ade03bc4686b6c328e..548db21878e5fb870ab547d62f1c148db456666c 100644
--- a/openair1/PHY/MODULATION/slot_fep_nr.c
+++ b/openair1/PHY/MODULATION/slot_fep_nr.c
@@ -34,53 +34,6 @@
 #define LOG_I(A,B...) printf(A)
 #endif*/
 
-dft_size_idx_t get_dft_size_idx(uint16_t ofdm_symbol_size)
-{
-  switch (ofdm_symbol_size) {
-  case 128:
-    return DFT_128;
-
-  case 256:
-    return DFT_256;
-
-  case 384:
-    return DFT_384;
-
-  case 512:
-    return DFT_512;
-
-  case 768:
-    return DFT_768;
-
-  case 1024:
-    return DFT_1024;
-
-  case 1536:
-    return DFT_1536;
-
-  case 2048:
-    return DFT_2048;
-
-  case 3072:
-    return DFT_3072;
-
-  case 4096:
-    return DFT_4096;
-
-  case 6144:
-    return DFT_6144;
-
-  case 8192:
-    return DFT_8192;
-
-  default:
-    printf("unsupported ofdm symbol size \n");
-    assert(0);
-  }
-
-  return DFT_SIZE_IDXTABLESIZE;
-}
-
 int nr_slot_fep(PHY_VARS_NR_UE *ue,
                 UE_nr_rxtx_proc_t *proc,
                 unsigned char symbol,
@@ -102,7 +55,7 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue,
     nb_prefix_samples0 = frame_parms->nb_prefix_samples;
   }
 
-  dft_size_idx_t dftsize = get_dft_size_idx(frame_parms->ofdm_symbol_size);
+  dft_size_idx_t dftsize = get_dft(frame_parms->ofdm_symbol_size);
   // This is for misalignment issues
   int32_t tmp_dft_in[8192] __attribute__ ((aligned (32)));
 
@@ -145,25 +98,25 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue,
     stop_meas(&ue->rx_dft_stats);
 
     int symb_offset = (Ns%frame_parms->slots_per_subframe)*frame_parms->symbols_per_slot;
-    int32_t rot2 = ((uint32_t*)frame_parms->symbol_rotation[0])[symbol+symb_offset];
-    ((int16_t*)&rot2)[1]=-((int16_t*)&rot2)[1];
+    c16_t rot2 = frame_parms->symbol_rotation[0][symbol+symb_offset];
+    rot2.i=-rot2.i;
 
 #ifdef DEBUG_FEP
     //  if (ue->frame <100)
     printf("slot_fep: slot %d, symbol %d rx_offset %u, rotation symbol %d %d.%d\n", Ns,symbol, rx_offset,
-	   symbol+symb_offset,((int16_t*)&rot2)[0],((int16_t*)&rot2)[1]);
+	   symbol+symb_offset,rot2.r,rot2.i);
 #endif
 
-    rotate_cpx_vector((int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
-		      (int16_t*)&rot2,
-		      (int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
+    rotate_cpx_vector((c16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
+		      &rot2,
+		      (c16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
 		      frame_parms->ofdm_symbol_size,
 		      15);
 
-    int16_t *shift_rot = frame_parms->timeshift_symbol_rotation;
+    c16_t *shift_rot = frame_parms->timeshift_symbol_rotation;
 
     multadd_cpx_vector((int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
-          shift_rot,
+          (int16_t *)shift_rot,
           (int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
           1,
           frame_parms->ofdm_symbol_size,
@@ -201,7 +154,7 @@ int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue,
   }
   unsigned int frame_length_samples = frame_parms->samples_per_frame;
 
-  dft_size_idx_t dftsize = get_dft_size_idx(frame_parms->ofdm_symbol_size);
+  dft_size_idx_t dftsize = get_dft(frame_parms->ofdm_symbol_size);
   // This is for misalignment issues
   int32_t tmp_dft_in[8192] __attribute__ ((aligned (32)));
 
@@ -261,18 +214,18 @@ int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue,
     stop_meas(&ue->rx_dft_stats);
 
     int symb_offset = (Ns%frame_parms->slots_per_subframe)*frame_parms->symbols_per_slot;
-    int32_t rot2 = ((uint32_t*)frame_parms->symbol_rotation[0])[symbol + symb_offset];
-    ((int16_t*)&rot2)[1]=-((int16_t*)&rot2)[1];
+    c16_t rot2 = frame_parms->symbol_rotation[0][symbol + symb_offset];
+    rot2.i=-rot2.i;
 
 #ifdef DEBUG_FEP
     //  if (ue->frame <100)
     printf("slot_fep: slot %d, symbol %d rx_offset %u, rotation symbol %d %d.%d\n", Ns,symbol, rx_offset,
-	   symbol+symb_offset,((int16_t*)&rot2)[0],((int16_t*)&rot2)[1]);
+	   symbol+symb_offset,rot2.r,rot2.i);
 #endif
 
-    rotate_cpx_vector((int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
-		      (int16_t*)&rot2,
-		      (int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
+    rotate_cpx_vector((c16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
+		      &rot2,
+		      (c16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
 		      frame_parms->ofdm_symbol_size,
 		      15);
   }
@@ -295,7 +248,7 @@ int nr_slot_fep_ul(NR_DL_FRAME_PARMS *frame_parms,
   unsigned int nb_prefix_samples  = frame_parms->nb_prefix_samples;
   unsigned int nb_prefix_samples0 = frame_parms->nb_prefix_samples0;
   
-  dft_size_idx_t dftsize = get_dft_size_idx(frame_parms->ofdm_symbol_size);
+  dft_size_idx_t dftsize = get_dft(frame_parms->ofdm_symbol_size);
   // This is for misalignment issues
   int32_t tmp_dft_in[8192] __attribute__ ((aligned (32)));
 
@@ -357,19 +310,19 @@ void apply_nr_rotation_ul(NR_DL_FRAME_PARMS *frame_parms,
 
   for (int symbol=first_symbol;symbol<nsymb;symbol++) {
     
-    uint32_t rot2 = ((uint32_t*)frame_parms->symbol_rotation[1])[symbol + symb_offset];
-    ((int16_t*)&rot2)[1]=-((int16_t*)&rot2)[1];
-    LOG_D(PHY,"slot %d, symb_offset %d rotating by %d.%d\n",slot,symb_offset,((int16_t*)&rot2)[0],((int16_t*)&rot2)[1]);
-    rotate_cpx_vector((int16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)],
-		      (int16_t*)&rot2,
-		      (int16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)],
+    c16_t rot2 = frame_parms->symbol_rotation[1][symbol + symb_offset];
+    rot2.i=-rot2.i;
+    LOG_D(PHY,"slot %d, symb_offset %d rotating by %d.%d\n",slot,symb_offset,rot2.r,rot2.i);
+    rotate_cpx_vector((c16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)],
+		      &rot2,
+		      (c16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)],
 		      length,
 		      15);
 
-    int16_t *shift_rot = frame_parms->timeshift_symbol_rotation;
+    c16_t *shift_rot = frame_parms->timeshift_symbol_rotation;
 
     multadd_cpx_vector((int16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)],
-          shift_rot,
+          (int16_t *)shift_rot,
           (int16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)],
           1,
           length,
diff --git a/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c b/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c
index fb56322e5440a89705f57faff5b96bb8b30aa29c..c527c3fc9df083c115f095d1d655e1c35a81c98f 100644
--- a/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c
+++ b/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c
@@ -67,6 +67,49 @@ int nr_est_timing_advance_pusch(PHY_VARS_gNB* gNB, int UE_id)
   return max_pos - sync_pos;
 }
 
+int nr_est_timing_advance_srs(const NR_DL_FRAME_PARMS *frame_parms,
+                              const int32_t srs_estimated_channel_time[][frame_parms->ofdm_symbol_size]) {
+  int timing_advance = 0;
+  int max_val = 0;
+
+  for (int i = 0; i < frame_parms->ofdm_symbol_size; i++) {
+    int temp = 0;
+    for (int aa = 0; aa < frame_parms->nb_antennas_rx; aa++) {
+      int Re = ((c16_t*)srs_estimated_channel_time[aa])[i].r;
+      int Im = ((c16_t*)srs_estimated_channel_time[aa])[i].i;
+      temp += (Re*Re/2) + (Im*Im/2);
+    }
+    if (temp > max_val) {
+      timing_advance = i;
+      max_val = temp;
+    }
+  }
+
+  if (timing_advance > frame_parms->ofdm_symbol_size/2) {
+    timing_advance = timing_advance - frame_parms->ofdm_symbol_size;
+  }
+
+  // Scale the 16 factor in N_TA calculation in 38.213 section 4.2 according to the used FFT size
+  const uint16_t bw_scaling = frame_parms->ofdm_symbol_size >> 7;
+
+  // do some integer rounding to improve TA accuracy
+  int sync_pos_rounded;
+  if (timing_advance > 0) {
+    sync_pos_rounded = timing_advance + (bw_scaling >> 1) - 1;
+  } else {
+    sync_pos_rounded = timing_advance - (bw_scaling >> 1) + 1;
+  }
+
+  int timing_advance_update = sync_pos_rounded / bw_scaling;
+
+  // put timing advance command in 0..63 range
+  timing_advance_update += 31;
+
+  if (timing_advance_update < 0)  timing_advance_update = 0;
+  if (timing_advance_update > 63) timing_advance_update = 63;
+
+  return timing_advance_update;
+}
 
 void dump_nr_I0_stats(FILE *fd,PHY_VARS_gNB *gNB) {
 
@@ -108,9 +151,9 @@ void gNB_I0_measurements(PHY_VARS_gNB *gNB,int slot, int first_symb,int num_symb
   NR_gNB_COMMON *common_vars = &gNB->common_vars;
   PHY_MEASUREMENTS_gNB *measurements = &gNB->measurements;
   int rb, nb_symb[275]={0};
-   
+
   memset(measurements->n0_subband_power, 0, sizeof(measurements->n0_subband_power));
-    
+
   for (int s=first_symb;s<(first_symb+num_symb);s++) {
     for (rb=0; rb<frame_parms->N_RB_UL; rb++) {
       if (s==first_symb /*&& ((gNB->rb_mask_ul[s][rb>>5]&(1<<(rb&31))) == 0)*/) {
@@ -119,13 +162,13 @@ void gNB_I0_measurements(PHY_VARS_gNB *gNB,int slot, int first_symb,int num_symb
            measurements->n0_subband_power[aarx][rb]=0;   
       }
       int offset0 = (slot&3)*(frame_parms->symbols_per_slot * frame_parms->ofdm_symbol_size) + (frame_parms->first_carrier_offset + (rb*12))%frame_parms->ofdm_symbol_size;
-      if ((gNB->rb_mask_ul[s][rb>>5]&(1<<(rb&31))) == 0) {  // check that rb was not used in this subframe
+      if ((gNB->rb_mask_ul[s][rb >> 5] & (1U << (rb & 31))) == 0) {  // check that rb was not used in this subframe
         nb_symb[rb]++;          
         for (int aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
           int offset = offset0 + (s*frame_parms->ofdm_symbol_size);
           int32_t *ul_ch  = &common_vars->rxdataF[aarx][offset];
           int len = 12;
-          if (((frame_parms->N_RB_UL&1) == 1) && 
+          if (((frame_parms->N_RB_UL&1) == 1) &&
               (rb==(frame_parms->N_RB_UL>>1))) {
             len=6;
           }
diff --git a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
index 4a6f8ef9af1b4a5f7d314bbc9ddb7969aaf2216c..e5c1ca37d820494cbefc37f61e2e9418d348b433 100644
--- a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
+++ b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
@@ -86,12 +86,13 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
 
   int pilot[3280] __attribute__((aligned(16)));
   unsigned char aarx;
-  unsigned short k;
+  unsigned short k0;
   unsigned int pilot_cnt,re_cnt;
   int16_t ch[2],ch_r[2],ch_l[2],*pil,*rxF,*ul_ch;
   int16_t *fl,*fm,*fr,*fml,*fmr,*fmm,*fdcl,*fdcr,*fdclh,*fdcrh;
   int ch_offset,symbol_offset ;
   int32_t **ul_ch_estimates_time =  gNB->pusch_vars[ul_id]->ul_ch_estimates_time;
+  int chest_freq = gNB->chest_freq;
   __m128i *ul_ch_128;
 
 #ifdef DEBUG_CH
@@ -112,18 +113,18 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
 
   symbol_offset = gNB->frame_parms.ofdm_symbol_size*symbol;
 
-  k = bwp_start_subcarrier;
+  k0 = bwp_start_subcarrier;
   int re_offset;
 
   uint16_t nb_rb_pusch = pusch_pdu->rb_size;
 
-  LOG_D(PHY, "In %s: ch_offset %d, soffset %d, symbol_offset %d OFDM size %d, Ns = %d, k = %d symbol %d\n",
+  LOG_D(PHY, "In %s: ch_offset %d, soffset %d, symbol_offset %d, OFDM size %d, Ns = %d, k0 = %d, symbol %d\n",
         __FUNCTION__,
         ch_offset, soffset,
         symbol_offset,
         gNB->frame_parms.ofdm_symbol_size,
         Ns,
-        k,
+        k0,
         symbol);
 
   switch (nushift) {
@@ -146,7 +147,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
          fr = filt8_r1;
          fmm = filt8_mm1;
          fml = filt8_ml1;
-         fmr = filt8_m1;
+         fmr = filt8_mm1;
          fdcl = filt8_dcl1;
          fdcr = filt8_dcr1;
          fdclh = filt8_dcl1_h;
@@ -169,10 +170,8 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
     gNB->pusch_gold_init[pusch_pdu->scid] = pusch_pdu->ul_dmrs_scrambling_id;
     nr_gold_pusch(gNB, pusch_pdu->scid, pusch_pdu->ul_dmrs_scrambling_id);
   }
-
-  // transform precoding = 1 means disabled
-  if (pusch_pdu->transform_precoding == 1) {
-    nr_pusch_dmrs_rx(gNB, Ns, gNB->nr_gold_pusch_dmrs[pusch_pdu->scid][Ns][symbol], &pilot[0], 1000, 0, nb_rb_pusch,
+  if (pusch_pdu->transform_precoding == transformPrecoder_disabled) {
+    nr_pusch_dmrs_rx(gNB, Ns, gNB->nr_gold_pusch_dmrs[pusch_pdu->scid][Ns][symbol], &pilot[0], (1000+p), 0, nb_rb_pusch,
                      (pusch_pdu->bwp_start + pusch_pdu->rb_start)*NR_NB_SC_PER_RB, pusch_pdu->dmrs_config_type);
   }
   else {  // if transform precoding or SC-FDMA is enabled in Uplink
@@ -208,214 +207,81 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
   }
 #endif
 
-  for (aarx=0; aarx<gNB->frame_parms.nb_antennas_rx; aarx++) {
+  uint8_t b_shift = pusch_pdu->nrOfLayers == 1;
 
-    re_offset = k;   /* Initializing the Resource element offset for each Rx antenna */
+  for (aarx=0; aarx<gNB->frame_parms.nb_antennas_rx; aarx++) {
 
     pil   = (int16_t *)&pilot[0];
-    rxF   = (int16_t *)&rxdataF[aarx][(soffset+symbol_offset+k+nushift)];
+    rxF   = (int16_t *)&rxdataF[aarx][(soffset + symbol_offset + k0 + nushift)];
     ul_ch = (int16_t *)&ul_ch_estimates[p*gNB->frame_parms.nb_antennas_rx+aarx][ch_offset];
-    re_offset = k;
+    re_offset = k0;
 
     memset(ul_ch,0,4*(gNB->frame_parms.ofdm_symbol_size));
 
 #ifdef DEBUG_PUSCH
     LOG_I(PHY, "In %s symbol_offset %d, nushift %d\n", __FUNCTION__, symbol_offset, nushift);
     LOG_I(PHY, "In %s ch est pilot addr %p, N_RB_UL %d\n", __FUNCTION__, &pilot[0], gNB->frame_parms.N_RB_UL);
-    LOG_I(PHY, "In %s bwp_start_subcarrier %d, k %d, first_carrier %d, nb_rb_pusch %d\n", __FUNCTION__, bwp_start_subcarrier, k, gNB->frame_parms.first_carrier_offset, nb_rb_pusch);
+    LOG_I(PHY, "In %s bwp_start_subcarrier %d, k0 %d, first_carrier %d, nb_rb_pusch %d\n", __FUNCTION__, bwp_start_subcarrier, k0, gNB->frame_parms.first_carrier_offset, nb_rb_pusch);
     LOG_I(PHY, "In %s rxF addr %p p %d\n", __FUNCTION__, rxF, p);
     LOG_I(PHY, "In %s ul_ch addr %p nushift %d\n", __FUNCTION__, ul_ch, nushift);
 #endif
-    //if ((gNB->frame_parms.N_RB_UL&1)==0) {
 
-    if (pusch_pdu->dmrs_config_type == pusch_dmrs_type1 && gNB->prb_interpolation == 0){
+    if (pusch_pdu->dmrs_config_type == pusch_dmrs_type1 && chest_freq == 0){
       LOG_D(PHY,"PUSCH estimation DMRS type 1, Freq-domain interpolation");
-      // Treat first 2 pilots specially (left edge)
-      ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
-      ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
 
-#ifdef DEBUG_PUSCH
-      LOG_I(PHY, "In %s ch 0 %d\n", __FUNCTION__, ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1]));
-      LOG_I(PHY, "In %s pilot 0 : rxF - > (%d,%d) (%d)  ch -> (%d,%d) (%d), pil -> (%d,%d) \n",
-        __FUNCTION__,
-        rxF[0],
-        rxF[1],
-        dBc(rxF[0],rxF[1]),
-        ch[0],
-        ch[1],
-        dBc(ch[0],ch[1]),
-        pil[0],
-        pil[1]);
-      LOG_I(PHY, "In %s data 0 : rxF - > (%d,%d) (%d)\n", __FUNCTION__, rxF[2], rxF[3], dBc(rxF[2],rxF[3]));
-#endif
+      // For configuration type 1: k = 4*n + 2*k' + delta,
+      // where k' is 0 or 1, and delta is in Table 6.4.1.1.3-1 from TS 38.211
 
-      multadd_real_vector_complex_scalar(fl,
-                                         ch,
-                                         ul_ch,
-                                         8);
-      pil += 2;
-      re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
-      rxF   = (int16_t *)&rxdataF[aarx][(soffset+symbol_offset+nushift+re_offset)];
-      //for (int i= 0; i<8; i++)
-      //printf("ul_ch addr %p %d\n", ul_ch+i, *(ul_ch+i));
+      pilot_cnt = 0;
+      int delta = nr_pusch_dmrs_delta(pusch_dmrs_type1, p);
 
-      ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
-      ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
+      for (int n = 0; n < 3*nb_rb_pusch; n++) {
 
-#ifdef DEBUG_PUSCH
-      LOG_I(PHY, "In %s pilot 1 : rxF - > (%d,%d) (%d) ch -> (%d,%d) (%d), pil -> (%d,%d) \n",
-        __FUNCTION__,
-        rxF[0],
-        rxF[1],
-        dBc(rxF[0],rxF[1]),
-        ch[0],
-        ch[1],
-        dBc(ch[0],ch[1]),
-        pil[0],
-        pil[1]);
-      LOG_I(PHY, "In %s data 1 : rxF - > (%d,%d) (%d)\n",
-        __FUNCTION__,
-        rxF[2],
-        rxF[3],
-        dBc(rxF[2],rxF[3]));
-#endif
-
-      multadd_real_vector_complex_scalar(fml,
-                                         ch,
-                                         ul_ch,
-                                         8);
-      pil += 2;
-      re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
-      rxF   = (int16_t *)&rxdataF[aarx][(soffset+symbol_offset+nushift+re_offset)];
-      //printf("ul_ch addr %p\n",ul_ch);
-      
-      ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
-      ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
+        // LS estimation
+        ch[0] = 0;
+        ch[1] = 0;
+        for (int k_line = 0; k_line <= 1; k_line++) {
+          re_offset = (k0 + (n << 2) + (k_line << 1) + delta) % gNB->frame_parms.ofdm_symbol_size;
+          rxF = (int16_t *) &rxdataF[aarx][(soffset + symbol_offset + re_offset)];
+          ch[0] += (int16_t) (((int32_t) pil[0] * rxF[0] - (int32_t) pil[1] * rxF[1]) >> (15+b_shift));
+          ch[1] += (int16_t) (((int32_t) pil[0] * rxF[1] + (int32_t) pil[1] * rxF[0]) >> (15+b_shift));
+          pil += 2;
+        }
 
+        // Channel interpolation
+        for (int k_line = 0; k_line <= 1; k_line++) {
 #ifdef DEBUG_PUSCH
-      LOG_I(PHY, "In %s pilot 2 : rxF - > (%d,%d) (%d) ch -> (%d,%d) (%d), pil -> (%d,%d) \n",
-        __FUNCTION__,
-        rxF[0],
-        rxF[1],
-        dBc(rxF[0],rxF[1]),
-        ch[0],
-        ch[1],
-        dBc(ch[0],ch[1]),
-        pil[0],
-        pil[1]);
-      LOG_I(PHY, "In %s data 2 : rxF - > (%d,%d) (%d)\n",
-        __FUNCTION__,
-        rxF[2],
-        rxF[3],
-        dBc(rxF[2],rxF[3]));
+          re_offset = (k0 + (n << 2) + (k_line << 1)) % gNB->frame_parms.ofdm_symbol_size;
+          rxF = (int16_t *) &rxdataF[aarx][(soffset + symbol_offset + re_offset)];
+          printf("pilot %4u: pil -> (%6d,%6d), rxF -> (%4d,%4d), ch -> (%4d,%4d)\n",
+                 pilot_cnt, pil[0], pil[1], rxF[0], rxF[1], ch[0], ch[1]);
+          //printf("data %4u: rxF -> (%4d,%4d) (%2d)\n",pilot_cnt, rxF[2], rxF[3], dBc(rxF[2], rxF[3]));
 #endif
-
-      multadd_real_vector_complex_scalar(fmm,
-                                         ch,
-                                         ul_ch,
-                                         8);
-
-      //for (int i= 0; i<16; i++)
-      //printf("ul_ch addr %p %d\n", ul_ch+i, *(ul_ch+i));
-
-      pil += 2;
-      re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
-      rxF   = (int16_t *)&rxdataF[aarx][(soffset+symbol_offset+nushift+re_offset)];
-      ul_ch+=8;
-
-      for (pilot_cnt=3; pilot_cnt<(6*nb_rb_pusch-3); pilot_cnt += 2) {
-
-        ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
-        ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
-
-  #ifdef DEBUG_PUSCH
-        printf("pilot %u : rxF - > (%d,%d) (%d) ch -> (%d,%d) (%d), pil -> (%d,%d) \n",pilot_cnt,rxF[0],rxF[1],dBc(rxF[0],rxF[1]),ch[0],ch[1],dBc(ch[0],ch[1]),pil[0],pil[1]);
-	printf("data %u : rxF - > (%d,%d) (%d)\n",pilot_cnt,rxF[2],rxF[3],dBc(rxF[2],rxF[3]));
-  #endif
-        multadd_real_vector_complex_scalar(fml,
-                                           ch,
-                                           ul_ch,
-                                           8);
-        pil += 2;
-        re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
-        rxF   = (int16_t *)&rxdataF[aarx][(soffset+symbol_offset+nushift+re_offset)];
-        //printf("ul_ch addr %p\n",ul_ch);
-
-        ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
-        ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
-
-  #ifdef DEBUG_PUSCH
-        printf("pilot %u : rxF - > (%d,%d) (%d) ch -> (%d,%d) (%d), pil -> (%d,%d) \n",pilot_cnt+1,rxF[0],rxF[1],dBc(rxF[0],rxF[1]),ch[0],ch[1],dBc(ch[0],ch[1]),pil[0],pil[1]);
-	printf("data %u : rxF - > (%d,%d) (%d)\n",pilot_cnt+1,rxF[2],rxF[3],dBc(rxF[2],rxF[3]));
-  #endif
-        multadd_real_vector_complex_scalar(fmm,
-                                           ch,
-                                           ul_ch,
-                                           8);
-
-        //for (int i= 0; i<16; i++)
-        //printf("ul_ch addr %p %d\n", ul_ch+i, *(ul_ch+i));
-
-        pil += 2;
-        re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
-        rxF   = (int16_t *)&rxdataF[aarx][soffset+(symbol_offset+nushift+re_offset)];
-        ul_ch+=8;
+          if (pilot_cnt == 0) {
+            multadd_real_vector_complex_scalar(fl, ch, ul_ch, 8);
+          } else if (pilot_cnt == 1) {
+            multadd_real_vector_complex_scalar(fml, ch, ul_ch, 8);
+          } else if (pilot_cnt == (6*nb_rb_pusch-2)) {
+            multadd_real_vector_complex_scalar(fmr, ch, ul_ch, 8);
+            ul_ch+=8;
+          } else if (pilot_cnt == (6*nb_rb_pusch-1)) {
+            multadd_real_vector_complex_scalar(fr, ch, ul_ch, 8);
+          } else if (pilot_cnt%2 == 0) {
+            multadd_real_vector_complex_scalar(fmm, ch, ul_ch, 8);
+            ul_ch+=8;
+          } else {
+            multadd_real_vector_complex_scalar(fm, ch, ul_ch, 8);
+          }
+          pilot_cnt++;
+        }
       }
-      
-      // Treat first 2 pilots specially (right edge)
-      ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
-      ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
-#ifdef DEBUG_PUSCH
-      printf("pilot %u : rxF - > (%d,%d) (%d) ch -> (%d,%d) (%d), pil -> (%d,%d) \n",pilot_cnt,rxF[0],rxF[1],dBc(rxF[0],rxF[1]),ch[0],ch[1],dBc(ch[0],ch[1]),pil[0],pil[1]);
-      printf("data %u : rxF - > (%d,%d) (%d)\n",pilot_cnt,rxF[2],rxF[3],dBc(rxF[2],rxF[3]));
-#endif
-      multadd_real_vector_complex_scalar(fm,
-                                         ch,
-                                         ul_ch,
-                                         8);
-                                         
-      //for (int i= 0; i<8; i++)
-      //printf("ul_ch addr %p %d\n", ul_ch+i, *(ul_ch+i));
-
-      pil += 2;
-      re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
-      rxF   = (int16_t *)&rxdataF[aarx][soffset+(symbol_offset+nushift+re_offset)];
-             
-      ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
-      ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
-#ifdef DEBUG_PUSCH
-      printf("ch 0 %d\n",((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1]));
-      printf("pilot %u : rxF - > (%d,%d) (%d) ch -> (%d,%d) (%d), pil -> (%d,%d) \n",pilot_cnt+1,rxF[0],rxF[1],dBc(rxF[0],rxF[1]),ch[0],ch[1],dBc(ch[0],ch[1]),pil[0],pil[1]);
-      printf("data %u : rxF - > (%d,%d) (%d)\n",pilot_cnt+1,rxF[2],rxF[3],dBc(rxF[2],rxF[3]));
-#endif
-      multadd_real_vector_complex_scalar(fmr,
-                                         ch,
-                                         ul_ch,
-                                         8);
-                                         
-      pil += 2;
-      re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
-      rxF   = (int16_t *)&rxdataF[aarx][soffset+(symbol_offset+nushift+re_offset)];
-      ul_ch+=8;
-      
-      ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
-      ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
-#ifdef DEBUG_PUSCH
-      printf("pilot %u: rxF - > (%d,%d) (%d) ch -> (%d,%d) (%d), pil -> (%d,%d) \n",pilot_cnt+2,rxF[0],rxF[1],dBc(rxF[0],rxF[1]),ch[0],ch[1],dBc(ch[0],ch[1]),pil[0],pil[1]);
-      printf("data %u : rxF - > (%d,%d) (%d)\n",pilot_cnt+2,rxF[2],rxF[3],dBc(rxF[2],rxF[3]));
-#endif
-      multadd_real_vector_complex_scalar(fr,
-                                         ch,
-                                         ul_ch,
-                                         8);
-
 
       // check if PRB crosses DC and improve estimates around DC
       if ((bwp_start_subcarrier < gNB->frame_parms.ofdm_symbol_size) && (bwp_start_subcarrier+nb_rb_pusch*12 >= gNB->frame_parms.ofdm_symbol_size)) {
         ul_ch = (int16_t *)&ul_ch_estimates[p*gNB->frame_parms.nb_antennas_rx+aarx][ch_offset];
         uint16_t idxDC = 2*(gNB->frame_parms.ofdm_symbol_size - bwp_start_subcarrier);
         uint16_t idxPil = idxDC/2;
-        re_offset = k;
+        re_offset = k0;
         pil = (int16_t *)&pilot[0];
         pil += (idxPil-2);
         ul_ch += (idxDC-4);
@@ -428,10 +294,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
         // for proper allignment of SIMD vectors
         if((gNB->frame_parms.N_RB_UL&1)==0) {
 
-          multadd_real_vector_complex_scalar(fdcl,
-                                             ch,
-                                             ul_ch-4,
-                                             8);
+          multadd_real_vector_complex_scalar(fdcl, ch, ul_ch-4, 8);
         
           pil += 4;
           re_offset = (re_offset+4) % gNB->frame_parms.ofdm_symbol_size;
@@ -439,16 +302,11 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
           ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
           ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
         
-          multadd_real_vector_complex_scalar(fdcr,
-                                             ch,
-                                             ul_ch-4,
-                                             8);
-        }
-        else {
-          multadd_real_vector_complex_scalar(fdclh,
-                                             ch,
-                                             ul_ch,
-                                             8);
+          multadd_real_vector_complex_scalar(fdcr, ch, ul_ch-4, 8);
+
+        } else {
+
+          multadd_real_vector_complex_scalar(fdclh, ch, ul_ch, 8);
         
           pil += 4;
           re_offset = (re_offset+4) % gNB->frame_parms.ofdm_symbol_size;
@@ -456,23 +314,22 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
           ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
           ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
         
-          multadd_real_vector_complex_scalar(fdcrh,
-                                             ch,
-                                             ul_ch,
-                                             8);
+          multadd_real_vector_complex_scalar(fdcrh, ch, ul_ch, 8);
         }
       }
+
 #ifdef DEBUG_PUSCH
       ul_ch = (int16_t *)&ul_ch_estimates[p*gNB->frame_parms.nb_antennas_rx+aarx][ch_offset];
       for(uint16_t idxP=0; idxP<ceil((float)nb_rb_pusch*12/8); idxP++) {
+        printf("(%3d)\t",idxP);
         for(uint8_t idxI=0; idxI<16; idxI += 2) {
           printf("%d\t%d\t",ul_ch[idxP*16+idxI],ul_ch[idxP*16+idxI+1]);
         }
-        printf("%d\n",idxP);
+        printf("\n");
       }
 #endif    
     }
-    else if (pusch_pdu->dmrs_config_type == pusch_dmrs_type2 && gNB->prb_interpolation == 0) { //pusch_dmrs_type2  |p_r,p_l,d,d,d,d,p_r,p_l,d,d,d,d|
+    else if (pusch_pdu->dmrs_config_type == pusch_dmrs_type2 && chest_freq == 0) { //pusch_dmrs_type2  |p_r,p_l,d,d,d,d,p_r,p_l,d,d,d,d|
       LOG_D(PHY,"PUSCH estimation DMRS type 2, Freq-domain interpolation");
       // Treat first DMRS specially (left edge)
 
@@ -808,6 +665,10 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
       ch[0] = ch_0 / 4;
       ch[1] = ch_1 / 4;
 
+#if NO_INTERP
+      for (int i=0;i<12;i++) ((int32_t*)ul_ch)[i] = *(int32_t*)ch;
+      ul_ch+=24;
+#else
       multadd_real_vector_complex_scalar(filt8_avlip0,
                                          ch,
                                          ul_ch,
@@ -825,6 +686,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
                                          ul_ch,
                                          8);
       ul_ch -= 24;
+#endif
 
       for (pilot_cnt=4; pilot_cnt<4*(nb_rb_pusch-1); pilot_cnt += 4) {
 
@@ -859,6 +721,10 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
         ch[0] = ch_0 / 4;
         ch[1] = ch_1 / 4;
 
+#if NO_INTERP
+        for (int i=0;i<12;i++) ((int32_t*)ul_ch)[i] = *(int32_t*)ch;
+        ul_ch+=24;
+#else
         ul_ch[6] += (ch[0] * 1365)>>15; // 1/12*16384
         ul_ch[7] += (ch[1] * 1365)>>15; // 1/12*16384
 
@@ -880,6 +746,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
                                            ul_ch,
                                            8);
         ul_ch -= 16;
+#endif
       }
       // Last PRB
       ch_0 = ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
@@ -913,6 +780,10 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
       ch[0] = ch_0 / 4;
       ch[1] = ch_1 / 4;
 
+#if NO_INTERP
+      for (int i=0;i<12;i++) ((int32_t*)ul_ch)[i] = *(int32_t*)ch;
+      ul_ch+=24;
+#else
       ul_ch[6] += (ch[0] * 1365)>>15; // 1/12*16384
       ul_ch[7] += (ch[1] * 1365)>>15; // 1/12*16384
 
@@ -927,6 +798,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
                                          ch,
                                          ul_ch,
                                          8);
+#endif
     }
 #ifdef DEBUG_PUSCH
     ul_ch = (int16_t *)&ul_ch_estimates[p*gNB->frame_parms.nb_antennas_rx+aarx][ch_offset];
@@ -982,7 +854,6 @@ void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB,
                               uint32_t nb_re_pusch)
 {
   //#define DEBUG_UL_PTRS 1
-  int16_t *phase_per_symbol = NULL;
   int32_t *ptrs_re_symbol   = NULL;
   int8_t   ret = 0;
 
@@ -999,20 +870,20 @@ void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB,
   uint8_t  *ptrsReOffset    = &rel15_ul->pusch_ptrs.ptrs_ports_list[0].ptrs_re_offset;
   /* loop over antennas */
   for (int aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
-    phase_per_symbol = (int16_t*)gNB->pusch_vars[ulsch_id]->ptrs_phase_per_slot[aarx];
+    c16_t *phase_per_symbol = (c16_t*)gNB->pusch_vars[ulsch_id]->ptrs_phase_per_slot[aarx];
     ptrs_re_symbol = &gNB->pusch_vars[ulsch_id]->ptrs_re_per_slot;
     *ptrs_re_symbol = 0;
-    phase_per_symbol[(2*symbol)+1] = 0; // Imag
+    phase_per_symbol[symbol].i = 0; 
     /* set DMRS estimates to 0 angle with magnitude 1 */
     if(is_dmrs_symbol(symbol,*dmrsSymbPos)) {
       /* set DMRS real estimation to 32767 */
-      phase_per_symbol[2*symbol]=(int16_t)((1<<15)-1); // 32767
+      phase_per_symbol[symbol].r=INT16_MAX; // 32767
 #ifdef DEBUG_UL_PTRS
-      printf("[PHY][PTRS]: DMRS Symbol %d -> %4d + j*%4d\n", symbol, phase_per_symbol[2*symbol],phase_per_symbol[(2*symbol)+1]);
+      printf("[PHY][PTRS]: DMRS Symbol %d -> %4d + j*%4d\n", symbol, phase_per_symbol[symbol].r,phase_per_symbol[symbol].i);
 #endif
     }
     else {// real ptrs value is set to 0
-      phase_per_symbol[2*symbol] = 0; // Real
+      phase_per_symbol[symbol].r = 0; 
     }
 
     if(symbol == *startSymbIndex) {
@@ -1033,12 +904,11 @@ void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB,
       /*------------------------------------------------------------------------------------------------------- */
       nr_ptrs_cpe_estimation(*K_ptrs,*ptrsReOffset,*dmrsConfigType,*nb_rb,
                              rel15_ul->rnti,
-                             (int16_t *)&gNB->pusch_vars[ulsch_id]->ul_ch_ptrs_estimates_ext[aarx][symbol*nb_re_pusch],
                              nr_tti_rx,
                              symbol,frame_parms->ofdm_symbol_size,
                              (int16_t*)&gNB->pusch_vars[ulsch_id]->rxdataF_comp[aarx][(symbol * nb_re_pusch)],
                              gNB->nr_gold_pusch_dmrs[rel15_ul->scid][nr_tti_rx][symbol],
-                             &phase_per_symbol[2* symbol],
+                             (int16_t*)&phase_per_symbol[symbol],
                              ptrs_re_symbol);
     }
     /* For last OFDM symbol at each antenna perform interpolation and compensation for the slot*/
@@ -1048,7 +918,7 @@ void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB,
       /*------------------------------------------------------------------------------------------------------- */
       /* If L-PTRS is > 0 then we need interpolation */
       if(*L_ptrs > 0) {
-        ret = nr_ptrs_process_slot(*dmrsSymbPos, *ptrsSymbPos, phase_per_symbol, *startSymbIndex, *nbSymb);
+        ret = nr_ptrs_process_slot(*dmrsSymbPos, *ptrsSymbPos, (int16_t*)phase_per_symbol, *startSymbIndex, *nbSymb);
         if(ret != 0) {
           LOG_W(PHY,"[PTRS] Compensation is skipped due to error in PTRS slot processing !!\n");
         }
@@ -1067,11 +937,11 @@ void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB,
         /* Skip rotation if the slot processing is wrong */
         if((!is_dmrs_symbol(i,*dmrsSymbPos)) && (ret == 0)) {
 #ifdef DEBUG_UL_PTRS
-          printf("[PHY][UL][PTRS]: Rotate Symbol %2d with  %d + j* %d\n", i, phase_per_symbol[2* i],phase_per_symbol[(2* i) +1]);
+          printf("[PHY][UL][PTRS]: Rotate Symbol %2d with  %d + j* %d\n", i, phase_per_symbol[i].r,phase_per_symbol[i].i);
 #endif
-          rotate_cpx_vector((int16_t*)&gNB->pusch_vars[ulsch_id]->rxdataF_comp[aarx][(i * rel15_ul->rb_size * NR_NB_SC_PER_RB)],
-                            &phase_per_symbol[2* i],
-                            (int16_t*)&gNB->pusch_vars[ulsch_id]->rxdataF_comp[aarx][(i * rel15_ul->rb_size * NR_NB_SC_PER_RB)],
+          rotate_cpx_vector((c16_t*)&gNB->pusch_vars[ulsch_id]->rxdataF_comp[aarx][(i * rel15_ul->rb_size * NR_NB_SC_PER_RB)],
+                            &phase_per_symbol[i],
+                            (c16_t*)&gNB->pusch_vars[ulsch_id]->rxdataF_comp[aarx][(i * rel15_ul->rb_size * NR_NB_SC_PER_RB)],
                             ((*nb_rb) * NR_NB_SC_PER_RB), 15);
         }// if not DMRS Symbol
       }// symbol loop
@@ -1079,9 +949,9 @@ void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB,
   }//Antenna loop
 }
 
-uint32_t calc_power(uint16_t *x, uint32_t size) {
-  uint64_t sum_x = 0;
-  uint64_t sum_x2 = 0;
+uint32_t calc_power(const int16_t *x, const uint32_t size) {
+  int64_t sum_x = 0;
+  int64_t sum_x2 = 0;
   for(int k = 0; k<size; k++) {
     sum_x = sum_x + x[k];
     sum_x2 = sum_x2 + x[k]*x[k];
@@ -1089,28 +959,34 @@ uint32_t calc_power(uint16_t *x, uint32_t size) {
   return sum_x2/size - (sum_x/size)*(sum_x/size);
 }
 
-int nr_srs_channel_estimation(PHY_VARS_gNB *gNB,
-                              int frame,
-                              int slot,
-                              nfapi_nr_srs_pdu_t *srs_pdu,
-                              nr_srs_info_t *nr_srs_info,
-                              int32_t *srs_generated_signal,
-                              int32_t **srs_received_signal,
-                              int32_t **srs_estimated_channel_freq,
-                              int32_t **srs_estimated_channel_time,
-                              int32_t **srs_estimated_channel_time_shifted,
-                              uint32_t *noise_power) {
+int nr_srs_channel_estimation(const PHY_VARS_gNB *gNB,
+                              const int frame,
+                              const int slot,
+                              const nfapi_nr_srs_pdu_t *srs_pdu,
+                              const nr_srs_info_t *nr_srs_info,
+                              const int32_t *srs_generated_signal,
+                              int32_t srs_received_signal[][gNB->frame_parms.ofdm_symbol_size*(1<<srs_pdu->num_symbols)],
+                              int32_t srs_ls_estimated_channel[][gNB->frame_parms.ofdm_symbol_size*(1<<srs_pdu->num_symbols)],
+                              int32_t srs_estimated_channel_freq[][gNB->frame_parms.ofdm_symbol_size*(1<<srs_pdu->num_symbols)],
+                              int32_t srs_estimated_channel_time[][gNB->frame_parms.ofdm_symbol_size],
+                              int32_t srs_estimated_channel_time_shifted[][gNB->frame_parms.ofdm_symbol_size],
+                              uint32_t *signal_power,
+                              uint32_t *noise_power_per_rb,
+                              uint32_t *noise_power,
+                              int8_t *snr_per_rb,
+                              int8_t *snr) {
 
   if(nr_srs_info->sc_list_length == 0) {
     LOG_E(NR_PHY, "(%d.%d) nr_srs_info was not generated yet!\n", frame, slot);
     return -1;
   }
 
-  NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
-  int32_t **srs_ls_estimated_channel = nr_srs_info->srs_ls_estimated_channel;
+  const NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
 
-  uint16_t noise_real[frame_parms->nb_antennas_rx*nr_srs_info->sc_list_length];
-  uint16_t noise_imag[frame_parms->nb_antennas_rx*nr_srs_info->sc_list_length];
+  int16_t ch_real[frame_parms->nb_antennas_rx*nr_srs_info->sc_list_length];
+  int16_t ch_imag[frame_parms->nb_antennas_rx*nr_srs_info->sc_list_length];
+  int16_t noise_real[frame_parms->nb_antennas_rx*nr_srs_info->sc_list_length];
+  int16_t noise_imag[frame_parms->nb_antennas_rx*nr_srs_info->sc_list_length];
 
   int16_t ls_estimated[2];
 
@@ -1123,11 +999,11 @@ int nr_srs_channel_estimation(PHY_VARS_gNB *gNB,
 
     for(int sc_idx = 0; sc_idx < nr_srs_info->sc_list_length; sc_idx++) {
 
-      int16_t generated_real = srs_generated_signal[nr_srs_info->sc_list[sc_idx]] & 0xFFFF;
-      int16_t generated_imag = (srs_generated_signal[nr_srs_info->sc_list[sc_idx]] >> 16) & 0xFFFF;
+      int16_t generated_real = ((c16_t*)srs_generated_signal)[nr_srs_info->sc_list[sc_idx]].r;
+      int16_t generated_imag = ((c16_t*)srs_generated_signal)[nr_srs_info->sc_list[sc_idx]].i;
 
-      int16_t received_real = srs_received_signal[ant][nr_srs_info->sc_list[sc_idx]] & 0xFFFF;
-      int16_t received_imag = (srs_received_signal[ant][nr_srs_info->sc_list[sc_idx]] >> 16) & 0xFFFF;
+      int16_t received_real = ((c16_t*)srs_received_signal[ant])[nr_srs_info->sc_list[sc_idx]].r;
+      int16_t received_imag = ((c16_t*)srs_received_signal[ant])[nr_srs_info->sc_list[sc_idx]].i;
 
       // We know that nr_srs_info->srs_generated_signal_bits bits are enough to represent the generated_real and generated_imag.
       // So we only need a nr_srs_info->srs_generated_signal_bits shift to ensure that the result fits into 16 bits.
@@ -1198,8 +1074,10 @@ int nr_srs_channel_estimation(PHY_VARS_gNB *gNB,
 
     // Compute noise
     for(int sc_idx = 0; sc_idx < nr_srs_info->sc_list_length; sc_idx++) {
-      noise_real[ant*nr_srs_info->sc_list_length + sc_idx] = abs((int16_t)((srs_ls_estimated_channel[ant][nr_srs_info->sc_list[sc_idx]]-srs_estimated_channel_freq[ant][nr_srs_info->sc_list[sc_idx]]) & 0xFFFF));
-      noise_imag[ant*nr_srs_info->sc_list_length + sc_idx] = abs((int16_t)(((srs_ls_estimated_channel[ant][nr_srs_info->sc_list[sc_idx]]-srs_estimated_channel_freq[ant][nr_srs_info->sc_list[sc_idx]]) >> 16) & 0xFFFF));
+      ch_real[ant*nr_srs_info->sc_list_length + sc_idx] = ((c16_t*)srs_estimated_channel_freq[ant])[nr_srs_info->sc_list[sc_idx]].r;
+      ch_imag[ant*nr_srs_info->sc_list_length + sc_idx] = ((c16_t*)srs_estimated_channel_freq[ant])[nr_srs_info->sc_list[sc_idx]].i;
+      noise_real[ant*nr_srs_info->sc_list_length + sc_idx] = abs(((c16_t*)srs_ls_estimated_channel[ant])[nr_srs_info->sc_list[sc_idx]].r - ch_real[ant*nr_srs_info->sc_list_length + sc_idx]);
+      noise_imag[ant*nr_srs_info->sc_list_length + sc_idx] = abs(((c16_t*)srs_ls_estimated_channel[ant])[nr_srs_info->sc_list[sc_idx]].i - ch_imag[ant*nr_srs_info->sc_list_length + sc_idx]);
     }
 
     // Convert to time domain
@@ -1216,11 +1094,74 @@ int nr_srs_channel_estimation(PHY_VARS_gNB *gNB,
            (gNB->frame_parms.ofdm_symbol_size>>1)*sizeof(int32_t));
   }
 
+  // Compute signal power
+  *signal_power = calc_power(ch_real,frame_parms->nb_antennas_rx*nr_srs_info->sc_list_length)
+                  + calc_power(ch_imag,frame_parms->nb_antennas_rx*nr_srs_info->sc_list_length);
+
+#ifdef SRS_DEBUG
+  LOG_I(NR_PHY,"signal_power = %u\n", *signal_power);
+#endif
+
+  if (*signal_power == 0) {
+    LOG_W(NR_PHY, "Received SRS signal power is 0\n");
+    return -1;
+  }
+
+  // Compute noise power
+
+  const uint8_t signal_power_bits = log2_approx(*signal_power);
+  const uint8_t factor_bits = signal_power_bits < 32 ? 32 - signal_power_bits : 0; // 32 due to input of dB_fixed(uint32_t x)
+  const int32_t factor_dB = dB_fixed(1<<factor_bits);
+
+  const uint64_t subcarrier_offset = frame_parms->first_carrier_offset + srs_pdu->bwp_start*12;
+  const uint8_t srs_symbols_per_rb = srs_pdu->comb_size == 0 ? 6 : 3;
+  const uint8_t n_noise_est = frame_parms->nb_antennas_rx * srs_symbols_per_rb;
+  uint8_t count_estimates = 0;
+  uint64_t sum_re = 0;
+  uint64_t sum_re2 = 0;
+  uint64_t sum_im = 0;
+  uint64_t sum_im2 = 0;
+
+  for (int sc_idx = 0; sc_idx < nr_srs_info->sc_list_length; sc_idx++) {
+
+    int subcarrier0 = nr_srs_info->sc_list[sc_idx]-subcarrier_offset;
+    if(subcarrier0 < 0) {
+      subcarrier0 = subcarrier0 + frame_parms->ofdm_symbol_size;
+    }
+    int rb = subcarrier0/NR_NB_SC_PER_RB;
+
+    for (int ant = 0; ant < frame_parms->nb_antennas_rx; ant++) {
+
+      sum_re = sum_re + noise_real[ant*nr_srs_info->sc_list_length+sc_idx];
+      sum_re2 = sum_re2 + noise_real[ant*nr_srs_info->sc_list_length+sc_idx]*noise_real[ant*nr_srs_info->sc_list_length+sc_idx];
+      sum_im = sum_im + noise_imag[ant*nr_srs_info->sc_list_length+sc_idx];
+      sum_im2 = sum_im2 + noise_imag[ant*nr_srs_info->sc_list_length+sc_idx]*noise_imag[ant*nr_srs_info->sc_list_length+sc_idx];
+
+      count_estimates++;
+      if (count_estimates == n_noise_est) {
+        noise_power_per_rb[rb] = max(sum_re2 / n_noise_est - (sum_re / n_noise_est) * (sum_re / n_noise_est) +
+                                     sum_im2 / n_noise_est - (sum_im / n_noise_est) * (sum_im / n_noise_est), 1);
+        snr_per_rb[rb] = dB_fixed((int32_t)((*signal_power<<factor_bits)/noise_power_per_rb[rb])) - factor_dB;
+        count_estimates = 0;
+        sum_re = 0;
+        sum_re2 = 0;
+        sum_im = 0;
+        sum_im2 = 0;
+
+#ifdef SRS_DEBUG
+        LOG_I(NR_PHY,"noise_power_per_rb[%i] = %i, snr_per_rb[%i] = %i dB\n", rb, noise_power_per_rb[rb], rb, snr_per_rb[rb]);
+#endif
+
+      }
+    }
+  }
+
   *noise_power = calc_power(noise_real,frame_parms->nb_antennas_rx*nr_srs_info->sc_list_length)
                   + calc_power(noise_imag,frame_parms->nb_antennas_rx*nr_srs_info->sc_list_length);
 
+  *snr = dB_fixed((int32_t)((*signal_power<<factor_bits)/(*noise_power))) - factor_dB;
+
 #ifdef SRS_DEBUG
-  uint64_t subcarrier_offset = frame_parms->first_carrier_offset + srs_pdu->bwp_start*12;
   uint8_t R = srs_pdu->comb_size == 0 ? 2 : 4;
   for (int ant = 0; ant < frame_parms->nb_antennas_rx; ant++) {
     for(int sc_idx = 0; sc_idx < nr_srs_info->sc_list_length; sc_idx++) {
@@ -1248,7 +1189,7 @@ int nr_srs_channel_estimation(PHY_VARS_gNB *gNB,
 
     }
   }
-  LOG_I(NR_PHY,"noise_power = %u\n", *noise_power);
+  LOG_I(NR_PHY,"noise_power = %u, SNR = %i dB\n", *noise_power, *snr);
 #endif
 
   return 0;
diff --git a/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h b/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h
index a01106adb5465e96536c67721ddf82e8361c63cf..b0ed3662eac8e52ba7fdbbc9dcf2af80492c1fc6 100644
--- a/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h
+++ b/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h
@@ -55,6 +55,9 @@ void nr_gnb_measurements(PHY_VARS_gNB *gNB, uint8_t ulsch_id, unsigned char harq
 
 int nr_est_timing_advance_pusch(PHY_VARS_gNB* phy_vars_gNB, int UE_id);
 
+int nr_est_timing_advance_srs(const NR_DL_FRAME_PARMS *frame_parms,
+                              const int32_t srs_estimated_channel_time[][frame_parms->ofdm_symbol_size]);
+
 void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB,
                               NR_DL_FRAME_PARMS *frame_parms,
                               nfapi_nr_pusch_pdu_t *rel15_ul,
@@ -63,15 +66,20 @@ void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB,
                               unsigned char symbol,
                               uint32_t nb_re_pusch);
 
-int nr_srs_channel_estimation(PHY_VARS_gNB *gNB,
-                              int frame,
-                              int slot,
-                              nfapi_nr_srs_pdu_t *srs_pdu,
-                              nr_srs_info_t *nr_srs_info,
-                              int32_t *srs_generated_signal,
-                              int32_t **srs_received_signal,
-                              int32_t **srs_estimated_channel_freq,
-                              int32_t **srs_estimated_channel_time,
-                              int32_t **srs_estimated_channel_time_shifted,
-                              uint32_t *noise_power);
+int nr_srs_channel_estimation(const PHY_VARS_gNB *gNB,
+                              const int frame,
+                              const int slot,
+                              const nfapi_nr_srs_pdu_t *srs_pdu,
+                              const nr_srs_info_t *nr_srs_info,
+                              const int32_t *srs_generated_signal,
+                              int32_t srs_received_signal[][gNB->frame_parms.ofdm_symbol_size*(1<<srs_pdu->num_symbols)],
+                              int32_t srs_ls_estimated_channel[][gNB->frame_parms.ofdm_symbol_size*(1<<srs_pdu->num_symbols)],
+                              int32_t srs_estimated_channel_freq[][gNB->frame_parms.ofdm_symbol_size*(1<<srs_pdu->num_symbols)],
+                              int32_t srs_estimated_channel_time[][gNB->frame_parms.ofdm_symbol_size],
+                              int32_t srs_estimated_channel_time_shifted[][gNB->frame_parms.ofdm_symbol_size],
+                              uint32_t *signal_power,
+                              uint32_t *noise_power_per_rb,
+                              uint32_t *noise_power,
+                              int8_t *snr_per_rb,
+                              int8_t *snr);
 #endif
diff --git a/openair1/PHY/NR_REFSIG/dmrs_nr.c b/openair1/PHY/NR_REFSIG/dmrs_nr.c
index 2e270318f822301e822ffd358870c63961c60593..1fd502a93e1369526ac012dd7905a24b6a94e3a8 100644
--- a/openair1/PHY/NR_REFSIG/dmrs_nr.c
+++ b/openair1/PHY/NR_REFSIG/dmrs_nr.c
@@ -295,74 +295,6 @@ uint16_t get_dmrs_freq_idx_ul(uint16_t n, uint8_t k_prime, uint8_t delta, uint8_
 
 #define CHECK_DMRS_PBCH_SEQUENCE
 
-void generate_dmrs_pbch(uint32_t dmrs_pbch_bitmap[DMRS_PBCH_I_SSB][DMRS_PBCH_N_HF][DMRS_BITMAP_SIZE], uint16_t Nid_cell)
-{
-  uint32_t cinit;
-  int i_ssb;
-  int n_hf;
-  int _i_ssb;
-
-#ifdef CHECK_DMRS_PBCH_SEQUENCE
-
-  uint32_t dmrs_bitmap[DMRS_PBCH_I_SSB][DMRS_PBCH_N_HF][DMRS_BITMAP_SIZE];
-  uint32_t *dmrs_sequence =  calloc(CELL_DMRS_LENGTH, sizeof(uint32_t));
-  if (dmrs_sequence == NULL) {
-    msg("Fatal error: memory allocation problem \n");
-  	assert(0);
-  }
-  else
-  {
-    printf("Check of demodulation reference signal of pbch sequence \n");
-  }
-
-#endif
-
-  /* for each slot number */
-  for (i_ssb = 0; i_ssb<DMRS_PBCH_I_SSB; i_ssb++) {
-
-    /* for each ofdm position */
-    for (n_hf=0; n_hf<DMRS_PBCH_N_HF; n_hf++) {
-
-      _i_ssb = i_ssb + 4*n_hf;
-
-      cinit = (((_i_ssb + 1)*((Nid_cell>>4) + 1))<<11) + ((_i_ssb + 1)<<6) + (Nid_cell%4);
-
-      pseudo_random_sequence_optimised(DMRS_BITMAP_SIZE, &(dmrs_pbch_bitmap[i_ssb][n_hf][0]), cinit);
-
-#ifdef CHECK_DMRS_PBCH_SEQUENCE
-
-      /* it allows checking generated with standard generation code */
-      pseudo_random_sequence(DMRS_BITMAP_SIZE*sizeof(uint32_t), dmrs_sequence, cinit);
-
-      int j = 0;
-      int k = 0;
-
-      /* format for getting bitmap from uint32_t */
-      for (int i=0; i<DMRS_BITMAP_SIZE; i++) {
-    	dmrs_bitmap[i_ssb][n_hf][i] = 0;
-    	/* convert to bitmap */
-      	for (; j < k + 32; j++) {
-          dmrs_bitmap[i_ssb][n_hf][i] |= (dmrs_sequence[j]<<j);
-      	}
-      	k = j;
-      }
-
-      for (int i=0; i<DMRS_BITMAP_SIZE; i++) {
-        if (dmrs_pbch_bitmap[i_ssb][n_hf][i] != dmrs_bitmap[i_ssb][n_hf][i]) {
-          printf("Error in gold sequence computation for ns %d l %d and index %i : 0x%x 0x%x \n", i_ssb, n_hf, i, dmrs_pbch_bitmap[i_ssb][n_hf][i], dmrs_bitmap[i_ssb][n_hf][i]);
-      	  assert(0);
-        }
-      }
-
-#endif
-
-    }
-  }
-
-#ifdef CHECK_DMRS_PBCH_SEQUENCE
-  free(dmrs_sequence);
-#endif
-}
 /* return the position of next dmrs symbol in a slot */
 int8_t get_next_dmrs_symbol_in_slot(uint16_t  ul_dmrs_symb_pos, uint8_t counter, uint8_t end_symbol)
 {
@@ -406,3 +338,81 @@ int8_t get_valid_dmrs_idx_for_channel_est(uint16_t  dmrs_symb_pos, uint8_t count
   }
   return symbIdx;
 }
+
+/* perform averaging of channel estimates and store result in first symbol buffer */
+void nr_chest_time_domain_avg(NR_DL_FRAME_PARMS *frame_parms,
+                              int **ch_est,
+                              uint8_t num_symbols,
+                              uint8_t start_symbol,
+                              uint16_t dmrs_bitmap,
+                              uint16_t num_rbs)
+{
+  __m128i *ul_ch128_0;
+  __m128i *ul_ch128_1;
+  int16_t *ul_ch16_0;
+  int total_symbols = start_symbol + num_symbols;
+  int num_dmrs_symb = get_dmrs_symbols_in_slot(dmrs_bitmap, total_symbols);
+  int first_dmrs_symb = get_next_dmrs_symbol_in_slot(dmrs_bitmap, start_symbol, total_symbols);
+  AssertFatal(first_dmrs_symb > -1, "No DMRS symbol present in this slot\n");
+  for (int aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) {
+    for (int symb = first_dmrs_symb+1; symb < total_symbols; symb++) {
+      ul_ch128_0 = (__m128i *)&ch_est[aarx][first_dmrs_symb*frame_parms->ofdm_symbol_size];
+      if ((dmrs_bitmap >> symb) & 0x01) {
+        ul_ch128_1 = (__m128i *)&ch_est[aarx][symb*frame_parms->ofdm_symbol_size];
+        for (int rbIdx = 0; rbIdx < num_rbs; rbIdx++) {
+          ul_ch128_0[0] = _mm_adds_epi16(ul_ch128_0[0], ul_ch128_1[0]);
+          ul_ch128_0[1] = _mm_adds_epi16(ul_ch128_0[1], ul_ch128_1[1]);
+          ul_ch128_0[2] = _mm_adds_epi16(ul_ch128_0[2], ul_ch128_1[2]);
+          ul_ch128_0 += 3;
+          ul_ch128_1 += 3;
+        }
+      }
+    }
+    ul_ch128_0 = (__m128i *)&ch_est[aarx][first_dmrs_symb*frame_parms->ofdm_symbol_size];
+    if (num_dmrs_symb == 2) {
+      for (int rbIdx = 0; rbIdx < num_rbs; rbIdx++) {
+        ul_ch128_0[0] = _mm_srai_epi16(ul_ch128_0[0], 1);
+        ul_ch128_0[1] = _mm_srai_epi16(ul_ch128_0[1], 1);
+        ul_ch128_0[2] = _mm_srai_epi16(ul_ch128_0[2], 1);
+        ul_ch128_0 += 3;
+      }
+    } else if (num_dmrs_symb == 4) {
+      for (int rbIdx = 0; rbIdx < num_rbs; rbIdx++) {
+        ul_ch128_0[0] = _mm_srai_epi16(ul_ch128_0[0], 2);
+        ul_ch128_0[1] = _mm_srai_epi16(ul_ch128_0[1], 2);
+        ul_ch128_0[2] = _mm_srai_epi16(ul_ch128_0[2], 2);
+        ul_ch128_0 += 3;
+      }
+    } else if (num_dmrs_symb == 3) {
+      ul_ch16_0 = (int16_t *)&ch_est[aarx][first_dmrs_symb*frame_parms->ofdm_symbol_size];
+      for (int rbIdx = 0; rbIdx < num_rbs; rbIdx++) {
+        ul_ch16_0[0] /= 3;
+        ul_ch16_0[1] /= 3;
+        ul_ch16_0[2] /= 3;
+        ul_ch16_0[3] /= 3;
+        ul_ch16_0[4] /= 3;
+        ul_ch16_0[5] /= 3;
+        ul_ch16_0[6] /= 3;
+        ul_ch16_0[7] /= 3;
+        ul_ch16_0[8] /= 3;
+        ul_ch16_0[9] /= 3;
+        ul_ch16_0[10] /= 3;
+        ul_ch16_0[11] /= 3;
+        ul_ch16_0[12] /= 3;
+        ul_ch16_0[13] /= 3;
+        ul_ch16_0[14] /= 3;
+        ul_ch16_0[15] /= 3;
+        ul_ch16_0[16] /= 3;
+        ul_ch16_0[17] /= 3;
+        ul_ch16_0[18] /= 3;
+        ul_ch16_0[19] /= 3;
+        ul_ch16_0[20] /= 3;
+        ul_ch16_0[21] /= 3;
+        ul_ch16_0[22] /= 3;
+        ul_ch16_0[23] /= 3;
+        ul_ch16_0 += 24;
+      }
+    } else AssertFatal((num_dmrs_symb < 5) && (num_dmrs_symb > 0), "Illegal number of DMRS symbols in the slot\n");
+  }
+}
+
diff --git a/openair1/PHY/NR_REFSIG/dmrs_nr.h b/openair1/PHY/NR_REFSIG/dmrs_nr.h
index b9e9ca6f0dc7dda7f6f6ffd93e1a414e66710785..1297a0cc2ff7b2f95c65ccb2259fc77681094ed9 100644
--- a/openair1/PHY/NR_REFSIG/dmrs_nr.h
+++ b/openair1/PHY/NR_REFSIG/dmrs_nr.h
@@ -53,7 +53,6 @@
 
 int pseudo_random_sequence(int M_PN, uint32_t *c, uint32_t cinit);
 void lte_gold_new(LTE_DL_FRAME_PARMS *frame_parms, uint32_t lte_gold_table[20][2][14], uint16_t Nid_cell);
-void generate_dmrs_pbch(uint32_t dmrs_pbch_bitmap[DMRS_PBCH_I_SSB][DMRS_PBCH_N_HF][DMRS_BITMAP_SIZE], uint16_t Nid_cell);
 uint16_t get_dmrs_freq_idx_ul(uint16_t n, uint8_t k_prime, uint8_t delta, uint8_t dmrs_type);
 
 uint8_t allowed_xlsch_re_in_dmrs_symbol(uint16_t k,
@@ -66,6 +65,12 @@ void nr_gen_ref_conj_symbols(uint32_t *in, uint32_t length, int16_t *output, uin
 int8_t get_next_dmrs_symbol_in_slot(uint16_t  ul_dmrs_symb_pos, uint8_t counter, uint8_t end_symbol);
 uint8_t get_dmrs_symbols_in_slot(uint16_t l_prime_mask,  uint16_t nb_symb);
 int8_t get_valid_dmrs_idx_for_channel_est(uint16_t  dmrs_symb_pos, uint8_t counter);
+void nr_chest_time_domain_avg(NR_DL_FRAME_PARMS *frame_parms,
+                              int **ch_est,
+                              uint8_t num_symbols,
+                              uint8_t start_symbol,
+                              uint16_t dmrs_bitmap,
+                              uint16_t num_rbs);
 
 static inline uint8_t is_dmrs_symbol(uint8_t l, uint16_t dmrsSymbMask ) { return ((dmrsSymbMask >> l) & 0x1); }
 #undef EXTERN
diff --git a/openair1/PHY/NR_REFSIG/nr_dmrs_rx.c b/openair1/PHY/NR_REFSIG/nr_dmrs_rx.c
index 920b78eac2b0880311bbac733c9b4fcbcd84ca76..4f089562f6cb30c3a9bbb45a2faa626cd1ae767b 100644
--- a/openair1/PHY/NR_REFSIG/nr_dmrs_rx.c
+++ b/openair1/PHY/NR_REFSIG/nr_dmrs_rx.c
@@ -39,9 +39,11 @@
 #include "nr_refsig.h"
 #include "PHY/defs_gNB.h"
 
-/*Table 7.4.1.1.2-1/2 from 38.211 */
+// Table 6.4.1.1.3-1/2 from TS 38.211
+int delta1[8] = {0, 0, 1, 1, 0, 0, 1, 1};
 int wf1[8][2] = {{1,1},{1,-1},{1,1},{1,-1},{1,1},{1,-1},{1,1},{1,-1}};
 int wt1[8][2] = {{1,1},{1,1},{1,1},{1,1},{1,-1},{1,-1},{1,-1},{1,-1}};
+int delta2[12] = {0, 0, 2, 2, 4, 4, 0, 0, 2, 2, 4, 4};
 int wf2[12][2] = {{1,1},{1,-1},{1,1},{1,-1},{1,1},{1,-1},{1,1},{1,-1},{1,1},{1,-1},{1,1},{1,-1}};
 int wt2[12][2] = {{1,1},{1,1},{1,1},{1,1},{1,1},{1,1},{1,-1},{1,-1},{1,-1},{1,-1},{1,-1},{1,-1}};
 
@@ -49,6 +51,13 @@ int wt2[12][2] = {{1,1},{1,1},{1,1},{1,1},{1,1},{1,1},{1,-1},{1,-1},{1,-1},{1,-1
 short nr_rx_mod_table[14]  = {0,0,23170,-23170,-23170,23170,23170,-23170,23170,23170,-23170,-23170,-23170,23170};
 short nr_rx_nmod_table[14] = {0,0,-23170,23170,23170,-23170,-23170,23170,-23170,-23170,23170,23170,23170,-23170};
 
+int nr_pusch_dmrs_delta(uint8_t dmrs_config_type, unsigned short p) {
+  if (dmrs_config_type == pusch_dmrs_type1) {
+    return delta1[p];
+  } else {
+    return delta2[p];
+  }
+}
 
 int nr_pusch_dmrs_rx(PHY_VARS_gNB *gNB,
                      unsigned int Ns,
diff --git a/openair1/PHY/NR_REFSIG/nr_gold.c b/openair1/PHY/NR_REFSIG/nr_gold.c
index 1073982909fd8650f60693b165f9adca943bf4d8..46bb03487a0bf452744e60ac712ca3c0c55e8822 100644
--- a/openair1/PHY/NR_REFSIG/nr_gold.c
+++ b/openair1/PHY/NR_REFSIG/nr_gold.c
@@ -45,7 +45,6 @@ void nr_init_pbch_dmrs(PHY_VARS_gNB* gNB)
 
       for (uint8_t n=0; n<NR_PBCH_DMRS_LENGTH_DWORD; n++) {
         gNB->nr_gold_pbch_dmrs[n_hf][l][n] = lte_gold_generic(&x1, &x2, reset);
-        //printf("%d \n",gNB->nr_gold_pbch_dmrs[n_hf][l][n]); 
         reset = 0;
       }
 
@@ -126,31 +125,6 @@ void nr_gold_pusch(PHY_VARS_gNB* gNB, int nscid, uint32_t nid) {
 }
 
 
-void nr_init_csi_rs(PHY_VARS_gNB* gNB, uint32_t Nid)
-{
-  NR_DL_FRAME_PARMS *fp = &gNB->frame_parms;
-  uint32_t ***csi_rs = gNB->nr_gold_csi_rs;
-  uint32_t x1, x2;
-  uint8_t reset;
-  int csi_dmrs_init_length =  ((fp->N_RB_DL<<4)>>5)+1;
-
-  for (uint8_t slot=0; slot<fp->slots_per_frame; slot++) {
-    for (uint8_t symb=0; symb<fp->symbols_per_slot; symb++) {
-
-      reset = 1;
-      x2 = ((1<<10) * (fp->symbols_per_slot*slot+symb+1) * ((Nid<<1)+1) + (Nid));
-
-      for (uint32_t n=0; n<csi_dmrs_init_length; n++) {
-        csi_rs[slot][symb][n] = lte_gold_generic(&x1, &x2, reset);
-        reset = 0;
-      }
-    }  
-  }
-
-}
-
-
-
 void nr_init_prs(PHY_VARS_gNB* gNB)
 {
   unsigned int x1, x2;
@@ -184,4 +158,3 @@ void nr_init_prs(PHY_VARS_gNB* gNB)
     }
   }
 }
-
diff --git a/openair1/PHY/NR_REFSIG/nr_refsig.h b/openair1/PHY/NR_REFSIG/nr_refsig.h
index 24be0021766524f1ee082290c17bd7d1045b66f1..fd89f122ce909879a399cbc04d7fc4f7b4d2f210 100644
--- a/openair1/PHY/NR_REFSIG/nr_refsig.h
+++ b/openair1/PHY/NR_REFSIG/nr_refsig.h
@@ -45,10 +45,12 @@ void nr_init_prs(PHY_VARS_gNB* gNB);
  */
 void nr_init_pdcch_dmrs(PHY_VARS_gNB* gNB, uint32_t Nid);
 void nr_init_pdsch_dmrs(PHY_VARS_gNB* gNB, uint8_t nscid, uint32_t Nid);
-void nr_init_csi_rs(PHY_VARS_gNB* gNB, uint32_t Nid);
+void nr_init_csi_rs(const NR_DL_FRAME_PARMS *fp, uint32_t ***csi_rs, uint32_t Nid);
 
 void nr_gold_pusch(PHY_VARS_gNB* gNB, int nscid, uint32_t nid);
 
+int nr_pusch_dmrs_delta(uint8_t dmrs_config_type, unsigned short p);
+
 int nr_pusch_dmrs_rx(PHY_VARS_gNB *gNB,
                      unsigned int Ns,
                      unsigned int *nr_gold_pusch,
diff --git a/openair1/PHY/NR_REFSIG/pss_nr.h b/openair1/PHY/NR_REFSIG/pss_nr.h
index c65ca3799d6348c81c39fae8a9a2d627f6fcedfa..b78a89b12c8085304c26b6f2bee0345b09557269 100644
--- a/openair1/PHY/NR_REFSIG/pss_nr.h
+++ b/openair1/PHY/NR_REFSIG/pss_nr.h
@@ -120,8 +120,6 @@ EXTERN time_stats_t generic_time[TIME_LAST];
 
 /************** FUNCTION ******************************************/
 
-idft_size_idx_t get_idft(int ofdm_symbol_size);
-dft_size_idx_t get_dft(int ofdm_symbol_size);
 void init_context_synchro_nr(NR_DL_FRAME_PARMS *frame_parms_ue);
 void free_context_synchro_nr(void);
 void init_context_pss_nr(NR_DL_FRAME_PARMS *frame_parms_ue);
diff --git a/openair1/PHY/NR_REFSIG/ptrs_nr.c b/openair1/PHY/NR_REFSIG/ptrs_nr.c
index 68134eb02ddb61b2dd7d63b54180cebc05bd64e1..5df4a25656f1cf12f2356c26501c3ae6a6304b87 100644
--- a/openair1/PHY/NR_REFSIG/ptrs_nr.c
+++ b/openair1/PHY/NR_REFSIG/ptrs_nr.c
@@ -230,7 +230,6 @@ int8_t get_next_estimate_in_slot(uint16_t  ptrsSymbPos,uint16_t  dmrsSymbPos, ui
  *                dmrsConfigType: DMRS configuration type
  *                nb_rb         : No. of resource blocks
  *                rnti          : RNTI
- *                ptrs_ch_p     : pointer to ptrs channel structure
  *                Ns            :
  *                symbol        : OFDM symbol
  *              ofdm_symbol_size: OFDM Symbol Size
@@ -249,7 +248,6 @@ void nr_ptrs_cpe_estimation(uint8_t K_ptrs,
                             uint8_t dmrsConfigType,
                             uint16_t nb_rb,
                             uint16_t rnti,
-                            int16_t *ptrs_ch_p,
                             unsigned char Ns,
                             unsigned char symbol,
                             uint16_t ofdm_symbol_size,
@@ -269,6 +267,7 @@ void nr_ptrs_cpe_estimation(uint8_t K_ptrs,
   }
   uint16_t              sc_per_symbol    = (nb_rb + K_ptrs - 1)/K_ptrs;
   c16_t      ptrs_p[(1 + sc_per_symbol/4)*4];
+  c16_t      ptrs_ch_p[(1 + sc_per_symbol/4)*4];
   c16_t      dmrs_comp_p[(1 + sc_per_symbol/4)*4];
   double                abs              = 0.0;
   double                real             = 0.0;
@@ -306,13 +305,13 @@ void nr_ptrs_cpe_estimation(uint8_t K_ptrs,
   *ptrs_sc = re_cnt;
 
   /*Multiple compensated data with conj of PTRS */
-  mult_cpx_vector((int16_t*)dmrs_comp_p, (int16_t*)ptrs_p, ptrs_ch_p,(1 + sc_per_symbol/4)*4,15); // 2^15 shifted
+  mult_cpx_vector((int16_t*)dmrs_comp_p, (int16_t*)ptrs_p, (int16_t*)ptrs_ch_p, (1 + sc_per_symbol/4)*4, 15); // 2^15 shifted
 
   /* loop over all ptrs sub carriers in a symbol */
   /* sum the error vector */
   for(int i = 0;i < sc_per_symbol; i++) {
-    real+= ptrs_ch_p[(2*i)];
-    imag+= ptrs_ch_p[(2*i)+1];
+    real += ptrs_ch_p[i].r;
+    imag += ptrs_ch_p[i].i;
   }
 #ifdef DEBUG_PTRS
   alpha = atan(imag/real);
diff --git a/openair1/PHY/NR_REFSIG/ptrs_nr.h b/openair1/PHY/NR_REFSIG/ptrs_nr.h
index 41acde0d0648ecbef152dfae6a7e39aca0e614c0..f46c5c7aeecb65e28740d9616d5ea8b2931008d8 100644
--- a/openair1/PHY/NR_REFSIG/ptrs_nr.h
+++ b/openair1/PHY/NR_REFSIG/ptrs_nr.h
@@ -96,7 +96,6 @@ void nr_ptrs_cpe_estimation(uint8_t K_ptrs,
                             uint8_t dmrsConfigType,
                             uint16_t nb_rb,
                             uint16_t rnti,
-                            int16_t *ptrs_ch_p,
                             unsigned char Ns,
                             unsigned char symbol,
                             uint16_t ofdm_symbol_size,
diff --git a/openair1/PHY/NR_REFSIG/refsig_defs_ue.h b/openair1/PHY/NR_REFSIG/refsig_defs_ue.h
index 3033ee488e1f1aa477ad2a34aabfeb1080441351..9667105be94359d45f3ad2bfe044caa5723fd963 100644
--- a/openair1/PHY/NR_REFSIG/refsig_defs_ue.h
+++ b/openair1/PHY/NR_REFSIG/refsig_defs_ue.h
@@ -68,6 +68,7 @@ void nr_init_pusch_dmrs(PHY_VARS_NR_UE* ue,
                         uint16_t N_n_scid,
                         uint8_t n_scid);
 
+void nr_init_csi_rs(const NR_DL_FRAME_PARMS *fp, uint32_t ***csi_rs, uint32_t Nid);
 void init_nr_gold_prs(PHY_VARS_NR_UE* ue);
 
 #endif
diff --git a/openair1/PHY/NR_REFSIG/ss_pbch_nr.h b/openair1/PHY/NR_REFSIG/ss_pbch_nr.h
index 44f8549258cf11ff7a4a8ef3310653f92697d609..5572604e5559e085a91176239d91c56821334538 100644
--- a/openair1/PHY/NR_REFSIG/ss_pbch_nr.h
+++ b/openair1/PHY/NR_REFSIG/ss_pbch_nr.h
@@ -80,8 +80,6 @@
 /* see TS 38211 7.4.1.4 Demodulation reference signals for PBCH */
 #define  DMRS_PBCH_I_SSB              (8)         /* maximum index value for SSB/PBCH which can have alength of L=4 or L=8 */
 #define  DMRS_PBCH_N_HF               (2)         /* half frame indication - 0 for first part of frame and 1 for second part of frame */
-#define  DMRS_ALIGNMENT_32_BIT        (20)        /* it is just for ensuring a 32 bits alignment for storing dmrs pbch into a 32 bits map */
-#define  DMRS_BITMAP_SIZE             ((DMRS_PBCH_NUMBER-DMRS_ALIGNMENT_32_BIT)/32)   /* size is divided by 32 (to get bitmap on uint32) DMRS_PBCH_NUMBER should be a multiple of 32 */
 
 #endif /* SS_PBCH_NR_H */
 
diff --git a/openair1/PHY/NR_TRANSPORT/dlsch_pdu_rel15.time_alloc_list_flag b/openair1/PHY/NR_TRANSPORT/dlsch_pdu_rel15.time_alloc_list_flag
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/openair1/PHY/NR_TRANSPORT/dlsch_pdu_rel15.time_allocation_type b/openair1/PHY/NR_TRANSPORT/dlsch_pdu_rel15.time_allocation_type
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/openair1/PHY/NR_TRANSPORT/nr_csi_rs.c b/openair1/PHY/NR_TRANSPORT/nr_csi_rs.c
index 694617c4441019c8a00b3bbb21907178b9d197db..0a1619f3e062a7d075e1af3d0a64c10c4f67f06f 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_csi_rs.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_csi_rs.c
@@ -27,20 +27,61 @@
 //#define NR_CSIRS_DEBUG
 
 
-void nr_generate_csi_rs(PHY_VARS_gNB *gNB,
-                        int16_t amp,
-                        nfapi_nr_dl_tti_csi_rs_pdu_rel15_t csi_params,
-                        int slot){
-
-  NR_DL_FRAME_PARMS frame_parms=gNB->frame_parms;
-  int32_t **txdataF = gNB->common_vars.txdataF;
-  int txdataF_offset = slot*frame_parms.samples_per_slot_wCP;
-  uint32_t **gold_csi_rs = gNB->nr_gold_csi_rs[slot];
+void nr_init_csi_rs(const NR_DL_FRAME_PARMS *fp, uint32_t ***csi_rs, uint32_t Nid) {
+  uint32_t x1, x2;
+  uint8_t reset;
+  int csi_dmrs_init_length =  ((fp->N_RB_DL<<4)>>5)+1;
+  for (uint8_t slot=0; slot<fp->slots_per_frame; slot++) {
+    for (uint8_t symb=0; symb<fp->symbols_per_slot; symb++) {
+      reset = 1;
+      x2 = ((1<<10) * (fp->symbols_per_slot*slot+symb+1) * ((Nid<<1)+1) + (Nid));
+      for (uint32_t n=0; n<csi_dmrs_init_length; n++) {
+        csi_rs[slot][symb][n] = lte_gold_generic(&x1, &x2, reset);
+        reset = 0;
+      }
+    }
+  }
+}
+
+void nr_generate_csi_rs(const NR_DL_FRAME_PARMS *frame_parms,
+                        int32_t **dataF,
+                        const int16_t amp,
+                        nr_csi_info_t *nr_csi_info,
+                        const nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *csi_params,
+                        const int slot,
+                        uint8_t *N_cdm_groups,
+                        uint8_t *CDM_group_size,
+                        uint8_t *k_prime,
+                        uint8_t *l_prime,
+                        uint8_t *N_ports,
+                        uint8_t *j_cdm,
+                        uint8_t *k_overline,
+                        uint8_t *l_overline) {
+
+#ifdef NR_CSIRS_DEBUG
+  LOG_I(NR_PHY, "csi_params->subcarrier_spacing = %i\n", csi_params->subcarrier_spacing);
+  LOG_I(NR_PHY, "csi_params->cyclic_prefix = %i\n", csi_params->cyclic_prefix);
+  LOG_I(NR_PHY, "csi_params->start_rb = %i\n", csi_params->start_rb);
+  LOG_I(NR_PHY, "csi_params->nr_of_rbs = %i\n", csi_params->nr_of_rbs);
+  LOG_I(NR_PHY, "csi_params->csi_type = %i (0:TRS, 1:CSI-RS NZP, 2:CSI-RS ZP)\n", csi_params->csi_type);
+  LOG_I(NR_PHY, "csi_params->row = %i\n", csi_params->row);
+  LOG_I(NR_PHY, "csi_params->freq_domain = %i\n", csi_params->freq_domain);
+  LOG_I(NR_PHY, "csi_params->symb_l0 = %i\n", csi_params->symb_l0);
+  LOG_I(NR_PHY, "csi_params->symb_l1 = %i\n", csi_params->symb_l1);
+  LOG_I(NR_PHY, "csi_params->cdm_type = %i\n", csi_params->cdm_type);
+  LOG_I(NR_PHY, "csi_params->freq_density = %i (0: dot5 (even RB), 1: dot5 (odd RB), 2: one, 3: three)\n", csi_params->freq_density);
+  LOG_I(NR_PHY, "csi_params->scramb_id = %i\n", csi_params->scramb_id);
+  LOG_I(NR_PHY, "csi_params->power_control_offset = %i\n", csi_params->power_control_offset);
+  LOG_I(NR_PHY, "csi_params->power_control_offset_ss = %i\n", csi_params->power_control_offset_ss);
+#endif
+
+  int dataF_offset = slot*frame_parms->samples_per_slot_wCP;
+  uint32_t **nr_gold_csi_rs = nr_csi_info->nr_gold_csi_rs[slot];
   //*8(max allocation per RB)*2(QPSK))
-  int csi_rs_length =  frame_parms.N_RB_DL<<4;
-  int16_t mod_csi[frame_parms.symbols_per_slot][csi_rs_length>>1] __attribute__((aligned(16)));;
-  uint16_t b = csi_params.freq_domain;
-  uint16_t n, csi_bw, csi_start, p, k, l, mprime, na, kpn, csi_length;
+  int csi_rs_length =  frame_parms->N_RB_DL<<4;
+  int16_t mod_csi[frame_parms->symbols_per_slot][csi_rs_length>>1] __attribute__((aligned(16)));
+  uint16_t b = csi_params->freq_domain;
+  uint16_t n, p, k, l, mprime, na, kpn;
   uint8_t size, ports, kprime, lprime, i, gs;
   uint8_t j[16], k_n[6], koverline[16], loverline[16];
   int found = 0;
@@ -48,16 +89,17 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB,
   uint8_t fi = 0;
   double rho, alpha;
   uint32_t beta = amp;
+  nr_csi_info->csi_rs_generated_signal_bits = log2_approx(amp);
 
   AssertFatal(b!=0, "Invalid CSI frequency domain mapping: no bit selected in bitmap\n");
 
   // if the scrambling id is not the one previously used to initialize we need to re-initialize the rs
-  if (csi_params.scramb_id != gNB->csi_gold_init) {
-    gNB->csi_gold_init = csi_params.scramb_id;
-    nr_init_csi_rs(gNB, csi_params.scramb_id);
+  if (csi_params->scramb_id != nr_csi_info->csi_gold_init) {
+    nr_csi_info->csi_gold_init = csi_params->scramb_id;
+    nr_init_csi_rs(frame_parms, nr_csi_info->nr_gold_csi_rs, csi_params->scramb_id);
   }
 
-  switch (csi_params.row) {
+  switch (csi_params->row) {
   // implementation of table 7.4.1.5.3-1 of 38.211
   // lprime and kprime are the max value of l' and k'
   case 1:
@@ -75,7 +117,7 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB,
     }
     for (i=0; i<size; i++) {
       j[i] = 0;
-      loverline[i] = csi_params.symb_l0;
+      loverline[i] = csi_params->symb_l0;
       koverline[i] = k_n[0] + (i<<2);
     }
     break;
@@ -95,7 +137,7 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB,
     }
     for (i=0; i<size; i++) {
       j[i] = 0;
-      loverline[i] = csi_params.symb_l0;
+      loverline[i] = csi_params->symb_l0;
       koverline[i] = k_n[0];
     }
     break;
@@ -115,7 +157,7 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB,
     }
     for (i=0; i<size; i++) {
       j[i] = 0;
-      loverline[i] = csi_params.symb_l0;
+      loverline[i] = csi_params->symb_l0;
       koverline[i] = k_n[0];
     }
     break;
@@ -135,7 +177,7 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB,
     }
     for (i=0; i<size; i++) {
       j[i] = i;
-      loverline[i] = csi_params.symb_l0;
+      loverline[i] = csi_params->symb_l0;
       koverline[i] = k_n[0] + (i<<1);
     }
     break;
@@ -155,7 +197,7 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB,
     }
     for (i=0; i<size; i++) {
       j[i] = i;
-      loverline[i] = csi_params.symb_l0 + i;
+      loverline[i] = csi_params->symb_l0 + i;
       koverline[i] = k_n[0];
     }
     break;
@@ -174,7 +216,7 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB,
     }
     for (i=0; i<size; i++) {
       j[i] = i;
-      loverline[i] = csi_params.symb_l0;
+      loverline[i] = csi_params->symb_l0;
       koverline[i] = k_n[i];
     }
     break;
@@ -193,7 +235,7 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB,
     }
     for (i=0; i<size; i++) {
       j[i] = i;
-      loverline[i] = csi_params.symb_l0 + (i>>1);
+      loverline[i] = csi_params->symb_l0 + (i>>1);
       koverline[i] = k_n[i%2];
     }
     break;
@@ -212,7 +254,7 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB,
     }
     for (i=0; i<size; i++) {
       j[i] = i;
-      loverline[i] = csi_params.symb_l0;
+      loverline[i] = csi_params->symb_l0;
       koverline[i] = k_n[i];
     }
     break;
@@ -231,7 +273,7 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB,
     }
     for (i=0; i<size; i++) {
       j[i] = i;
-      loverline[i] = csi_params.symb_l0;
+      loverline[i] = csi_params->symb_l0;
       koverline[i] = k_n[i];
     }
     break;
@@ -250,7 +292,7 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB,
     }
     for (i=0; i<size; i++) {
       j[i] = i;
-      loverline[i] = csi_params.symb_l0;
+      loverline[i] = csi_params->symb_l0;
       koverline[i] = k_n[i];
     }
     break;
@@ -269,7 +311,7 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB,
     }
     for (i=0; i<size; i++) {
       j[i] = i;
-      loverline[i] = csi_params.symb_l0 + (i>>2);
+      loverline[i] = csi_params->symb_l0 + (i>>2);
       koverline[i] = k_n[i%4];
     }
     break;
@@ -288,7 +330,7 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB,
     }
     for (i=0; i<size; i++) {
       j[i] = i;
-      loverline[i] = csi_params.symb_l0;
+      loverline[i] = csi_params->symb_l0;
       koverline[i] = k_n[i];
     }
     break;
@@ -308,9 +350,9 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB,
     for (i=0; i<size; i++) {
       j[i] = i;
       if (i<6)
-        loverline[i] = csi_params.symb_l0 + i/3;
+        loverline[i] = csi_params->symb_l0 + i/3;
       else
-        loverline[i] = csi_params.symb_l1 + i/9;
+        loverline[i] = csi_params->symb_l1 + i/9;
       koverline[i] = k_n[i%3];
     }
     break;
@@ -330,9 +372,9 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB,
     for (i=0; i<size; i++) {
       j[i] = i;
       if (i<3)
-        loverline[i] = csi_params.symb_l0;
+        loverline[i] = csi_params->symb_l0;
       else
-        loverline[i] = csi_params.symb_l1;
+        loverline[i] = csi_params->symb_l1;
       koverline[i] = k_n[i%3];
     }
     break;
@@ -351,7 +393,7 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB,
     }
     for (i=0; i<size; i++) {
       j[i] = i;
-      loverline[i] = csi_params.symb_l0;
+      loverline[i] = csi_params->symb_l0;
       koverline[i] = k_n[i];
     }
     break;
@@ -371,9 +413,9 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB,
     for (i=0; i<size; i++) {
       j[i] = i;
       if (i<8)
-        loverline[i] = csi_params.symb_l0 + (i>>2);
+        loverline[i] = csi_params->symb_l0 + (i>>2);
       else
-        loverline[i] = csi_params.symb_l1 + (i/12);
+        loverline[i] = csi_params->symb_l1 + (i/12);
       koverline[i] = k_n[i%4];
     }
     break;
@@ -393,9 +435,9 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB,
     for (i=0; i<size; i++) {
       j[i] = i;
       if (i<4)
-        loverline[i] = csi_params.symb_l0;
+        loverline[i] = csi_params->symb_l0;
       else
-        loverline[i] = csi_params.symb_l1;
+        loverline[i] = csi_params->symb_l1;
       koverline[i] = k_n[i%4];
     }
     break;
@@ -414,17 +456,17 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB,
     }
     for (i=0; i<size; i++) {
       j[i] = i;
-      loverline[i] = csi_params.symb_l0;
+      loverline[i] = csi_params->symb_l0;
       koverline[i] = k_n[i];
     }
     break;
 
   default:
-    AssertFatal(0==1, "Row %d is not valid for CSI Table 7.4.1.5.3-1\n", csi_params.row);
+    AssertFatal(0==1, "Row %d is not valid for CSI Table 7.4.1.5.3-1\n", csi_params->row);
   }
 
 #ifdef NR_CSIRS_DEBUG
-  printf(" row %d, n. of ports %d\n k' ",csi_params.row,ports);
+  printf(" row %d, n. of ports %d\n k' ",csi_params->row,ports);
   for (kp=0; kp<=kprime; kp++)
     printf("%d, ",kp);
   printf("l' ");
@@ -441,7 +483,7 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB,
 
 
   // setting the frequency density from its index
-  switch (csi_params.freq_density) {
+  switch (csi_params->freq_density) {
   
   case 0:
     rho = 0.5;
@@ -473,7 +515,7 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB,
 #endif
 
   // CDM group size from CDM type index
-  switch (csi_params.cdm_type) {
+  switch (csi_params->cdm_type) {
   
   case 0:
     gs = 1;
@@ -495,39 +537,31 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB,
     AssertFatal(0==1, "Invalid cdm type index for CSI\n");
   }
 
-  // according to 38.214 5.2.2.3.1 last paragraph
-  if (csi_params.start_rb<csi_params.bwp_start)
-    csi_start = csi_params.bwp_start;
-  else 
-    csi_start = csi_params.start_rb;
-  if (csi_params.nr_of_rbs > (csi_params.bwp_start+csi_params.bwp_size-csi_start))
-    csi_bw = csi_params.bwp_start+csi_params.bwp_size-csi_start;
-  else
-    csi_bw = csi_params.nr_of_rbs;
-
+  uint16_t csi_length;
   if (rho < 1) {
-    if (csi_params.freq_density == 0)
-      csi_length = (((csi_bw + csi_start)>>1)<<kprime)<<1;
-    else
-      csi_length = ((((csi_bw + csi_start)>>1)<<kprime)+1)<<1;
+    if (csi_params->freq_density == 0) {
+      csi_length = (((csi_params->start_rb + csi_params->nr_of_rbs)>>1)<<kprime)<<1;
+    } else {
+      csi_length = ((((csi_params->start_rb + csi_params->nr_of_rbs)>>1)<<kprime)+1)<<1;
+    }
+  } else {
+    csi_length = (((uint16_t) rho*(csi_params->start_rb + csi_params->nr_of_rbs))<<kprime)<<1;
   }
-  else
-    csi_length = (((uint16_t) rho*(csi_bw + csi_start))<<kprime)<<1;
 
 #ifdef NR_CSIRS_DEBUG
-    printf(" start rb %d, n. rbs %d, csi length %d\n",csi_start,csi_bw,csi_length);
+    printf(" start rb %d, nr of rbs %d, csi length %d\n", csi_params->start_rb, csi_params->nr_of_rbs, csi_length);
 #endif
 
 
   // TRS
-  if (csi_params.csi_type == 0) {
+  if (csi_params->csi_type == 0) {
     // ???
   }
 
   // NZP CSI RS
-  if (csi_params.csi_type == 1) {
+  if (csi_params->csi_type == 1) {
     // assuming amp is the amplitude of SSB channels
-    switch (csi_params.power_control_offset_ss) {
+    switch (csi_params->power_control_offset_ss) {
     case 0:
       beta = (amp*ONE_OVER_SQRT2_Q15)>>15;
       break;
@@ -545,30 +579,30 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB,
     }
 
     for (lp=0; lp<=lprime; lp++){
-      symb = csi_params.symb_l0;
-      nr_modulation(gold_csi_rs[symb+lp], csi_length, DMRS_MOD_ORDER, mod_csi[symb+lp]);
-      if ((csi_params.row == 5) || (csi_params.row == 7) || (csi_params.row == 11) || (csi_params.row == 13) || (csi_params.row == 16))
-        nr_modulation(gold_csi_rs[symb+1], csi_length, DMRS_MOD_ORDER, mod_csi[symb+1]);
-      if ((csi_params.row == 14) || (csi_params.row == 13) || (csi_params.row == 16) || (csi_params.row == 17)) {
-        symb = csi_params.symb_l1;
-        nr_modulation(gold_csi_rs[symb+lp], csi_length, DMRS_MOD_ORDER, mod_csi[symb+lp]);
-        if ((csi_params.row == 13) || (csi_params.row == 16))
-          nr_modulation(gold_csi_rs[symb+1], csi_length, DMRS_MOD_ORDER, mod_csi[symb+1]);
+      symb = csi_params->symb_l0;
+      nr_modulation(nr_gold_csi_rs[symb+lp], csi_length, DMRS_MOD_ORDER, mod_csi[symb+lp]);
+      if ((csi_params->row == 5) || (csi_params->row == 7) || (csi_params->row == 11) || (csi_params->row == 13) || (csi_params->row == 16))
+        nr_modulation(nr_gold_csi_rs[symb+1], csi_length, DMRS_MOD_ORDER, mod_csi[symb+1]);
+      if ((csi_params->row == 14) || (csi_params->row == 13) || (csi_params->row == 16) || (csi_params->row == 17)) {
+        symb = csi_params->symb_l1;
+        nr_modulation(nr_gold_csi_rs[symb+lp], csi_length, DMRS_MOD_ORDER, mod_csi[symb+lp]);
+        if ((csi_params->row == 13) || (csi_params->row == 16))
+          nr_modulation(nr_gold_csi_rs[symb+1], csi_length, DMRS_MOD_ORDER, mod_csi[symb+1]);
       }
     }
   }
 
-  uint16_t start_sc = frame_parms.first_carrier_offset;
+  uint16_t start_sc = frame_parms->first_carrier_offset;
 
   // resource mapping according to 38.211 7.4.1.5.3
-  for (n=csi_start; n<(csi_start+csi_bw); n++) {
-   if ( (csi_params.freq_density > 1) || (csi_params.freq_density == (n%2))) {  // for freq density 0.5 checks if even or odd RB
+  for (n=csi_params->start_rb; n<(csi_params->start_rb+csi_params->nr_of_rbs); n++) {
+   if ( (csi_params->freq_density > 1) || (csi_params->freq_density == (n%2))) {  // for freq density 0.5 checks if even or odd RB
     for (int ji=0; ji<size; ji++) { // loop over CDM groups
       for (int s=0 ; s<gs; s++)  { // loop over each CDM group size
         p = s+j[ji]*gs; // port index
         for (kp=0; kp<=kprime; kp++) { // loop over frequency resource elements within a group
-          k = (start_sc+(n*NR_NB_SC_PER_RB)+koverline[ji]+kp)%(frame_parms.ofdm_symbol_size);  // frequency index of current resource element
-          // wf according to tables 7.4.5.3-2 to 7.4.5.3-5 
+          k = (start_sc+(n*NR_NB_SC_PER_RB)+koverline[ji]+kp)%(frame_parms->ofdm_symbol_size);  // frequency index of current resource element
+          // wf according to tables 7.4.5.3-2 to 7.4.5.3-5
           if (kp == 0)
             wf = 1;
           else
@@ -591,24 +625,46 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB,
               else
                 wt = -1;
             }
+
             // ZP CSI RS
-            if (csi_params.csi_type == 2) {
-              ((int16_t*)txdataF[p])[((l*frame_parms.ofdm_symbol_size + k)<<1)+(2*txdataF_offset)] = 0;
-              ((int16_t*)txdataF[p])[((l*frame_parms.ofdm_symbol_size + k)<<1)+1+(2*txdataF_offset)] = 0;
+            if (csi_params->csi_type == 2) {
+              ((int16_t*)dataF[p])[((l*frame_parms->ofdm_symbol_size + k)<<1)+(2*dataF_offset)] = 0;
+              ((int16_t*)dataF[p])[((l*frame_parms->ofdm_symbol_size + k)<<1)+1+(2*dataF_offset)] = 0;
             }
             else {
-              ((int16_t*)txdataF[p])[((l*frame_parms.ofdm_symbol_size + k)<<1)+(2*txdataF_offset)] = (beta*wt*wf*mod_csi[l][mprime<<1]) >> 15;
-              ((int16_t*)txdataF[p])[((l*frame_parms.ofdm_symbol_size + k)<<1)+1+(2*txdataF_offset)] = (beta*wt*wf*mod_csi[l][(mprime<<1) + 1]) >> 15;
+              ((int16_t*)dataF[p])[((l*frame_parms->ofdm_symbol_size + k)<<1)+(2*dataF_offset)] = (beta*wt*wf*mod_csi[l][mprime<<1]) >> 15;
+              ((int16_t*)dataF[p])[((l*frame_parms->ofdm_symbol_size + k)<<1)+1+(2*dataF_offset)] = (beta*wt*wf*mod_csi[l][(mprime<<1) + 1]) >> 15;
             }
 #ifdef NR_CSIRS_DEBUG
-            printf("l,k (%d %d)  seq. index %d \t port %d \t (%d,%d)\n",l,k,mprime,p+3000,
-                   ((int16_t*)txdataF[p])[((l*frame_parms.ofdm_symbol_size + k)<<1)+(2*txdataF_offset)],
-                   ((int16_t*)txdataF[p])[((l*frame_parms.ofdm_symbol_size + k)<<1)+1+(2*txdataF_offset)]);
+            printf("l,k (%d,%d)  seq. index %d \t port %d \t (%d,%d)\n",l,k,mprime,p+3000,
+                   ((int16_t*)dataF[p])[((l*frame_parms->ofdm_symbol_size + k)<<1)+(2*dataF_offset)],
+                   ((int16_t*)dataF[p])[((l*frame_parms->ofdm_symbol_size + k)<<1)+1+(2*dataF_offset)]);
 #endif
           }
         }
-      }    
+      }
     }
    }
-  } 
+  }
+  if (N_cdm_groups) *N_cdm_groups = size;
+  if (CDM_group_size) *CDM_group_size = gs;
+  if (k_prime) *k_prime = kprime;
+  if (l_prime) *l_prime = lprime;
+  if (N_ports) *N_ports = ports;
+  if (j_cdm) memcpy(j_cdm,j,16*sizeof(uint8_t));
+  if (k_overline) memcpy(k_overline,koverline,16*sizeof(uint8_t));
+  if (l_overline) memcpy(l_overline,loverline,16*sizeof(uint8_t));
+
+#ifdef NR_CSIRS_DEBUG
+  if (N_ports) LOG_I(NR_PHY, "nr_csi_info->N_ports = %d\n", *N_ports);
+  if (N_cdm_groups) LOG_I(NR_PHY, "nr_csi_info->N_cdm_groups = %d\n", *N_cdm_groups);
+  if (CDM_group_size) LOG_I(NR_PHY, "nr_csi_info->CDM_group_size = %d\n", *CDM_group_size);
+  if (k_prime) LOG_I(NR_PHY, "nr_csi_info->kprime = %d\n", *k_prime);
+  if (l_prime) LOG_I(NR_PHY, "nr_csi_info->lprime = %d\n", *l_prime);
+  if (N_cdm_groups) {
+    for(int ji=0; ji<*N_cdm_groups; ji++) {
+      LOG_I(NR_PHY, "(CDM group %d) j = %d, koverline = %d, loverline = %d\n", ji, j[ji], koverline[ji], loverline[ji]);
+    }
+  }
+#endif
 }
diff --git a/openair1/PHY/NR_TRANSPORT/nr_dci.c b/openair1/PHY/NR_TRANSPORT/nr_dci.c
index ffbe850fdd1b1f7014affac739b2578c05b8b35a..dc1ed47e0ffd4f7698201a05082a559f4830940e 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_dci.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_dci.c
@@ -73,7 +73,6 @@ void nr_generate_dci(PHY_VARS_gNB *gNB,
                      NR_DL_FRAME_PARMS *frame_parms,
                      int slot) {
 
-  int16_t mod_dmrs[NR_MAX_CSET_DURATION][NR_MAX_PDCCH_DMRS_LENGTH>>1] __attribute__((aligned(16))); // 3 for the max coreset duration
   uint16_t cset_start_sc;
   uint8_t cset_start_symb, cset_nsymb;
   int k,l,k_prime,dci_idx, dmrs_idx;
@@ -82,13 +81,14 @@ void nr_generate_dci(PHY_VARS_gNB *gNB,
     
   int rb_offset;
   int n_rb;
-
   // compute rb_offset and n_prb based on frequency allocation
   nr_cce_t cce_list[MAX_DCI_CORESET][NR_MAX_PDCCH_AGG_LEVEL];
-  nr_fill_cce_list(cce_list,0,pdcch_pdu_rel15);
+  nr_fill_cce_list(cce_list, pdcch_pdu_rel15);
   get_coreset_rballoc(pdcch_pdu_rel15->FreqDomainResource,&n_rb,&rb_offset);
   cset_start_sc = frame_parms->first_carrier_offset + (pdcch_pdu_rel15->BWPStart + rb_offset) * NR_NB_SC_PER_RB;
 
+  int16_t mod_dmrs[pdcch_pdu_rel15->StartSymbolIndex+pdcch_pdu_rel15->DurationSymbols][(n_rb+rb_offset)*6] __attribute__((aligned(16))); // 3 for the max coreset duration
+
   for (int d=0;d<pdcch_pdu_rel15->numDlDci;d++) {
     /*The coreset is initialised
      * in frequency: the first subcarrier is obtained by adding the first CRB overlapping the SSB and the rb_offset for coreset 0
@@ -111,22 +111,23 @@ void nr_generate_dci(PHY_VARS_gNB *gNB,
     // DMRS length is per OFDM symbol
     uint32_t dmrs_length = n_rb*6; //2(QPSK)*3(per RB)*6(REG per CCE)
     uint32_t encoded_length = dci_pdu->AggregationLevel*108; //2(QPSK)*9(per RB)*6(REG per CCE)
-    LOG_D(PHY, "DL_DCI : rb_offset %d, nb_rb %d, DMRS length per symbol %d\t DCI encoded length %d (precoder_granularity %d,reg_mapping %d),Scrambling_Id %d,ScramblingRNTI %x,PayloadSizeBits %d\n",
-          rb_offset, n_rb,dmrs_length, encoded_length,pdcch_pdu_rel15->precoderGranularity,pdcch_pdu_rel15->CceRegMappingType,
-          dci_pdu->ScramblingId,dci_pdu->ScramblingRNTI,dci_pdu->PayloadSizeBits);
+    if (dci_pdu->RNTI != 0xFFFF)
+      LOG_D(PHY, "DL_DCI : rb_offset %d, nb_rb %d, DMRS length per symbol %d\t DCI encoded length %d (precoder_granularity %d, reg_mapping %d), Scrambling_Id %d, ScramblingRNTI %x, PayloadSizeBits %d\n",
+            rb_offset, n_rb,dmrs_length, encoded_length,pdcch_pdu_rel15->precoderGranularity,pdcch_pdu_rel15->CceRegMappingType,
+            dci_pdu->ScramblingId,dci_pdu->ScramblingRNTI,dci_pdu->PayloadSizeBits);
     dmrs_length += rb_offset*6; // To accommodate more DMRS symbols in case of rb offset
       
     /// DMRS QPSK modulation
     for (int symb=cset_start_symb; symb<cset_start_symb + pdcch_pdu_rel15->DurationSymbols; symb++) {
-      
+
       nr_modulation(gold_pdcch_dmrs[symb], dmrs_length, DMRS_MOD_ORDER, mod_dmrs[symb]); //Qm = 2 as DMRS is QPSK modulated
       
 #ifdef DEBUG_PDCCH_DMRS
-       if(dci_pdu->RNTI!=0xFFFF) {      
-         for (int i=0; i<dmrs_length>>1; i++)
-	   printf("symb %d i %d %p gold seq 0x%08x mod_dmrs %d %d\n", symb, i,
-	          &gold_pdcch_dmrs[symb][i>>5],gold_pdcch_dmrs[symb][i>>5], mod_dmrs[symb][i<<1], mod_dmrs[symb][(i<<1)+1] );
-       }
+      if(dci_pdu->RNTI!=0xFFFF) {
+        for (int i=0; i<dmrs_length>>1; i++)
+          printf("symb %d i %d %p gold seq 0x%08x mod_dmrs %d %d\n", symb, i,
+                 &gold_pdcch_dmrs[symb][i>>5],gold_pdcch_dmrs[symb][i>>5], mod_dmrs[symb][i<<1], mod_dmrs[symb][(i<<1)+1]);
+      }
 #endif
     }
     
@@ -178,8 +179,10 @@ void nr_generate_dci(PHY_VARS_gNB *gNB,
 
     // Get cce_list indices by reg_idx in ascending order
     int reg_list_index = 0;
+    int N_regs = n_rb*pdcch_pdu_rel15->DurationSymbols; // nb of REGs per coreset
+    int N_cces = N_regs / NR_NB_REG_PER_CCE; // nb of cces in coreset
     int reg_list_order[NR_MAX_PDCCH_AGG_LEVEL] = {};
-    for (int p = 0; p < NR_MAX_PDCCH_AGG_LEVEL; p++) {
+    for (int p = 0; p < N_cces; p++) {
       for(int p2 = 0; p2 < dci_pdu->AggregationLevel; p2++) {
         if(cce_list[d][p2].reg_list[0].reg_idx == p * NR_NB_REG_PER_CCE) {
           reg_list_order[reg_list_index] = p2;
@@ -191,24 +194,25 @@ void nr_generate_dci(PHY_VARS_gNB *gNB,
 
     /*Mapping the encoded DCI along with the DMRS */
     for(int symbol_idx = 0; symbol_idx < pdcch_pdu_rel15->DurationSymbols; symbol_idx++) {
-      for (int cce_count = 0; cce_count < dci_pdu->AggregationLevel; cce_count+=pdcch_pdu_rel15->DurationSymbols) {
+      for (int cce_count = 0; cce_count < dci_pdu->AggregationLevel; cce_count++) {
 
         int8_t cce_idx = reg_list_order[cce_count];
 
-        for (int reg_in_cce_idx = 0; reg_in_cce_idx < NR_NB_REG_PER_CCE; reg_in_cce_idx++) {
+        for (int reg_in_cce_idx = 0; reg_in_cce_idx < NR_NB_REG_PER_CCE; reg_in_cce_idx+=pdcch_pdu_rel15->DurationSymbols) {
 
           k = cset_start_sc + cce_list[d][cce_idx].reg_list[reg_in_cce_idx].start_sc_idx;
-
+          LOG_D(PHY,"CCE %d REG %d k %d\n",cce_idx,reg_in_cce_idx+symbol_idx,k);
           if (k >= frame_parms->ofdm_symbol_size)
             k -= frame_parms->ofdm_symbol_size;
 
           l = cset_start_symb + symbol_idx;
 
           // dmrs index depends on reference point for k according to 38.211 7.4.1.3.2
+          int eff_reg_idx = cce_list[d][cce_idx].reg_list[reg_in_cce_idx].reg_idx/pdcch_pdu_rel15->DurationSymbols;
           if (pdcch_pdu_rel15->CoreSetType == NFAPI_NR_CSET_CONFIG_PDCCH_CONFIG)
-            dmrs_idx = (cce_list[d][cce_idx].reg_list[reg_in_cce_idx].reg_idx) * 3;
+            dmrs_idx = eff_reg_idx * 3;
           else
-            dmrs_idx = (cce_list[d][cce_idx].reg_list[reg_in_cce_idx].reg_idx + rb_offset) * 3;
+            dmrs_idx = (eff_reg_idx + rb_offset) * 3;
 
           k_prime = 0;
 
@@ -262,7 +266,6 @@ void nr_generate_dci_top(processingData_L1tx_t *msgTx,
                          int16_t amp,
                          NR_DL_FRAME_PARMS *frame_parms) {
 
-
   for (int i=0; i<msgTx->num_ul_pdcch; i++)
     nr_generate_dci(msgTx->gNB,&msgTx->ul_pdcch_pdu[i].pdcch_pdu.pdcch_pdu_rel15,txdataF,amp,frame_parms,slot);
   for (int i=0; i<msgTx->num_dl_pdcch; i++)
diff --git a/openair1/PHY/NR_TRANSPORT/nr_dci.h b/openair1/PHY/NR_TRANSPORT/nr_dci.h
index 490a8b528682fa3d64b7a8d0de5f7a8f223372cb..0bf6932bb50685c622236c2b4dfdd095f1ae0e49 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_dci.h
+++ b/openair1/PHY/NR_TRANSPORT/nr_dci.h
@@ -55,6 +55,6 @@ void nr_fill_ul_dci(PHY_VARS_gNB *gNB,
 		    int slot,
 		    nfapi_nr_ul_dci_request_pdus_t *pdcch_pdu);
 
-void nr_fill_cce_list(nr_cce_t cce_list[MAX_DCI_CORESET][NR_MAX_PDCCH_AGG_LEVEL], uint8_t m,nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu_rel15);
+void nr_fill_cce_list(nr_cce_t cce_list[MAX_DCI_CORESET][NR_MAX_PDCCH_AGG_LEVEL], nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu_rel15);
 
 #endif //__PHY_NR_TRANSPORT_DCI__H
diff --git a/openair1/PHY/NR_TRANSPORT/nr_dci_tools.c b/openair1/PHY/NR_TRANSPORT/nr_dci_tools.c
index 8d5eb4a66072ca56684ebee75c12cc2f69c07a47..e9d3010ce7c4c884ab9c68025ed59be389e21d47 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_dci_tools.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_dci_tools.c
@@ -37,89 +37,8 @@
 
 #include "nr_dlsch.h"
 
-/*
-  Original version to keep code for Y that needs to be moved to MAC
-
-void nr_fill_cce_list(PHY_VARS_gNB *gNB, uint16_t n_shift, uint8_t m) {
-
-  nr_cce_t* cce;
-  nr_reg_t* reg;
-  nfapi_nr_dl_config_pdcch_pdu_rel15_t* pdcch_pdu = gNB->pdcch_pdu.pdcch;
-
-  uint8_t L = dci_alloc->L;
-  uint8_t bsize = pdcch_params->reg_bundle_size;
-  uint8_t R = pdcch_params->interleaver_size;
-  uint16_t N_reg = pdcch_params->n_rb * pdcch_params->n_symb;
-  uint16_t Y, N_cce, M_s_max, n_CI=0, tmp, C=0;
-  uint16_t n_RNTI = (pdcch_params->search_space_type == NFAPI_NR_SEARCH_SPACE_TYPE_UE_SPECIFIC)? pdcch_params->rnti:0;
-  uint32_t A[3]={39827,39829,39839};
-
-  if (pdcch_params->config_type == NFAPI_NR_CSET_CONFIG_MIB_SIB1)
-    AssertFatal(L>=4, "Invalid aggregation level for SIB1 configured PDCCH %d\n", L);
-
-  N_cce = N_reg / NR_NB_REG_PER_CCE;
-  //Max number of candidates per aggregation level -- SIB1 configured search space only
-  M_s_max = (L==4)?4:(L==8)?2:1;
-
-  if (pdcch_params->search_space_type == NFAPI_NR_SEARCH_SPACE_TYPE_COMMON)
-    Y = 0;
-  else { //NFAPI_NR_SEARCH_SPACE_TYPE_UE_SPECIFIC
-    Y = (A[0]*n_RNTI)%65537; // Candidate 0, antenna port 0
-  }
-
-  if (pdcch_params->cr_mapping_type == NFAPI_NR_CCE_REG_MAPPING_INTERLEAVED) {
-	  uint16_t assertFatalCond = (N_reg%(bsize*R));
-	  AssertFatal(assertFatalCond == 0,"CCE to REG interleaving: Invalid configuration leading to non integer C (N_reg %us, bsize %d R %d)\n",N_reg, bsize, R);
-	  C = N_reg/(bsize*R);
-  }
-
-  tmp = L * (( Y + (m*N_cce)/(L*M_s_max) + n_CI ) % CEILIDIV(N_cce,L));
-
-  LOG_D(PHY, "CCE list generation for candidate %d: bundle size %d ilv size %d tmp %d\n", m, bsize, R, tmp);
-  for (uint8_t cce_idx=0; cce_idx<L; cce_idx++) {
-    cce = &dci_alloc->cce_list[cce_idx];
-    cce->cce_idx = tmp + cce_idx;
-    LOG_D(PHY, "cce_idx %d\n", cce->cce_idx);
-
-    if (pdcch_params->cr_mapping_type == NFAPI_NR_CCE_REG_MAPPING_INTERLEAVED) {
-      LOG_D(PHY, "Interleaved CCE to REG mapping\n");
-      uint8_t j = cce->cce_idx, j_prime;
-      uint8_t r,c,idx;
-
-      for (uint8_t bundle_idx=0; bundle_idx<NR_NB_REG_PER_CCE/bsize; bundle_idx++) {
-        j_prime = 6*j/bsize + bundle_idx;
-        r = j_prime%R;
-        c = (j_prime-r)/R;
-        idx = (r*C + c + n_shift)%(N_reg/bsize);
-        LOG_D(PHY, "bundle idx = %d \n j = %d \t j_prime = %d \t r = %d \t c = %d\n", idx, j , j_prime, r, c);
-
-        for (uint8_t reg_idx=0; reg_idx<bsize; reg_idx++) {
-          reg = &cce->reg_list[reg_idx];
-          reg->reg_idx = bsize*idx + reg_idx;
-          reg->start_sc_idx = (reg->reg_idx/pdcch_params->n_symb) * NR_NB_SC_PER_RB;
-          reg->symb_idx = reg->reg_idx % pdcch_params->n_symb;
-          LOG_D(PHY, "reg %d symbol %d start subcarrier %d\n", reg->reg_idx, reg->symb_idx, reg->start_sc_idx);
-        }
-      }
-    }
-    else { // NFAPI_NR_CCE_REG_MAPPING_NON_INTERLEAVED
-      LOG_D(PHY, "Non interleaved CCE to REG mapping\n");
-      for (uint8_t reg_idx=0; reg_idx<NR_NB_REG_PER_CCE; reg_idx++) {
-        reg = &cce->reg_list[reg_idx];
-        reg->reg_idx = cce->cce_idx*NR_NB_REG_PER_CCE + reg_idx;
-        reg->start_sc_idx = (reg->reg_idx/pdcch_params->n_symb) * NR_NB_SC_PER_RB;
-        reg->symb_idx = reg->reg_idx % pdcch_params->n_symb;
-        LOG_D(PHY, "reg %d symbol %d start subcarrier %d\n", reg->reg_idx, reg->symb_idx, reg->start_sc_idx);
-      }
-
-    }
 
-  }
-}
-
-*/
-
-void nr_fill_cce_list(nr_cce_t cce_list[MAX_DCI_CORESET][NR_MAX_PDCCH_AGG_LEVEL], uint8_t m,  nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu_rel15) {
+void nr_fill_cce_list(nr_cce_t cce_list[MAX_DCI_CORESET][NR_MAX_PDCCH_AGG_LEVEL], nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu_rel15) {
 
   nr_cce_t* cce;
   nr_reg_t* reg;
@@ -128,71 +47,51 @@ void nr_fill_cce_list(nr_cce_t cce_list[MAX_DCI_CORESET][NR_MAX_PDCCH_AGG_LEVEL]
   int R = pdcch_pdu_rel15->InterleaverSize;
   int n_shift = pdcch_pdu_rel15->ShiftIndex;
 
-
   //Max number of candidates per aggregation level -- SIB1 configured search space only
 
-
   int n_rb,rb_offset;
 
   get_coreset_rballoc(pdcch_pdu_rel15->FreqDomainResource,&n_rb,&rb_offset);
 
-
-  int N_reg = n_rb;
-  int C=-1;
-
-  AssertFatal(N_reg > 0,"N_reg cannot be 0\n");
-
   for (int d=0;d<pdcch_pdu_rel15->numDlDci;d++) {
+
     int  L = pdcch_pdu_rel15->dci_pdu[d].AggregationLevel;
+    int dur = pdcch_pdu_rel15->DurationSymbols;
+    int N_regs = n_rb*dur; // nb of REGs per coreset
+    AssertFatal(N_regs > 0,"N_reg cannot be 0\n");
 
     if (pdcch_pdu_rel15->CoreSetType == NFAPI_NR_CSET_CONFIG_MIB_SIB1)
       AssertFatal(L>=4, "Invalid aggregation level for SIB1 configured PDCCH %d\n", L);
-    
+
+    int C = 0;
+
     if (pdcch_pdu_rel15->CceRegMappingType == NFAPI_NR_CCE_REG_MAPPING_INTERLEAVED) {
-      uint16_t assertFatalCond = (N_reg%(bsize*R));
-      AssertFatal(assertFatalCond == 0,"CCE to REG interleaving: Invalid configuration leading to non integer C (N_reg %us, bsize %d R %d)\n",N_reg, bsize, R);
-      C = N_reg/(bsize*R);
+      uint16_t assertFatalCond = (N_regs%(bsize*R));
+      AssertFatal(assertFatalCond == 0,"CCE to REG interleaving: Invalid configuration leading to non integer C (N_reg %us, bsize %d R %d)\n",N_regs, bsize, R);
+      C = N_regs/(bsize*R);
     }
-    
-    if (pdcch_pdu_rel15->dci_pdu[d].RNTI != 0xFFFF) LOG_D(PHY, "CCE list generation for candidate %d: bundle size %d ilv size %d CceIndex %d\n", m, bsize, R, pdcch_pdu_rel15->dci_pdu[d].CceIndex);
+
+    if (pdcch_pdu_rel15->dci_pdu[d].RNTI != 0xFFFF)
+      LOG_D(PHY, "CCE list generation for candidate %d: bundle size %d ilv size %d CceIndex %d\n", d, bsize, R, pdcch_pdu_rel15->dci_pdu[d].CceIndex);
+
     for (uint8_t cce_idx=0; cce_idx<L; cce_idx++) {
       cce = &cce_list[d][cce_idx];
       cce->cce_idx = pdcch_pdu_rel15->dci_pdu[d].CceIndex + cce_idx;
       LOG_D(PHY, "cce_idx %d\n", cce->cce_idx);
-      
-      if (pdcch_pdu_rel15->CceRegMappingType == NFAPI_NR_CCE_REG_MAPPING_INTERLEAVED) {
-	LOG_D(PHY, "Interleaved CCE to REG mapping\n");
-	uint8_t j = cce->cce_idx, j_prime;
-	uint8_t r,c,idx;
-	
-	for (uint8_t bundle_idx=0; bundle_idx<NR_NB_REG_PER_CCE/bsize; bundle_idx++) {
-	  j_prime = 6*j/bsize + bundle_idx;
-	  r = j_prime%R;
-	  c = (j_prime-r)/R;
-	  idx = (r*C + c + n_shift)%(N_reg/bsize);
-	  LOG_D(PHY, "bundle idx = %d \n j = %d \t j_prime = %d \t r = %d \t c = %d\n", idx, j , j_prime, r, c);
-	  
-	  for (uint8_t reg_idx=0; reg_idx<bsize; reg_idx++) {
-	    reg = &cce->reg_list[reg_idx];
-	    reg->reg_idx = bsize*idx + reg_idx;
-	    reg->start_sc_idx = reg->reg_idx * NR_NB_SC_PER_RB;
-	    reg->symb_idx = 0;
-	    LOG_D(PHY, "reg %d symbol %d start subcarrier %d\n", reg->reg_idx, reg->symb_idx, reg->start_sc_idx);
-	  }
-	}
-      }
-      else { // NFAPI_NR_CCE_REG_MAPPING_NON_INTERLEAVED
-	LOG_D(PHY, "Non interleaved CCE to REG mapping\n");
-	for (uint8_t reg_idx=0; reg_idx<NR_NB_REG_PER_CCE; reg_idx++) {
+
+      uint8_t j = cce->cce_idx;
+      for (int k=6*j/bsize; k<(6*j/bsize+6/bsize); k++) { // loop over REG bundles
+
+        int f = cce_to_reg_interleaving(R, k, n_shift, C, bsize, N_regs);
+
+	for (uint8_t reg_idx=0; reg_idx<bsize; reg_idx++) {
 	  reg = &cce->reg_list[reg_idx];
-	  reg->reg_idx = cce->cce_idx*NR_NB_REG_PER_CCE + reg_idx;
-	  reg->start_sc_idx = reg->reg_idx * NR_NB_SC_PER_RB;
-	  reg->symb_idx = 0;
+	  reg->reg_idx = bsize*f + reg_idx;
+	  reg->start_sc_idx = (reg->reg_idx/dur) * NR_NB_SC_PER_RB;
+	  reg->symb_idx = reg_idx%dur;
 	  LOG_D(PHY, "reg %d symbol %d start subcarrier %d\n", reg->reg_idx, reg->symb_idx, reg->start_sc_idx);
 	}
-	
       }
-      
     }
   }
 }
diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c
index d975c1d38bfe75ee6b468339458e311b40941341..30dbc39185c125587c105963d263108dce39965a 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c
@@ -38,6 +38,7 @@
 #include "PHY/NR_REFSIG/ptrs_nr.h"
 #include "common/utils/LOG/vcd_signal_dumper.h"
 #include "common/utils/nr/nr_common.h"
+#include "executables/softmodem-common.h"
 
 //#define DEBUG_DLSCH
 //#define DEBUG_DLSCH_MAPPING
@@ -122,7 +123,6 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx,
                           rel15->dlDmrsSymbPos);
       n_ptrs = (rel15->rbSize + rel15->PTRSFreqDensity - 1)/rel15->PTRSFreqDensity;
     }
-    int16_t mod_ptrs[n_ptrs<<1] __attribute__ ((aligned(16)));
 
     /// CRC, coding, interleaving and rate matching
     AssertFatal(harq->pdu!=NULL,"harq->pdu is null\n");
@@ -153,6 +153,9 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx,
     printf("\n");
 #endif
 
+    if (IS_SOFTMODEM_DLSIM)
+      memcpy(harq->f, output, encoded_length);
+
     for (int q=0; q<rel15->NrOfCodewords; q++) {
       /// scrambling
       start_meas(dlsch_scrambling_stats);
@@ -214,6 +217,7 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx,
 #endif
 
     stop_meas(&gNB->dlsch_layer_mapping_stats); 
+
     /// Resource mapping
     
     // Non interleaved VRB to PRB mapping
@@ -235,6 +239,7 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx,
     for (int nl=0; nl<rel15->nrOfLayers; nl++) {
 
       int dmrs_port = get_dmrs_port(nl,rel15->dmrsPorts);
+
       // DMRS params for this dmrs port
       get_Wt(Wt, dmrs_port, dmrs_Type);
       get_Wf(Wf, dmrs_port, dmrs_Type);
@@ -296,12 +301,14 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx,
 
         /* calculate if current symbol is PTRS symbols */
         ptrs_idx = 0;
-
+        int16_t *mod_ptrs = NULL;
         if(rel15->pduBitmap & 0x1) {
           ptrs_symbol = is_ptrs_symbol(l,dlPtrsSymPos);
           if(ptrs_symbol) {
             /* PTRS QPSK Modulation for each OFDM symbol in a slot */
             LOG_D(PHY,"Doing ptrs modulation for symbol %d, n_ptrs %d\n",l,n_ptrs);
+            int16_t mod_ptrsBuf[n_ptrs<<1] __attribute__ ((aligned(16)));
+            mod_ptrs =mod_ptrsBuf;
             nr_modulation(pdsch_dmrs[l][rel15->SCID], (n_ptrs<<1), DMRS_MOD_ORDER, mod_ptrs);
           }
         }
@@ -312,7 +319,8 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx,
           for (int i=0; i<rel15->rbSize*NR_NB_SC_PER_RB; i++) {
             /* check if cuurent RE is PTRS RE*/
             is_ptrs_re = 0;
-            if (ptrs_symbol)
+            /* check for PTRS symbol and set flag for PTRS RE */
+            if(ptrs_symbol){
               is_ptrs_re = is_ptrs_subcarrier(k,
                                               rel15->rnti,
                                               nl,
@@ -322,6 +330,7 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx,
                                               rel15->PTRSReOffset,
                                               start_sc,
                                               frame_parms->ofdm_symbol_size);
+            }
             /* Map DMRS Symbol */
             if ( (dmrs_symbol_map & (1 << l)) &&
                  (k == ((start_sc+get_dmrs_freq_idx(n, k_prime, delta, dmrs_Type))%(frame_parms->ofdm_symbol_size)))) {
@@ -337,6 +346,7 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx,
               k_prime&=1;
               n+=(k_prime)?0:1;
             }
+            /* Map PTRS Symbol */
             else if(is_ptrs_re){
               txdataF_precoding[nl][((l*frame_parms->ofdm_symbol_size + k)<<1)    ] = (beta_ptrs*amp*mod_ptrs[ptrs_idx<<1]) >> 15;
               txdataF_precoding[nl][((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (beta_ptrs*amp*mod_ptrs[(ptrs_idx<<1) + 1])>> 15;
diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h
index daa4ed17230af7ae0078a809797f1e3dfd343c52..bdf681c21d3dbb480dca1a4f16acb754bb62f8b3 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h
+++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h
@@ -49,11 +49,6 @@ void nr_get_rbg_parms(NR_BWP_PARMS* bwp, uint8_t config_type);
 
 void nr_get_rbg_list(uint32_t bitmap, uint8_t n_rbg, uint8_t* rbg_list);
 
-
-uint8_t nr_get_Qm(uint8_t Imcs, uint8_t table_idx);
-
-uint32_t nr_get_code_rate(uint8_t Imcs, uint8_t table_idx);
-
 void nr_pdsch_codeword_scrambling(uint8_t *in,
                                   uint32_t size,
                                   uint8_t q,
diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
index f7abc2a513cf6d587f11afb912a5ad77cbdc010a..8672f3ae29aadf3d4d0bcf8e2d37864a3c448319 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
@@ -69,6 +69,10 @@ void free_gNB_dlsch(NR_gNB_DLSCH_t **dlschptr,
     free16(harq->b, a_segments * 1056);
     harq->b = NULL;
   }
+  if (harq->f) {
+    free16(harq->f, N_RB * NR_SYMBOLS_PER_SLOT * NR_NB_SC_PER_RB * 8 * NR_MAX_NB_LAYERS);
+    harq->f = NULL;
+  }
   for (int r = 0; r < a_segments; r++) {
     free(harq->c[r]);
     harq->c[r] = NULL;
@@ -119,7 +123,6 @@ NR_gNB_DLSCH_t *new_gNB_dlsch(NR_DL_FRAME_PARMS *frame_parms,
   bzero(dlsch,sizeof(NR_gNB_DLSCH_t));
   dlsch->Kmimo = Kmimo;
   dlsch->Mdlharq = Mdlharq;
-  dlsch->Mlimit = 4;
   dlsch->Nsoft = Nsoft;
 
   int txdataf_size = frame_parms->N_RB_DL*NR_SYMBOLS_PER_SLOT*NR_NB_SC_PER_RB*8; // max pdsch encoded length for each layer
@@ -177,6 +180,10 @@ NR_gNB_DLSCH_t *new_gNB_dlsch(NR_DL_FRAME_PARMS *frame_parms,
     bzero(harq->c[r], 8448);
   }
 
+  harq->f = malloc16(N_RB * NR_SYMBOLS_PER_SLOT * NR_NB_SC_PER_RB * 8 * NR_MAX_NB_LAYERS);
+  AssertFatal(harq->f, "cannot allocate harq->f\n");
+  bzero(harq->f, N_RB * NR_SYMBOLS_PER_SLOT * NR_NB_SC_PER_RB * 8 * NR_MAX_NB_LAYERS);
+
   return(dlsch);
 }
 
@@ -240,19 +247,12 @@ void ldpc8blocks( void *p) {
           impp->F,
           Kr-impp->F-2*(*impp->Zc),
           mod_order,nb_rb,rel15->nrOfLayers);
-    // for tbslbrm calculation according to 5.4.2.1 of 38.212
-    uint8_t Nl = 4;
-
-    if (rel15->nrOfLayers < Nl)
-      Nl = rel15->nrOfLayers;
 
-    uint32_t Tbslbrm = nr_compute_tbslbrm(rel15->mcsTable[0],nb_rb,Nl);
-    uint8_t Ilbrm = 1;
+    uint32_t Tbslbrm = rel15->maintenance_parms_v3.tbSizeLbrmBytes;
 
     uint8_t e[E];
     bzero (e, E);
-    nr_rate_matching_ldpc(Ilbrm,
-                          Tbslbrm,
+    nr_rate_matching_ldpc(Tbslbrm,
                           impp->BG,
                           *impp->Zc,
                           impp->d[rr],
@@ -313,12 +313,11 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB,
   unsigned int crc=1;
   nfapi_nr_dl_tti_pdsch_pdu_rel15_t *rel15 = &harq->pdsch_pdu.pdsch_pdu_rel15;
   impp.Zc = &harq->Z;
-  float Coderate = 0.0;
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_gNB_DLSCH_ENCODING, VCD_FUNCTION_IN);
   uint32_t A = rel15->TBSize[0]<<3;
   unsigned char *a=harq->pdu;
   if ( rel15->rnti != SI_RNTI)
-    trace_NRpdu(DIRECTION_DOWNLINK, a, rel15->TBSize[0], 0, WS_C_RNTI, rel15->rnti, frame, slot,0, 0);
+    trace_NRpdu(DIRECTION_DOWNLINK, a, rel15->TBSize[0], WS_C_RNTI, rel15->rnti, frame, slot,0, 0);
 
   NR_gNB_SCH_STATS_t *stats=NULL;
   int first_free=-1;
@@ -376,10 +375,9 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB,
     memcpy(harq->b, a, (A / 8) + 3); // using 3 bytes to mimic the case of 24 bit crc
   }
 
-  if (rel15->targetCodeRate[0]<1000)
-    Coderate = (float)rel15->targetCodeRate[0] /(float) 1024;
-  else  // to scale for mcs 20 and 26 in table 5.1.3.1-2 which are decimal and input 2* in nr_tbs_tools
-    Coderate = (float)rel15->targetCodeRate[0] /(float) 2048;
+  // target_code_rate is in 0.1 units
+  float Coderate = (float) rel15->targetCodeRate[0] / 10240.0f;
+  LOG_D(PHY,"DLSCH Coderate %f\n",Coderate);
 
   if ((A <=292) || ((A<=3824) && (Coderate <= 0.6667)) || Coderate <= 0.25)
     impp.BG = 2;
diff --git a/openair1/PHY/NR_TRANSPORT/nr_pbch.c b/openair1/PHY/NR_TRANSPORT/nr_pbch.c
index fc7df4649606902a073dd149197e6fbf49cb3ae7..278c2dfd58c8061d7b2c8d4c621e1373ae0dac7d 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_pbch.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_pbch.c
@@ -35,6 +35,7 @@
 #include "PHY/NR_TRANSPORT/nr_transport_proto.h"
 #include "PHY/LTE_REFSIG/lte_refsig.h"
 #include "PHY/sse_intrin.h"
+#include "executables/softmodem-common.h"
 
 //#define DEBUG_PBCH
 //#define DEBUG_PBCH_ENCODING
@@ -248,6 +249,9 @@ int nr_generate_pbch(nfapi_nr_dl_tti_ssb_pdu *ssb_pdu,
   for (int i=0; i<NR_PBCH_PDU_BITS; i++)
     pbch->pbch_a |= ((pbch_pdu[i>>3]>>(7-(i&7)))&1)<<i;
 
+  // NSA to signal no coreset0
+  const int ssb_sc_offset = get_softmodem_params()->sa ? config->ssb_table.ssb_subcarrier_offset.value : 31;
+
   #ifdef DEBUG_PBCH_ENCODING
   for (int i=0; i<3; i++)
     printf("pbch_pdu[%d]: 0x%02x\n", i, pbch_pdu[i]);
@@ -265,7 +269,7 @@ int nr_generate_pbch(nfapi_nr_dl_tti_ssb_pdu *ssb_pdu,
     for (int i=0; i<3; i++)
       pbch->pbch_a |= ((ssb_index>>(5-i))&1)<<(29+i); // resp. 6th, 5th and 4th bits of ssb_index
   else
-    pbch->pbch_a |= ((config->ssb_table.ssb_subcarrier_offset.value>>4)&1)<<29; //MSB of k_SSB (bit index 4)
+    pbch->pbch_a |= ((ssb_sc_offset>>4)&1)<<29; //MSB of k_SSB (bit index 4)
 
   LOG_D(PHY,"After extra byte: pbch_a = 0x%08x\n",pbch->pbch_a);
 
diff --git a/openair1/PHY/NR_TRANSPORT/nr_prach.c b/openair1/PHY/NR_TRANSPORT/nr_prach.c
index b12a58526d9a202ae842aedc5e4f99d9fe8e78c1..eb012532ce6ffd2799ed9149760a63a5f982750b 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_prach.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_prach.c
@@ -175,11 +175,19 @@ void rx_nr_prach_ru(RU_t *ru,
   int msg1_frequencystart   = ru->config.prach_config.num_prach_fd_occasions_list[numRA].k1.value;
 
   int sample_offset_slot;
-  if (!(slot%(fp->slots_per_subframe/2)))
-    sample_offset_slot = (prachStartSymbol==0?0:fp->ofdm_symbol_size*prachStartSymbol+fp->nb_prefix_samples0+fp->nb_prefix_samples*(prachStartSymbol-1));
-  else
-    sample_offset_slot = (prachStartSymbol==0?0:prachStartSymbol*(fp->ofdm_symbol_size+fp->nb_prefix_samples));
-  //to be checked for mu=0;
+  if (prachStartSymbol == 0) {
+    sample_offset_slot = 0;
+  } else if (fp->slots_per_subframe == 1) {
+    if (prachStartSymbol <= 7)
+      sample_offset_slot = (fp->ofdm_symbol_size + fp->nb_prefix_samples) * (prachStartSymbol - 1) + (fp->ofdm_symbol_size + fp->nb_prefix_samples0);
+    else
+      sample_offset_slot = (fp->ofdm_symbol_size + fp->nb_prefix_samples) * (prachStartSymbol - 2) + (fp->ofdm_symbol_size + fp->nb_prefix_samples0) * 2;
+  } else {
+    if (!(slot%(fp->slots_per_subframe/2)))
+      sample_offset_slot = (fp->ofdm_symbol_size + fp->nb_prefix_samples) * (prachStartSymbol - 1) + (fp->ofdm_symbol_size + fp->nb_prefix_samples0);
+    else
+      sample_offset_slot = (fp->ofdm_symbol_size + fp->nb_prefix_samples) * prachStartSymbol;
+  }
 
   LOG_D(PHY,"frame %d, slot %d: doing rx_nr_prach_ru for format %d, numRA %d, prachStartSymbol %d, prachOccasion %d\n",frame,slot,prachFormat,numRA,prachStartSymbol,prachOccasion);
 
@@ -193,89 +201,167 @@ void rx_nr_prach_ru(RU_t *ru,
     prach[aa] = (int16_t*)&ru->common.rxdata[aa][fp->get_samples_slot_timestamp(slot2,fp,0)+sample_offset_slot-ru->N_TA_offset];
   } 
 
-  idft_size_idx_t dftsize;
-  int dftlen=0;
+  int reps;
+  int Ncp;
+  int dftlen;
   int mu = fp->numerology_index;
-  int Ncp = 0;
-  int16_t *prach2;
 
   if (prach_sequence_length == 0) {
     LOG_D(PHY,"PRACH (ru %d) in %d.%d, format %d, msg1_frequencyStart %d\n",
 	  ru->idx,frame,slot2,prachFormat,msg1_frequencystart);
-    AssertFatal(prachFormat<4,"Illegal prach format %d for length 839\n",prachFormat);
     switch (prachFormat) {
     case 0:
+      reps = 1;
       Ncp = 3168;
+      dftlen = 24576;
       break;
-      
+
     case 1:
+      reps = 2;
       Ncp = 21024;
+      dftlen = 24576;
       break;
-      
+
     case 2:
+      reps = 4;
       Ncp = 4688;
+      dftlen = 24576;
       break;
-      
+
     case 3:
+      reps = 4;
       Ncp = 3168;
+      dftlen = 6144;
+      break;
+
+    default:
+      AssertFatal(1==0, "Illegal prach format %d for length 839\n", prachFormat);
       break;
-      
     }
   }
   else {
     LOG_D(PHY,"PRACH (ru %d) in %d.%d, format %s, msg1_frequencyStart %d,startSymbol %d\n",
 	  ru->idx,frame,slot,prachfmt[prachFormat],msg1_frequencystart,prachStartSymbol);
-
     switch (prachFormat) {
     case 4: //A1
-      Ncp = 288/(1<<mu);
+      reps = 2;
+      Ncp = 288 >> mu;
       break;
-      
+
     case 5: //A2
-      Ncp = 576/(1<<mu);
+      reps = 4;
+      Ncp = 576 >> mu;
       break;
-      
+
     case 6: //A3
-      Ncp = 864/(1<<mu);
+      reps = 6;
+      Ncp = 864 >> mu;
       break;
-      
+
     case 7: //B1
-      Ncp = 216/(1<<mu);
-    break;
-    
+      reps = 2;
+      Ncp = 216 >> mu;
+      break;
+
     /*
     // B2 and B3 do not exist in FAPI
     case 4: //B2
-      Ncp = 360/(1<<mu);
+      reps = 4;
+      Ncp = 360 >> mu;
       break;
-      
+
     case 5: //B3
-      Ncp = 504/(1<<mu);
+      reps = 6;
+      Ncp = 504 >> mu;
       break;
     */
+
     case 8: //B4
-      Ncp = 936/(1<<mu);
+      reps = 12;
+      Ncp = 936 >> mu;
       break;
-      
+
     case 9: //C0
-      Ncp = 1240/(1<<mu);
+      reps = 1;
+      Ncp = 1240 >> mu;
       break;
-      
+
     case 10: //C2
-      Ncp = 2048/(1<<mu);
+      reps = 4;
+      Ncp = 2048 >> mu;
       break;
-      
+
     default:
       AssertFatal(1==0,"unknown prach format %x\n",prachFormat);
       break;
     }
+    dftlen = 2048 >> mu;
+  }
+
+  //actually what we should be checking here is how often the current prach crosses a 0.5ms boundary. I am not quite sure for which paramter set this would be the case, so I will ignore it for now and just check if the prach starts on a 0.5ms boundary
+  if(fp->numerology_index == 0) {
+    if (prachStartSymbol == 0 || prachStartSymbol == 7)
+      Ncp += 16;
+  }
+  else {
+    if (slot%(fp->slots_per_subframe/2)==0 && prachStartSymbol == 0)
+      Ncp += 16;
   }
+
+  switch(fp->samples_per_subframe) {
+  case 7680:
+    // 5 MHz @ 7.68 Ms/s
+    Ncp >>= 2;
+    dftlen >>= 2;
+    break;
+
+  case 15360:
+    // 10, 15 MHz @ 15.36 Ms/s
+    Ncp >>= 1;
+    dftlen >>= 1;
+    break;
+
+  case 30720:
+    // 20, 25, 30 MHz @ 30.72 Ms/s
+    Ncp = Ncp;
+    dftlen = dftlen;
+    break;
+
+  case 46080:
+    // 40 MHz @ 46.08 Ms/s
+    Ncp = (Ncp*3)/2;
+    dftlen = (dftlen*3)/2;
+    break;
+
+  case 61440:
+    // 40, 50, 60 MHz @ 61.44 Ms/s
+    Ncp <<= 1;
+    dftlen <<= 1;
+    break;
+
+  case 92160:
+    // 50, 60, 70, 80, 90 MHz @ 92.16 Ms/s
+    Ncp *= 3;
+    dftlen *= 3;
+    break;
+
+  case 122880:
+    // 70, 80, 90, 100 MHz @ 122.88 Ms/s
+    Ncp <<= 2;
+    dftlen <<= 2;
+    break;
+
+  default:
+    AssertFatal(1==0,"sample rate %f MHz not supported for numerology %d\n", fp->samples_per_subframe / 1000.0, mu);
+  }
+
+  const idft_size_idx_t dftsize = get_dft(dftlen);
+
   // Do forward transform
   if (LOG_DEBUGFLAG(PRACH)) {
-    LOG_D(PHY,"rx_prach: Doing PRACH FFT for nb_rx:%d Ncp:%d\n",ru->nb_rx, Ncp);
+    LOG_D(PHY, "rx_prach: Doing PRACH FFT for nb_rx:%d Ncp:%d dftlen:%d\n", ru->nb_rx, Ncp, dftlen);
   }
 
-  
 
   // Note: Assumes PUSCH SCS @ 30 kHz, take values for formats 0-2 and adjust for others below
   int kbar = 1;
@@ -299,357 +385,13 @@ void rx_nr_prach_ru(RU_t *ru,
   k*=K;
   k+=kbar;
 
-  int reps=1;
-
   for (int aa=0; aa<ru->nb_rx; aa++) {
     AssertFatal(prach[aa]!=NULL,"prach[%d] is null\n",aa);
 
     // do DFT
-    if (mu==1) {
-      switch(fp->samples_per_subframe) {
-        case 15360:
-          // 10, 15 MHz @ 15.36 Ms/s
-          prach2 = prach[aa] + (1*Ncp); // Ncp is for 30.72 Ms/s, so divide by 2 to bring to 15.36 Ms/s and multiply by 2 for I/Q
-          if (prach_sequence_length == 0) {
-            if (prachFormat == 0 || prachFormat == 1 || prachFormat == 2) {
-              dftlen=12288;
-              dft(DFT_12288,prach2,rxsigF[aa],1);
-            }
-            if (prachFormat == 1 || prachFormat == 2) {
-              dft(DFT_12288,prach2+24576,rxsigF[aa]+24576,1);
-              reps++;
-            }
-            if (prachFormat == 2) {
-              dft(DFT_12288,prach2+(24576*2),rxsigF[aa]+(24576*2),1);
-              dft(DFT_12288,prach2+(24576*3),rxsigF[aa]+(24576*3),1);
-              reps+=2;
-            }
-            if (prachFormat == 3) {
-              dftlen=3072;
-              for (int i=0;i<4;i++) dft(DFT_3072,prach2+(i*3072*2),rxsigF[aa]+(i*3072*2),1);
-              reps=4;
-            }
-          } else { // 839 sequence
-            if (prachStartSymbol == 0) prach2+=16; // 8 samples @ 15.36 Ms/s in first symbol of each half subframe (15/30 kHz only)
-
-            dftlen=512;
-            dft(DFT_512,prach2,rxsigF[aa],1);
-            if (prachFormat != 9/*C0*/) {
-              dft(DFT_512,prach2+1024,rxsigF[aa]+1024,1);
-              reps++;
-            }
-            if (prachFormat == 5/*A2*/ || prachFormat == 6/*A3*/|| prachFormat == 8/*B4*/ || prachFormat == 10/*C2*/) {
-              dft(DFT_512,prach2+1024*2,rxsigF[aa]+1024*2,1);
-              dft(DFT_512,prach2+1024*3,rxsigF[aa]+1024*3,1);
-              reps+=2;
-            }
-            if (prachFormat == 6/*A3*/ || prachFormat == 8/*B4*/) {
-              dft(DFT_512,prach2+1024*4,rxsigF[aa]+1024*4,1);
-              dft(DFT_512,prach2+1024*5,rxsigF[aa]+1024*5,1);
-              reps+=2;
-            }
-            if (prachFormat == 8/*B4*/) {
-              for (int i=6;i<12;i++) dft(DFT_512,prach2+(1024*i),rxsigF[aa]+(1024*i),1);
-              reps+=6;
-            }
-          }
-          break;
-
-        case 30720:
-          // 20, 25, 30 MHz @ 30.72 Ms/s
-          prach2 = prach[aa] + (2*Ncp); // Ncp is for 30.72 Ms/s, so just multiply by 2 for I/Q
-          if (prach_sequence_length == 0) {
-            if (prachFormat == 0 || prachFormat == 1 || prachFormat == 2) {
-              dftlen=24576;
-              dft(DFT_24576,prach2,rxsigF[aa],1);
-            }
-            if (prachFormat == 1 || prachFormat == 2) {
-              dft(DFT_24576,prach2+49152,rxsigF[aa]+49152,1);
-              reps++;
-            }
-            if (prachFormat == 2) {
-              dft(DFT_24576,prach2+(49152*2),rxsigF[aa]+(49152*2),1);
-              dft(DFT_24576,prach2+(49152*3),rxsigF[aa]+(49152*3),1);
-              reps+=2;
-            }
-            if (prachFormat == 3) {
-              dftlen=6144;
-              for (int i=0;i<4;i++) dft(DFT_6144,prach2+(i*6144*2),rxsigF[aa]+(i*6144*2),1);
-              reps=4;
-            }
-          } else { // 839 sequence
-            if (prachStartSymbol == 0) prach2+=32; // 16 samples @ 30.72 Ms/s in first symbol of each half subframe (15/30 kHz only)
-
-            dftlen=1024;
-            dft(DFT_1024,prach2,rxsigF[aa],1);
-            if (prachFormat != 9/*C0*/) {
-              dft(DFT_1024,prach2+2048,rxsigF[aa]+2048,1);
-              reps++;
-            }
-            if (prachFormat == 5/*A2*/ || prachFormat == 6/*A3*/|| prachFormat == 8/*B4*/ || prachFormat == 10/*C2*/) {
-              dft(DFT_1024,prach2+2048*2,rxsigF[aa]+2048*2,1);
-              dft(DFT_1024,prach2+2048*3,rxsigF[aa]+2048*3,1);
-              reps+=2;
-            }
-            if (prachFormat == 6/*A3*/ || prachFormat == 8/*B4*/) {
-              dft(DFT_1024,prach2+2048*4,rxsigF[aa]+2048*4,1);
-              dft(DFT_1024,prach2+2048*5,rxsigF[aa]+2048*5,1);
-              reps+=2;
-            }
-            if (prachFormat == 8/*B4*/) {
-              for (int i=6;i<12;i++) dft(DFT_1024,prach2+(2048*i),rxsigF[aa]+(2048*i),1);
-              reps+=6;
-            }
-          }
-          break;
-
-        case 61440:
-          // 40, 50, 60 MHz @ 61.44 Ms/s
-          prach2 = prach[aa] + (4*Ncp); // Ncp is for 30.72 Ms/s, so multiply by 2 for I/Q, and 2 to bring to 61.44 Ms/s
-          if (prach_sequence_length == 0) {
-            if (prachFormat == 0 || prachFormat == 1 || prachFormat == 2) {
-              dftlen=49152;
-              dft(DFT_49152,prach2,rxsigF[aa],1);
-            }
-            if (prachFormat == 1 || prachFormat == 2) {
-              dft(DFT_49152,prach2+98304,rxsigF[aa]+98304,1);
-              reps++;
-            }
-            if (prachFormat == 2) {
-              dft(DFT_49152,prach2+(98304*2),rxsigF[aa]+(98304*2),1);
-              dft(DFT_49152,prach2+(98304*3),rxsigF[aa]+(98304*3),1);
-              reps+=2;
-            }
-            if (prachFormat == 3) {
-              dftlen=12288;
-              for (int i=0;i<4;i++) dft(DFT_12288,prach2+(i*12288*2),rxsigF[aa]+(i*12288*2),1);
-              reps=4;
-            }
-          } else { // 839 sequence
-            if (prachStartSymbol == 0) prach2+=64; // 32 samples @ 61.44 Ms/s in first symbol of each half subframe (15/30 kHz only)
-
-            dftlen=2048;
-            dft(DFT_2048,prach2,rxsigF[aa],1);
-            if (prachFormat != 9/*C0*/) {
-              dft(DFT_2048,prach2+4096,rxsigF[aa]+4096,1);
-              reps++;
-            }
-            if (prachFormat == 5/*A2*/ || prachFormat == 6/*A3*/|| prachFormat == 8/*B4*/ || prachFormat == 10/*C2*/) {
-              dft(DFT_2048,prach2+4096*2,rxsigF[aa]+4096*2,1);
-              dft(DFT_2048,prach2+4096*3,rxsigF[aa]+4096*3,1);
-              reps+=2;
-            }
-            if (prachFormat == 6/*A3*/ || prachFormat == 8/*B4*/) {
-              dft(DFT_2048,prach2+4096*4,rxsigF[aa]+4096*4,1);
-              dft(DFT_2048,prach2+4096*5,rxsigF[aa]+4096*5,1);
-              reps+=2;
-            }
-            if (prachFormat == 8/*B4*/) {
-              for (int i=6;i<12;i++) dft(DFT_2048,prach2+(4096*i),rxsigF[aa]+(4096*i),1);
-              reps+=6;
-            }
-          }
-          break;
-
-        case 46080:
-          // 40 MHz @ 46.08 Ms/s
-          prach2 = prach[aa] + (3*Ncp); // 46.08 is 1.5 * 30.72, times 2 for I/Q
-          if (prach_sequence_length == 0) {
-            if (prachFormat == 0 || prachFormat == 1 || prachFormat == 2) {
-              dftlen=36864;
-              dft(DFT_36864,prach2,rxsigF[aa],1);
-            }
-            if (prachFormat == 1 || prachFormat == 2) {
-              dft(DFT_36864,prach2+73728,rxsigF[aa]+73728,1);
-              reps++;
-            }
-            if (prachFormat == 2) {
-              dft(DFT_36864,prach2+(73728*2),rxsigF[aa]+(73728*2),1);
-              dft(DFT_36864,prach2+(73728*3),rxsigF[aa]+(73728*3),1);
-              reps+=2;
-            }
-            if (prachFormat == 3) {
-              dftlen=9216;
-              for (int i=0;i<4;i++) dft(DFT_9216,prach2+(i*9216*2),rxsigF[aa]+(i*9216*2),1);
-              reps=4;
-            }
-          } else { // 839 sequence
-            if (prachStartSymbol == 0) prach2+=48; // 24 samples @ 46.08 Ms/s in first symbol of each half subframe (15/30 kHz only)
-
-            dftlen=1536;
-            dft(DFT_1536,prach2,rxsigF[aa],1);
-            if (prachFormat != 9/*C0*/) {
-              dft(DFT_1536,prach2+3072,rxsigF[aa]+3072,1);
-              reps++;
-            }
-            if (prachFormat == 5/*A2*/ || prachFormat == 6/*A3*/|| prachFormat == 8/*B4*/ || prachFormat == 10/*C2*/) {
-              dft(DFT_1536,prach2+3072*2,rxsigF[aa]+3072*2,1);
-              dft(DFT_1536,prach2+3072*3,rxsigF[aa]+3072*3,1);
-              reps+=2;
-            }
-            if (prachFormat == 6/*A3*/ || prachFormat == 8/*B4*/) {
-              dft(DFT_1536,prach2+3072*4,rxsigF[aa]+3072*4,1);
-              dft(DFT_1536,prach2+3072*5,rxsigF[aa]+3072*5,1);
-              reps+=2;
-            }
-            if (prachFormat == 8/*B4*/) {
-              for (int i=6;i<12;i++) dft(DFT_1536,prach2+(3072*i),rxsigF[aa]+(3072*i),1);
-              reps+=6;
-            }
-          }
-          break;
-
-        case 122880:
-          // 70, 80, 90, 100 MHz @ 122.88 Ms/s
-          prach2 = prach[aa] + (8*Ncp);
-          if (prach_sequence_length == 0) {
-            if (prachFormat == 0 || prachFormat == 1 || prachFormat == 2) {
-              dftlen=98304;
-              dft(DFT_98304,prach2,rxsigF[aa],1);
-            }
-            if (prachFormat == 1 || prachFormat == 2) {
-              dft(DFT_98304,prach2+196608,rxsigF[aa]+196608,1);
-              reps++;
-            }
-            if (prachFormat == 2) {
-              dft(DFT_98304,prach2+(196608*2),rxsigF[aa]+(196608*2),1);
-              dft(DFT_98304,prach2+(196608*3),rxsigF[aa]+(196608*3),1);
-              reps+=2;
-            }
-            if (prachFormat == 3) {
-              dftlen=24576;
-              for (int i=0;i<4;i++) dft(DFT_24576,prach2+(i*2*24576),rxsigF[aa]+(i*2*24576),1);
-              reps=4;
-            }
-          } else { // 839 sequence
-            if (prachStartSymbol == 0) prach2+=128; // 64 samples @ 122.88 Ms/s in first symbol of each half subframe (15/30 kHz only)
-
-            dftlen=4096;
-            dft(DFT_4096,prach2,rxsigF[aa],1);
-            if (prachFormat != 9/*C0*/) {
-              dft(DFT_4096,prach2+8192,rxsigF[aa]+8192,1);
-              reps++;
-            }
-
-            if (prachFormat == 5/*A2*/ || prachFormat == 6/*A3*/|| prachFormat == 8/*B4*/ || prachFormat == 10/*C2*/) {
-              dft(DFT_4096,prach2+8192*2,rxsigF[aa]+8192*2,1);
-              dft(DFT_4096,prach2+8192*3,rxsigF[aa]+8192*3,1);
-              reps+=2;
-            }
-            if (prachFormat == 6/*A3*/ || prachFormat == 8/*B4*/) {
-              dft(DFT_4096,prach2+8192*4,rxsigF[aa]+8192*4,1);
-              dft(DFT_4096,prach2+8192*5,rxsigF[aa]+8192*5,1);
-              reps+=2;
-            }
-            if (prachFormat == 8/*B4*/) {
-              for (int i=6;i<12;i++) dft(DFT_4096,prach2+(8192*i),rxsigF[aa]+(8192*i),1);
-              reps+=6;
-            }
-          }
-          break;
-
-        case 92160:
-          // 80, 90 MHz @ 92.16 Ms/s
-          prach2 = prach[aa] + (6*Ncp);
-          if (prach_sequence_length == 0) {
-            if (prachFormat == 0 || prachFormat == 1 || prachFormat == 2) {
-              dftlen=73728;
-              dft(DFT_73728,prach2,rxsigF[aa],1);
-            }
-            if (prachFormat == 1 || prachFormat == 2) {
-              dft(DFT_73728,prach2+147456,rxsigF[aa]+147456,1);
-              reps++;
-            }
-            if (prachFormat == 2) {
-              dft(DFT_73728,prach2+(147456*2),rxsigF[aa]+(147456*2),1);
-              dft(DFT_73728,prach2+(147456*3),rxsigF[aa]+(147456*3),1);
-              reps+=2;
-            }
-            if (prachFormat == 3) {
-              dftlen=18432;
-              for (int i=0;i<4;i++) dft(DFT_18432,prach2+(i*2*18432),rxsigF[aa]+(i*2*18432),1);
-              reps=4;
-            }
-          } else {
-            if (prachStartSymbol == 0) prach2+=96; // 64 samples @ 122.88 Ms/s in first symbol of each half subframe (15/30 kHz only)
-
-            dftlen=3072;
-            dft(DFT_3072,prach2,rxsigF[aa],1);
-            if (prachFormat != 9/*C0*/) {
-              dft(DFT_3072,prach2+6144,rxsigF[aa]+6144,1);
-              reps++;
-            }
-
-            if (prachFormat == 5/*A2*/ || prachFormat == 6/*A3*/|| prachFormat == 8/*B4*/ || prachFormat == 10/*C2*/) {
-              dft(DFT_3072,prach2+6144*2,rxsigF[aa]+6144*2,1);
-              dft(DFT_3072,prach2+6144*3,rxsigF[aa]+6144*3,1);
-              reps+=2;
-            }
-            if (prachFormat == 6/*A3*/ || prachFormat == 8/*B4*/) {
-              dft(DFT_3072,prach2+6144*4,rxsigF[aa]+6144*4,1);
-              dft(DFT_3072,prach2+6144*5,rxsigF[aa]+6144*5,1);
-              reps+=2;
-            }
-            if (prachFormat == 8/*B4*/) {
-              for (int i=6;i<12;i++) dft(DFT_3072,prach2+(6144*i),rxsigF[aa]+(6144*i),1);
-              reps+=6;
-            }
-          }
-          break;
-        default:
-          AssertFatal(1==0,"sample_rate %f MHz not support for NR PRACH yet\n", fp->samples_per_subframe / 1000.0);
-      }
-    }
-    else if (mu==3) {
-      if (fp->threequarter_fs) {
-	AssertFatal(1==0,"3/4 sampling not supported for numerology %d\n",mu);
-      }
-      if (prach_sequence_length == 0) {
-	AssertFatal(1==0,"long prach not supported for numerology %d\n",mu);
-      }
-      if (fp->N_RB_UL == 32) {
-	prach2 = prach[aa] + (Ncp<<2); // Ncp is for 30.72 Ms/s, so multiply by 2 for I/Q, and 2 for 61.44Msps
-	if (slot%(fp->slots_per_subframe/2)==0 && prachStartSymbol == 0)
-	  prach2+=64; // 32 samples @ 61.44 Ms/s in first symbol of each half subframe
-	dftlen=512;
-	dftsize = DFT_512;
-      }
-      else if (fp->N_RB_UL == 66) {
-	prach2 = prach[aa] + (Ncp<<3); // Ncp is for 30.72 Ms/s, so multiply by 4 for I/Q, and 2 for 122.88Msps
-	if (slot%(fp->slots_per_subframe/2)==0 && prachStartSymbol == 0)
-	  prach2+=128; // 64 samples @ 122.88 Ms/s in first symbol of each half subframe 
-	dftlen=1024;
-	dftsize = DFT_1024;
-      }
-      else {
-	AssertFatal(1==0,"N_RB_UL %d not support for numerology %d\n",fp->N_RB_UL,mu);
-      }
-      
-      dft(dftsize,prach2,rxsigF[aa],1);
-      if (prachFormat != 9/*C0*/) {
-	dft(dftsize,prach2+dftlen*2,rxsigF[aa]+dftlen*2,1);
-	reps++;
-      }
-	  
-      if (prachFormat == 5/*A2*/ || prachFormat == 6/*A3*/|| prachFormat == 8/*B4*/ || prachFormat == 10/*C2*/) {     
-	dft(dftsize,prach2+dftlen*4,rxsigF[aa]+dftlen*4,1);
-	dft(dftsize,prach2+dftlen*6,rxsigF[aa]+dftlen*6,1);
-	reps+=2;
-      } 
-      if (prachFormat == 6/*A3*/ || prachFormat == 8/*B4*/) {     
-	dft(dftsize,prach2+dftlen*8,rxsigF[aa]+dftlen*8,1);
-	dft(dftsize,prach2+dftlen*10,rxsigF[aa]+dftlen*10,1);
-	reps+=2;
-      } 
-      if (prachFormat == 8/*B4*/) {
-	for (int i=6;i<12;i++)
-	  dft(dftsize,prach2+(dftlen*2*i),rxsigF[aa]+(dftlen*2*i),1);
-	reps+=6;
-      }
-    }
-    else {
-      AssertFatal(1==0,"Numerology not supported\n");
-    }
+    int16_t *prach2 = prach[aa] + (2*Ncp); // times 2 for complex samples
+    for (int i = 0; i < reps; i++)
+      dft(dftsize, prach2 + 2*dftlen*i, rxsigF[aa] + 2*dftlen*i, 1);
 
     //LOG_M("ru_rxsigF_tmp.m","rxsFtmp", rxsigF[aa], dftlen*2*reps, 1, 1);
 
diff --git a/openair1/PHY/NR_TRANSPORT/nr_scrambling.c b/openair1/PHY/NR_TRANSPORT/nr_scrambling.c
index 4bbecfd994d4ffd0dd180a5634d87f15084fd460..8a49a7ffe0d1f3b4920e77c218d1f77e3a0db6e1 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_scrambling.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_scrambling.c
@@ -52,6 +52,7 @@ void nr_codeword_scrambling(uint8_t *in,
     ((uint16_t*)&in32)[0] = _mm_movemask_epi8(_mm_slli_epi16(in128[0],7));
     ((uint16_t*)&in32)[1] = _mm_movemask_epi8(_mm_slli_epi16(in128[1],7));
     out[i]=(in32^s);
+    LOG_D(PHY,"in[%d] %x => %x\n",i,in32,out[i]);
     s=lte_gold_generic(&x1, &x2, 0);
   }
 //#elsif defined(__arm__) || defined(__aarch64)
diff --git a/openair1/PHY/NR_TRANSPORT/nr_transport_common_proto.h b/openair1/PHY/NR_TRANSPORT/nr_transport_common_proto.h
index 2daf2af1fb80922c90caacd2796ca39ff4eb4df8..74d19bf6f614666abf139fe31310cd0d2c351021 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_transport_common_proto.h
+++ b/openair1/PHY/NR_TRANSPORT/nr_transport_common_proto.h
@@ -60,14 +60,6 @@ uint32_t nr_get_G(uint16_t nb_rb, uint16_t nb_symb_sch, uint8_t nb_re_dmrs, uint
 
 uint32_t nr_get_E(uint32_t G, uint8_t C, uint8_t Qm, uint8_t Nl, uint8_t r);
 
-uint8_t nr_get_Qm_ul(uint8_t Imcs, uint8_t table_idx);
-
-uint8_t nr_get_Qm_dl(uint8_t Imcs, uint8_t table_idx);
-
-uint32_t nr_get_code_rate_ul(uint8_t Imcs, uint8_t table_idx);
-
-uint32_t nr_get_code_rate_dl(uint8_t Imcs, uint8_t table_idx);
-
 void compute_nr_prach_seq(uint8_t short_sequence,
                           uint8_t num_sequences,
                           uint8_t rootSequenceIndex,
diff --git a/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h b/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h
index d22f3fe2c4f9db7e2cfb21f8b1dfad66695399ea..0b81f5322df8df8708c7d24ce834a96c3e2e0a71 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h
+++ b/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h
@@ -144,21 +144,22 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
     @param nb_rb_pusch The number of RBs allocated (used for Resource Allocation Type 1 in NR)
     @param frame_parms, Pointer to frame descriptor structure
 */
-void nr_ulsch_extract_rbs_single(int32_t **rxdataF,
-                                 NR_gNB_PUSCH *pusch_vars,
-                                 int slot,
-                                 unsigned char symbol,
-                                 uint8_t is_dmrs_symbol,
-                                 nfapi_nr_pusch_pdu_t *pusch_pdu,
-                                 NR_DL_FRAME_PARMS *frame_parms);
+void nr_ulsch_extract_rbs(int32_t **rxdataF,
+                          NR_gNB_PUSCH *pusch_vars,
+                          int slot,
+                          unsigned char symbol,
+                          uint8_t is_dmrs_symbol,
+                          nfapi_nr_pusch_pdu_t *pusch_pdu,
+                          NR_DL_FRAME_PARMS *frame_parms);
 
 void nr_ulsch_scale_channel(int32_t **ul_ch_estimates_ext,
                             NR_DL_FRAME_PARMS *frame_parms,
                             NR_gNB_ULSCH_t *ulsch_gNB,
-                            uint8_t symbol,
-                            uint8_t start_symbol,
-                            uint16_t nb_rb,
-                            pusch_dmrs_type_t pusch_dmrs_type);
+                            uint8_t symbol, 
+                            uint8_t is_dmrs_symbol,                           
+                            uint32_t len,
+                            uint8_t nrOfLayers,
+                            uint16_t nb_rb);
 
 /** \brief This function computes the average channel level over all allocated RBs and antennas (TX/RX) in order to compute output shift for compensated signal
     @param ul_ch_estimates_ext Channel estimates in allocated RBs
@@ -192,9 +193,10 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext,
                                 int **ul_ch_mag,
                                 int **ul_ch_magb,
                                 int **rxdataF_comp,
-                                int **rho,
+                                int ***rho,
                                 NR_DL_FRAME_PARMS *frame_parms,
                                 unsigned char symbol,
+                                int length,
                                 uint8_t is_dmrs_symbol,
                                 unsigned char mod_order,
                                 uint8_t  nrOfLayers,
@@ -262,8 +264,8 @@ void nr_ulsch_64qam_llr(int32_t *rxdataF_comp,
     @param mod_order modulation order
 */
 void nr_ulsch_compute_llr(int32_t *rxdataF_comp,
-                          int32_t **ul_ch_mag,
-                          int32_t **ul_ch_magb,
+                          int32_t *ul_ch_mag,
+                          int32_t *ul_ch_magb,
                           int16_t  *ulsch_llr,
                           uint32_t nb_rb,
                           uint32_t nb_re,
@@ -336,17 +338,27 @@ int nr_get_srs_signal(PHY_VARS_gNB *gNB,
                       int slot,
                       nfapi_nr_srs_pdu_t *srs_pdu,
                       nr_srs_info_t *nr_srs_info,
-                      int32_t **srs_received_signal);
+                      int32_t srs_received_signal[][gNB->frame_parms.ofdm_symbol_size*(1<<srs_pdu->num_symbols)]);
 
 void init_prach_list(PHY_VARS_gNB *gNB);
 void init_prach_ru_list(RU_t *ru);
 void free_nr_ru_prach_entry(RU_t *ru, int prach_id);
 uint8_t get_nr_prach_duration(uint8_t prach_format);
 
-void nr_generate_csi_rs(PHY_VARS_gNB *gNB,
-                        int16_t amp,
-                        nfapi_nr_dl_tti_csi_rs_pdu_rel15_t csi_params,
-                        int slot);
+void nr_generate_csi_rs(const NR_DL_FRAME_PARMS *frame_parms,
+                        int32_t **dataF,
+                        const int16_t amp,
+                        nr_csi_info_t *nr_csi_info,
+                        const nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *csi_params,
+                        const int slot,
+                        uint8_t *N_cdm_groups,
+                        uint8_t *CDM_group_size,
+                        uint8_t *k_prime,
+                        uint8_t *l_prime,
+                        uint8_t *N_ports,
+                        uint8_t *j_cdm,
+                        uint8_t *k_overline,
+                        uint8_t *l_overline);
 
 void free_nr_prach_entry(PHY_VARS_gNB *gNB, int prach_id);
 
diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch.c
index 3e3137739e2d620339619ab17414cf2a17b05a35..e56a4607e2d9a130e204c347db3a714f130ad4c3 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_ulsch.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch.c
@@ -68,12 +68,20 @@ void nr_fill_ulsch(PHY_VARS_gNB *gNB,
   ulsch->rnti = ulsch_pdu->rnti;
   //ulsch->rnti_type;
   ulsch->harq_mask |= 1<<harq_pid;
-  ulsch->harq_process_id[slot] = harq_pid;
 
-  ulsch->harq_processes[harq_pid]->frame=frame;
-  ulsch->harq_processes[harq_pid]->slot=slot;
-  ulsch->harq_processes[harq_pid]->handled= 0;
-  ulsch->harq_processes[harq_pid]->status= NR_ACTIVE;
+  NR_UL_gNB_HARQ_t *harq = ulsch->harq_processes[harq_pid];
+  harq->frame=frame;
+  harq->slot=slot;
+  harq->handled = 0;
+  harq->status= NR_ACTIVE;
+  harq->new_rx = harq->ndi != ulsch_pdu->pusch_data.new_data_indicator;
+  if (harq->new_rx) {
+    harq->ndi = ulsch_pdu->pusch_data.new_data_indicator;
+    harq->round = 0;
+  } else {
+    harq->round++;
+  }
+
   memcpy((void*)&ulsch->harq_processes[harq_pid]->ulsch_pdu, (void*)ulsch_pdu, sizeof(nfapi_nr_pusch_pdu_t));
 
   LOG_D(PHY,"Initializing nFAPI for ULSCH, UE %d, harq_pid %d\n",ulsch_id,harq_pid);
@@ -85,6 +93,33 @@ void nr_ulsch_unscrambling(int16_t* llr, uint32_t size, uint32_t Nid, uint32_t n
   nr_codeword_unscrambling(llr, size, 0, Nid, n_RNTI);
 }
 
+void nr_ulsch_layer_demapping(int16_t *llr_cw,
+				     uint8_t Nl,
+				     uint8_t mod_order,
+				     uint32_t length,
+				     int16_t **llr_layers) 
+{
+
+  switch (Nl) {
+    case 1:
+      memcpy((void*)llr_cw, (void*)llr_layers[0], (length)*sizeof(int16_t));
+      break;
+    case 2:
+    case 3:
+    case 4:
+      for (int i=0; i<(length/Nl/mod_order); i++) {
+        for (int l=0; l<Nl; l++) {
+          for (int m=0; m<mod_order; m++) {
+            llr_cw[i*Nl*mod_order+l*mod_order+m] = llr_layers[l][i*mod_order+m];
+          }
+        }
+      }
+      break;
+  default:
+  AssertFatal(0, "Not supported number of layers %d\n", Nl);
+  }
+}
+
 void dump_pusch_stats(FILE *fd,PHY_VARS_gNB *gNB) {
 
   for (int i=0;i<gNB->number_of_nr_ulsch_max;i++) {
diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch.h b/openair1/PHY/NR_TRANSPORT/nr_ulsch.h
index 0791fd2bbc63f982aca2e32248f4d4b844519102..c7229bc5d0736e702920a2a8b0c9a7a564923730 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_ulsch.h
+++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch.h
@@ -71,6 +71,12 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
 
 void nr_ulsch_unscrambling(int16_t* llr, uint32_t size, uint32_t Nid, uint32_t n_RNTI);
 
+void nr_ulsch_layer_demapping(int16_t *llr_cw,
+				     uint8_t Nl,
+				     uint8_t mod_order,
+				     uint32_t length,
+				     int16_t **llr_layers); 
+
 void nr_ulsch_procedures(PHY_VARS_gNB *gNB,
                          int frame_rx,
                          int slot_rx,
diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c
index 39f14b05f89912e3a927e5bee68a87019967ec54..ef5c0c069e0f000c3c46ac11723c108d131c9dca 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c
@@ -57,8 +57,7 @@
 void free_gNB_ulsch(NR_gNB_ULSCH_t **ulschptr, uint16_t N_RB_UL)
 {
 
-  int i,r;
-  uint16_t a_segments = MAX_NUM_NR_ULSCH_SEGMENTS;  //number of segments to be allocated
+  uint16_t a_segments = MAX_NUM_NR_ULSCH_SEGMENTS_PER_LAYER*NR_MAX_NB_LAYERS;  //number of segments to be allocated
   NR_gNB_ULSCH_t *ulsch = *ulschptr;
 
   if (N_RB_UL != 273) {
@@ -66,17 +65,18 @@ void free_gNB_ulsch(NR_gNB_ULSCH_t **ulschptr, uint16_t N_RB_UL)
     a_segments = a_segments/273 +1;
   }
 
-  for (i=0; i<NR_MAX_ULSCH_HARQ_PROCESSES; i++) {
+  for (int i=0; i<NR_MAX_ULSCH_HARQ_PROCESSES; i++) {
     if (ulsch->harq_processes[i]) {
       if (ulsch->harq_processes[i]->b) {
         free_and_zero(ulsch->harq_processes[i]->b);
         ulsch->harq_processes[i]->b = NULL;
       }
-      for (r=0; r<a_segments; r++) {
+      for (int r=0; r<a_segments; r++) {
         free_and_zero(ulsch->harq_processes[i]->c[r]);
         free_and_zero(ulsch->harq_processes[i]->d[r]);
-        free_and_zero(ulsch->harq_processes[i]->w[r]);
       }
+      free_and_zero(ulsch->harq_processes[i]->c);
+      free_and_zero(ulsch->harq_processes[i]->d);
       free_and_zero(ulsch->harq_processes[i]);
       ulsch->harq_processes[i] = NULL;
     }
@@ -90,7 +90,7 @@ NR_gNB_ULSCH_t *new_gNB_ulsch(uint8_t max_ldpc_iterations, uint16_t N_RB_UL)
 
   NR_gNB_ULSCH_t *ulsch;
   uint8_t i,r;
-  uint16_t a_segments = MAX_NUM_NR_ULSCH_SEGMENTS;  //number of segments to be allocated
+  uint16_t a_segments = MAX_NUM_NR_ULSCH_SEGMENTS_PER_LAYER*NR_MAX_NB_LAYERS;  //number of segments to be allocated
 
   if (N_RB_UL != 273) {
     a_segments = a_segments*N_RB_UL;
@@ -101,16 +101,16 @@ NR_gNB_ULSCH_t *new_gNB_ulsch(uint8_t max_ldpc_iterations, uint16_t N_RB_UL)
   ulsch = (NR_gNB_ULSCH_t *)malloc16_clear(sizeof(NR_gNB_ULSCH_t));
 
   ulsch->max_ldpc_iterations = max_ldpc_iterations;
-  ulsch->Mlimit = 4;
 
   for (i=0; i<NR_MAX_ULSCH_HARQ_PROCESSES; i++) {
 
     ulsch->harq_processes[i] = (NR_UL_gNB_HARQ_t *)malloc16_clear(sizeof(NR_UL_gNB_HARQ_t));
     ulsch->harq_processes[i]->b = (uint8_t*)malloc16_clear(ulsch_bytes);
+    ulsch->harq_processes[i]->c = (uint8_t**)malloc16_clear(a_segments*sizeof(uint8_t *));
+    ulsch->harq_processes[i]->d = (int16_t**)malloc16_clear(a_segments*sizeof(int16_t *));
     for (r=0; r<a_segments; r++) {
       ulsch->harq_processes[i]->c[r] = (uint8_t*)malloc16_clear(8448*sizeof(uint8_t));
       ulsch->harq_processes[i]->d[r] = (int16_t*)malloc16_clear((68*384)*sizeof(int16_t));
-      ulsch->harq_processes[i]->w[r] = (int16_t*)malloc16_clear((3*(6144+64))*sizeof(int16_t));
     }
   }
 
@@ -135,10 +135,8 @@ void clean_gNB_ulsch(NR_gNB_ULSCH_t *ulsch)
     ulsch->rnti_type = 0;
     ulsch->cyclicShift = 0;
     ulsch->cooperation_flag = 0;
-    ulsch->Mlimit = 0;
     ulsch->max_ldpc_iterations = 0;
     ulsch->last_iteration_cnt = 0;
-    for (i=0;i<NR_MAX_SLOTS_PER_FRAME;i++) ulsch->harq_process_id[i] = 0;
 
     for (i=0; i<NR_MAX_ULSCH_HARQ_PROCESSES; i++) {
       if (ulsch->harq_processes[i]){
@@ -168,8 +166,6 @@ void clean_gNB_ulsch(NR_gNB_ULSCH_t *ulsch)
         ulsch->harq_processes[i]->C=0;
         /// Pointers to code blocks after LDPC coding (38.212 V15.4.0 section 5.3.2)
         //int16_t *d[MAX_NUM_NR_ULSCH_SEGMENTS];
-        /// LDPC processing buffer
-        //t_nrLDPC_procBuf* p_nrLDPC_procBuf[MAX_NUM_NR_ULSCH_SEGMENTS];
         ulsch->harq_processes[i]->Z=0;
         /// code blocks after bit selection in rate matching for LDPC code (38.212 V15.4.0 section 5.4.2.1)
         //int16_t e[MAX_NUM_NR_ULSCH_SEGMENTS][3*8448];
@@ -234,7 +230,6 @@ void nr_processULSegment(void* arg) {
   int rv_index = rdata->rv_index;
   int r_offset = rdata->r_offset;
   uint8_t kc = rdata->Kc;
-  uint32_t Tbslbrm = rdata->Tbslbrm;
   short* ulsch_llr = rdata->ulsch_llr;
   int max_ldpc_iterations = p_decoderParms->numMaxIter;
   int8_t llrProcBuf[OAI_UL_LDPC_MAX_NUM_LLR] __attribute__ ((aligned(32)));
@@ -244,8 +239,6 @@ void nr_processULSegment(void* arg) {
 
   __m128i *pv = (__m128i*)&z;
   __m128i *pl = (__m128i*)&l;
-  
-  uint8_t  Ilbrm    = 0;
 
   Kr = ulsch_harq->K;
   Kr_bytes = Kr>>3;
@@ -262,9 +255,12 @@ void nr_processULSegment(void* arg) {
 
   //////////////////////////// ulsch_llr =====> ulsch_harq->e //////////////////////////////
 
+  /// code blocks after bit selection in rate matching for LDPC code (38.212 V15.4.0 section 5.4.2.1)
+  int16_t harq_e[3*8448];
+
   nr_deinterleaving_ldpc(E,
                          Qm,
-                         ulsch_harq->e[r],
+                         harq_e,
                          ulsch_llr+r_offset);
 
   //for (int i =0; i<16; i++)
@@ -273,16 +269,7 @@ void nr_processULSegment(void* arg) {
   stop_meas(&phy_vars_gNB->ulsch_deinterleaving_stats);
 
 
-  /*LOG_D(PHY,"HARQ_PID %d Rate Matching Segment %d (coded bits %d,unpunctured/repeated bits %d, TBS %d, mod_order %d, nb_rb %d, Nl %d, rv %d, round %d)...\n",
-        harq_pid,r, G,
-        Kr*3,
-        ulsch_harq->TBS,
-        Qm,
-        nb_rb,
-        n_layers,
-        pusch_pdu->pusch_data.rv_index,
-        ulsch_harq->round);*/
-  //////////////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////////////////////////////////
 
 
   //////////////////////////////////////////////////////////////////////////////////////////
@@ -293,12 +280,11 @@ void nr_processULSegment(void* arg) {
 
   //start_meas(&phy_vars_gNB->ulsch_rate_unmatching_stats);
 
-  if (nr_rate_matching_ldpc_rx(Ilbrm,
-                               Tbslbrm,
+  if (nr_rate_matching_ldpc_rx(rdata->tbslbrm,
                                p_decoderParms->BG,
                                p_decoderParms->Z,
                                ulsch_harq->d[r],
-                               ulsch_harq->e[r],
+                               harq_e,
                                ulsch_harq->C,
                                rv_index,
                                ulsch_harq->new_rx,
@@ -361,13 +347,13 @@ void nr_processULSegment(void* arg) {
 
   if (check_crc((uint8_t*)llrProcBuf,length_dec,ulsch_harq->F,crc_type)) {
 #ifdef PRINT_CRC_CHECK
-      LOG_I(PHY, "Segment %d CRC OK, iterations %d/%d\n",r,no_iteration_ldpc,max_ldpc_iterations);
+      LOG_I(PHY,"Segment %d CRC OK, iterations %d/%d\n",r,no_iteration_ldpc,max_ldpc_iterations);
 #endif
     rdata->decodeIterations = no_iteration_ldpc;
     if (rdata->decodeIterations > p_decoderParms->numMaxIter) rdata->decodeIterations--;
   } else {
 #ifdef PRINT_CRC_CHECK
-      LOG_I(PHY, "CRC NOK\n");
+      LOG_I(PHY,"CRC NOK\n");
 #endif
     rdata->decodeIterations = max_ldpc_iterations + 1;
   }
@@ -394,7 +380,6 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
   uint32_t r_offset;
   uint32_t offset;
   int kc;
-  int Tbslbrm;
   int E;
 
 #ifdef PRINT_CRC_CHECK
@@ -419,13 +404,10 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
     
   phy_vars_gNB->nbDecode = 0;
   harq_process->processedSegments = 0;
-
-  double   Coderate = 0.0;
   
   // ------------------------------------------------------------------
   uint16_t nb_rb          = pusch_pdu->rb_size;
   uint8_t Qm              = pusch_pdu->qam_mod_order;
-  uint16_t R              = pusch_pdu->target_code_rate;
   uint8_t mcs             = pusch_pdu->mcs_index;
   uint8_t n_layers        = pusch_pdu->nrOfLayers;
   // ------------------------------------------------------------------
@@ -454,13 +436,12 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
 
   A   = (harq_process->TBS)<<3;
 
-  LOG_D(NR_PHY, "ULSCH Decoding, harq_pid %d TBS %d G %d mcs %d Nl %d nb_rb %d, Qm %d, n_layers %d, Coderate %d\n", harq_pid, A, G, mcs, n_layers, nb_rb, Qm, n_layers, R);
+  // target_code_rate is in 0.1 units
+  float Coderate = (float) pusch_pdu->target_code_rate / 10240.0f;
+
+  LOG_D(PHY,"ULSCH Decoding, harq_pid %d TBS %d G %d mcs %d Nl %d nb_rb %d, Qm %d, Coderate %f RV %d round %d\n",
+        harq_pid, A, G, mcs, n_layers, nb_rb, Qm, Coderate, pusch_pdu->pusch_data.rv_index, harq_process->round);
 
-  if (R<1024)
-    Coderate = (float) R /(float) 1024;
-  else
-    Coderate = (float) R /(float) 2048;
-  
   if ((A <=292) || ((A<=3824) && (Coderate <= 0.6667)) || Coderate <= 0.25){
     p_decParams->BG = 2;
     kc = 52;
@@ -539,7 +520,6 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
   if (!frame%100)
     printf("K %d C %d Z %d \n", harq_process->K, harq_process->C, harq_process->Z);
 #endif
-  Tbslbrm = nr_compute_tbslbrm(0,nb_rb,n_layers);
 
   p_decParams->Z = harq_process->Z;
 
@@ -549,7 +529,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
 
   r_offset = 0;
 
-  uint16_t a_segments = MAX_NUM_NR_ULSCH_SEGMENTS;  //number of segments to be allocated
+  uint16_t a_segments = MAX_NUM_NR_ULSCH_SEGMENTS_PER_LAYER*n_layers;  //number of segments to be allocated
 
   if (nb_rb != 273) {
     a_segments = a_segments*nb_rb;
@@ -590,10 +570,10 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
     rdata->r_offset = r_offset;
     rdata->Kr_bytes = Kr_bytes;
     rdata->rv_index = pusch_pdu->pusch_data.rv_index;
-    rdata->Tbslbrm = Tbslbrm;
     rdata->offset = offset;
     rdata->ulsch = ulsch;
     rdata->ulsch_id = ULSCH_id;
+    rdata->tbslbrm = pusch_pdu->maintenance_parms_v3.tbSizeLbrmBytes;
     pushTpool(phy_vars_gNB->threadPool,req);
     phy_vars_gNB->nbDecode++;
     LOG_D(PHY,"Added a block to decode, in pipe: %d\n",phy_vars_gNB->nbDecode);
diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
index 44f4dd8bfc15270d062d25fbb5c929e61a9376c3..4b8315e1ce488b4f43dde0acfca721deb5bed1c0 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
@@ -302,36 +302,32 @@ void nr_idft(int32_t *z, uint32_t Msc_PUSCH)
 }
 
 
-void nr_ulsch_extract_rbs_single(int32_t **rxdataF,
-                                 NR_gNB_PUSCH *pusch_vars,
-                                 int slot,
-                                 unsigned char symbol,
-                                 uint8_t is_dmrs_symbol,
-                                 nfapi_nr_pusch_pdu_t *pusch_pdu,
-                                 NR_DL_FRAME_PARMS *frame_parms)
-{
+void nr_ulsch_extract_rbs(int32_t **rxdataF,
+                          NR_gNB_PUSCH *pusch_vars,
+                          int slot,
+                          unsigned char symbol,
+                          uint8_t is_dmrs_symbol,
+                          nfapi_nr_pusch_pdu_t *pusch_pdu,
+                          NR_DL_FRAME_PARMS *frame_parms) {
 
   unsigned short start_re, re, nb_re_pusch;
-  unsigned char aarx;
+  unsigned char aarx, aatx;
   uint32_t rxF_ext_index = 0;
   uint32_t ul_ch0_ext_index = 0;
   uint32_t ul_ch0_index = 0;
-  uint8_t k_prime;
-  uint16_t n;
   int16_t *rxF,*rxF_ext;
   int *ul_ch0,*ul_ch0_ext;
-  uint8_t delta = 0;
   int soffset = (slot&3)*frame_parms->symbols_per_slot*frame_parms->ofdm_symbol_size;
-#ifdef DEBUG_RB_EXT
 
+#ifdef DEBUG_RB_EXT
   printf("--------------------symbol = %d-----------------------\n", symbol);
   printf("--------------------ch_ext_index = %d-----------------------\n", symbol*NR_NB_SC_PER_RB * pusch_pdu->rb_size);
-
 #endif
 
-  uint8_t is_dmrs_re;
+  uint8_t is_data_re;
   start_re = (frame_parms->first_carrier_offset + (pusch_pdu->rb_start + pusch_pdu->bwp_start) * NR_NB_SC_PER_RB)%frame_parms->ofdm_symbol_size;
   nb_re_pusch = NR_NB_SC_PER_RB * pusch_pdu->rb_size;
+
 #ifdef __AVX2__
   int nb_re_pusch2 = nb_re_pusch + (nb_re_pusch&7);
 #else
@@ -340,62 +336,64 @@ void nr_ulsch_extract_rbs_single(int32_t **rxdataF,
 
   for (aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) {
 
-    rxF       = (int16_t *)&rxdataF[aarx][soffset+(symbol * frame_parms->ofdm_symbol_size)];
-    rxF_ext   = (int16_t *)&pusch_vars->rxdataF_ext[aarx][symbol * nb_re_pusch2]; // [hna] rxdataF_ext isn't contiguous in order to solve an alignment problem ib llr computation in case of mod_order = 4, 6
-
-    ul_ch0     = &pusch_vars->ul_ch_estimates[aarx][pusch_vars->dmrs_symbol*frame_parms->ofdm_symbol_size]; // update channel estimates if new dmrs symbol are available
-
-    ul_ch0_ext = &pusch_vars->ul_ch_estimates_ext[aarx][symbol*nb_re_pusch2];
-
-    n = 0;
-    k_prime = 0;
-    rxF_ext_index = 0;
-    ul_ch0_ext_index = 0;
-    ul_ch0_index = 0;
-
+    rxF = (int16_t *)&rxdataF[aarx][soffset+(symbol * frame_parms->ofdm_symbol_size)];
+    rxF_ext = (int16_t *)&pusch_vars->rxdataF_ext[aarx][symbol * nb_re_pusch2]; // [hna] rxdataF_ext isn't contiguous in order to solve an alignment problem ib llr computation in case of mod_order = 4, 6
+    
     if (is_dmrs_symbol == 0) {
-      //
-      //rxF[ ((start_re + re)*2)      % (frame_parms->ofdm_symbol_size*2)]);
       if (start_re + nb_re_pusch <= frame_parms->ofdm_symbol_size) {
-        memcpy1((void*)rxF_ext,
-                (void*)&rxF[start_re*2],
-                nb_re_pusch*sizeof(int32_t));
+        memcpy1((void*)rxF_ext, (void*)&rxF[start_re*2], nb_re_pusch*sizeof(int32_t));
       } else {
-	int neg_length = frame_parms->ofdm_symbol_size-start_re;
-	int pos_length = nb_re_pusch-neg_length;
-
-	memcpy1((void*)rxF_ext,(void*)&rxF[start_re*2],neg_length*sizeof(int32_t));
-	memcpy1((void*)&rxF_ext[2*neg_length],(void*)rxF,pos_length*sizeof(int32_t));
+        int neg_length = frame_parms->ofdm_symbol_size-start_re;
+        int pos_length = nb_re_pusch-neg_length;
+        memcpy1((void*)rxF_ext,(void*)&rxF[start_re*2],neg_length*sizeof(int32_t));
+        memcpy1((void*)&rxF_ext[2*neg_length],(void*)rxF,pos_length*sizeof(int32_t));
       }
-      memcpy1((void*)ul_ch0_ext,(void*)ul_ch0,nb_re_pusch*sizeof(int32_t));
-    }
-    else {
-      for (re = 0; re < nb_re_pusch; re++) {
 
-        is_dmrs_re = (re == get_dmrs_freq_idx_ul(n, k_prime, delta, pusch_pdu->dmrs_config_type));
+      for (aatx = 0; aatx < pusch_pdu->nrOfLayers; aatx++) {
+        ul_ch0 = &pusch_vars->ul_ch_estimates[aatx*frame_parms->nb_antennas_rx+aarx][pusch_vars->dmrs_symbol*frame_parms->ofdm_symbol_size]; // update channel estimates if new dmrs symbol are available
+        ul_ch0_ext = &pusch_vars->ul_ch_estimates_ext[aatx*frame_parms->nb_antennas_rx+aarx][symbol*nb_re_pusch2];
+        memcpy1((void*)ul_ch0_ext,(void*)ul_ch0,nb_re_pusch*sizeof(int32_t));
+      }
 
-#ifdef DEBUG_RB_EXT
-        printf("re = %d, kprime %d, n %d, is_dmrs_symbol = %d, symbol = %d\n", re, k_prime, n, is_dmrs_symbol, symbol);
-#endif
+    } else {
 
-        /* save only data and respective channel estimates */
-        if (is_dmrs_re == 0) {
-          rxF_ext[rxF_ext_index]     = (rxF[ ((start_re + re)*2)      % (frame_parms->ofdm_symbol_size*2)]);
-          rxF_ext[rxF_ext_index + 1] = (rxF[(((start_re + re)*2) + 1) % (frame_parms->ofdm_symbol_size*2)]);
-          ul_ch0_ext[ul_ch0_ext_index] = ul_ch0[ul_ch0_index];
+      for (aatx = 0; aatx < pusch_pdu->nrOfLayers; aatx++) {
+        ul_ch0 = &pusch_vars->ul_ch_estimates[aatx*frame_parms->nb_antennas_rx+aarx][pusch_vars->dmrs_symbol*frame_parms->ofdm_symbol_size]; // update channel estimates if new dmrs symbol are available
+        ul_ch0_ext = &pusch_vars->ul_ch_estimates_ext[aatx*frame_parms->nb_antennas_rx+aarx][symbol*nb_re_pusch2];
+
+        rxF_ext_index = 0;
+        ul_ch0_ext_index = 0;
+        ul_ch0_index = 0;
+        for (re = 0; re < nb_re_pusch; re++) {
+          uint16_t k = start_re + re;
+          is_data_re = allowed_xlsch_re_in_dmrs_symbol(k, start_re, frame_parms->ofdm_symbol_size, pusch_pdu->num_dmrs_cdm_grps_no_data, pusch_pdu->dmrs_config_type);
+          if (++k >= frame_parms->ofdm_symbol_size) {
+            k -= frame_parms->ofdm_symbol_size;
+          }
 
-#ifdef DEBUG_RB_EXT
-          printf("dmrs symb %d: rxF_ext[%d] = (%d,%d), ul_ch0_ext[%d] = (%d,%d)\n",
+          #ifdef DEBUG_RB_EXT
+          printf("re = %d, is_dmrs_symbol = %d, symbol = %d\n", re, is_dmrs_symbol, symbol);
+          #endif
+
+          // save only data and respective channel estimates
+          if (is_data_re == 1) {
+            if (aatx == 0) {
+              rxF_ext[rxF_ext_index]     = (rxF[ ((start_re + re)*2)      % (frame_parms->ofdm_symbol_size*2)]);
+              rxF_ext[rxF_ext_index + 1] = (rxF[(((start_re + re)*2) + 1) % (frame_parms->ofdm_symbol_size*2)]);
+              rxF_ext_index +=2;
+            }
+          
+            ul_ch0_ext[ul_ch0_ext_index] = ul_ch0[ul_ch0_index];
+            ul_ch0_ext_index++;
+
+            #ifdef DEBUG_RB_EXT
+            printf("dmrs symb %d: rxF_ext[%d] = (%d,%d), ul_ch0_ext[%d] = (%d,%d)\n",
                  is_dmrs_symbol,rxF_ext_index>>1, rxF_ext[rxF_ext_index],rxF_ext[rxF_ext_index+1],
                  ul_ch0_ext_index,  ((int16_t*)&ul_ch0_ext[ul_ch0_ext_index])[0],  ((int16_t*)&ul_ch0_ext[ul_ch0_ext_index])[1]);
-#endif
-          ul_ch0_ext_index++;
-          rxF_ext_index +=2;
-        } else {
-          n += k_prime;
-          k_prime ^= 1;
+            #endif          
+          } 
+          ul_ch0_index++;
         }
-        ul_ch0_index++;
       }
     }
   }
@@ -406,16 +404,19 @@ void nr_ulsch_scale_channel(int **ul_ch_estimates_ext,
                             NR_gNB_ULSCH_t *ulsch_gNB,
                             uint8_t symbol,
                             uint8_t is_dmrs_symbol,
-                            unsigned short nb_rb,
-                            pusch_dmrs_type_t pusch_dmrs_type)
+                            uint32_t len,
+                            uint8_t nrOfLayers,
+                            unsigned short nb_rb)
 {
 
 #if defined(__x86_64__)||defined(__i386__)
 
   short rb, ch_amp;
-  unsigned char aarx;
+  unsigned char aarx,aatx;
   __m128i *ul_ch128, ch_amp128;
 
+  uint32_t nb_rb_0 = len/12 + ((len%12)?1:0);
+
   // Determine scaling amplitude based the symbol
 
   ch_amp = 1024*8; //((pilots) ? (ulsch_gNB->sqrt_rho_b) : (ulsch_gNB->sqrt_rho_a));
@@ -431,35 +432,22 @@ void nr_ulsch_scale_channel(int **ul_ch_estimates_ext,
   int off = 0;
 #endif
 
-  for (aarx=0; aarx < frame_parms->nb_antennas_rx; aarx++) {
-
-      ul_ch128 = (__m128i *)&ul_ch_estimates_ext[aarx][symbol*(off+(nb_rb*NR_NB_SC_PER_RB))];
-
-      if (is_dmrs_symbol==1){
-        if (pusch_dmrs_type == pusch_dmrs_type1)
-          nb_rb = nb_rb>>1;
-        else
-          nb_rb = (2*nb_rb)/3;
-      }
-
-      for (rb=0;rb<nb_rb;rb++) {
-
+  for (aatx = 0; aatx < nrOfLayers; aatx++) {
+    for (aarx=0; aarx < frame_parms->nb_antennas_rx; aarx++) {
+      ul_ch128 = (__m128i *)&ul_ch_estimates_ext[aatx*frame_parms->nb_antennas_rx+aarx][symbol*(off+(nb_rb*NR_NB_SC_PER_RB))];
+      for (rb=0;rb < nb_rb_0;rb++) {
         ul_ch128[0] = _mm_mulhi_epi16(ul_ch128[0], ch_amp128);
         ul_ch128[0] = _mm_slli_epi16(ul_ch128[0], 3);
 
         ul_ch128[1] = _mm_mulhi_epi16(ul_ch128[1], ch_amp128);
         ul_ch128[1] = _mm_slli_epi16(ul_ch128[1], 3);
 
-        if (is_dmrs_symbol) {
-          ul_ch128+=2;
-        } else {
-          ul_ch128[2] = _mm_mulhi_epi16(ul_ch128[2], ch_amp128);
-          ul_ch128[2] = _mm_slli_epi16(ul_ch128[2], 3);
-          ul_ch128+=3;
-
-        }
+        ul_ch128[2] = _mm_mulhi_epi16(ul_ch128[2], ch_amp128);
+        ul_ch128[2] = _mm_slli_epi16(ul_ch128[2], 3);
+        ul_ch128+=3;
       }
     }
+  }
 #endif
 }
 
@@ -481,6 +469,8 @@ void nr_ulsch_channel_level(int **ul_ch_estimates_ext,
 
   int16_t x = factor2(len);
   int16_t y = (len)>>x;
+  
+  uint32_t nb_rb_0 = len/12 + ((len%12)?1:0);
 
 #ifdef __AVX2__
   int off = ((nb_rb&1) == 1)? 4:0;
@@ -488,14 +478,14 @@ void nr_ulsch_channel_level(int **ul_ch_estimates_ext,
   int off = 0;
 #endif
 
-  for (aatx = 0; aatx < nrOfLayers; aatx++)
+  for (aatx = 0; aatx < nrOfLayers; aatx++) {
     for (aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) {
       //clear average level
       avg128U = _mm_setzero_si128();
 
       ul_ch128=(__m128i *)&ul_ch_estimates_ext[aatx*frame_parms->nb_antennas_rx+aarx][symbol*(off+(nb_rb*12))];
 
-      for (rb = 0; rb < len/12; rb++) {
+      for (rb = 0; rb < nb_rb_0; rb++) {
         avg128U = _mm_add_epi32(avg128U, _mm_srai_epi32(_mm_madd_epi16(ul_ch128[0], ul_ch128[0]), x));
         avg128U = _mm_add_epi32(avg128U, _mm_srai_epi32(_mm_madd_epi16(ul_ch128[1], ul_ch128[1]), x));
         avg128U = _mm_add_epi32(avg128U, _mm_srai_epi32(_mm_madd_epi16(ul_ch128[2], ul_ch128[2]), x));
@@ -506,8 +496,8 @@ void nr_ulsch_channel_level(int **ul_ch_estimates_ext,
                                                     ((int32_t*)&avg128U)[1] +
                                                     ((int32_t*)&avg128U)[2] +
                                                     ((int32_t*)&avg128U)[3]) / y;
-
     }
+  }
 
   _mm_empty();
   _m_empty();
@@ -520,7 +510,7 @@ void nr_ulsch_channel_level(int **ul_ch_estimates_ext,
   int16x4_t *ul_ch128;
 
   symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol;
-
+  uint32_t nb_rb_0 = len/12 + ((len%12)?1:0);
   for (aatx=0; aatx<nrOfLayers; aatx++) {
     for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
       //clear average level
@@ -529,7 +519,7 @@ void nr_ulsch_channel_level(int **ul_ch_estimates_ext,
 
       ul_ch128 = (int16x4_t *)&ul_ch_estimates_ext[aatx*frame_parms->nb_antennas_rx+aarx][symbol*frame_parms->N_RB_UL*12];
 
-      for (rb = 0; rb < nb_rb; rb++) {
+      for (rb = 0; rb < nb_rb_0; rb++) {
         //  printf("rb %d : ",rb);
         //  print_shorts("ch",&ul_ch128[0]);
         avg128U = vqaddq_s32(avg128U, vmull_s16(ul_ch128[0], ul_ch128[0]));
@@ -568,14 +558,20 @@ void nr_ulsch_channel_level(int **ul_ch_estimates_ext,
 #endif
 }
 
+
+
+//==============================================================================================
+// Pre-processing for LLR computation
+//==============================================================================================
 void nr_ulsch_channel_compensation(int **rxdataF_ext,
                                    int **ul_ch_estimates_ext,
                                    int **ul_ch_mag,
                                    int **ul_ch_magb,
                                    int **rxdataF_comp,
-                                   int **rho,
+                                   int ***rho,
                                    NR_DL_FRAME_PARMS *frame_parms,
                                    unsigned char symbol,
+                                   int length,
                                    uint8_t is_dmrs_symbol,
                                    unsigned char mod_order,
                                    uint8_t  nrOfLayers,
@@ -591,22 +587,21 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext,
 #ifdef DEBUG_CH_COMP
   int16_t *rxF, *ul_ch;
   int prnt_idx;
-
-  for (int ant=0; ant<frame_parms->nb_antennas_rx; ant++) {
-    rxF   = (int16_t *)&rxdataF_ext[ant][symbol*(off+(nb_rb*12))];
-    ul_ch = (int16_t *)&ul_ch_estimates_ext[ant][symbol*(off+(nb_rb*12))];
-
-    printf("--------------------symbol = %d, mod_order = %d, output_shift = %d-----------------------\n", symbol, mod_order, output_shift);
-    printf("----------------Before compensation------------------\n");
-
-    for (prnt_idx=0;prnt_idx<12*5*2;prnt_idx+=2){
-
-      printf("rxF[%d] = (%d,%d)\n", prnt_idx>>1, rxF[prnt_idx],rxF[prnt_idx+1]);
-      printf("ul_ch[%d] = (%d,%d)\n", prnt_idx>>1, ul_ch[prnt_idx],ul_ch[prnt_idx+1]);
-
+  for (int nl=0; nl<nrOfLayers; nl++) {
+    for (int aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) {
+      rxF = (int16_t *) &rxdataF_ext[aarx][symbol * (off + (nb_rb * 12))];
+      ul_ch = (int16_t *) &ul_ch_estimates_ext[nl * frame_parms->nb_antennas_rx + aarx][symbol * (off + (nb_rb * 12))];
+
+      printf("--------symbol = %d, mod_order = %d, output_shift = %d, layer %i, antenna rx = %d -----------\n",
+             symbol, mod_order, output_shift, nl, aarx);
+      printf("----------------Before compensation------------------\n");
+
+      for (prnt_idx = 0; prnt_idx < 12 * 5 * 2; prnt_idx += 2) {
+        printf("rxF[%d] = (%d,%d)\n", prnt_idx >> 1, rxF[prnt_idx], rxF[prnt_idx + 1]);
+        printf("ul_ch[%d] = (%d,%d)\n", prnt_idx >> 1, ul_ch[prnt_idx], ul_ch[prnt_idx + 1]);
+      }
     }
   }
-
 #endif
 
 #ifdef DEBUG_CH_MAG
@@ -637,20 +632,20 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext,
   __m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128={0},QAM_amp128b={0};
   QAM_amp128b = _mm_setzero_si128();
 
+  uint32_t nb_rb_0 = length/12 + ((length%12)?1:0);
   for (aatx=0; aatx<nrOfLayers; aatx++) {
-
     if (mod_order == 4) {
       QAM_amp128 = _mm_set1_epi16(QAM16_n1);  // 2/sqrt(10)
       QAM_amp128b = _mm_setzero_si128();
-    } else if (mod_order == 6) {
+    } 
+    else if (mod_order == 6) {
       QAM_amp128  = _mm_set1_epi16(QAM64_n1); //
       QAM_amp128b = _mm_set1_epi16(QAM64_n2);
     }
 
     //    printf("comp: rxdataF_comp %p, symbol %d\n",rxdataF_comp[0],symbol);
 
-    for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
-
+    for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++)  {
       ul_ch128          = (__m128i *)&ul_ch_estimates_ext[aatx*frame_parms->nb_antennas_rx+aarx][symbol*(off+(nb_rb*12))];
       ul_ch_mag128      = (__m128i *)&ul_ch_mag[aatx*frame_parms->nb_antennas_rx+aarx][symbol*(off+(nb_rb*12))];
       ul_ch_mag128b     = (__m128i *)&ul_ch_magb[aatx*frame_parms->nb_antennas_rx+aarx][symbol*(off+(nb_rb*12))];
@@ -658,7 +653,7 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext,
       rxdataF_comp128   = (__m128i *)&rxdataF_comp[aatx*frame_parms->nb_antennas_rx+aarx][symbol*(off+(nb_rb*12))];
 
 
-      for (rb=0; rb<nb_rb; rb++) {
+      for (rb=0; rb<nb_rb_0; rb++) {
         if (mod_order>2) {
           // get channel amplitude if not QPSK
 
@@ -679,6 +674,8 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext,
           ul_ch_mag128[0] = _mm_mulhi_epi16(ul_ch_mag128[0],QAM_amp128);
           ul_ch_mag128[0] = _mm_slli_epi16(ul_ch_mag128[0],1);
 
+          ul_ch_mag128b[0] = _mm_mulhi_epi16(ul_ch_mag128b[0],QAM_amp128b);
+          ul_ch_mag128b[0] = _mm_slli_epi16(ul_ch_mag128b[0],1);
           // print_ints("ch: = ",(int32_t*)&mmtmpD0);
           // print_shorts("QAM_amp:",(int16_t*)&QAM_amp128);
           // print_shorts("mag:",(int16_t*)&ul_ch_mag128[0]);
@@ -687,30 +684,24 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext,
           ul_ch_mag128b[1] = ul_ch_mag128[1];
           ul_ch_mag128[1] = _mm_mulhi_epi16(ul_ch_mag128[1],QAM_amp128);
           ul_ch_mag128[1] = _mm_slli_epi16(ul_ch_mag128[1],1);
+          
+          ul_ch_mag128b[1] = _mm_mulhi_epi16(ul_ch_mag128b[1],QAM_amp128b);
+          ul_ch_mag128b[1] = _mm_slli_epi16(ul_ch_mag128b[1],1);
 
-          if (is_dmrs_symbol==0) {
-            mmtmpD0 = _mm_madd_epi16(ul_ch128[2],ul_ch128[2]);
-            mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift);
-            mmtmpD1 = _mm_packs_epi32(mmtmpD0,mmtmpD0);
+          mmtmpD0 = _mm_madd_epi16(ul_ch128[2],ul_ch128[2]);
+          mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift);
+          mmtmpD1 = _mm_packs_epi32(mmtmpD0,mmtmpD0);
 
-            ul_ch_mag128[2] = _mm_unpacklo_epi16(mmtmpD1,mmtmpD1);
-            ul_ch_mag128b[2] = ul_ch_mag128[2];
+          ul_ch_mag128[2] = _mm_unpacklo_epi16(mmtmpD1,mmtmpD1);
+          ul_ch_mag128b[2] = ul_ch_mag128[2];
 
-            ul_ch_mag128[2] = _mm_mulhi_epi16(ul_ch_mag128[2],QAM_amp128);
-            ul_ch_mag128[2] = _mm_slli_epi16(ul_ch_mag128[2],1);
-          }
+          ul_ch_mag128[2] = _mm_mulhi_epi16(ul_ch_mag128[2],QAM_amp128);
+          ul_ch_mag128[2] = _mm_slli_epi16(ul_ch_mag128[2],1);
 
-          ul_ch_mag128b[0] = _mm_mulhi_epi16(ul_ch_mag128b[0],QAM_amp128b);
-          ul_ch_mag128b[0] = _mm_slli_epi16(ul_ch_mag128b[0],1);
 
+          ul_ch_mag128b[2] = _mm_mulhi_epi16(ul_ch_mag128b[2],QAM_amp128b);
+          ul_ch_mag128b[2] = _mm_slli_epi16(ul_ch_mag128b[2],1);
 
-          ul_ch_mag128b[1] = _mm_mulhi_epi16(ul_ch_mag128b[1],QAM_amp128b);
-          ul_ch_mag128b[1] = _mm_slli_epi16(ul_ch_mag128b[1],1);
-
-          if (is_dmrs_symbol==0) {
-            ul_ch_mag128b[2] = _mm_mulhi_epi16(ul_ch_mag128b[2],QAM_amp128b);
-            ul_ch_mag128b[2] = _mm_slli_epi16(ul_ch_mag128b[2],1);
-          }
         }
 
         // multiply by conjugated channel
@@ -755,117 +746,153 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext,
         //  print_shorts("ch:",ul_ch128+1);
         //  print_shorts("pack:",rxdataF_comp128+1);
 
-        if (is_dmrs_symbol==0) {
-          // multiply by conjugated channel
-          mmtmpD0 = _mm_madd_epi16(ul_ch128[2],rxdataF128[2]);
-          // mmtmpD0 contains real part of 4 consecutive outputs (32-bit)
-          mmtmpD1 = _mm_shufflelo_epi16(ul_ch128[2],_MM_SHUFFLE(2,3,0,1));
-          mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1));
-          mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)conjugate);
-          mmtmpD1 = _mm_madd_epi16(mmtmpD1,rxdataF128[2]);
-          // mmtmpD1 contains imag part of 4 consecutive outputs (32-bit)
-          mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift);
-          mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift);
-          mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1);
-          mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1);
-
-          rxdataF_comp128[2] = _mm_packs_epi32(mmtmpD2,mmtmpD3);
-          //  print_shorts("rx:",rxdataF128+2);
-          //  print_shorts("ch:",ul_ch128+2);
-          //        print_shorts("pack:",rxdataF_comp128+2);
-
-          ul_ch128+=3;
-          ul_ch_mag128+=3;
-          ul_ch_mag128b+=3;
-          rxdataF128+=3;
-          rxdataF_comp128+=3;
-        } else { // we have a smaller PUSCH in symbols with pilots so skip last group of 4 REs and increment less
-          ul_ch128+=2;
-          ul_ch_mag128+=2;
-          ul_ch_mag128b+=2;
-          rxdataF128+=2;
-          rxdataF_comp128+=2;
-        }
-
-      }
-    }
-  }
-
-  if (rho) {
-
-    for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
-      rho128        = (__m128i *)&rho[aarx][symbol*frame_parms->N_RB_UL*12];
-      ul_ch128      = (__m128i *)&ul_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_UL*12];
-      ul_ch128_2    = (__m128i *)&ul_ch_estimates_ext[2+aarx][symbol*frame_parms->N_RB_UL*12];
-
-      for (rb=0; rb<nb_rb; rb++) {
         // multiply by conjugated channel
-        mmtmpD0 = _mm_madd_epi16(ul_ch128[0],ul_ch128_2[0]);
-        //  print_ints("re",&mmtmpD0);
-
-        // mmtmpD0 contains real part of 4 consecutive outputs (32-bit)
-        mmtmpD1 = _mm_shufflelo_epi16(ul_ch128[0],_MM_SHUFFLE(2,3,0,1));
-        mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1));
-        mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)&conjugate[0]);
-        //  print_ints("im",&mmtmpD1);
-        mmtmpD1 = _mm_madd_epi16(mmtmpD1,ul_ch128_2[0]);
-        // mmtmpD1 contains imag part of 4 consecutive outputs (32-bit)
-        mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift);
-        //  print_ints("re(shift)",&mmtmpD0);
-        mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift);
-        //  print_ints("im(shift)",&mmtmpD1);
-        mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1);
-        mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1);
-        //        print_ints("c0",&mmtmpD2);
-        //  print_ints("c1",&mmtmpD3);
-        rho128[0] = _mm_packs_epi32(mmtmpD2,mmtmpD3);
-
-        //print_shorts("rx:",ul_ch128_2);
-        //print_shorts("ch:",ul_ch128);
-        //print_shorts("pack:",rho128);
-
-        // multiply by conjugated channel
-        mmtmpD0 = _mm_madd_epi16(ul_ch128[1],ul_ch128_2[1]);
-        // mmtmpD0 contains real part of 4 consecutive outputs (32-bit)
-        mmtmpD1 = _mm_shufflelo_epi16(ul_ch128[1],_MM_SHUFFLE(2,3,0,1));
-        mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1));
-        mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)conjugate);
-        mmtmpD1 = _mm_madd_epi16(mmtmpD1,ul_ch128_2[1]);
-        // mmtmpD1 contains imag part of 4 consecutive outputs (32-bit)
-        mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift);
-        mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift);
-        mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1);
-        mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1);
-
-
-        rho128[1] =_mm_packs_epi32(mmtmpD2,mmtmpD3);
-        //print_shorts("rx:",ul_ch128_2+1);
-        //print_shorts("ch:",ul_ch128+1);
-        //print_shorts("pack:",rho128+1);
-        // multiply by conjugated channel
-        mmtmpD0 = _mm_madd_epi16(ul_ch128[2],ul_ch128_2[2]);
+        mmtmpD0 = _mm_madd_epi16(ul_ch128[2],rxdataF128[2]);
         // mmtmpD0 contains real part of 4 consecutive outputs (32-bit)
         mmtmpD1 = _mm_shufflelo_epi16(ul_ch128[2],_MM_SHUFFLE(2,3,0,1));
         mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1));
         mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)conjugate);
-        mmtmpD1 = _mm_madd_epi16(mmtmpD1,ul_ch128_2[2]);
+        mmtmpD1 = _mm_madd_epi16(mmtmpD1,rxdataF128[2]);
         // mmtmpD1 contains imag part of 4 consecutive outputs (32-bit)
         mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift);
         mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift);
         mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1);
         mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1);
 
-        rho128[2] = _mm_packs_epi32(mmtmpD2,mmtmpD3);
-        //print_shorts("rx:",ul_ch128_2+2);
+        rxdataF_comp128[2] = _mm_packs_epi32(mmtmpD2,mmtmpD3);
+        //print_shorts("rx:",rxdataF128+2);
         //print_shorts("ch:",ul_ch128+2);
-        //print_shorts("pack:",rho128+2);
+        //print_shorts("pack:",rxdataF_comp128+2);
 
         ul_ch128+=3;
-        ul_ch128_2+=3;
-        rho128+=3;
-
+        ul_ch_mag128+=3;
+        ul_ch_mag128b+=3;
+        rxdataF128+=3;
+        rxdataF_comp128+=3;
       }
+    }
+  }
 
+  if (rho) {
+    //we compute the Tx correlation matrix for each Rx antenna
+    //As an example the 2x2 MIMO case requires
+    //rho[aarx][nb_aatx*nb_aatx] = [cov(H_aarx_0,H_aarx_0) cov(H_aarx_0,H_aarx_1)
+    //                              cov(H_aarx_1,H_aarx_0) cov(H_aarx_1,H_aarx_1)], aarx=0,...,nb_antennas_rx-1
+
+    int avg_rho_re[frame_parms->nb_antennas_rx][nrOfLayers*nrOfLayers];
+    int avg_rho_im[frame_parms->nb_antennas_rx][nrOfLayers*nrOfLayers];
+
+    for (aarx=0; aarx < frame_parms->nb_antennas_rx; aarx++) {
+      for (aatx=0; aatx < nrOfLayers; aatx++) {
+        for (int atx=0; atx< nrOfLayers; atx++) {
+
+          avg_rho_re[aarx][aatx*nrOfLayers+atx] = 0;
+          avg_rho_im[aarx][aatx*nrOfLayers+atx] = 0;
+          rho128        = (__m128i *)&rho[aarx][aatx*nrOfLayers+atx][symbol*(off+(nb_rb*12))];
+          ul_ch128      = (__m128i *)&ul_ch_estimates_ext[aatx*frame_parms->nb_antennas_rx+aarx][symbol*(off+(nb_rb*12))];
+          ul_ch128_2    = (__m128i *)&ul_ch_estimates_ext[atx*frame_parms->nb_antennas_rx+aarx][symbol*(off+(nb_rb*12))];
+
+          for (rb=0; rb<nb_rb_0; rb++) {
+            // multiply by conjugated channel
+            mmtmpD0 = _mm_madd_epi16(ul_ch128[0],ul_ch128_2[0]);
+            //  print_ints("re",&mmtmpD0);
+
+            // mmtmpD0 contains real part of 4 consecutive outputs (32-bit)
+            mmtmpD1 = _mm_shufflelo_epi16(ul_ch128[0],_MM_SHUFFLE(2,3,0,1));
+            mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1));
+            mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)&conjugate[0]);
+            //  print_ints("im",&mmtmpD1);
+            mmtmpD1 = _mm_madd_epi16(mmtmpD1,ul_ch128_2[0]);
+            // mmtmpD1 contains imag part of 4 consecutive outputs (32-bit)
+            mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift);
+            //  print_ints("re(shift)",&mmtmpD0);
+            mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift);
+            //  print_ints("im(shift)",&mmtmpD1);
+            mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1);
+            mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1);
+            //        print_ints("c0",&mmtmpD2);
+            //  print_ints("c1",&mmtmpD3);
+            rho128[0] = _mm_packs_epi32(mmtmpD2,mmtmpD3);
+
+            //print_shorts("rx:",ul_ch128_2);
+            //print_shorts("ch:",ul_ch128);
+            //print_shorts("pack:",rho128);
+
+            avg_rho_re[aarx][aatx*nrOfLayers+atx] +=(((int16_t*)&rho128[0])[0]+
+              ((int16_t*)&rho128[0])[2] +
+              ((int16_t*)&rho128[0])[4] +
+              ((int16_t*)&rho128[0])[6])/16;//
+
+            avg_rho_im[aarx][aatx*nrOfLayers+atx] +=(((int16_t*)&rho128[0])[1]+
+              ((int16_t*)&rho128[0])[3] +
+              ((int16_t*)&rho128[0])[5] +
+              ((int16_t*)&rho128[0])[7])/16;//
+            // multiply by conjugated channel
+            mmtmpD0 = _mm_madd_epi16(ul_ch128[1],ul_ch128_2[1]);
+            // mmtmpD0 contains real part of 4 consecutive outputs (32-bit)
+            mmtmpD1 = _mm_shufflelo_epi16(ul_ch128[1],_MM_SHUFFLE(2,3,0,1));
+            mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1));
+            mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)conjugate);
+            mmtmpD1 = _mm_madd_epi16(mmtmpD1,ul_ch128_2[1]);
+            // mmtmpD1 contains imag part of 4 consecutive outputs (32-bit)
+            mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift);
+            mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift);
+            mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1);
+            mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1);
+            rho128[1] =_mm_packs_epi32(mmtmpD2,mmtmpD3);
+            //print_shorts("rx:",ul_ch128_2+1);
+            //print_shorts("ch:",ul_ch128+1);
+            //print_shorts("pack:",rho128+1);
+
+            // multiply by conjugated channel
+            avg_rho_re[aarx][aatx*nrOfLayers+atx] +=(((int16_t*)&rho128[1])[0]+
+              ((int16_t*)&rho128[1])[2] +
+              ((int16_t*)&rho128[1])[4] +
+              ((int16_t*)&rho128[1])[6])/16;
+
+            avg_rho_im[aarx][aatx*nrOfLayers+atx] +=(((int16_t*)&rho128[1])[1]+
+              ((int16_t*)&rho128[1])[3] +
+              ((int16_t*)&rho128[1])[5] +
+              ((int16_t*)&rho128[1])[7])/16;
+
+            mmtmpD0 = _mm_madd_epi16(ul_ch128[2],ul_ch128_2[2]);
+            // mmtmpD0 contains real part of 4 consecutive outputs (32-bit)
+            mmtmpD1 = _mm_shufflelo_epi16(ul_ch128[2],_MM_SHUFFLE(2,3,0,1));
+            mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1));
+            mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)conjugate);
+            mmtmpD1 = _mm_madd_epi16(mmtmpD1,ul_ch128_2[2]);
+            // mmtmpD1 contains imag part of 4 consecutive outputs (32-bit)
+            mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift);
+            mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift);
+            mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1);
+            mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1);
+
+            rho128[2] = _mm_packs_epi32(mmtmpD2,mmtmpD3);
+            //print_shorts("rx:",ul_ch128_2+2);
+            //print_shorts("ch:",ul_ch128+2);
+            //print_shorts("pack:",rho128+2);
+            avg_rho_re[aarx][aatx*nrOfLayers+atx] +=(((int16_t*)&rho128[2])[0]+
+              ((int16_t*)&rho128[2])[2] +
+              ((int16_t*)&rho128[2])[4] +
+              ((int16_t*)&rho128[2])[6])/16;
+
+            avg_rho_im[aarx][aatx*nrOfLayers+atx] +=(((int16_t*)&rho128[2])[1]+
+              ((int16_t*)&rho128[2])[3] +
+              ((int16_t*)&rho128[2])[5] +
+              ((int16_t*)&rho128[2])[7])/16;
+
+            ul_ch128+=3;
+            ul_ch128_2+=3;
+            rho128+=3;
+          }
+          if (is_dmrs_symbol==1) {
+            //measurements->rx_correlation[0][0][aarx] = signal_energy(&rho[aarx][aatx*nb_aatx+atx][symbol*nb_rb*12],rb*12);
+            avg_rho_re[aarx][aatx*nrOfLayers+atx] = 16*avg_rho_re[aarx][aatx*nrOfLayers+atx]/(nb_rb*12);
+            avg_rho_im[aarx][aatx*nrOfLayers+atx] = 16*avg_rho_im[aarx][aatx*nrOfLayers+atx]/(nb_rb*12);
+            //printf("rho[rx]%d tx%d tx%d = Re: %d Im: %d\n",aarx, aatx,atx, avg_rho_re[aarx][aatx*nb_aatx+atx], avg_rho_im[aarx][aatx*nb_aatx+atx]);
+          }
+        }
+      }
     }
   }
 
@@ -1070,19 +1097,17 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext,
 
 
 #ifdef DEBUG_CH_COMP
+  for (int nl2=0; nl2<nrOfLayers; nl2++) {
+    for (int aarx2=0; aarx2<frame_parms->nb_antennas_rx; aarx2++) {
+      rxF   = (int16_t *)&rxdataF_comp[nl2*frame_parms->nb_antennas_rx+aarx2][(symbol*(off+(nb_rb*12)))];
 
-  for (int ant=0; ant<frame_parms->nb_antennas_rx; ant++) {
-    rxF   = (int16_t *)&rxdataF_comp[ant][(symbol*(off+(nb_rb*12)))];
-
-    printf("----------------After compansation------------------\n");
-
-    for (prnt_idx=0;prnt_idx<12*5*2;prnt_idx+=2){
-
-      printf("rxF[%d] = (%d,%d)\n", prnt_idx>>1, rxF[prnt_idx],rxF[prnt_idx+1]);
+      printf("--------After compansation, layer %i, antenna rx %i----------\n", nl2, aarx2);
 
+      for (prnt_idx=0;prnt_idx<12*5*2;prnt_idx+=2){
+        printf("rxF[%d] = (%d,%d)\n", prnt_idx>>1, rxF[prnt_idx],rxF[prnt_idx+1]);
+      }
     }
   }
-
 #endif
 
 #ifdef DEBUG_CH_MAG
@@ -1105,19 +1130,23 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext,
 }
 
 void nr_ulsch_detection_mrc(NR_DL_FRAME_PARMS *frame_parms,
-			    int32_t **rxdataF_comp,
-			    int32_t **ul_ch_mag,
-			    int32_t **ul_ch_magb,
-			    uint8_t symbol,
-			    uint16_t nb_rb) {
+                int32_t **rxdataF_comp,
+                int32_t **ul_ch_mag,
+                int32_t **ul_ch_magb,
+                int32_t ***rho,                
+                uint8_t  nrOfLayers,
+                uint8_t symbol,
+                uint16_t nb_rb,
+                int length) {
   int n_rx = frame_parms->nb_antennas_rx;
 #if defined(__x86_64__) || defined(__i386__)
-  __m128i *rxdataF_comp128[1+n_rx],*ul_ch_mag128[1+n_rx],*ul_ch_mag128b[1+n_rx];
+  __m128i *rxdataF_comp128[2],*ul_ch_mag128[2],*ul_ch_mag128b[2];
 #elif defined(__arm__)
   int16x8_t *rxdataF_comp128_0,*ul_ch_mag128_0,*ul_ch_mag128_0b;
   int16x8_t *rxdataF_comp128_1,*ul_ch_mag128_1,*ul_ch_mag128_1b;
 #endif
   int32_t i;
+  uint32_t nb_rb_0 = length/12 + ((length%12)?1:0);
 
 #ifdef __AVX2__
   int off = ((nb_rb&1) == 1)? 4:0;
@@ -1125,23 +1154,30 @@ void nr_ulsch_detection_mrc(NR_DL_FRAME_PARMS *frame_parms,
   int off = 0;
 #endif
 
-  if (frame_parms->nb_antennas_rx>1) {
-#if defined(__x86_64__) || defined(__i386__)
-    int nb_re = nb_rb*12;
-    for (int aa=0;aa<frame_parms->nb_antennas_rx;aa++) {
-      rxdataF_comp128[aa]   = (__m128i *)&rxdataF_comp[aa][(symbol*(nb_re + off))];
-      ul_ch_mag128[aa]      = (__m128i *)&ul_ch_mag[aa][(symbol*(nb_re + off))];
-      ul_ch_mag128b[aa]     = (__m128i *)&ul_ch_magb[aa][(symbol*(nb_re + off))];
-    }
-    for (int aa=1;aa<frame_parms->nb_antennas_rx;aa++) {      
-      // MRC on each re of rb, both on MF output and magnitude (for 16QAM/64QAM llr computation)
-      for (i=0; i<nb_rb*3; i++) {
-	rxdataF_comp128[0][i] = _mm_adds_epi16(rxdataF_comp128[0][i],rxdataF_comp128[aa][i]);
-	ul_ch_mag128[0][i]    = _mm_adds_epi16(ul_ch_mag128[0][i], ul_ch_mag128[aa][i]);
-	ul_ch_mag128b[0][i]   = _mm_adds_epi16(ul_ch_mag128b[0][i],ul_ch_mag128b[aa][i]);
+  if (n_rx > 1) {
+    #if defined(__x86_64__) || defined(__i386__)
+    for (int aatx=0; aatx<nrOfLayers; aatx++) {
+      int nb_re = nb_rb*12;
+
+      rxdataF_comp128[0]   = (__m128i *)&rxdataF_comp[aatx*frame_parms->nb_antennas_rx][(symbol*(nb_re + off))];
+      ul_ch_mag128[0]      = (__m128i *)&ul_ch_mag[aatx*frame_parms->nb_antennas_rx][(symbol*(nb_re + off))];
+      ul_ch_mag128b[0]     = (__m128i *)&ul_ch_magb[aatx*frame_parms->nb_antennas_rx][(symbol*(nb_re + off))];
+
+      for (int aa=1;aa < n_rx;aa++) {
+        rxdataF_comp128[1]   = (__m128i *)&rxdataF_comp[aatx*frame_parms->nb_antennas_rx+aa][(symbol*(nb_re + off))];
+        ul_ch_mag128[1]      = (__m128i *)&ul_ch_mag[aatx*frame_parms->nb_antennas_rx+aa][(symbol*(nb_re + off))];
+        ul_ch_mag128b[1]     = (__m128i *)&ul_ch_magb[aatx*frame_parms->nb_antennas_rx+aa][(symbol*(nb_re + off))];
+      
+        // MRC on each re of rb, both on MF output and magnitude (for 16QAM/64QAM llr computation)
+        for (i=0; i<nb_rb_0*3; i++) {
+            rxdataF_comp128[0][i] = _mm_adds_epi16(rxdataF_comp128[0][i],rxdataF_comp128[1][i]);
+            ul_ch_mag128[0][i]    = _mm_adds_epi16(ul_ch_mag128[0][i],ul_ch_mag128[1][i]);
+            ul_ch_mag128b[0][i]   = _mm_adds_epi16(ul_ch_mag128b[0][i],ul_ch_mag128b[1][i]);
+            //rxdataF_comp128[0][i] = _mm_add_epi16(rxdataF_comp128_0[i],(*(__m128i *)&jitterc[0]));
+        }
       }
     }
-#elif defined(__arm__)
+    #elif defined(__arm__)
     rxdataF_comp128_0   = (int16x8_t *)&rxdataF_comp[0][symbol*frame_parms->N_RB_DL*12];
     rxdataF_comp128_1   = (int16x8_t *)&rxdataF_comp[1][symbol*frame_parms->N_RB_DL*12];
     ul_ch_mag128_0      = (int16x8_t *)&ul_ch_mag[0][symbol*frame_parms->N_RB_DL*12];
@@ -1156,7 +1192,7 @@ void nr_ulsch_detection_mrc(NR_DL_FRAME_PARMS *frame_parms,
       ul_ch_mag128_0b[i]   = vhaddq_s16(ul_ch_mag128_0b[i],ul_ch_mag128_1b[i]);
       rxdataF_comp128_0[i] = vqaddq_s16(rxdataF_comp128_0[i],(*(int16x8_t *)&jitterc[0]));
     }
-#endif
+    #endif
   }
 
 #if defined(__x86_64__) || defined(__i386__)
@@ -1165,6 +1201,696 @@ void nr_ulsch_detection_mrc(NR_DL_FRAME_PARMS *frame_parms,
 #endif
 }
 
+/* Zero Forcing Rx function: nr_det_HhH()
+ *
+ *
+ * */
+void nr_ulsch_det_HhH(int32_t *after_mf_00,//a
+                int32_t *after_mf_01,//b
+                int32_t *after_mf_10,//c
+                int32_t *after_mf_11,//d
+                int32_t *det_fin,//1/ad-bc
+                unsigned short nb_rb,
+                unsigned char symbol,
+                int32_t shift)
+{
+  int16_t nr_conjug2[8]__attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1} ;
+  unsigned short rb;
+  __m128i *after_mf_00_128,*after_mf_01_128, *after_mf_10_128, *after_mf_11_128, ad_re_128, bc_re_128; //ad_im_128, bc_im_128;
+  __m128i *det_fin_128, det_re_128; //det_im_128, tmp_det0, tmp_det1;
+
+  after_mf_00_128 = (__m128i *)after_mf_00;
+  after_mf_01_128 = (__m128i *)after_mf_01;
+  after_mf_10_128 = (__m128i *)after_mf_10;
+  after_mf_11_128 = (__m128i *)after_mf_11;
+
+  det_fin_128 = (__m128i *)det_fin;
+
+  for (rb=0; rb<3*nb_rb; rb++) {
+
+    //complex multiplication (I_a+jQ_a)(I_d+jQ_d) = (I_aI_d - Q_aQ_d) + j(Q_aI_d + I_aQ_d)
+    //The imag part is often zero, we compute only the real part
+    ad_re_128 = _mm_sign_epi16(after_mf_00_128[0],*(__m128i*)&nr_conjug2[0]);
+    ad_re_128 = _mm_madd_epi16(ad_re_128,after_mf_11_128[0]); //Re: I_a0*I_d0 - Q_a1*Q_d1
+    //ad_im_128 = _mm_shufflelo_epi16(after_mf_00_128[0],_MM_SHUFFLE(2,3,0,1));//permutes IQs for the low 64 bits as [I_a0 Q_a1 I_a2 Q_a3]_64bits to [Q_a1 I_a0 Q_a3 I_a2]_64bits
+    //ad_im_128 = _mm_shufflehi_epi16(ad_im_128,_MM_SHUFFLE(2,3,0,1));//permutes IQs for the high 64 bits as [I_a0 Q_a1 I_a2 Q_a3]_64bits to [Q_a1 I_a0 Q_a3 I_a2]_64bits
+    //ad_im_128 = _mm_madd_epi16(ad_im_128,after_mf_11_128[0]);//Im: (Q_aI_d + I_aQ_d)
+
+    //complex multiplication (I_b+jQ_b)(I_c+jQ_c) = (I_bI_c - Q_bQ_c) + j(Q_bI_c + I_bQ_c)
+    //The imag part is often zero, we compute only the real part
+    bc_re_128 = _mm_sign_epi16(after_mf_01_128[0],*(__m128i*)&nr_conjug2[0]);
+    bc_re_128 = _mm_madd_epi16(bc_re_128,after_mf_10_128[0]); //Re: I_b0*I_c0 - Q_b1*Q_c1
+    //bc_im_128 = _mm_shufflelo_epi16(after_mf_01_128[0],_MM_SHUFFLE(2,3,0,1));//permutes IQs for the low 64 bits as [I_b0 Q_b1 I_b2 Q_b3]_64bits to [Q_b1 I_b0 Q_b3 I_b2]_64bits
+    //bc_im_128 = _mm_shufflehi_epi16(bc_im_128,_MM_SHUFFLE(2,3,0,1));//permutes IQs for the high 64 bits as [I_b0 Q_b1 I_b2 Q_b3]_64bits to [Q_b1 I_b0 Q_b3 I_b2]_64bits
+    //bc_im_128 = _mm_madd_epi16(bc_im_128,after_mf_10_128[0]);//Im: (Q_bI_c + I_bQ_c)
+
+    det_re_128 = _mm_sub_epi32(ad_re_128, bc_re_128);
+    //det_im_128 = _mm_sub_epi32(ad_im_128, bc_im_128);
+
+    //det in Q30 format
+    det_fin_128[0] = _mm_abs_epi32(det_re_128);
+
+
+#ifdef DEBUG_DLSCH_DEMOD
+     printf("\n Computing det_HhH_inv \n");
+     //print_ints("det_re_128:",(int32_t*)&det_re_128);
+     //print_ints("det_im_128:",(int32_t*)&det_im_128);
+     print_ints("det_fin_128:",(int32_t*)&det_fin_128[0]);
+#endif
+    det_fin_128+=1;
+    after_mf_00_128+=1;
+    after_mf_01_128+=1;
+    after_mf_10_128+=1;
+    after_mf_11_128+=1;
+  }
+  _mm_empty();
+  _m_empty();
+}
+
+/* Zero Forcing Rx function: nr_inv_comp_muli
+ * Complex number multi: z = x*y
+ *                         = (x_re*y_re - x_im*y_im) + j(x_im*y_re + x_re*y_im)
+ * */
+__m128i nr_ulsch_inv_comp_muli(__m128i input_x,
+                         __m128i input_y)
+{
+  int16_t nr_conjug2[8]__attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1} ;
+
+  __m128i xy_re_128, xy_im_128;
+  __m128i output_z, tmp_z0, tmp_z1;
+
+  // complex multiplication (x_re + jx_im)*(y_re + jy_im) = (x_re*y_re - x_im*y_im) + j(x_im*y_re + x_re*y_im)
+
+  // the real part
+  xy_re_128 = _mm_sign_epi16(input_x,*(__m128i*)&nr_conjug2[0]);
+  xy_re_128 = _mm_madd_epi16(xy_re_128,input_y); //Re: (x_re*y_re - x_im*y_im)
+
+  // the imag part
+  xy_im_128 = _mm_shufflelo_epi16(input_x,_MM_SHUFFLE(2,3,0,1));//permutes IQs for the low 64 bits as [I_a0 Q_a1 I_a2 Q_a3]_64bits to [Q_a1 I_a0 Q_a3 I_a2]_64bits
+  xy_im_128 = _mm_shufflehi_epi16(xy_im_128,_MM_SHUFFLE(2,3,0,1));//permutes IQs for the high 64 bits as [I_a0 Q_a1 I_a2 Q_a3]_64bits to [Q_a1 I_a0 Q_a3 I_a2]_64bits
+  xy_im_128 = _mm_madd_epi16(xy_im_128,input_y);//Im: (x_im*y_re + x_re*y_im)
+
+  //convert back to Q15 before packing
+  xy_re_128 = _mm_srai_epi32(xy_re_128,4);//(2^15/64*2*16)
+  xy_im_128 = _mm_srai_epi32(xy_im_128,4);
+
+  tmp_z0  = _mm_unpacklo_epi32(xy_re_128,xy_im_128);
+  //print_ints("unpack lo:",&tmp_z0[0]);
+  tmp_z1  = _mm_unpackhi_epi32(xy_re_128,xy_im_128);
+  //print_ints("unpack hi:",&tmp_z1[0]);
+  output_z = _mm_packs_epi32(tmp_z0,tmp_z1);
+
+  _mm_empty();
+  _m_empty();
+  return(output_z);
+}
+
+/* Zero Forcing Rx function: nr_conjch0_mult_ch1()
+ *
+ *
+ * */
+void nr_ulsch_conjch0_mult_ch1(int *ch0,
+                         int *ch1,
+                         int32_t *ch0conj_ch1,
+                         unsigned short nb_rb,
+                         unsigned char output_shift0)
+{
+  //This function is used to compute multiplications in H_hermitian * H matrix
+  short nr_conjugate[8]__attribute__((aligned(16))) = {-1,1,-1,1,-1,1,-1,1};
+  unsigned short rb;
+  __m128i *dl_ch0_128,*dl_ch1_128, *ch0conj_ch1_128, mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3;
+
+  dl_ch0_128 = (__m128i *)ch0;
+  dl_ch1_128 = (__m128i *)ch1;
+
+  ch0conj_ch1_128 = (__m128i *)ch0conj_ch1;
+
+  for (rb=0; rb<3*nb_rb; rb++) {
+
+    mmtmpD0 = _mm_madd_epi16(dl_ch0_128[0],dl_ch1_128[0]);
+    mmtmpD1 = _mm_shufflelo_epi16(dl_ch0_128[0],_MM_SHUFFLE(2,3,0,1));
+    mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1));
+    mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)&nr_conjugate[0]);
+    mmtmpD1 = _mm_madd_epi16(mmtmpD1,dl_ch1_128[0]);
+    mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift0);
+    mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift0);
+    mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1);
+    mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1);
+
+    ch0conj_ch1_128[0] = _mm_packs_epi32(mmtmpD2,mmtmpD3);
+
+    /*printf("\n Computing conjugates \n");
+    print_shorts("ch0:",(int16_t*)&dl_ch0_128[0]);
+    print_shorts("ch1:",(int16_t*)&dl_ch1_128[0]);
+    print_shorts("pack:",(int16_t*)&ch0conj_ch1_128[0]);*/
+
+    dl_ch0_128+=1;
+    dl_ch1_128+=1;
+    ch0conj_ch1_128+=1;
+  }
+  _mm_empty();
+  _m_empty();
+}
+__m128i nr_ulsch_comp_muli_sum(__m128i input_x,
+                         __m128i input_y,
+                         __m128i input_w,
+                         __m128i input_z,
+                         __m128i det)
+{
+  int16_t nr_conjug2[8]__attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1} ;
+
+  __m128i xy_re_128, xy_im_128, wz_re_128, wz_im_128;
+  __m128i output, tmp_z0, tmp_z1;
+
+  // complex multiplication (x_re + jx_im)*(y_re + jy_im) = (x_re*y_re - x_im*y_im) + j(x_im*y_re + x_re*y_im)
+  // the real part
+  xy_re_128 = _mm_sign_epi16(input_x,*(__m128i*)&nr_conjug2[0]);
+  xy_re_128 = _mm_madd_epi16(xy_re_128,input_y); //Re: (x_re*y_re - x_im*y_im)
+
+  // the imag part
+  xy_im_128 = _mm_shufflelo_epi16(input_x,_MM_SHUFFLE(2,3,0,1));//permutes IQs for the low 64 bits as [I_a0 Q_a1 I_a2 Q_a3]_64bits to [Q_a1 I_a0 Q_a3 I_a2]_64bits
+  xy_im_128 = _mm_shufflehi_epi16(xy_im_128,_MM_SHUFFLE(2,3,0,1));//permutes IQs for the high 64 bits as [I_a0 Q_a1 I_a2 Q_a3]_64bits to [Q_a1 I_a0 Q_a3 I_a2]_64bits
+  xy_im_128 = _mm_madd_epi16(xy_im_128,input_y);//Im: (x_im*y_re + x_re*y_im)
+
+  // complex multiplication (w_re + jw_im)*(z_re + jz_im) = (w_re*z_re - w_im*z_im) + j(w_im*z_re + w_re*z_im)
+  // the real part
+  wz_re_128 = _mm_sign_epi16(input_w,*(__m128i*)&nr_conjug2[0]);
+  wz_re_128 = _mm_madd_epi16(wz_re_128,input_z); //Re: (w_re*z_re - w_im*z_im)
+
+  // the imag part
+  wz_im_128 = _mm_shufflelo_epi16(input_w,_MM_SHUFFLE(2,3,0,1));//permutes IQs for the low 64 bits as [I_a0 Q_a1 I_a2 Q_a3]_64bits to [Q_a1 I_a0 Q_a3 I_a2]_64bits
+  wz_im_128 = _mm_shufflehi_epi16(wz_im_128,_MM_SHUFFLE(2,3,0,1));//permutes IQs for the high 64 bits as [I_a0 Q_a1 I_a2 Q_a3]_64bits to [Q_a1 I_a0 Q_a3 I_a2]_64bits
+  wz_im_128 = _mm_madd_epi16(wz_im_128,input_z);//Im: (w_im*z_re + w_re*z_im)
+
+
+  xy_re_128 = _mm_sub_epi32(xy_re_128, wz_re_128);
+  xy_im_128 = _mm_sub_epi32(xy_im_128, wz_im_128);
+  //print_ints("rx_re:",(int32_t*)&xy_re_128[0]);
+  //print_ints("rx_Img:",(int32_t*)&xy_im_128[0]);
+  //divide by matrix det and convert back to Q15 before packing
+  int sum_det =0;
+  for (int k=0; k<4;k++) {
+    sum_det += ((((int *)&det[0])[k])>>2);
+    //printf("det_%d = %d log2 =%d \n",k,(((int *)&det[0])[k]),log2_approx(((int *)&det[0])[k]));
+    }
+
+  xy_re_128 = _mm_slli_epi32(xy_re_128,5);
+  xy_re_128 = _mm_srai_epi32(xy_re_128,log2_approx(sum_det));
+  xy_re_128 = _mm_slli_epi32(xy_re_128,5);
+
+  xy_im_128 = _mm_slli_epi32(xy_im_128,5);
+  xy_im_128 = _mm_srai_epi32(xy_im_128,log2_approx(sum_det));
+  xy_im_128 = _mm_slli_epi32(xy_im_128,5);
+
+  tmp_z0  = _mm_unpacklo_epi32(xy_re_128,xy_im_128);
+  //print_ints("unpack lo:",&tmp_z0[0]);
+  tmp_z1  = _mm_unpackhi_epi32(xy_re_128,xy_im_128);
+  //print_ints("unpack hi:",&tmp_z1[0]);
+  output = _mm_packs_epi32(tmp_z0,tmp_z1);
+
+  _mm_empty();
+  _m_empty();
+  return(output);
+}
+/* Zero Forcing Rx function: nr_construct_HhH_elements()
+ *
+ *
+ * */
+void nr_ulsch_construct_HhH_elements(int *conjch00_ch00,
+                               int *conjch01_ch01,
+                               int *conjch11_ch11,
+                               int *conjch10_ch10,//
+                               int *conjch20_ch20,
+                               int *conjch21_ch21,
+                               int *conjch30_ch30,
+                               int *conjch31_ch31,
+                               int *conjch00_ch01,//00_01
+                               int *conjch01_ch00,//01_00
+                               int *conjch10_ch11,//10_11
+                               int *conjch11_ch10,//11_10
+                               int *conjch20_ch21,
+                               int *conjch21_ch20,
+                               int *conjch30_ch31,
+                               int *conjch31_ch30,
+                               int32_t *after_mf_00,
+                               int32_t *after_mf_01,
+                               int32_t *after_mf_10,
+                               int32_t *after_mf_11,
+                               unsigned short nb_rb,
+                               unsigned char symbol)
+{
+  //This function is used to construct the (H_hermitian * H matrix) matrix elements
+  unsigned short rb;
+  __m128i *conjch00_ch00_128, *conjch01_ch01_128, *conjch11_ch11_128, *conjch10_ch10_128;
+  __m128i *conjch20_ch20_128, *conjch21_ch21_128, *conjch30_ch30_128, *conjch31_ch31_128;
+  __m128i *conjch00_ch01_128, *conjch01_ch00_128, *conjch10_ch11_128, *conjch11_ch10_128;
+  __m128i *conjch20_ch21_128, *conjch21_ch20_128, *conjch30_ch31_128, *conjch31_ch30_128;
+  __m128i *after_mf_00_128, *after_mf_01_128, *after_mf_10_128, *after_mf_11_128;
+
+  conjch00_ch00_128 = (__m128i *)conjch00_ch00;
+  conjch01_ch01_128 = (__m128i *)conjch01_ch01;
+  conjch11_ch11_128 = (__m128i *)conjch11_ch11;
+  conjch10_ch10_128 = (__m128i *)conjch10_ch10;
+
+  conjch20_ch20_128 = (__m128i *)conjch20_ch20;
+  conjch21_ch21_128 = (__m128i *)conjch21_ch21;
+  conjch30_ch30_128 = (__m128i *)conjch30_ch30;
+  conjch31_ch31_128 = (__m128i *)conjch31_ch31;
+
+  conjch00_ch01_128 = (__m128i *)conjch00_ch01;
+  conjch01_ch00_128 = (__m128i *)conjch01_ch00;
+  conjch10_ch11_128 = (__m128i *)conjch10_ch11;
+  conjch11_ch10_128 = (__m128i *)conjch11_ch10;
+
+  conjch20_ch21_128 = (__m128i *)conjch20_ch21;
+  conjch21_ch20_128 = (__m128i *)conjch21_ch20;
+  conjch30_ch31_128 = (__m128i *)conjch30_ch31;
+  conjch31_ch30_128 = (__m128i *)conjch31_ch30;
+
+  after_mf_00_128 = (__m128i *)after_mf_00;
+  after_mf_01_128 = (__m128i *)after_mf_01;
+  after_mf_10_128 = (__m128i *)after_mf_10;
+  after_mf_11_128 = (__m128i *)after_mf_11;
+
+  for (rb=0; rb<3*nb_rb; rb++) {
+
+    after_mf_00_128[0] =_mm_adds_epi16(conjch00_ch00_128[0],conjch10_ch10_128[0]);//00_00 + 10_10
+    if (conjch20_ch20 != NULL) after_mf_00_128[0] =_mm_adds_epi16(after_mf_00_128[0],conjch20_ch20_128[0]);
+    if (conjch30_ch30 != NULL) after_mf_00_128[0] =_mm_adds_epi16(after_mf_00_128[0],conjch30_ch30_128[0]);
+
+    after_mf_11_128[0] =_mm_adds_epi16(conjch01_ch01_128[0], conjch11_ch11_128[0]); //01_01 + 11_11
+    if (conjch21_ch21 != NULL) after_mf_11_128[0] =_mm_adds_epi16(after_mf_11_128[0],conjch21_ch21_128[0]);
+    if (conjch31_ch31 != NULL) after_mf_11_128[0] =_mm_adds_epi16(after_mf_11_128[0],conjch31_ch31_128[0]);
+
+    after_mf_01_128[0] =_mm_adds_epi16(conjch00_ch01_128[0], conjch10_ch11_128[0]);//00_01 + 10_11
+    if (conjch20_ch21 != NULL) after_mf_01_128[0] =_mm_adds_epi16(after_mf_01_128[0],conjch20_ch21_128[0]);
+    if (conjch30_ch31 != NULL) after_mf_01_128[0] =_mm_adds_epi16(after_mf_01_128[0],conjch30_ch31_128[0]);
+
+    after_mf_10_128[0] =_mm_adds_epi16(conjch01_ch00_128[0], conjch11_ch10_128[0]);//01_00 + 11_10
+    if (conjch21_ch20 != NULL) after_mf_10_128[0] =_mm_adds_epi16(after_mf_10_128[0],conjch21_ch20_128[0]);
+    if (conjch31_ch30 != NULL) after_mf_10_128[0] =_mm_adds_epi16(after_mf_10_128[0],conjch31_ch30_128[0]);
+
+#ifdef DEBUG_DLSCH_DEMOD
+    if ((rb<=30))
+    {
+      printf(" \n construct_HhH_elements \n");
+      print_shorts("after_mf_00_128:",(int16_t*)&after_mf_00_128[0]);
+      print_shorts("after_mf_01_128:",(int16_t*)&after_mf_01_128[0]);
+      print_shorts("after_mf_10_128:",(int16_t*)&after_mf_10_128[0]);
+      print_shorts("after_mf_11_128:",(int16_t*)&after_mf_11_128[0]);
+    }
+#endif
+    conjch00_ch00_128+=1;
+    conjch10_ch10_128+=1;
+    conjch01_ch01_128+=1;
+    conjch11_ch11_128+=1;
+
+    if (conjch20_ch20 != NULL) conjch20_ch20_128+=1;
+    if (conjch21_ch21 != NULL) conjch21_ch21_128+=1;
+    if (conjch30_ch30 != NULL) conjch30_ch30_128+=1;
+    if (conjch31_ch31 != NULL) conjch31_ch31_128+=1;
+
+    conjch00_ch01_128+=1;
+    conjch01_ch00_128+=1;
+    conjch10_ch11_128+=1;
+    conjch11_ch10_128+=1;
+
+    if (conjch20_ch21 != NULL) conjch20_ch21_128+=1;
+    if (conjch21_ch20 != NULL) conjch21_ch20_128+=1;
+    if (conjch30_ch31 != NULL) conjch30_ch31_128+=1;
+    if (conjch31_ch30 != NULL) conjch31_ch30_128+=1;
+
+    after_mf_00_128 += 1;
+    after_mf_01_128 += 1;
+    after_mf_10_128 += 1;
+    after_mf_11_128 += 1;
+  }
+  _mm_empty();
+  _m_empty();
+}
+
+/* Zero Forcing Rx function: nr_ulsch_zero_forcing_rx_2layers()
+ *
+ *
+ * */
+uint8_t nr_ulsch_zero_forcing_rx_2layers(int **rxdataF_comp,
+                                   int **ul_ch_mag,
+                                   int **ul_ch_magb,                                   
+                                   int **ul_ch_estimates_ext,
+                                   unsigned short nb_rb,
+                                   unsigned char n_rx,
+                                   unsigned char mod_order,
+                                   int shift,
+                                   unsigned char symbol,
+                                   int length)
+{
+  int *ch00, *ch01, *ch10, *ch11;
+  int *ch20, *ch30, *ch21, *ch31;
+  uint32_t nb_rb_0 = length/12 + ((length%12)?1:0);
+
+  #ifdef __AVX2__
+  int off = ((nb_rb&1) == 1)? 4:0;
+  #else
+  int off = 0;
+  #endif
+
+  /* we need at least alignment to 16 bytes, let's put 32 to be sure
+   * (maybe not necessary but doesn't hurt)
+   */
+  int32_t conjch00_ch01[12*nb_rb] __attribute__((aligned(32)));
+  int32_t conjch01_ch00[12*nb_rb] __attribute__((aligned(32)));
+  int32_t conjch10_ch11[12*nb_rb] __attribute__((aligned(32)));
+  int32_t conjch11_ch10[12*nb_rb] __attribute__((aligned(32)));
+  int32_t conjch00_ch00[12*nb_rb] __attribute__((aligned(32)));
+  int32_t conjch01_ch01[12*nb_rb] __attribute__((aligned(32)));
+  int32_t conjch10_ch10[12*nb_rb] __attribute__((aligned(32)));
+  int32_t conjch11_ch11[12*nb_rb] __attribute__((aligned(32)));
+  int32_t conjch20_ch20[12*nb_rb] __attribute__((aligned(32)));
+  int32_t conjch21_ch21[12*nb_rb] __attribute__((aligned(32)));
+  int32_t conjch30_ch30[12*nb_rb] __attribute__((aligned(32)));
+  int32_t conjch31_ch31[12*nb_rb] __attribute__((aligned(32)));
+  int32_t conjch20_ch21[12*nb_rb] __attribute__((aligned(32)));
+  int32_t conjch30_ch31[12*nb_rb] __attribute__((aligned(32)));
+  int32_t conjch21_ch20[12*nb_rb] __attribute__((aligned(32)));
+  int32_t conjch31_ch30[12*nb_rb] __attribute__((aligned(32)));
+
+  int32_t af_mf_00[12*nb_rb] __attribute__((aligned(32)));
+  int32_t af_mf_01[12*nb_rb] __attribute__((aligned(32)));
+  int32_t af_mf_10[12*nb_rb] __attribute__((aligned(32)));
+  int32_t af_mf_11[12*nb_rb] __attribute__((aligned(32)));
+  int32_t determ_fin[12*nb_rb] __attribute__((aligned(32)));
+
+  switch (n_rx) {
+    case 2://
+      ch00 = (int *)&ul_ch_estimates_ext[0][symbol*(off+nb_rb*12)];
+      ch01 = (int *)&ul_ch_estimates_ext[2][symbol*(off+nb_rb*12)];
+      ch10 = (int *)&ul_ch_estimates_ext[1][symbol*(off+nb_rb*12)];
+      ch11 = (int *)&ul_ch_estimates_ext[3][symbol*(off+nb_rb*12)];
+      ch20 = NULL;
+      ch21 = NULL;
+      ch30 = NULL;
+      ch31 = NULL;
+      break;
+
+    case 4://
+      ch00 = (int *)&ul_ch_estimates_ext[0][symbol*(off+nb_rb*12)];
+      ch01 = (int *)&ul_ch_estimates_ext[4][symbol*(off+nb_rb*12)];
+      ch10 = (int *)&ul_ch_estimates_ext[1][symbol*(off+nb_rb*12)];
+      ch11 = (int *)&ul_ch_estimates_ext[5][symbol*(off+nb_rb*12)];
+      ch20 = (int *)&ul_ch_estimates_ext[2][symbol*(off+nb_rb*12)];
+      ch21 = (int *)&ul_ch_estimates_ext[6][symbol*(off+nb_rb*12)];
+      ch30 = (int *)&ul_ch_estimates_ext[3][symbol*(off+nb_rb*12)];
+      ch31 = (int *)&ul_ch_estimates_ext[7][symbol*(off+nb_rb*12)];
+      break;
+
+    default:
+      return -1;
+      break;
+  }
+
+  /* 1- Compute the rx channel matrix after compensation: (1/2^log2_max)x(H_herm x H)
+   * for n_rx = 2
+   * |conj_H_00       conj_H_10|    | H_00         H_01|   |(conj_H_00xH_00+conj_H_10xH_10)   (conj_H_00xH_01+conj_H_10xH_11)|
+   * |                         |  x |                  | = |                                                                 |
+   * |conj_H_01       conj_H_11|    | H_10         H_11|   |(conj_H_01xH_00+conj_H_11xH_10)   (conj_H_01xH_01+conj_H_11xH_11)|
+   *
+   */
+
+  if (n_rx>=2){
+    // (1/2^log2_maxh)*conj_H_00xH_00: (1/(64*2))conjH_00*H_00*2^15
+    nr_ulsch_conjch0_mult_ch1(ch00,
+                        ch00,
+                        conjch00_ch00,
+                        nb_rb_0,
+                        shift);
+    // (1/2^log2_maxh)*conj_H_10xH_10: (1/(64*2))conjH_10*H_10*2^15
+    nr_ulsch_conjch0_mult_ch1(ch10,
+                        ch10,
+                        conjch10_ch10,
+                        nb_rb_0,
+                        shift);
+    // conj_H_00xH_01
+    nr_ulsch_conjch0_mult_ch1(ch00,
+                        ch01,
+                        conjch00_ch01,
+                        nb_rb_0,
+                        shift); // this shift is equal to the channel level log2_maxh
+    // conj_H_10xH_11
+    nr_ulsch_conjch0_mult_ch1(ch10,
+                        ch11,
+                        conjch10_ch11,
+                        nb_rb_0,
+                        shift);
+    // conj_H_01xH_01
+    nr_ulsch_conjch0_mult_ch1(ch01,
+                        ch01,
+                        conjch01_ch01,
+                        nb_rb_0,
+                        shift);
+    // conj_H_11xH_11
+    nr_ulsch_conjch0_mult_ch1(ch11,
+                        ch11,
+                        conjch11_ch11,
+                        nb_rb_0,
+                        shift);
+    // conj_H_01xH_00
+    nr_ulsch_conjch0_mult_ch1(ch01,
+                        ch00,
+                        conjch01_ch00,
+                        nb_rb_0,
+                        shift);
+    // conj_H_11xH_10
+    nr_ulsch_conjch0_mult_ch1(ch11,
+                        ch10,
+                        conjch11_ch10,
+                        nb_rb_0,
+                        shift);
+  }
+  if (n_rx==4){
+    // (1/2^log2_maxh)*conj_H_20xH_20: (1/(64*2*16))conjH_20*H_20*2^15
+    nr_ulsch_conjch0_mult_ch1(ch20,
+                        ch20,
+                        conjch20_ch20,
+                        nb_rb_0,
+                        shift);
+
+    // (1/2^log2_maxh)*conj_H_30xH_30: (1/(64*2*4))conjH_30*H_30*2^15
+    nr_ulsch_conjch0_mult_ch1(ch30,
+                        ch30,
+                        conjch30_ch30,
+                        nb_rb_0,
+                        shift);
+
+    // (1/2^log2_maxh)*conj_H_20xH_20: (1/(64*2))conjH_20*H_20*2^15
+    nr_ulsch_conjch0_mult_ch1(ch20,
+                        ch21,
+                        conjch20_ch21,
+                        nb_rb_0,
+                        shift);
+
+    nr_ulsch_conjch0_mult_ch1(ch30,
+                        ch31,
+                        conjch30_ch31,
+                        nb_rb_0,
+                        shift);
+
+    nr_ulsch_conjch0_mult_ch1(ch21,
+                        ch21,
+                        conjch21_ch21,
+                        nb_rb_0,
+                        shift);
+
+    nr_ulsch_conjch0_mult_ch1(ch31,
+                        ch31,
+                        conjch31_ch31,
+                        nb_rb_0,
+                        shift);
+
+    // (1/2^log2_maxh)*conj_H_20xH_20: (1/(64*2))conjH_20*H_20*2^15
+    nr_ulsch_conjch0_mult_ch1(ch21,
+                        ch20,
+                        conjch21_ch20,
+                        nb_rb_0,
+                        shift);
+
+    nr_ulsch_conjch0_mult_ch1(ch31,
+                        ch30,
+                        conjch31_ch30,
+                        nb_rb_0,
+                        shift);
+
+    nr_ulsch_construct_HhH_elements(conjch00_ch00,
+                              conjch01_ch01,
+                              conjch11_ch11,
+                              conjch10_ch10,//
+                              conjch20_ch20,
+                              conjch21_ch21,
+                              conjch30_ch30,
+                              conjch31_ch31,
+                              conjch00_ch01,
+                              conjch01_ch00,
+                              conjch10_ch11,
+                              conjch11_ch10,//
+                              conjch20_ch21,
+                              conjch21_ch20,
+                              conjch30_ch31,
+                              conjch31_ch30,
+                              af_mf_00,
+                              af_mf_01,
+                              af_mf_10,
+                              af_mf_11,
+                              nb_rb_0,
+                              symbol);
+  }
+  if (n_rx==2){
+    nr_ulsch_construct_HhH_elements(conjch00_ch00,
+                              conjch01_ch01,
+                              conjch11_ch11,
+                              conjch10_ch10,//
+                              NULL,
+                              NULL,
+                              NULL,
+                              NULL,
+                              conjch00_ch01,
+                              conjch01_ch00,
+                              conjch10_ch11,
+                              conjch11_ch10,//
+                              NULL,
+                              NULL,
+                              NULL,
+                              NULL,
+                              af_mf_00,
+                              af_mf_01,
+                              af_mf_10,
+                              af_mf_11,
+                              nb_rb_0,
+                              symbol);
+  }
+  //det_HhH = ad -bc
+  nr_ulsch_det_HhH(af_mf_00,//a
+             af_mf_01,//b
+             af_mf_10,//c
+             af_mf_11,//d
+             determ_fin,
+             nb_rb_0,
+             symbol,
+             shift);
+  /* 2- Compute the channel matrix inversion **********************************
+   *
+     *    |(conj_H_00xH_00+conj_H_10xH_10)   (conj_H_00xH_01+conj_H_10xH_11)|
+     * A= |                                                                 |
+     *    |(conj_H_01xH_00+conj_H_11xH_10)   (conj_H_01xH_01+conj_H_11xH_11)|
+     *
+     *
+     *
+     *inv(A) =(1/det)*[d  -b
+     *                 -c  a]
+     *
+     *
+     **************************************************************************/
+  __m128i *rxdataF_comp128_0,*rxdataF_comp128_1,*ul_ch_mag128_0=NULL,*ul_ch_mag128b_0=NULL,*determ_fin_128;//*dl_ch_mag128_1,*dl_ch_mag128b_1,*dl_ch_mag128r_1
+  __m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3;
+  __m128i *after_mf_a_128,*after_mf_b_128, *after_mf_c_128, *after_mf_d_128;
+  __m128i QAM_amp128={0},QAM_amp128b={0};
+
+  determ_fin_128      = (__m128i *)&determ_fin[0];
+
+  rxdataF_comp128_0   = (__m128i *)&rxdataF_comp[0][symbol*(off+nb_rb*12)];//aatx=0 @ aarx =0
+  rxdataF_comp128_1   = (__m128i *)&rxdataF_comp[n_rx][symbol*(off+nb_rb*12)];//aatx=1 @ aarx =0
+
+  after_mf_a_128 = (__m128i *)af_mf_00;
+  after_mf_b_128 = (__m128i *)af_mf_01;
+  after_mf_c_128 = (__m128i *)af_mf_10;
+  after_mf_d_128 = (__m128i *)af_mf_11;
+
+  if (mod_order>2) {
+    if (mod_order == 4) {
+      QAM_amp128 = _mm_set1_epi16(QAM16_n1);  //2/sqrt(10)
+      QAM_amp128b = _mm_setzero_si128();
+    } else if (mod_order == 6) {
+      QAM_amp128  = _mm_set1_epi16(QAM64_n1); //4/sqrt{42}
+      QAM_amp128b = _mm_set1_epi16(QAM64_n2); //2/sqrt{42}
+    } 
+    ul_ch_mag128_0      = (__m128i *)&ul_ch_mag[0][symbol*(off+nb_rb*12)];
+    ul_ch_mag128b_0     = (__m128i *)&ul_ch_magb[0][symbol*(off+nb_rb*12)];
+  }
+
+  for (int rb=0; rb<3*nb_rb_0; rb++) {
+    if (mod_order>2) {
+      int sum_det =0;
+      for (int k=0; k<4;k++) {
+        sum_det += ((((int *)&determ_fin_128[0])[k])>>2);
+        //printf("det_%d = %d\n",k,sum_det);
+        }
+
+      mmtmpD2 = _mm_slli_epi32(determ_fin_128[0],5);
+      mmtmpD2 = _mm_srai_epi32(mmtmpD2,log2_approx(sum_det));
+      mmtmpD2 = _mm_slli_epi32(mmtmpD2,5);
+
+      mmtmpD3 = _mm_unpacklo_epi32(mmtmpD2,mmtmpD2);
+
+      mmtmpD2 = _mm_unpackhi_epi32(mmtmpD2,mmtmpD2);
+
+      mmtmpD2 = _mm_packs_epi32(mmtmpD3,mmtmpD2);
+
+      ul_ch_mag128_0[0] = mmtmpD2;
+      ul_ch_mag128b_0[0] = mmtmpD2;
+
+      ul_ch_mag128_0[0] = _mm_mulhi_epi16(ul_ch_mag128_0[0],QAM_amp128);
+      ul_ch_mag128_0[0] = _mm_slli_epi16(ul_ch_mag128_0[0],1);
+
+      ul_ch_mag128b_0[0] = _mm_mulhi_epi16(ul_ch_mag128b_0[0],QAM_amp128b);
+      ul_ch_mag128b_0[0] = _mm_slli_epi16(ul_ch_mag128b_0[0],1);
+
+      //print_shorts("mag layer 1:",(int16_t*)&dl_ch_mag128_0[0]);
+      //print_shorts("mag layer 2:",(int16_t*)&dl_ch_mag128_1[0]);
+      //print_shorts("magb layer 1:",(int16_t*)&dl_ch_mag128b_0[0]);
+      //print_shorts("magb layer 2:",(int16_t*)&dl_ch_mag128b_1[0]);
+      //print_shorts("magr layer 1:",(int16_t*)&dl_ch_mag128r_0[0]);
+      //print_shorts("magr layer 2:",(int16_t*)&dl_ch_mag128r_1[0]);
+    }
+    // multiply by channel Inv
+    //rxdataF_zf128_0 = rxdataF_comp128_0*d - b*rxdataF_comp128_1
+    //rxdataF_zf128_1 = rxdataF_comp128_1*a - c*rxdataF_comp128_0
+    //printf("layer_1 \n");
+    mmtmpD0 = nr_ulsch_comp_muli_sum(rxdataF_comp128_0[0],
+                               after_mf_d_128[0],
+                               rxdataF_comp128_1[0],
+                               after_mf_b_128[0],
+                               determ_fin_128[0]);
+
+    //printf("layer_2 \n");
+    mmtmpD1 = nr_ulsch_comp_muli_sum(rxdataF_comp128_1[0],
+                               after_mf_a_128[0],
+                               rxdataF_comp128_0[0],
+                               after_mf_c_128[0],
+                               determ_fin_128[0]);
+
+    rxdataF_comp128_0[0] = mmtmpD0;
+    rxdataF_comp128_1[0] = mmtmpD1;
+#ifdef DEBUG_DLSCH_DEMOD
+    printf("\n Rx signal after ZF l%d rb%d\n",symbol,rb);
+    print_shorts(" Rx layer 1:",(int16_t*)&rxdataF_comp128_0[0]);
+    print_shorts(" Rx layer 2:",(int16_t*)&rxdataF_comp128_1[0]);
+#endif
+    determ_fin_128 += 1;
+    ul_ch_mag128_0 += 1;
+    ul_ch_mag128b_0 += 1;    
+    rxdataF_comp128_0 += 1;
+    rxdataF_comp128_1 += 1;
+    after_mf_a_128 += 1;
+    after_mf_b_128 += 1;
+    after_mf_c_128 += 1;
+    after_mf_d_128 += 1;
+  }
+  _mm_empty();
+  _m_empty();
+   return(0);
+}
+
+//==============================================================================================
+
+/* Main Function */
 int nr_rx_pusch(PHY_VARS_gNB *gNB,
                 uint8_t ulsch_id,
                 uint32_t frame,
@@ -1186,7 +1912,10 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
   bwp_start_subcarrier = ((rel15_ul->rb_start + rel15_ul->bwp_start)*NR_NB_SC_PER_RB + frame_parms->first_carrier_offset) % frame_parms->ofdm_symbol_size;
   LOG_D(PHY,"pusch %d.%d : bwp_start_subcarrier %d, rb_start %d, first_carrier_offset %d\n", frame,slot,bwp_start_subcarrier, rel15_ul->rb_start, frame_parms->first_carrier_offset);
   LOG_D(PHY,"pusch %d.%d : ul_dmrs_symb_pos %x\n",frame,slot,rel15_ul->ul_dmrs_symb_pos);
-
+  LOG_D(PHY,"ulsch RX %x : start_rb %d nb_rb %d mcs %d Nl %d Tpmi %d bwp_start %d start_sc %d start_symbol %d num_symbols %d cdmgrpsnodata %d num_dmrs %d dmrs_ports %d\n",
+          rel15_ul->rnti,rel15_ul->rb_start,rel15_ul->rb_size,rel15_ul->mcs_index,
+          rel15_ul->nrOfLayers,0,rel15_ul->bwp_start,0,rel15_ul->start_symbol_index,rel15_ul->nr_of_symbols,
+          rel15_ul->num_dmrs_cdm_grps_no_data,rel15_ul->ul_dmrs_symb_pos,rel15_ul->dmrs_ports);
   //----------------------------------------------------------
   //--------------------- Channel estimation ---------------------
   //----------------------------------------------------------
@@ -1194,11 +1923,13 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
   for(uint8_t symbol = rel15_ul->start_symbol_index; symbol < (rel15_ul->start_symbol_index + rel15_ul->nr_of_symbols); symbol++) {
     uint8_t dmrs_symbol_flag = (rel15_ul->ul_dmrs_symb_pos >> symbol) & 0x01;
     LOG_D(PHY, "symbol %d, dmrs_symbol_flag :%d\n", symbol, dmrs_symbol_flag);
+    
     if (dmrs_symbol_flag == 1) {
       if (gNB->pusch_vars[ulsch_id]->dmrs_symbol == INVALID_VALUE)
         gNB->pusch_vars[ulsch_id]->dmrs_symbol = symbol;
 
-      for (int nl=0; nl<rel15_ul->nrOfLayers; nl++)
+      for (int nl=0; nl<rel15_ul->nrOfLayers; nl++) {
+        
         nr_pusch_channel_estimation(gNB,
                                     slot,
                                     get_dmrs_port(nl,rel15_ul->dmrs_ports),
@@ -1206,6 +1937,7 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
                                     ulsch_id,
                                     bwp_start_subcarrier,
                                     rel15_ul);
+      }
 
       nr_gnb_measurements(gNB, ulsch_id, harq_pid, symbol,rel15_ul->nrOfLayers);
 
@@ -1214,9 +1946,11 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
           gNB->pusch_vars[ulsch_id]->ulsch_power[aarx] = 0;
           gNB->pusch_vars[ulsch_id]->ulsch_noise_power[aarx] = 0;
         }
-        gNB->pusch_vars[ulsch_id]->ulsch_power[aarx] += signal_energy_nodc(
-            &gNB->pusch_vars[ulsch_id]->ul_ch_estimates[aarx][symbol * frame_parms->ofdm_symbol_size],
+        for (aatx = 0; aatx < rel15_ul->nrOfLayers; aatx++) {
+          gNB->pusch_vars[ulsch_id]->ulsch_power[aarx] += signal_energy_nodc(
+            &gNB->pusch_vars[ulsch_id]->ul_ch_estimates[aatx*gNB->frame_parms.nb_antennas_rx+aarx][symbol * frame_parms->ofdm_symbol_size],
             rel15_ul->rb_size * 12);
+        }
         for (int rb = 0; rb < rel15_ul->rb_size; rb++) {
           gNB->pusch_vars[ulsch_id]->ulsch_noise_power[aarx] +=
               gNB->measurements.n0_subband_power[aarx][rel15_ul->bwp_start + rel15_ul->rb_start + rb] /
@@ -1229,6 +1963,17 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
       }
     }
   }
+
+  if (gNB->chest_time == 1) { // averaging time domain channel estimates
+    nr_chest_time_domain_avg(frame_parms,
+                             gNB->pusch_vars[ulsch_id]->ul_ch_estimates,
+                             rel15_ul->nr_of_symbols,
+                             rel15_ul->start_symbol_index,
+                             rel15_ul->ul_dmrs_symb_pos,
+                             rel15_ul->rb_size);
+
+    gNB->pusch_vars[ulsch_id]->dmrs_symbol = get_next_dmrs_symbol_in_slot(rel15_ul->ul_dmrs_symb_pos, rel15_ul->start_symbol_index, rel15_ul->nr_of_symbols);
+  }
   stop_meas(&gNB->ulsch_channel_estimation_stats);
 
 #ifdef __AVX2__
@@ -1244,7 +1989,8 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
       if ((rel15_ul->ul_dmrs_symb_pos >> ((symbol + 1) % frame_parms->symbols_per_slot)) & 0x01)
         AssertFatal(1==0,"Double DMRS configuration is not yet supported\n");
 
-      gNB->pusch_vars[ulsch_id]->dmrs_symbol = symbol;
+      if (gNB->chest_time == 0) // Non averaging time domain channel estimates
+        gNB->pusch_vars[ulsch_id]->dmrs_symbol = symbol;
 
       if (rel15_ul->dmrs_config_type == 0) {
         // if no data in dmrs cdm group is 1 only even REs have no data
@@ -1254,7 +2000,8 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
       else {
         nb_re_pusch = rel15_ul->rb_size *(12 - (rel15_ul->num_dmrs_cdm_grps_no_data*4));
       }
-    } else {
+    } 
+    else {
       nb_re_pusch = rel15_ul->rb_size * NR_NB_SC_PER_RB;
     }
 
@@ -1265,15 +2012,14 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
     //--------------------- RBs extraction ---------------------
     //----------------------------------------------------------
     if (nb_re_pusch > 0) {
-
       start_meas(&gNB->ulsch_rbs_extraction_stats);
-      nr_ulsch_extract_rbs_single(gNB->common_vars.rxdataF,
-                                  gNB->pusch_vars[ulsch_id],
-                                  slot,
-                                  symbol,
-                                  dmrs_symbol_flag,
-                                  rel15_ul,
-                                  frame_parms);
+      nr_ulsch_extract_rbs(gNB->common_vars.rxdataF,
+                           gNB->pusch_vars[ulsch_id],
+                           slot,
+                           symbol,
+                           dmrs_symbol_flag,
+                           rel15_ul,
+                           frame_parms);
       stop_meas(&gNB->ulsch_rbs_extraction_stats);
 
       //----------------------------------------------------------
@@ -1284,8 +2030,9 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
                             gNB->ulsch[ulsch_id],
                             symbol,
                             dmrs_symbol_flag,
-                            rel15_ul->rb_size,
-                            rel15_ul->dmrs_config_type);
+                            nb_re_pusch,
+                            rel15_ul->nrOfLayers,
+                            rel15_ul->rb_size);
 
       if (gNB->pusch_vars[ulsch_id]->cl_done==0) {
         nr_ulsch_channel_level(gNB->pusch_vars[ulsch_id]->ul_ch_estimates_ext,
@@ -1319,6 +2066,7 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
                                     (rel15_ul->nrOfLayers>1) ? gNB->pusch_vars[ulsch_id]->rho : NULL,
                                     frame_parms,
                                     symbol,
+                                    nb_re_pusch,
                                     dmrs_symbol_flag,
                                     rel15_ul->qam_mod_order,
                                     rel15_ul->nrOfLayers,
@@ -1331,19 +2079,32 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
                              gNB->pusch_vars[ulsch_id]->rxdataF_comp,
                              gNB->pusch_vars[ulsch_id]->ul_ch_mag0,
                              gNB->pusch_vars[ulsch_id]->ul_ch_magb0,
+                             (rel15_ul->nrOfLayers>1) ? gNB->pusch_vars[ulsch_id]->rho : NULL,
+                             rel15_ul->nrOfLayers,
                              symbol,
-                             rel15_ul->rb_size);
+                             rel15_ul->rb_size,
+                             nb_re_pusch);
+                 
+      if (rel15_ul->nrOfLayers == 2)//Apply zero forcing for 2 Tx layers
+        nr_ulsch_zero_forcing_rx_2layers(gNB->pusch_vars[ulsch_id]->rxdataF_comp,
+                                   gNB->pusch_vars[ulsch_id]->ul_ch_mag0,
+                                   gNB->pusch_vars[ulsch_id]->ul_ch_magb0,                                   
+                                   gNB->pusch_vars[ulsch_id]->ul_ch_estimates_ext,
+                                   rel15_ul->rb_size,
+                                   frame_parms->nb_antennas_rx,
+                                   rel15_ul->qam_mod_order,
+                                   gNB->pusch_vars[ulsch_id]->log2_maxh,
+                                   symbol,
+                                   nb_re_pusch);
       stop_meas(&gNB->ulsch_mrc_stats);
 
-      // transform precoding = 0 means enabled
-      if (rel15_ul->transform_precoding == 0) {
-
-      #ifdef __AVX2__
+      if (rel15_ul->transform_precoding == transformPrecoder_enabled) {
+         #ifdef __AVX2__
         // For odd number of resource blocks need byte alignment to multiple of 8
         int nb_re_pusch2 = nb_re_pusch + (nb_re_pusch&7);
-      #else
+        #else
         int nb_re_pusch2 = nb_re_pusch;
-      #endif
+        #endif
 
         // perform IDFT operation on the compensated rxdata if transform precoding is enabled
         nr_idft(&gNB->pusch_vars[ulsch_id]->rxdataF_comp[0][symbol * nb_re_pusch2], nb_re_pusch);
@@ -1374,14 +2135,16 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
       /*--------------------  LLRs computation  -------------------------------------------------------------*/
       /*-----------------------------------------------------------------------------------------------------*/
       start_meas(&gNB->ulsch_llr_stats);
-      nr_ulsch_compute_llr(&gNB->pusch_vars[ulsch_id]->rxdataF_comp[0][symbol * (off + rel15_ul->rb_size * NR_NB_SC_PER_RB)],
-                           gNB->pusch_vars[ulsch_id]->ul_ch_mag0,
-                           gNB->pusch_vars[ulsch_id]->ul_ch_magb0,
-                           &gNB->pusch_vars[ulsch_id]->llr[rxdataF_ext_offset * rel15_ul->qam_mod_order],
-                           rel15_ul->rb_size,
-                           gNB->pusch_vars[ulsch_id]->ul_valid_re_per_slot[symbol],
-                           symbol,
-                           rel15_ul->qam_mod_order);
+      for (aatx=0; aatx < rel15_ul->nrOfLayers; aatx++) {
+        nr_ulsch_compute_llr(&gNB->pusch_vars[ulsch_id]->rxdataF_comp[aatx*frame_parms->nb_antennas_rx][symbol * (off + rel15_ul->rb_size * NR_NB_SC_PER_RB)],
+                             gNB->pusch_vars[ulsch_id]->ul_ch_mag0[aatx*frame_parms->nb_antennas_rx],
+                             gNB->pusch_vars[ulsch_id]->ul_ch_magb0[aatx*frame_parms->nb_antennas_rx],
+                             &gNB->pusch_vars[ulsch_id]->llr_layers[aatx][rxdataF_ext_offset * rel15_ul->qam_mod_order],
+                             rel15_ul->rb_size,
+                             gNB->pusch_vars[ulsch_id]->ul_valid_re_per_slot[symbol],
+                             symbol,
+                             rel15_ul->qam_mod_order);
+      }
       stop_meas(&gNB->ulsch_llr_stats);
       rxdataF_ext_offset += gNB->pusch_vars[ulsch_id]->ul_valid_re_per_slot[symbol];
     }
diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_llr_computation.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_llr_computation.c
index bf96a761060489ece5b08afb9419a45343a60d71..f6eefe846ac5e3de53c76f3c044039a2c8babb3f 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_llr_computation.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_llr_computation.c
@@ -44,19 +44,19 @@ void nr_ulsch_qpsk_llr(int32_t *rxdataF_comp,
                       uint32_t nb_re,
                       uint8_t  symbol)
 {
-  uint32_t *rxF   = (uint32_t*)rxdataF_comp;
-  uint32_t *llr32 = (uint32_t*)ulsch_llr;
+  c16_t *rxF   = (c16_t *)rxdataF_comp;
+  c16_t *llr32 = (c16_t *)ulsch_llr;
 
   if (!llr32) {
     LOG_E(PHY,"nr_ulsch_qpsk_llr: llr is null, symbol %d, llr32 = %p\n",symbol, llr32);
   }
-  /*
-  for (i = 0; i < nb_re; i++) {
-    *llr32 = *rxF;
+  for (int i = 0; i < nb_re; i++) {
+    //*llr32 = *rxF;
+    llr32->r = rxF->r >> 3;
+    llr32->i = rxF->i >> 3;
     rxF++;
     llr32++;
-    }*/
-  memcpy1((void*)llr32,(void*)rxF,nb_re<<2);
+  }
 }
 
 //----------------------------------------------------------------------------------------------
@@ -64,7 +64,7 @@ void nr_ulsch_qpsk_llr(int32_t *rxdataF_comp,
 //----------------------------------------------------------------------------------------------
 
 void nr_ulsch_16qam_llr(int32_t *rxdataF_comp,
-                        int32_t **ul_ch_mag,
+                        int32_t *ul_ch_mag,
                         int16_t  *ulsch_llr,
                         uint32_t nb_rb,
                         uint32_t nb_re,
@@ -110,12 +110,12 @@ void nr_ulsch_16qam_llr(int32_t *rxdataF_comp,
 
 #if defined(__x86_64__) || defined(__i386__)
 #ifdef __AVX2__
-    ch_mag = (__m256i*)&ul_ch_mag[0][(symbol*(off+(nb_rb*12)))];
+    ch_mag = (__m256i*)&ul_ch_mag[(symbol*(off+(nb_rb*12)))];
 #else
-    ch_mag = (__m128i*)&ul_ch_mag[0][(symbol*(off+(nb_rb*12)))];
+    ch_mag = (__m128i*)&ul_ch_mag[(symbol*(off+(nb_rb*12)))];
 #endif
 #elif defined(__arm__)
-  ch_mag = (int16x8_t*)&ul_ch_mag[0][(symbol*nb_rb*12)];
+  ch_mag = (int16x8_t*)&ul_ch_mag[(symbol*nb_rb*12)];
 #endif
 
 #ifdef __AVX2__
@@ -231,8 +231,8 @@ void nr_ulsch_16qam_llr(int32_t *rxdataF_comp,
 //----------------------------------------------------------------------------------------------
 
 void nr_ulsch_64qam_llr(int32_t *rxdataF_comp,
-                        int32_t **ul_ch_mag,
-                        int32_t **ul_ch_magb,
+                        int32_t *ul_ch_mag,
+                        int32_t *ul_ch_magb,
                         int16_t  *ulsch_llr,
                         uint32_t nb_rb,
                         uint32_t nb_re,
@@ -265,15 +265,15 @@ void nr_ulsch_64qam_llr(int32_t *rxdataF_comp,
 
 #if defined(__x86_64__) || defined(__i386__)
 #ifdef __AVX2__
-  ch_mag = (__m256i*)&ul_ch_mag[0][(symbol*(off+(nb_rb*12)))];
-  ch_magb = (__m256i*)&ul_ch_magb[0][(symbol*(off+(nb_rb*12)))];
+  ch_mag = (__m256i*)&ul_ch_mag[(symbol*(off+(nb_rb*12)))];
+  ch_magb = (__m256i*)&ul_ch_magb[(symbol*(off+(nb_rb*12)))];
 #else
-  ch_mag = (__m128i*)&ul_ch_mag[0][(symbol*nb_rb*12)];
-  ch_magb = (__m128i*)&ul_ch_magb[0][(symbol*nb_rb*12)];
+  ch_mag = (__m128i*)&ul_ch_mag[(symbol*nb_rb*12)];
+  ch_magb = (__m128i*)&ul_ch_magb[(symbol*nb_rb*12)];
 #endif
 #elif defined(__arm__)
-  ch_mag = (int16x8_t*)&ul_ch_mag[0][(symbol*nb_rb*12)];
-  ch_magb = (int16x8_t*)&ul_ch_magb[0][(symbol*nb_rb*12)];
+  ch_mag = (int16x8_t*)&ul_ch_mag[(symbol*nb_rb*12)];
+  ch_magb = (int16x8_t*)&ul_ch_magb[(symbol*nb_rb*12)];
 #endif
 
 #ifdef __AVX2__
@@ -471,8 +471,8 @@ void nr_ulsch_64qam_llr(int32_t *rxdataF_comp,
 
 
 void nr_ulsch_compute_llr(int32_t *rxdataF_comp,
-                          int32_t **ul_ch_mag,
-                          int32_t **ul_ch_magb,
+                          int32_t *ul_ch_mag,
+                          int32_t *ul_ch_magb,
                           int16_t *ulsch_llr,
                           uint32_t nb_rb,
                           uint32_t nb_re,
diff --git a/openair1/PHY/NR_TRANSPORT/pucch_rx.c b/openair1/PHY/NR_TRANSPORT/pucch_rx.c
index fa177b98f50dc5c758c16d2c2a9a4f3d3480a80a..85461df44149c4a100200aec9c45d607c09a117d 100644
--- a/openair1/PHY/NR_TRANSPORT/pucch_rx.c
+++ b/openair1/PHY/NR_TRANSPORT/pucch_rx.c
@@ -190,7 +190,7 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
 	      pucch_pdu->bit_len_harq,pucch_pdu->sr_flag);
 
   NR_gNB_UCI_STATS_t *uci_stats=NULL;
-  NR_gNB_UCI_STATS_t *first_uci_stats=NULL;
+  NR_gNB_UCI_STATS_t *first_uci_stats = gNB->uci_stats;
   for (int i=0;i<NUMBER_OF_NR_UCI_STATS_MAX;i++)
      if (gNB->uci_stats[i].rnti == pucch_pdu->rnti) {
         uci_stats = &gNB->uci_stats[i];
@@ -278,16 +278,30 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
   uint8_t maxpos=0;
   uint8_t index=0;
 
+  int nb_re_pucch = 12*pucch_pdu->prb_size;  // prb size is 1
+  int32_t rp[frame_parms->nb_antennas_rx][pucch_pdu->nr_of_symbols][nb_re_pucch],*tmp_rp;
+
   for (int l=0; l<pucch_pdu->nr_of_symbols; l++) {
     l2 = l+pucch_pdu->start_symbol_index;
+
     re_offset[l] = (12*prb_offset[l]) + frame_parms->first_carrier_offset;
     if (re_offset[l]>= frame_parms->ofdm_symbol_size)
       re_offset[l]-=frame_parms->ofdm_symbol_size;
-  
-    AssertFatal(re_offset[l]+12 < frame_parms->ofdm_symbol_size,"pucch straddles DC carrier, handle this!\n");
+
     for (int aa=0;aa<frame_parms->nb_antennas_rx;aa++) {
-      c16_t *r=(c16_t*)&rxdataF[aa][soffset+(l2*frame_parms->ofdm_symbol_size)+re_offset[l]];
-      for (n=0;n<12;n++) {
+      tmp_rp = &rxdataF[aa][soffset + l2*frame_parms->ofdm_symbol_size];
+      if(re_offset[l] + nb_re_pucch > frame_parms->ofdm_symbol_size) {
+        int neg_length = frame_parms->ofdm_symbol_size-re_offset[l];
+        int pos_length = nb_re_pucch-neg_length;
+        memcpy1((void*)rp[aa][l],(void*)&tmp_rp[re_offset[l]],neg_length*sizeof(int32_t));
+        memcpy1((void*)&rp[aa][l][neg_length],(void*)tmp_rp,pos_length*sizeof(int32_t));
+      }
+      else
+        memcpy1((void*)rp[aa][l],(void*)&tmp_rp[re_offset[l]],nb_re_pucch*sizeof(int32_t));
+
+      c16_t *r = (c16_t*)&rp[aa][l];
+
+      for (n=0;n<nb_re_pucch;n++) {
         xr[aa][l][n].r = (int32_t)x_re[l][n] * r[n].r + (int32_t)x_im[l][n] * r[n].i;
         xr[aa][l][n].i = (int32_t)x_re[l][n] * r[n].i - (int32_t)x_im[l][n] * r[n].r;
 #ifdef DEBUG_NR_PUCCH_RX
@@ -317,8 +331,8 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
           corr[aa][l].r += xr[aa][l][n].r * idft12_re[seq_index][n] + xr[aa][l][n].i * idft12_im[seq_index][n];
           corr[aa][l].i += xr[aa][l][n].r * idft12_im[seq_index][n] - xr[aa][l][n].i * idft12_re[seq_index][n];
         }
-	corr[aa][l].r >>= 31;
-	corr[aa][l].i >>= 31;
+        corr[aa][l].r >>= 31;
+        corr[aa][l].i >>= 31;
       }
     }
     LOG_D(PHY,"PUCCH IDFT[%d/%d] = (%ld,%ld)=>%f\n",
@@ -385,9 +399,7 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
 		   gNB->measurements.n0_subband_power_tot_dB[prb_offset[1]]);
   int SNRtimes10,sigenergy=0;
   for (int aa=0;aa<frame_parms->nb_antennas_rx;aa++)
-    sigenergy += signal_energy_nodc(&rxdataF[aa][soffset+
-                                                 (pucch_pdu->start_symbol_index*frame_parms->ofdm_symbol_size)+
-                                                 re_offset[0]],12);
+    sigenergy += signal_energy_nodc(rp[aa][0],12);
   SNRtimes10 = xrtmag_dBtimes10-(10*max_n0);
   int cqi;
   if (SNRtimes10 < -640) cqi=0;
@@ -1545,7 +1557,7 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
 #ifdef DEBUG_NR_PUCCH_RX
     printf("cw_ML %d, metric %d dB\n",cw_ML,corr_dB);
 #endif
-    LOG_D(PHY,"slot %d PUCCH2 cw_ML %d, metric %d dB\n",slot,cw_ML,corr_dB);
+    LOG_D(PHY,"slot %d PUCCH2 cw_ML %d, metric %d dB\n", slot, cw_ML, corr_dB);
 
     decodedPayload[0]=(uint64_t)cw_ML;
   }
diff --git a/openair1/PHY/NR_TRANSPORT/srs_rx.c b/openair1/PHY/NR_TRANSPORT/srs_rx.c
index 2d7aefdee082b5b6baeb03e104de8a828aaf791f..39c3846db596df01533a3fc8831136daec828356 100644
--- a/openair1/PHY/NR_TRANSPORT/srs_rx.c
+++ b/openair1/PHY/NR_TRANSPORT/srs_rx.c
@@ -98,7 +98,7 @@ int nr_get_srs_signal(PHY_VARS_gNB *gNB,
                       int slot,
                       nfapi_nr_srs_pdu_t *srs_pdu,
                       nr_srs_info_t *nr_srs_info,
-                      int32_t **srs_received_signal) {
+                      int32_t srs_received_signal[][gNB->frame_parms.ofdm_symbol_size*(1<<srs_pdu->num_symbols)]) {
 
   if(nr_srs_info->sc_list_length == 0) {
     LOG_E(NR_PHY, "(%d.%d) nr_srs_info was not generated yet!\n", frame, slot);
@@ -113,6 +113,7 @@ int nr_get_srs_signal(PHY_VARS_gNB *gNB,
   uint64_t symbol_offset = (n_symbols+l0)*frame_parms->ofdm_symbol_size;
 
   int32_t *rx_signal;
+  bool no_srs_signal = true;
   for (int ant = 0; ant < frame_parms->nb_antennas_rx; ant++) {
 
     memset(srs_received_signal[ant], 0, frame_parms->ofdm_symbol_size*sizeof(int32_t));
@@ -121,6 +122,10 @@ int nr_get_srs_signal(PHY_VARS_gNB *gNB,
     for(int sc_idx = 0; sc_idx < nr_srs_info->sc_list_length; sc_idx++) {
       srs_received_signal[ant][nr_srs_info->sc_list[sc_idx]] = rx_signal[nr_srs_info->sc_list[sc_idx]];
 
+      if (rx_signal[nr_srs_info->sc_list[sc_idx]] != 0) {
+        no_srs_signal = false;
+      }
+
 #ifdef SRS_DEBUG
       uint64_t subcarrier_offset = frame_parms->first_carrier_offset + srs_pdu->bwp_start*12;
       int subcarrier_log = nr_srs_info->sc_list[sc_idx]-subcarrier_offset;
@@ -140,5 +145,11 @@ int nr_get_srs_signal(PHY_VARS_gNB *gNB,
 #endif
     }
   }
-  return 0;
+
+  if (no_srs_signal) {
+    LOG_W(NR_PHY, "No SRS signal\n");
+    return -1;
+  } else {
+    return 0;
+  }
 }
\ No newline at end of file
diff --git a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c
index 7fb73627798f768c273df7a1a01d8eaf9e72df90..5e2fc8538739ee371d8a598992b5805322b88533 100644
--- a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c
+++ b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c
@@ -120,7 +120,7 @@ short filt16a_m3_dc[16] = {
 -9831,-6554,-3277,0,3276,6553,9830,16384,12288,8192,4096,0,0,0,0,0};
 
 short filt16a_1[16] = {
-16384,16384,16384,16384,16384,16384,16384,16384,16384,16384,16384,16384};
+16384,16384,16384,16384,16384,16384,16384,16384,16384,16384,16384,16384,0,0,0,0};
 
 short filt16a_2l0[16] = {
 16384,12288,8192,4096,-4096,0,0,0,0,0,0,0,0,0,0,0};
@@ -190,10 +190,10 @@ short filt8_mm1[8]= {
 0,0,0,0,8192,16384,8192,0};
 
 short filt8_dcl1[8]= {
-0,0,0,16384,12288,8192,4096,0};
+0,0,16384,12288,8192,4096,0,0};
 
 short filt8_dcr1[8]= {
-0,0,0,0,4096,8192,12288,16384};
+0,0,0,4096,8192,12288,16384,0};
 
 short filt8_dcl1_h[8]= {
 0,16384,12288,8192,4096,0,0,0};
@@ -309,4 +309,17 @@ short filt16_middle4[16] = {
     4096,8192,8192,8192,8192,8192,8192,8192,4096,0,0,0,0,0,0,0};
 
 short filt16_end[16] = {
-    4096,8192,8192,8192,12288,16384,16384,16384,0,0,0,0,0,0,0,0};
\ No newline at end of file
+    4096,8192,8192,8192,12288,16384,16384,16384,0,0,0,0,0,0,0,0};
+
+// CSI-RS
+short filt24_start[24] = {
+    12288,11605,10923,10240,9557,8875,8192,7509,6827,6144,5461,4779,
+    0,0,0,0,0,0,0,0,0,0,0,0};
+
+short filt24_end[24] = {
+    4096,4779,5461,6144,6827,7509,8192,8875,9557,10240,10923,11605,
+    16384,16384,16384,16384,16384,16384,16384,16384,16384,16384,16384,16384};
+
+short filt24_middle[24] = {
+    4096,4779,5461,6144,6827,7509,8192,8875,9557,10240,10923,11605,
+    12288,11605,10923,10240,9557,8875,8192,7509,6827,6144,5461,4779};
diff --git a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h
index f88bef56a0aac55a4887ae47f3f6b3673e280b81..3bc802ce7a40b09c151063fda5a5843ef783c415 100644
--- a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h
+++ b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h
@@ -211,4 +211,10 @@ extern short filt8_end[8];
 extern short filt16_start[16];
 extern short filt16_middle4[16];
 extern short filt16_end[16];
+
+/*CSI-RS*/
+extern short filt24_start[24];
+extern short filt24_end[24];
+extern short filt24_middle[24];
+
 #endif
diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
index 9756f1105f35fda795c24a6c162fb724d532b18a..76eb901c876bfe512c9fb1d2be4ccf53b1375290 100644
--- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
+++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
@@ -567,6 +567,8 @@ int nr_prs_channel_estimation(uint8_t gNB_id,
   return(0);
 }
 
+#define CH_INTERP 0
+#define NO_INTERP 1
 
 /* Generic function to find the peak of channel estimation buffer */
 void peak_estimator(int32_t *buffer, int32_t buf_len, int32_t *peak_idx, int32_t *peak_val)
@@ -1029,7 +1031,7 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
   unsigned char aarx;
   unsigned short k;
   unsigned int pilot_cnt;
-  int16_t ch[2],*pil,*rxF,*dl_ch,*fl,*fm,*fr;
+  int16_t ch[2],*pil,*rxF,*dl_ch;
   int ch_offset,symbol_offset;
 
   int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].rxdataF;
@@ -1044,9 +1046,11 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
          proc->thread_id, gNB_id,ch_offset,ue->frame_parms.ofdm_symbol_size,ue->frame_parms.Ncp,Ns,symbol);
 #endif
 
-  fl = filt16a_l1;
-  fm = filt16a_m1;
-  fr = filt16a_r1;
+#if CH_INTERP
+  int16_t *fl = filt16a_l1;
+  int16_t *fm = filt16a_m1;
+  int16_t *fr = filt16a_r1;
+#endif
 
   // checking if re-initialization of scrambling IDs is needed (should be done here but scrambling ID for PDCCH is not taken from RRC)
   if (scrambling_id != ue->scramblingID_pdcch){
@@ -1075,6 +1079,7 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
 
     printf("dl_ch addr %p\n",dl_ch);
 #endif
+  #if CH_INTERP
     //    if ((ue->frame_parms.N_RB_DL&1)==0) {
     // Treat first 2 pilots specially (left edge)
     ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
@@ -1203,6 +1208,33 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
       rxF += 8;
       k   += 4;
     }
+  #else //ELSE CH_INTERP
+    int ch_sum[2] = {0, 0};
+
+    for (pilot_cnt = 0; pilot_cnt < 3*nb_rb_coreset; pilot_cnt++) {
+      if (k >= ue->frame_parms.ofdm_symbol_size) {
+        k  -= ue->frame_parms.ofdm_symbol_size;
+        rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+1)];
+      }
+#ifdef DEBUG_PDCCH
+      printf("pilot[%d] = (%d, %d)\trxF[%d] = (%d, %d)\n", pilot_cnt, pil[0], pil[1], k+1, rxF[0], rxF[1]);
+#endif
+      ch_sum[0] += (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
+      ch_sum[1] += (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
+      pil += 2;
+      rxF += 8;
+      k   += 4;
+
+      if (pilot_cnt % 3 == 2) {
+        ch[0] = ch_sum[0] / 3;
+        ch[1] = ch_sum[1] / 3;
+        multadd_real_vector_complex_scalar(filt16a_1, ch, dl_ch, 16);
+        dl_ch += 24;
+        ch_sum[0] = 0;
+        ch_sum[1] = 0;
+      }
+    }
+  #endif //END CH_INTERP
 
 
     //}
@@ -1235,7 +1267,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
   int ch_offset,symbol_offset;
 
   uint8_t nushift;
-  int **dl_ch_estimates  =ue->pdsch_vars[proc->thread_id][gNB_id]->dl_ch_estimates;
+  int **dl_ch_estimates = ue->pdsch_vars[proc->thread_id][gNB_id]->dl_ch_estimates;
   int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].rxdataF;
 
   ch_offset     = ue->frame_parms.ofdm_symbol_size*symbol;
@@ -1245,7 +1277,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
   k = bwp_start_subcarrier;
   int re_offset = k;
 
-#ifdef DEBUG_CH
+#ifdef DEBUG_PDSCH
   printf("PDSCH Channel Estimation : ThreadId %d, gNB_id %d ch_offset %d, symbol_offset %d OFDM size %d, Ncp=%d, Ns=%d, k=%d symbol %d\n",proc->thread_id, gNB_id,ch_offset,symbol_offset,ue->frame_parms.ofdm_symbol_size,
          ue->frame_parms.Ncp,Ns,k, symbol);
 #endif
@@ -1360,7 +1392,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
     printf("rxF addr %p p %d\n", rxF,p);
     printf("dl_ch addr %p nushift %d\n",dl_ch,nushift);
 #endif
-    if (config_type == NFAPI_NR_DMRS_TYPE1 && ue->prb_interpolation == 0) {
+    if (config_type == NFAPI_NR_DMRS_TYPE1 && ue->chest_freq == 0) {
 
       // Treat first 2 pilots specially (left edge)
       ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
@@ -1537,7 +1569,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
                      8);
         }
       }
-    } else if (config_type == NFAPI_NR_DMRS_TYPE2 && ue->prb_interpolation == 0){ //pdsch_dmrs_type2  |dmrs_r,dmrs_l,0,0,0,0,dmrs_r,dmrs_l,0,0,0,0|
+    } else if (config_type == NFAPI_NR_DMRS_TYPE2 && ue->chest_freq == 0){ //pdsch_dmrs_type2  |dmrs_r,dmrs_l,0,0,0,0,dmrs_r,dmrs_l,0,0,0,0|
 
       // Treat first 4 pilots specially (left edge)
       ch_l[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
@@ -1797,6 +1829,10 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
       ch[0] = ch_0 / 6;
       ch[1] = ch_1 / 6;
 
+#if NO_INTERP
+      for (int i=0;i<12;i++) ((int32_t*)dl_ch)[i] = *(int32_t*)ch;
+      dl_ch+=24;
+#else
       multadd_real_vector_complex_scalar(filt8_avlip0,
                                          ch,
                                          dl_ch,
@@ -1814,6 +1850,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
                                          dl_ch,
                                          8);
       dl_ch -= 24;
+#endif
 
       for (pilot_cnt=6; pilot_cnt<6*(nb_rb_pdsch-1); pilot_cnt += 6) {
 
@@ -1861,6 +1898,11 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
 
         ch[0] = ch_0 / 6;
         ch[1] = ch_1 / 6;
+
+#if NO_INTERP
+        for (int i=0;i<12;i++) ((int32_t*)dl_ch)[i] = *(int32_t*)ch;
+        dl_ch+=24;
+#else
         dl_ch[6] += (ch[0] * 1365)>>15; // 1/12*16384
         dl_ch[7] += (ch[1] * 1365)>>15; // 1/12*16384
 
@@ -1882,6 +1924,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
                                            dl_ch,
                                            8);
         dl_ch -= 16;
+#endif
       }
       ch_0 = ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
       ch_1 = ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
@@ -1928,6 +1971,10 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
       ch[0] = ch_0 / 6;
       ch[1] = ch_1 / 6;
 
+#if NO_INTERP
+      for (int i=0;i<12;i++) ((int32_t*)dl_ch)[i] = *(int32_t*)ch;
+      dl_ch+=24;
+#else
       dl_ch[6] += (ch[0] * 1365)>>15; // 1/12*16384
       dl_ch[7] += (ch[1] * 1365)>>15; // 1/12*16384
 
@@ -1942,6 +1989,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
                                          ch,
                                          dl_ch,
                                          8);
+#endif
     }
     else  { // this is case without frequency-domain linear interpolation, just take average of LS channel estimates of 4 DMRS REs and use a common value for the whole PRB
       int32_t ch_0, ch_1;
@@ -1977,6 +2025,10 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
       ch[0] = ch_0 / 4;
       ch[1] = ch_1 / 4;
 
+#if NO_INTERP
+      for (int i=0;i<12;i++) ((int32_t*)dl_ch)[i] = *(int32_t*)ch;
+      dl_ch+=24;
+#else
       multadd_real_vector_complex_scalar(filt8_avlip0,
                                          ch,
                                          dl_ch,
@@ -1994,6 +2046,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
                                          dl_ch,
                                          8);
       dl_ch -= 24;
+#endif
 
       for (pilot_cnt=4; pilot_cnt<4*(nb_rb_pdsch-1); pilot_cnt += 4) {
         int32_t ch_0, ch_1;
@@ -2029,6 +2082,10 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
         ch[0] = ch_0 / 4;
         ch[1] = ch_1 / 4;
 
+#if NO_INTERP
+        for (int i=0;i<12;i++) ((int32_t*)dl_ch)[i] = *(int32_t*)ch;
+        dl_ch+=24;
+#else
         dl_ch[6] += (ch[0] * 1365)>>15; // 1/12*16384
         dl_ch[7] += (ch[1] * 1365)>>15; // 1/12*16384
 
@@ -2050,6 +2107,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
                                            dl_ch,
                                            8);
         dl_ch -= 16;
+#endif
       }
 
       ch_0 = ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
@@ -2083,6 +2141,10 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
       ch[0] = ch_0 / 4;
       ch[1] = ch_1 / 4;
 
+#if NO_INTERP
+      for (int i=0;i<12;i++) ((int32_t*)dl_ch)[i] = *(int32_t*)ch;
+      dl_ch+=24;
+#else
       dl_ch[6] += (ch[0] * 1365)>>15; // 1/12*16384
       dl_ch[7] += (ch[1] * 1365)>>15; // 1/12*16384
 
@@ -2097,6 +2159,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
                                          ch,
                                          dl_ch,
                                          8);
+#endif
     }
 #ifdef DEBUG_PDSCH
     dl_ch = (int16_t *)&dl_ch_estimates[p*ue->frame_parms.nb_antennas_rx+aarx][ch_offset];
@@ -2147,7 +2210,6 @@ void nr_pdsch_ptrs_processing(PHY_VARS_NR_UE *ue,
                               RX_type_t rx_type)
 {
   //#define DEBUG_DL_PTRS 1
-  int16_t *phase_per_symbol = NULL;
   int32_t *ptrs_re_symbol = NULL;
   int8_t   ret = 0;
   /* harq specific variables */
@@ -2191,20 +2253,20 @@ void nr_pdsch_ptrs_processing(PHY_VARS_NR_UE *ue,
   }
   /* loop over antennas */
   for (int aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
-    phase_per_symbol = (int16_t*)pdsch_vars[gNB_id]->ptrs_phase_per_slot[aarx];
+    c16_t *phase_per_symbol = (c16_t*)pdsch_vars[gNB_id]->ptrs_phase_per_slot[aarx];
     ptrs_re_symbol = (int32_t*)pdsch_vars[gNB_id]->ptrs_re_per_slot[aarx];
     ptrs_re_symbol[symbol] = 0;
-    phase_per_symbol[(2*symbol)+1] = 0; // Imag
+    phase_per_symbol[symbol].i = 0; // Imag
     /* set DMRS estimates to 0 angle with magnitude 1 */
     if(is_dmrs_symbol(symbol,*dmrsSymbPos)) {
       /* set DMRS real estimation to 32767 */
-      phase_per_symbol[2*symbol]=(int16_t)((1<<15)-1); // 32767
+      phase_per_symbol[symbol].r=INT16_MAX; // 32767
 #ifdef DEBUG_DL_PTRS
-      printf("[PHY][PTRS]: DMRS Symbol %d -> %4d + j*%4d\n", symbol, phase_per_symbol[2*symbol],phase_per_symbol[(2*symbol)+1]);
+      printf("[PHY][PTRS]: DMRS Symbol %d -> %4d + j*%4d\n", symbol, phase_per_symbol[symbol].r,phase_per_symbol[symbol].i);
 #endif
     }
     else { // real ptrs value is set to 0
-      phase_per_symbol[2*symbol] = 0; // Real
+      phase_per_symbol[symbol].r = 0; // Real
     }
 
     if(dlsch0_harq->status == ACTIVE) {
@@ -2226,12 +2288,11 @@ void nr_pdsch_ptrs_processing(PHY_VARS_NR_UE *ue,
         /*------------------------------------------------------------------------------------------------------- */
         nr_ptrs_cpe_estimation(*K_ptrs,*ptrsReOffset,*dmrsConfigType,*nb_rb,
                                rnti,
-                               (int16_t *)&pdsch_vars[gNB_id]->dl_ch_ptrs_estimates_ext[aarx][symbol*nb_re_pdsch],
                                nr_slot_rx,
                                symbol,frame_parms->ofdm_symbol_size,
                                (int16_t*)&pdsch_vars[gNB_id]->rxdataF_comp0[aarx][(symbol * nb_re_pdsch)],
                                ue->nr_gold_pdsch[gNB_id][nr_slot_rx][symbol][0],
-                               &phase_per_symbol[2* symbol],
+                               (int16_t*)&phase_per_symbol[symbol],
                                &ptrs_re_symbol[symbol]);
       }
     }// HARQ 0
@@ -2243,7 +2304,7 @@ void nr_pdsch_ptrs_processing(PHY_VARS_NR_UE *ue,
       /*------------------------------------------------------------------------------------------------------- */
       /* If L-PTRS is > 0 then we need interpolation */
       if(*L_ptrs > 0) {
-        ret = nr_ptrs_process_slot(*dmrsSymbPos, *ptrsSymbPos, phase_per_symbol, *startSymbIndex, *nbSymb);
+        ret = nr_ptrs_process_slot(*dmrsSymbPos, *ptrsSymbPos, (int16_t*)phase_per_symbol, *startSymbIndex, *nbSymb);
         if(ret != 0) {
           LOG_W(PHY,"[PTRS] Compensation is skipped due to error in PTRS slot processing !!\n");
         }
@@ -2262,11 +2323,11 @@ void nr_pdsch_ptrs_processing(PHY_VARS_NR_UE *ue,
         /* Skip rotation if the slot processing is wrong */
         if((!is_dmrs_symbol(i,*dmrsSymbPos)) && (ret == 0)) {
 #ifdef DEBUG_DL_PTRS
-          printf("[PHY][DL][PTRS]: Rotate Symbol %2d with  %d + j* %d\n", i, phase_per_symbol[2* i],phase_per_symbol[(2* i) +1]);
+          printf("[PHY][DL][PTRS]: Rotate Symbol %2d with  %d + j* %d\n", i, phase_per_symbol[i].r,phase_per_symbol[i].i);
 #endif
-          rotate_cpx_vector((int16_t*)&pdsch_vars[gNB_id]->rxdataF_comp0[aarx][(i * (*nb_rb) * NR_NB_SC_PER_RB)],
-                            &phase_per_symbol[2* i],
-                            (int16_t*)&pdsch_vars[gNB_id]->rxdataF_comp0[aarx][(i * (*nb_rb) * NR_NB_SC_PER_RB)],
+          rotate_cpx_vector((c16_t*)&pdsch_vars[gNB_id]->rxdataF_comp0[aarx][(i * (*nb_rb) * NR_NB_SC_PER_RB)],
+                            &phase_per_symbol[i],
+                            (c16_t*)&pdsch_vars[gNB_id]->rxdataF_comp0[aarx][(i * (*nb_rb) * NR_NB_SC_PER_RB)],
                             ((*nb_rb) * NR_NB_SC_PER_RB), 15);
         }// if not DMRS Symbol
       }// symbol loop
diff --git a/openair1/PHY/NR_UE_TRANSPORT/csi_rx.c b/openair1/PHY/NR_UE_TRANSPORT/csi_rx.c
new file mode 100644
index 0000000000000000000000000000000000000000..43944b2fa876538cf4a04a28bf86ff1c7812098d
--- /dev/null
+++ b/openair1/PHY/NR_UE_TRANSPORT/csi_rx.c
@@ -0,0 +1,969 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+/***********************************************************************
+*
+* FILENAME    :  csi_rx.c
+*
+* MODULE      :
+*
+* DESCRIPTION :  function to receive the channel state information
+*
+************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "executables/nr-softmodem-common.h"
+#include "nr_transport_proto_ue.h"
+#include "PHY/phy_extern_nr_ue.h"
+#include "common/utils/nr/nr_common.h"
+#include "PHY/NR_TRANSPORT/nr_transport_proto.h"
+#include "PHY/NR_UE_ESTIMATION/filt16a_32.h"
+
+// 10*log10(pow(2,30))
+#define pow_2_30_dB 90
+
+//#define NR_CSIRS_DEBUG
+//#define NR_CSIIM_DEBUG
+
+void nr_det_A_MF_2x2(int32_t *a_mf_00,
+                     int32_t *a_mf_01,
+                     int32_t *a_mf_10,
+                     int32_t *a_mf_11,
+                     int32_t *det_fin,
+                     const unsigned short nb_rb) {
+
+  int16_t nr_conjug2[8]__attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1} ;
+
+  __m128i ad_re_128, bc_re_128, det_re_128;
+
+  __m128i *a_mf_00_128 = (__m128i *)a_mf_00;
+  __m128i *a_mf_01_128 = (__m128i *)a_mf_01;
+  __m128i *a_mf_10_128 = (__m128i *)a_mf_10;
+  __m128i *a_mf_11_128 = (__m128i *)a_mf_11;
+  __m128i *det_fin_128 = (__m128i *)det_fin;
+
+  for (int rb = 0; rb<3*nb_rb; rb++) {
+
+    //complex multiplication (I_a+jQ_a)(I_d+jQ_d) = (I_aI_d - Q_aQ_d) + j(Q_aI_d + I_aQ_d)
+    //The imag part is often zero, we compute only the real part
+    ad_re_128 = _mm_sign_epi16(a_mf_00_128[0],*(__m128i*)&nr_conjug2[0]);
+    ad_re_128 = _mm_madd_epi16(ad_re_128,a_mf_11_128[0]); //Re: I_a0*I_d0 - Q_a1*Q_d1
+
+    //complex multiplication (I_b+jQ_b)(I_c+jQ_c) = (I_bI_c - Q_bQ_c) + j(Q_bI_c + I_bQ_c)
+    //The imag part is often zero, we compute only the real part
+    bc_re_128 = _mm_sign_epi16(a_mf_01_128[0],*(__m128i*)&nr_conjug2[0]);
+    bc_re_128 = _mm_madd_epi16(bc_re_128,a_mf_10_128[0]); //Re: I_b0*I_c0 - Q_b1*Q_c1
+
+    det_re_128 = _mm_sub_epi32(ad_re_128, bc_re_128);
+
+    //det in Q30 format
+    det_fin_128[0] = _mm_abs_epi32(det_re_128);
+
+    det_fin_128+=1;
+    a_mf_00_128+=1;
+    a_mf_01_128+=1;
+    a_mf_10_128+=1;
+    a_mf_11_128+=1;
+  }
+  _mm_empty();
+  _m_empty();
+}
+
+void nr_squared_matrix_element(int32_t *a,
+                               int32_t *a_sq,
+                               const unsigned short nb_rb) {
+  __m128i *a_128 = (__m128i *)a;
+  __m128i *a_sq_128 = (__m128i *)a_sq;
+  for (int rb=0; rb<3*nb_rb; rb++) {
+    a_sq_128[0] = _mm_madd_epi16(a_128[0], a_128[0]);
+    a_sq_128+=1;
+    a_128+=1;
+  }
+  _mm_empty();
+  _m_empty();
+}
+
+void nr_numer_2x2(int32_t *a_00_sq,
+                  int32_t *a_01_sq,
+                  int32_t *a_10_sq,
+                  int32_t *a_11_sq,
+                  int32_t *num_fin,
+                  const unsigned short nb_rb) {
+  __m128i *a_00_sq_128 = (__m128i *)a_00_sq;
+  __m128i *a_01_sq_128 = (__m128i *)a_01_sq;
+  __m128i *a_10_sq_128 = (__m128i *)a_10_sq;
+  __m128i *a_11_sq_128 = (__m128i *)a_11_sq;
+  __m128i *num_fin_128 = (__m128i *)num_fin;
+  for (int rb=0; rb<3*nb_rb; rb++) {
+    __m128i sq_a_plus_sq_d_128 = _mm_add_epi32(a_00_sq_128[0], a_11_sq_128[0]);
+    __m128i sq_b_plus_sq_c_128 = _mm_add_epi32(a_01_sq_128[0], a_10_sq_128[0]);
+    num_fin_128[0] = _mm_add_epi32(sq_a_plus_sq_d_128, sq_b_plus_sq_c_128);
+    num_fin_128+=1;
+    a_00_sq_128+=1;
+    a_01_sq_128+=1;
+    a_10_sq_128+=1;
+    a_11_sq_128+=1;
+  }
+  _mm_empty();
+  _m_empty();
+}
+
+bool is_csi_rs_in_symbol(const fapi_nr_dl_config_csirs_pdu_rel15_t csirs_config_pdu, const int symbol) {
+
+  bool ret = false;
+
+  // 38.211-Table 7.4.1.5.3-1: CSI-RS locations within a slot
+  switch(csirs_config_pdu.row){
+    case 1:
+    case 2:
+    case 3:
+    case 4:
+    case 6:
+    case 9:
+      if(symbol == csirs_config_pdu.symb_l0) {
+        ret = true;
+      }
+      break;
+    case 5:
+    case 7:
+    case 8:
+    case 10:
+    case 11:
+    case 12:
+      if(symbol == csirs_config_pdu.symb_l0 || symbol == (csirs_config_pdu.symb_l0+1) ) {
+        ret = true;
+      }
+      break;
+    case 13:
+    case 14:
+    case 16:
+    case 17:
+      if(symbol == csirs_config_pdu.symb_l0 || symbol == (csirs_config_pdu.symb_l0+1) ||
+          symbol == csirs_config_pdu.symb_l1 || symbol == (csirs_config_pdu.symb_l1+1)) {
+        ret = true;
+      }
+      break;
+    case 15:
+    case 18:
+      if(symbol == csirs_config_pdu.symb_l0 || symbol == (csirs_config_pdu.symb_l0+1) || symbol == (csirs_config_pdu.symb_l0+2) ) {
+        ret = true;
+      }
+      break;
+    default:
+      AssertFatal(0==1, "Row %d is not valid for CSI Table 7.4.1.5.3-1\n", csirs_config_pdu.row);
+  }
+
+  return ret;
+}
+
+int nr_get_csi_rs_signal(const PHY_VARS_NR_UE *ue,
+                         const UE_nr_rxtx_proc_t *proc,
+                         const fapi_nr_dl_config_csirs_pdu_rel15_t *csirs_config_pdu,
+                         const nr_csi_info_t *nr_csi_info,
+                         const uint8_t N_cdm_groups,
+                         const uint8_t CDM_group_size,
+                         const uint8_t k_prime,
+                         const uint8_t l_prime,
+                         const uint8_t *j_cdm,
+                         const uint8_t *k_overline,
+                         const uint8_t *l_overline,
+                         int32_t csi_rs_received_signal[][ue->frame_parms.samples_per_slot_wCP],
+                         uint32_t *rsrp,
+                         int *rsrp_dBm) {
+
+  int32_t **rxdataF  =  ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].rxdataF;
+  const NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
+  uint16_t meas_count = 0;
+  uint32_t rsrp_sum = 0;
+
+  for (int ant_rx = 0; ant_rx < frame_parms->nb_antennas_rx; ant_rx++) {
+
+    for (int rb = csirs_config_pdu->start_rb; rb < (csirs_config_pdu->start_rb+csirs_config_pdu->nr_of_rbs); rb++) {
+
+      // for freq density 0.5 checks if even or odd RB
+      if(csirs_config_pdu->freq_density <= 1 && csirs_config_pdu->freq_density != (rb % 2)) {
+        continue;
+      }
+
+      for (int cdm_id = 0; cdm_id < N_cdm_groups; cdm_id++) {
+        for (int s = 0; s < CDM_group_size; s++)  {
+
+          // loop over frequency resource elements within a group
+          for (int kp = 0; kp <= k_prime; kp++) {
+
+            uint16_t k = (frame_parms->first_carrier_offset + (rb*NR_NB_SC_PER_RB)+k_overline[cdm_id] + kp) % frame_parms->ofdm_symbol_size;
+
+            // loop over time resource elements within a group
+            for (int lp = 0; lp <= l_prime; lp++) {
+              uint16_t symb = lp + l_overline[cdm_id];
+              uint64_t symbol_offset = symb*frame_parms->ofdm_symbol_size;
+              c16_t *rx_signal = (c16_t*)&rxdataF[ant_rx][symbol_offset];
+              c16_t *rx_csi_rs_signal = (c16_t*)&csi_rs_received_signal[ant_rx][symbol_offset];
+              rx_csi_rs_signal[k].r = rx_signal[k].r;
+              rx_csi_rs_signal[k].i = rx_signal[k].i;
+
+              rsrp_sum += (((int32_t)(rx_csi_rs_signal[k].r)*rx_csi_rs_signal[k].r) +
+                           ((int32_t)(rx_csi_rs_signal[k].i)*rx_csi_rs_signal[k].i));
+
+              meas_count++;
+
+#ifdef NR_CSIRS_DEBUG
+              int dataF_offset = proc->nr_slot_rx*ue->frame_parms.samples_per_slot_wCP;
+              uint16_t port_tx = s+j_cdm[cdm_id]*CDM_group_size;
+              c16_t *tx_csi_rs_signal = (c16_t*)&nr_csi_info->csi_rs_generated_signal[port_tx][symbol_offset+dataF_offset];
+              LOG_I(NR_PHY, "l,k (%2d,%4d) |\tport_tx %d (%4d,%4d)\tant_rx %d (%4d,%4d)\n",
+                    symb,
+                    k,
+                    port_tx+3000,
+                    tx_csi_rs_signal[k].r,
+                    tx_csi_rs_signal[k].i,
+                    ant_rx,
+                    rx_csi_rs_signal[k].r,
+                    rx_csi_rs_signal[k].i);
+#endif
+            }
+          }
+        }
+      }
+    }
+  }
+
+
+  *rsrp = rsrp_sum/meas_count;
+  *rsrp_dBm = dB_fixed(*rsrp) + 30 - pow_2_30_dB
+      - ((int)openair0_cfg[0].rx_gain[0] - (int)openair0_cfg[0].rx_gain_offset[0]) - dB_fixed(ue->frame_parms.ofdm_symbol_size);
+
+#ifdef NR_CSIRS_DEBUG
+  LOG_I(NR_PHY, "RSRP = %i (%i dBm)\n", *rsrp, *rsrp_dBm);
+#endif
+
+  return 0;
+}
+
+uint32_t calc_power_csirs(const uint16_t *x, const fapi_nr_dl_config_csirs_pdu_rel15_t *csirs_config_pdu) {
+  uint64_t sum_x = 0;
+  uint64_t sum_x2 = 0;
+  uint16_t size = 0;
+  for (int rb = csirs_config_pdu->start_rb; rb < (csirs_config_pdu->start_rb+csirs_config_pdu->nr_of_rbs); rb++) {
+    if (csirs_config_pdu->freq_density <= 1 && csirs_config_pdu->freq_density != (rb % 2)) {
+      continue;
+    }
+    sum_x = sum_x + x[rb-csirs_config_pdu->start_rb];
+    sum_x2 = sum_x2 + x[rb]*x[rb-csirs_config_pdu->start_rb];
+    size++;
+  }
+  return sum_x2/size - (sum_x/size)*(sum_x/size);
+}
+
+int nr_csi_rs_channel_estimation(const PHY_VARS_NR_UE *ue,
+                                 const UE_nr_rxtx_proc_t *proc,
+                                 const fapi_nr_dl_config_csirs_pdu_rel15_t *csirs_config_pdu,
+                                 const nr_csi_info_t *nr_csi_info,
+                                 const int32_t **csi_rs_generated_signal,
+                                 const int32_t csi_rs_received_signal[][ue->frame_parms.samples_per_slot_wCP],
+                                 const uint8_t N_cdm_groups,
+                                 const uint8_t CDM_group_size,
+                                 const uint8_t k_prime,
+                                 const uint8_t l_prime,
+                                 const uint8_t N_ports,
+                                 const uint8_t *j_cdm,
+                                 const uint8_t *k_overline,
+                                 const uint8_t *l_overline,
+                                 int32_t csi_rs_ls_estimated_channel[][N_ports][ue->frame_parms.ofdm_symbol_size],
+                                 int32_t csi_rs_estimated_channel_freq[][N_ports][ue->frame_parms.ofdm_symbol_size],
+                                 int16_t *log2_re,
+                                 int16_t *log2_maxh,
+                                 uint32_t *noise_power) {
+
+  const NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
+  const int dataF_offset = proc->nr_slot_rx*ue->frame_parms.samples_per_slot_wCP;
+  *noise_power = 0;
+  int maxh = 0;
+  int count = 0;
+
+  for (int ant_rx = 0; ant_rx < frame_parms->nb_antennas_rx; ant_rx++) {
+
+    /// LS channel estimation
+
+    for(uint16_t port_tx = 0; port_tx<N_ports; port_tx++) {
+      memset(csi_rs_ls_estimated_channel[ant_rx][port_tx], 0, frame_parms->ofdm_symbol_size*sizeof(int32_t));
+    }
+
+    for (int rb = csirs_config_pdu->start_rb; rb < (csirs_config_pdu->start_rb+csirs_config_pdu->nr_of_rbs); rb++) {
+
+      // for freq density 0.5 checks if even or odd RB
+      if(csirs_config_pdu->freq_density <= 1 && csirs_config_pdu->freq_density != (rb % 2)) {
+        continue;
+      }
+
+      for (int cdm_id = 0; cdm_id < N_cdm_groups; cdm_id++) {
+        for (int s = 0; s < CDM_group_size; s++)  {
+
+          uint16_t port_tx = s+j_cdm[cdm_id]*CDM_group_size;
+
+          // loop over frequency resource elements within a group
+          for (int kp = 0; kp <= k_prime; kp++) {
+
+            uint16_t kinit = (frame_parms->first_carrier_offset + rb*NR_NB_SC_PER_RB) % frame_parms->ofdm_symbol_size;
+            uint16_t k = kinit + k_overline[cdm_id] + kp;
+
+            // loop over time resource elements within a group
+            for (int lp = 0; lp <= l_prime; lp++) {
+              uint16_t symb = lp + l_overline[cdm_id];
+              uint64_t symbol_offset = symb*frame_parms->ofdm_symbol_size;
+              c16_t *tx_csi_rs_signal = (c16_t*)&csi_rs_generated_signal[port_tx][symbol_offset+dataF_offset];
+              c16_t *rx_csi_rs_signal = (c16_t*)&csi_rs_received_signal[ant_rx][symbol_offset];
+              c16_t *csi_rs_ls_estimated_channel16 = (c16_t*)&csi_rs_ls_estimated_channel[ant_rx][port_tx][0];
+
+              int16_t csi_rs_ls_estimated_channel_re = (int16_t)(((int32_t)tx_csi_rs_signal[k].r*rx_csi_rs_signal[k].r + (int32_t)tx_csi_rs_signal[k].i*rx_csi_rs_signal[k].i)>>nr_csi_info->csi_rs_generated_signal_bits);
+              int16_t csi_rs_ls_estimated_channel_im = (int16_t)(((int32_t)tx_csi_rs_signal[k].r*rx_csi_rs_signal[k].i - (int32_t)tx_csi_rs_signal[k].i*rx_csi_rs_signal[k].r)>>nr_csi_info->csi_rs_generated_signal_bits);
+
+              // This is not just the LS estimation for each (k,l), but also the sum of the different contributions
+              // for the sake of optimizing the memory used.
+              csi_rs_ls_estimated_channel16[kinit].r += csi_rs_ls_estimated_channel_re;
+              csi_rs_ls_estimated_channel16[kinit].i += csi_rs_ls_estimated_channel_im;
+            }
+          }
+        }
+      }
+    }
+
+#ifdef NR_CSIRS_DEBUG
+    for(int symb = 0; symb < NR_SYMBOLS_PER_SLOT; symb++) {
+      if(!is_csi_rs_in_symbol(*csirs_config_pdu,symb)) {
+        continue;
+      }
+      for(int k = 0; k<frame_parms->ofdm_symbol_size; k++) {
+        LOG_I(NR_PHY, "l,k (%2d,%4d) | ", symb, k);
+        for(uint16_t port_tx = 0; port_tx<N_ports; port_tx++) {
+          uint64_t symbol_offset = symb*frame_parms->ofdm_symbol_size;
+          c16_t *tx_csi_rs_signal = (c16_t*)&csi_rs_generated_signal[port_tx][symbol_offset+dataF_offset];
+          c16_t *rx_csi_rs_signal = (c16_t*)&csi_rs_received_signal[ant_rx][symbol_offset];
+          c16_t *csi_rs_ls_estimated_channel16 = (c16_t*)&csi_rs_ls_estimated_channel[ant_rx][port_tx][0];
+          printf("port_tx %d --> ant_rx %d, tx (%4d,%4d), rx (%4d,%4d), ls (%4d,%4d) | ",
+                 port_tx+3000, ant_rx,
+                 tx_csi_rs_signal[k].r, tx_csi_rs_signal[k].i,
+                 rx_csi_rs_signal[k].r, rx_csi_rs_signal[k].i,
+                 csi_rs_ls_estimated_channel16[k].r, csi_rs_ls_estimated_channel16[k].i);
+        }
+        printf("\n");
+      }
+    }
+#endif
+
+    /// Channel interpolation
+
+    for(uint16_t port_tx = 0; port_tx<N_ports; port_tx++) {
+      memset(csi_rs_estimated_channel_freq[ant_rx][port_tx], 0, frame_parms->ofdm_symbol_size*sizeof(int32_t));
+    }
+
+    for (int rb = csirs_config_pdu->start_rb; rb < (csirs_config_pdu->start_rb+csirs_config_pdu->nr_of_rbs); rb++) {
+
+      // for freq density 0.5 checks if even or odd RB
+      if(csirs_config_pdu->freq_density <= 1 && csirs_config_pdu->freq_density != (rb % 2)) {
+        continue;
+      }
+
+      count++;
+
+      uint16_t k = (frame_parms->first_carrier_offset + rb*NR_NB_SC_PER_RB) % frame_parms->ofdm_symbol_size;
+      for(uint16_t port_tx = 0; port_tx<N_ports; port_tx++) {
+        int16_t *csi_rs_ls_estimated_channel16 = (int16_t*)&csi_rs_ls_estimated_channel[ant_rx][port_tx][k];
+        int16_t *csi_rs_estimated_channel16 = (int16_t *)&csi_rs_estimated_channel_freq[ant_rx][port_tx][k];
+        if( (k == 0) || (k == frame_parms->first_carrier_offset) ) { // Start of OFDM symbol case or first occupied subcarrier case
+          multadd_real_vector_complex_scalar(filt24_start, csi_rs_ls_estimated_channel16, csi_rs_estimated_channel16, 24);
+        } else if( ( (k + NR_NB_SC_PER_RB) >= frame_parms->ofdm_symbol_size) ||
+                   (rb == (csirs_config_pdu->start_rb+csirs_config_pdu->nr_of_rbs-1)) ) { // End of OFDM symbol case or Last occupied subcarrier case
+          multadd_real_vector_complex_scalar(filt24_end, csi_rs_ls_estimated_channel16, csi_rs_estimated_channel16 - 3*sizeof(uint64_t), 24);
+        } else { // Middle case
+          multadd_real_vector_complex_scalar(filt24_middle, csi_rs_ls_estimated_channel16, csi_rs_estimated_channel16 - 3*sizeof(uint64_t), 24);
+        }
+      }
+    }
+
+    /// Power noise estimation
+    uint16_t noise_real[frame_parms->nb_antennas_rx][N_ports][csirs_config_pdu->nr_of_rbs];
+    uint16_t noise_imag[frame_parms->nb_antennas_rx][N_ports][csirs_config_pdu->nr_of_rbs];
+    for (int rb = csirs_config_pdu->start_rb; rb < (csirs_config_pdu->start_rb+csirs_config_pdu->nr_of_rbs); rb++) {
+      if (csirs_config_pdu->freq_density <= 1 && csirs_config_pdu->freq_density != (rb % 2)) {
+        continue;
+      }
+      uint16_t k = (frame_parms->first_carrier_offset + rb*NR_NB_SC_PER_RB) % frame_parms->ofdm_symbol_size;
+      for(uint16_t port_tx = 0; port_tx<N_ports; port_tx++) {
+        c16_t *csi_rs_ls_estimated_channel16 = (c16_t*)&csi_rs_ls_estimated_channel[ant_rx][port_tx][k];
+        c16_t *csi_rs_estimated_channel16 = (c16_t *)&csi_rs_estimated_channel_freq[ant_rx][port_tx][k];
+        noise_real[ant_rx][port_tx][rb-csirs_config_pdu->start_rb] = abs(csi_rs_ls_estimated_channel16->r-csi_rs_estimated_channel16->r);
+        noise_imag[ant_rx][port_tx][rb-csirs_config_pdu->start_rb] = abs(csi_rs_ls_estimated_channel16->i-csi_rs_estimated_channel16->i);
+        maxh = cmax3(maxh, abs(csi_rs_estimated_channel16->r), abs(csi_rs_estimated_channel16->i));
+      }
+    }
+    for(uint16_t port_tx = 0; port_tx<N_ports; port_tx++) {
+      *noise_power += (calc_power_csirs(noise_real[ant_rx][port_tx], csirs_config_pdu) + calc_power_csirs(noise_imag[ant_rx][port_tx],csirs_config_pdu));
+    }
+
+#ifdef NR_CSIRS_DEBUG
+    for(int k = 0; k<frame_parms->ofdm_symbol_size; k++) {
+      int rb = k >= frame_parms->first_carrier_offset ?
+               (k - frame_parms->first_carrier_offset)/NR_NB_SC_PER_RB :
+               (k + frame_parms->ofdm_symbol_size - frame_parms->first_carrier_offset)/NR_NB_SC_PER_RB;
+      LOG_I(NR_PHY, "(k = %4d) |\t", k);
+      for(uint16_t port_tx = 0; port_tx<N_ports; port_tx++) {
+        c16_t *csi_rs_ls_estimated_channel16 = (c16_t*)&csi_rs_ls_estimated_channel[ant_rx][port_tx][0];
+        c16_t *csi_rs_estimated_channel16 = (c16_t *)&csi_rs_estimated_channel_freq[ant_rx][port_tx][0];
+        printf("Channel port_tx %d --> ant_rx %d : ls (%4d,%4d), int (%4d,%4d), noise (%4d,%4d) | ",
+               port_tx+3000, ant_rx,
+               csi_rs_ls_estimated_channel16[k].r, csi_rs_ls_estimated_channel16[k].i,
+               csi_rs_estimated_channel16[k].r, csi_rs_estimated_channel16[k].i,
+               rb >= csirs_config_pdu->start_rb+csirs_config_pdu->nr_of_rbs ? 0 : noise_real[ant_rx][port_tx][rb-csirs_config_pdu->start_rb],
+               rb >= csirs_config_pdu->start_rb+csirs_config_pdu->nr_of_rbs ? 0 : noise_imag[ant_rx][port_tx][rb-csirs_config_pdu->start_rb]);
+      }
+      printf("\n");
+    }
+#endif
+
+  }
+
+  *noise_power /= (frame_parms->nb_antennas_rx*N_ports);
+  *log2_maxh = log2_approx(maxh-1);
+  *log2_re = log2_approx(count-1);
+
+#ifdef NR_CSIRS_DEBUG
+  LOG_I(NR_PHY, "Noise power estimation based on CSI-RS: %i\n", *noise_power);
+#endif
+
+  return 0;
+}
+
+int nr_csi_rs_ri_estimation(const PHY_VARS_NR_UE *ue,
+                            const fapi_nr_dl_config_csirs_pdu_rel15_t *csirs_config_pdu,
+                            const nr_csi_info_t *nr_csi_info,
+                            const uint8_t N_ports,
+                            int32_t csi_rs_estimated_channel_freq[][N_ports][ue->frame_parms.ofdm_symbol_size],
+                            const int16_t log2_maxh,
+                            uint8_t *rank_indicator) {
+
+  const NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
+  const int16_t cond_dB_threshold = 5;
+  int count = 0;
+  *rank_indicator = 0;
+
+  if (ue->frame_parms.nb_antennas_rx == 1 || N_ports == 1) {
+    return 0;
+  } else if( !(ue->frame_parms.nb_antennas_rx == 2 && N_ports == 2) ) {
+    LOG_W(NR_PHY, "Rank indicator computation is not implemented for %i x %i system\n",
+          ue->frame_parms.nb_antennas_rx, N_ports);
+    return -1;
+  }
+
+  /* Example 2x2: Hh x H =
+  *            | conjch00 conjch10 | x | ch00 ch01 | = | conjch00*ch00+conjch10*ch10 conjch00*ch01+conjch10*ch11 |
+  *            | conjch01 conjch11 |   | ch10 ch11 |   | conjch01*ch00+conjch11*ch10 conjch01*ch01+conjch11*ch11 |
+  */
+
+  int32_t csi_rs_estimated_conjch_ch[frame_parms->nb_antennas_rx][N_ports][frame_parms->nb_antennas_rx][N_ports][frame_parms->ofdm_symbol_size] __attribute__((aligned(32)));
+  int32_t csi_rs_estimated_A_MF[N_ports][N_ports][frame_parms->ofdm_symbol_size] __attribute__((aligned(32)));
+  int32_t csi_rs_estimated_A_MF_sq[N_ports][N_ports][frame_parms->ofdm_symbol_size] __attribute__((aligned(32)));
+  int32_t csi_rs_estimated_determ_fin[frame_parms->ofdm_symbol_size] __attribute__((aligned(32)));
+  int32_t csi_rs_estimated_numer_fin[frame_parms->ofdm_symbol_size] __attribute__((aligned(32)));
+
+  const uint8_t sum_shift = 1; // log2(2x2) = 2, which is a shift of 1 bit
+  
+  for (int rb = csirs_config_pdu->start_rb; rb < (csirs_config_pdu->start_rb+csirs_config_pdu->nr_of_rbs); rb++) {
+
+    if (csirs_config_pdu->freq_density <= 1 && csirs_config_pdu->freq_density != (rb % 2)) {
+      continue;
+    }
+    uint16_t k = (frame_parms->first_carrier_offset + rb*NR_NB_SC_PER_RB) % frame_parms->ofdm_symbol_size;
+
+    for (int ant_rx_conjch = 0; ant_rx_conjch < frame_parms->nb_antennas_rx; ant_rx_conjch++) {
+      for(uint16_t port_tx_conjch = 0; port_tx_conjch < N_ports; port_tx_conjch++) {
+        for (int ant_rx_ch = 0; ant_rx_ch < frame_parms->nb_antennas_rx; ant_rx_ch++) {
+          for(uint16_t port_tx_ch = 0; port_tx_ch < N_ports; port_tx_ch++) {
+
+            // conjch x ch computation
+            nr_conjch0_mult_ch1(&csi_rs_estimated_channel_freq[ant_rx_conjch][port_tx_conjch][k],
+                                &csi_rs_estimated_channel_freq[ant_rx_ch][port_tx_ch][k],
+                                &csi_rs_estimated_conjch_ch[ant_rx_conjch][port_tx_conjch][ant_rx_ch][port_tx_ch][k],
+                                1,
+                                log2_maxh);
+
+            // construct Hh x H elements
+            if(ant_rx_conjch == ant_rx_ch) {
+              nr_a_sum_b((__m128i *)&csi_rs_estimated_A_MF[port_tx_conjch][port_tx_ch][k],
+                         (__m128i *)&csi_rs_estimated_conjch_ch[ant_rx_conjch][port_tx_conjch][ant_rx_ch][port_tx_ch][k],
+                         1);
+            }
+          }
+        }
+      }
+    }
+
+    // compute the determinant of A_MF (denominator)
+    nr_det_A_MF_2x2(&csi_rs_estimated_A_MF[0][0][k],
+                    &csi_rs_estimated_A_MF[0][1][k],
+                    &csi_rs_estimated_A_MF[1][0][k],
+                    &csi_rs_estimated_A_MF[1][1][k],
+                    &csi_rs_estimated_determ_fin[k],
+                    1);
+
+    // compute the square of A_MF (numerator)
+    nr_squared_matrix_element(&csi_rs_estimated_A_MF[0][0][k], &csi_rs_estimated_A_MF_sq[0][0][k], 1);
+    nr_squared_matrix_element(&csi_rs_estimated_A_MF[0][1][k], &csi_rs_estimated_A_MF_sq[0][1][k], 1);
+    nr_squared_matrix_element(&csi_rs_estimated_A_MF[1][0][k], &csi_rs_estimated_A_MF_sq[1][0][k], 1);
+    nr_squared_matrix_element(&csi_rs_estimated_A_MF[1][1][k], &csi_rs_estimated_A_MF_sq[1][1][k], 1);
+    nr_numer_2x2(&csi_rs_estimated_A_MF_sq[0][0][k],
+                 &csi_rs_estimated_A_MF_sq[0][1][k],
+                 &csi_rs_estimated_A_MF_sq[1][0][k],
+                 &csi_rs_estimated_A_MF_sq[1][1][k],
+                 &csi_rs_estimated_numer_fin[k],
+                 1);
+
+#ifdef NR_CSIRS_DEBUG
+    for(uint16_t port_tx_conjch = 0; port_tx_conjch < N_ports; port_tx_conjch++) {
+      for(uint16_t port_tx_ch = 0; port_tx_ch < N_ports; port_tx_ch++) {
+        c16_t *csi_rs_estimated_A_MF_k = (c16_t *) &csi_rs_estimated_A_MF[port_tx_conjch][port_tx_ch][k];
+        LOG_I(NR_PHY, "(%i) csi_rs_estimated_A_MF[%i][%i] = (%i, %i)\n",
+              k, port_tx_conjch, port_tx_ch, csi_rs_estimated_A_MF_k->r, csi_rs_estimated_A_MF_k->i);
+        c16_t *csi_rs_estimated_A_MF_sq_k = (c16_t *) &csi_rs_estimated_A_MF_sq[port_tx_conjch][port_tx_ch][k];
+        LOG_I(NR_PHY, "(%i) csi_rs_estimated_A_MF_sq[%i][%i] = (%i, %i)\n",
+              k, port_tx_conjch, port_tx_ch, csi_rs_estimated_A_MF_sq_k->r, csi_rs_estimated_A_MF_sq_k->i);
+      }
+    }
+    LOG_I(NR_PHY, "(%i) csi_rs_estimated_determ_fin = %i\n", k, csi_rs_estimated_determ_fin[k]);
+    LOG_I(NR_PHY, "(%i) csi_rs_estimated_numer_fin = %i\n", k, csi_rs_estimated_numer_fin[k]>>sum_shift);
+#endif
+
+    // compute the conditional number
+    for (int sc_idx=0; sc_idx < NR_NB_SC_PER_RB; sc_idx++) {
+      int8_t csi_rs_estimated_denum_db = dB_fixed(csi_rs_estimated_determ_fin[k + sc_idx]);
+      int8_t csi_rs_estimated_numer_db = dB_fixed(csi_rs_estimated_numer_fin[k + sc_idx]>>sum_shift);
+      int8_t cond_db = csi_rs_estimated_numer_db - csi_rs_estimated_denum_db;
+
+#ifdef NR_CSIRS_DEBUG
+      LOG_I(NR_PHY, "csi_rs_estimated_denum_db = %i\n", csi_rs_estimated_denum_db);
+      LOG_I(NR_PHY, "csi_rs_estimated_numer_db = %i\n", csi_rs_estimated_numer_db);
+      LOG_I(NR_PHY, "cond_db = %i\n", cond_db);
+#endif
+
+      if (cond_db < cond_dB_threshold) {
+        count++;
+      } else {
+        count--;
+      }
+    }
+  }
+
+  // conditional number is lower than cond_dB_threshold in half on more REs
+  if (count > 0) {
+    *rank_indicator = 1;
+  }
+
+#ifdef NR_CSIRS_DEBUG
+  LOG_I(NR_PHY, "count = %i\n", count);
+  LOG_I(NR_PHY, "rank = %i\n", (*rank_indicator)+1);
+#endif
+
+  return 0;
+}
+
+int nr_csi_rs_pmi_estimation(const PHY_VARS_NR_UE *ue,
+                             const fapi_nr_dl_config_csirs_pdu_rel15_t *csirs_config_pdu,
+                             const nr_csi_info_t *nr_csi_info,
+                             const uint8_t N_ports,
+                             const int32_t csi_rs_estimated_channel_freq[][N_ports][ue->frame_parms.ofdm_symbol_size],
+                             const uint32_t interference_plus_noise_power,
+                             const uint8_t rank_indicator,
+                             const int16_t log2_re,
+                             uint8_t *i1,
+                             uint8_t *i2,
+                             uint32_t *precoded_sinr_dB) {
+
+  const NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
+  memset(i1,0,3*sizeof(uint8_t));
+  i2[0] = 0;
+
+  // i1 is a three-element vector in the form of [i11 i12 i13], when CodebookType is specified as 'Type1SinglePanel'.
+  // Note that i13 is not applicable when the number of transmission layers is one of {1, 5, 6, 7, 8}.
+  // i2, for 'Type1SinglePanel' codebook type, it is a scalar when PMIMode is specified as 'wideband', and when PMIMode
+  // is specified as 'subband' or when PRGSize, the length of the i2 vector equals to the number of subbands or PRGs.
+  // Note that when the number of CSI-RS ports is 2, the applicable codebook type is 'Type1SinglePanel'. In this case,
+  // the precoding matrix is obtained by a single index (i2 field here) based on TS 38.214 Table 5.2.2.2.1-1.
+  // The first column is applicable if the UE is reporting a Rank = 1, whereas the second column is applicable if the
+  // UE is reporting a Rank = 2.
+
+  if(N_ports == 1 || interference_plus_noise_power == 0) {
+    return 0;
+  }
+
+  if(rank_indicator == 0 || rank_indicator == 1) {
+
+    int32_t sum_re[4] = {0};
+    int32_t sum_im[4] = {0};
+    int32_t sum2_re[4] = {0};
+    int32_t sum2_im[4] = {0};
+    int32_t tested_precoded_sinr[4] = {0};
+
+    for (int rb = csirs_config_pdu->start_rb; rb < (csirs_config_pdu->start_rb+csirs_config_pdu->nr_of_rbs); rb++) {
+
+      if (csirs_config_pdu->freq_density <= 1 && csirs_config_pdu->freq_density != (rb % 2)) {
+        continue;
+      }
+      uint16_t k = (frame_parms->first_carrier_offset + rb * NR_NB_SC_PER_RB) % frame_parms->ofdm_symbol_size;
+
+      for (int ant_rx = 0; ant_rx < frame_parms->nb_antennas_rx; ant_rx++) {
+
+        c16_t *csi_rs_estimated_channel_p0 = (c16_t *) &csi_rs_estimated_channel_freq[ant_rx][0][k];
+        c16_t *csi_rs_estimated_channel_p1 = (c16_t *) &csi_rs_estimated_channel_freq[ant_rx][1][k];
+
+        // H_p0 + 1*H_p1 = (H_p0_re + H_p1_re) + 1j*(H_p0_im + H_p1_im)
+        sum_re[0] += (csi_rs_estimated_channel_p0->r+csi_rs_estimated_channel_p1->r);
+        sum_im[0] += (csi_rs_estimated_channel_p0->i+csi_rs_estimated_channel_p1->i);
+        sum2_re[0] += ((csi_rs_estimated_channel_p0->r+csi_rs_estimated_channel_p1->r)*(csi_rs_estimated_channel_p0->r+csi_rs_estimated_channel_p1->r))>>log2_re;
+        sum2_im[0] += ((csi_rs_estimated_channel_p0->i+csi_rs_estimated_channel_p1->i)*(csi_rs_estimated_channel_p0->i+csi_rs_estimated_channel_p1->i))>>log2_re;
+
+        // H_p0 + 1j*H_p1 = (H_p0_re - H_p1_im) + 1j*(H_p0_im + H_p1_re)
+        sum_re[1] += (csi_rs_estimated_channel_p0->r-csi_rs_estimated_channel_p1->i);
+        sum_im[1] += (csi_rs_estimated_channel_p0->i+csi_rs_estimated_channel_p1->r);
+        sum2_re[1] += ((csi_rs_estimated_channel_p0->r-csi_rs_estimated_channel_p1->i)*(csi_rs_estimated_channel_p0->r-csi_rs_estimated_channel_p1->i))>>log2_re;
+        sum2_im[1] += ((csi_rs_estimated_channel_p0->i+csi_rs_estimated_channel_p1->r)*(csi_rs_estimated_channel_p0->i+csi_rs_estimated_channel_p1->r))>>log2_re;
+
+        // H_p0 - 1*H_p1 = (H_p0_re - H_p1_re) + 1j*(H_p0_im - H_p1_im)
+        sum_re[2] += (csi_rs_estimated_channel_p0->r-csi_rs_estimated_channel_p1->r);
+        sum_im[2] += (csi_rs_estimated_channel_p0->i-csi_rs_estimated_channel_p1->i);
+        sum2_re[2] += ((csi_rs_estimated_channel_p0->r-csi_rs_estimated_channel_p1->r)*(csi_rs_estimated_channel_p0->r-csi_rs_estimated_channel_p1->r))>>log2_re;
+        sum2_im[2] += ((csi_rs_estimated_channel_p0->i-csi_rs_estimated_channel_p1->i)*(csi_rs_estimated_channel_p0->i-csi_rs_estimated_channel_p1->i))>>log2_re;
+
+        // H_p0 - 1j*H_p1 = (H_p0_re + H_p1_im) + 1j*(H_p0_im - H_p1_re)
+        sum_re[3] += (csi_rs_estimated_channel_p0->r+csi_rs_estimated_channel_p1->i);
+        sum_im[3] += (csi_rs_estimated_channel_p0->i-csi_rs_estimated_channel_p1->r);
+        sum2_re[3] += ((csi_rs_estimated_channel_p0->r+csi_rs_estimated_channel_p1->i)*(csi_rs_estimated_channel_p0->r+csi_rs_estimated_channel_p1->i))>>log2_re;
+        sum2_im[3] += ((csi_rs_estimated_channel_p0->i-csi_rs_estimated_channel_p1->r)*(csi_rs_estimated_channel_p0->i-csi_rs_estimated_channel_p1->r))>>log2_re;
+      }
+    }
+
+    // We should perform >>nr_csi_info->log2_re here for all terms, but since sum2_re and sum2_im can be high values,
+    // we performed this above.
+    for(int p = 0; p<4; p++) {
+      int32_t power_re = sum2_re[p] - (sum_re[p]>>log2_re)*(sum_re[p]>>log2_re);
+      int32_t power_im = sum2_im[p] - (sum_im[p]>>log2_re)*(sum_im[p]>>log2_re);
+      tested_precoded_sinr[p] = (power_re+power_im)/(int32_t)interference_plus_noise_power;
+    }
+
+    if(rank_indicator == 0) {
+      for(int tested_i2 = 0; tested_i2 < 4; tested_i2++) {
+        if(tested_precoded_sinr[tested_i2] > tested_precoded_sinr[i2[0]]) {
+          i2[0] = tested_i2;
+        }
+      }
+      *precoded_sinr_dB = dB_fixed(tested_precoded_sinr[i2[0]]);
+    } else {
+      i2[0] = tested_precoded_sinr[0]+tested_precoded_sinr[2] > tested_precoded_sinr[1]+tested_precoded_sinr[3] ? 0 : 1;
+      *precoded_sinr_dB = dB_fixed((tested_precoded_sinr[i2[0]] + tested_precoded_sinr[i2[0]+2])>>1);
+    }
+
+  } else {
+    LOG_W(NR_PHY, "PMI computation is not implemented for rank indicator %i\n", rank_indicator+1);
+    return -1;
+  }
+
+  return 0;
+}
+
+int nr_csi_rs_cqi_estimation(const uint32_t precoded_sinr,
+                             uint8_t *cqi) {
+
+  *cqi = 0;
+
+  // Default SINR table for an AWGN channel for SISO scenario, considering 0.1 BLER condition and TS 38.214 Table 5.2.2.1-2
+  if(precoded_sinr>0 && precoded_sinr<=2) {
+    *cqi = 4;
+  } else if(precoded_sinr==3) {
+    *cqi = 5;
+  } else if(precoded_sinr>3 && precoded_sinr<=5) {
+    *cqi = 6;
+  } else if(precoded_sinr>5 && precoded_sinr<=7) {
+    *cqi = 7;
+  } else if(precoded_sinr>7 && precoded_sinr<=9) {
+    *cqi = 8;
+  } else if(precoded_sinr==10) {
+    *cqi = 9;
+  } else if(precoded_sinr>10 && precoded_sinr<=12) {
+    *cqi = 10;
+  } else if(precoded_sinr>12 && precoded_sinr<=15) {
+    *cqi = 11;
+  } else if(precoded_sinr==16) {
+    *cqi = 12;
+  } else if(precoded_sinr>16 && precoded_sinr<=18) {
+    *cqi = 13;
+  } else if(precoded_sinr==19) {
+    *cqi = 14;
+  } else if(precoded_sinr>19) {
+    *cqi = 15;
+  }
+
+  return 0;
+}
+
+int nr_csi_im_power_estimation(const PHY_VARS_NR_UE *ue,
+                               const UE_nr_rxtx_proc_t *proc,
+                               const fapi_nr_dl_config_csiim_pdu_rel15_t *csiim_config_pdu,
+                               uint32_t *interference_plus_noise_power) {
+
+  int32_t **rxdataF = ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].rxdataF;
+  const NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
+
+  const uint16_t end_rb = csiim_config_pdu->start_rb + csiim_config_pdu->nr_of_rbs > csiim_config_pdu->bwp_size ?
+                          csiim_config_pdu->bwp_size : csiim_config_pdu->start_rb + csiim_config_pdu->nr_of_rbs;
+
+  int32_t count = 0;
+  int32_t sum_re = 0;
+  int32_t sum_im = 0;
+  int32_t sum2_re = 0;
+  int32_t sum2_im = 0;
+
+  int l_csiim[4] = {-1, -1, -1, -1};
+
+  for(int symb_idx = 0; symb_idx < 4; symb_idx++) {
+
+    uint8_t symb = csiim_config_pdu->l_csiim[symb_idx];
+    bool done = false;
+    for (int symb_idx2 = 0; symb_idx2 < symb_idx; symb_idx2++) {
+      if (l_csiim[symb_idx2] == symb) {
+        done = true;
+      }
+    }
+
+    if (done) {
+      continue;
+    }
+
+    l_csiim[symb_idx] = symb;
+    uint64_t symbol_offset = symb*frame_parms->ofdm_symbol_size;
+
+    for (int ant_rx = 0; ant_rx < frame_parms->nb_antennas_rx; ant_rx++) {
+
+      c16_t *rx_signal = (c16_t*)&rxdataF[ant_rx][symbol_offset];
+
+      for (int rb = csiim_config_pdu->start_rb; rb < end_rb; rb++) {
+
+        uint16_t sc0_offset = (frame_parms->first_carrier_offset + rb*NR_NB_SC_PER_RB) % frame_parms->ofdm_symbol_size;
+
+        for (int sc_idx = 0; sc_idx<4; sc_idx++) {
+
+          uint16_t sc = sc0_offset + csiim_config_pdu->k_csiim[sc_idx];
+
+#ifdef NR_CSIIM_DEBUG
+          LOG_I(NR_PHY, "(ant_rx %i, sc %i) real %i, imag %i\n", ant_rx, rb, rx_signal[sc].r, rx_signal[sc].i);
+#endif
+
+          sum_re += rx_signal[sc].r;
+          sum_im += rx_signal[sc].i;
+          sum2_re += rx_signal[sc].r*rx_signal[sc].r;
+          sum2_im += rx_signal[sc].i*rx_signal[sc].i;
+          count++;
+        }
+      }
+    }
+  }
+
+  int32_t power_re = sum2_re/count - (sum_re/count)*(sum_re/count);
+  int32_t power_im = sum2_im/count - (sum_im/count)*(sum_im/count);
+
+  *interference_plus_noise_power = power_re + power_im;
+
+#ifdef NR_CSIIM_DEBUG
+  LOG_I(NR_PHY, "interference_plus_noise_power based on CSI-IM = %i\n", *interference_plus_noise_power);
+#endif
+
+  return 0;
+}
+
+int nr_ue_csi_im_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t gNB_id) {
+
+  if(!ue->csiim_vars[gNB_id]->active) {
+    return -1;
+  }
+
+  const fapi_nr_dl_config_csiim_pdu_rel15_t *csiim_config_pdu = (fapi_nr_dl_config_csiim_pdu_rel15_t*)&ue->csiim_vars[gNB_id]->csiim_config_pdu;
+
+#ifdef NR_CSIIM_DEBUG
+  LOG_I(NR_PHY, "csiim_config_pdu->bwp_size = %i\n", csiim_config_pdu->bwp_size);
+  LOG_I(NR_PHY, "csiim_config_pdu->bwp_start = %i\n", csiim_config_pdu->bwp_start);
+  LOG_I(NR_PHY, "csiim_config_pdu->subcarrier_spacing = %i\n", csiim_config_pdu->subcarrier_spacing);
+  LOG_I(NR_PHY, "csiim_config_pdu->start_rb = %i\n", csiim_config_pdu->start_rb);
+  LOG_I(NR_PHY, "csiim_config_pdu->nr_of_rbs = %i\n", csiim_config_pdu->nr_of_rbs);
+  LOG_I(NR_PHY, "csiim_config_pdu->k_csiim = %i.%i.%i.%i\n", csiim_config_pdu->k_csiim[0], csiim_config_pdu->k_csiim[1], csiim_config_pdu->k_csiim[2], csiim_config_pdu->k_csiim[3]);
+  LOG_I(NR_PHY, "csiim_config_pdu->l_csiim = %i.%i.%i.%i\n", csiim_config_pdu->l_csiim[0], csiim_config_pdu->l_csiim[1], csiim_config_pdu->l_csiim[2], csiim_config_pdu->l_csiim[3]);
+#endif
+
+  nr_csi_im_power_estimation(ue, proc, csiim_config_pdu, &ue->nr_csi_info->interference_plus_noise_power);
+  ue->nr_csi_info->csi_im_meas_computed = true;
+
+  return 0;
+}
+
+int nr_ue_csi_rs_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t gNB_id) {
+
+  if(!ue->csirs_vars[gNB_id]->active) {
+    return -1;
+  }
+
+  const fapi_nr_dl_config_csirs_pdu_rel15_t *csirs_config_pdu = (fapi_nr_dl_config_csirs_pdu_rel15_t*)&ue->csirs_vars[gNB_id]->csirs_config_pdu;
+
+#ifdef NR_CSIRS_DEBUG
+  LOG_I(NR_PHY, "csirs_config_pdu->subcarrier_spacing = %i\n", csirs_config_pdu->subcarrier_spacing);
+  LOG_I(NR_PHY, "csirs_config_pdu->cyclic_prefix = %i\n", csirs_config_pdu->cyclic_prefix);
+  LOG_I(NR_PHY, "csirs_config_pdu->start_rb = %i\n", csirs_config_pdu->start_rb);
+  LOG_I(NR_PHY, "csirs_config_pdu->nr_of_rbs = %i\n", csirs_config_pdu->nr_of_rbs);
+  LOG_I(NR_PHY, "csirs_config_pdu->csi_type = %i (0:TRS, 1:CSI-RS NZP, 2:CSI-RS ZP)\n", csirs_config_pdu->csi_type);
+  LOG_I(NR_PHY, "csirs_config_pdu->row = %i\n", csirs_config_pdu->row);
+  LOG_I(NR_PHY, "csirs_config_pdu->freq_domain = %i\n", csirs_config_pdu->freq_domain);
+  LOG_I(NR_PHY, "csirs_config_pdu->symb_l0 = %i\n", csirs_config_pdu->symb_l0);
+  LOG_I(NR_PHY, "csirs_config_pdu->symb_l1 = %i\n", csirs_config_pdu->symb_l1);
+  LOG_I(NR_PHY, "csirs_config_pdu->cdm_type = %i\n", csirs_config_pdu->cdm_type);
+  LOG_I(NR_PHY, "csirs_config_pdu->freq_density = %i (0: dot5 (even RB), 1: dot5 (odd RB), 2: one, 3: three)\n", csirs_config_pdu->freq_density);
+  LOG_I(NR_PHY, "csirs_config_pdu->scramb_id = %i\n", csirs_config_pdu->scramb_id);
+  LOG_I(NR_PHY, "csirs_config_pdu->power_control_offset = %i\n", csirs_config_pdu->power_control_offset);
+  LOG_I(NR_PHY, "csirs_config_pdu->power_control_offset_ss = %i\n", csirs_config_pdu->power_control_offset_ss);
+#endif
+
+  const NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
+  int32_t csi_rs_received_signal[frame_parms->nb_antennas_rx][frame_parms->samples_per_slot_wCP];
+  uint8_t N_cdm_groups = 0;
+  uint8_t CDM_group_size = 0;
+  uint8_t k_prime = 0;
+  uint8_t l_prime = 0;
+  uint8_t N_ports = 0;
+  uint8_t j_cdm[16];
+  uint8_t k_overline[16];
+  uint8_t l_overline[16];
+  int16_t log2_re = 0;
+  int16_t log2_maxh = 0;
+  uint32_t rsrp = 0;
+  int rsrp_dBm = 0;
+  uint32_t noise_power = 0;
+  uint8_t rank_indicator = 0;
+  uint32_t precoded_sinr_dB = 0;
+  uint8_t cqi = 0;
+  uint8_t i1[3];
+  uint8_t i2[1];
+
+  nr_generate_csi_rs(frame_parms,
+                     ue->nr_csi_info->csi_rs_generated_signal,
+                     AMP,
+                     ue->nr_csi_info,
+                     (nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *) csirs_config_pdu,
+                     proc->nr_slot_rx,
+                     &N_cdm_groups,
+                     &CDM_group_size,
+                     &k_prime,
+                     &l_prime,
+                     &N_ports,
+                     j_cdm,
+                     k_overline,
+                     l_overline);
+
+  int32_t csi_rs_ls_estimated_channel[frame_parms->nb_antennas_rx][N_ports][frame_parms->ofdm_symbol_size];
+  int32_t csi_rs_estimated_channel_freq[frame_parms->nb_antennas_rx][N_ports][frame_parms->ofdm_symbol_size];
+
+  nr_get_csi_rs_signal(ue,
+                       proc,
+                       csirs_config_pdu,
+                       ue->nr_csi_info,
+                       N_cdm_groups,
+                       CDM_group_size,
+                       k_prime,
+                       l_prime,
+                       j_cdm,
+                       k_overline,
+                       l_overline,
+                       csi_rs_received_signal,
+                       &rsrp,
+                       &rsrp_dBm);
+
+  nr_csi_rs_channel_estimation(ue,
+                               proc,
+                               csirs_config_pdu,
+                               ue->nr_csi_info,
+                               (const int32_t **) ue->nr_csi_info->csi_rs_generated_signal,
+                               csi_rs_received_signal,
+                               N_cdm_groups,
+                               CDM_group_size,
+                               k_prime,
+                               l_prime,
+                               N_ports,
+                               j_cdm,
+                               k_overline,
+                               l_overline,
+                               csi_rs_ls_estimated_channel,
+                               csi_rs_estimated_channel_freq,
+                               &log2_re,
+                               &log2_maxh,
+                               &noise_power);
+
+  nr_csi_rs_ri_estimation(ue,
+                          csirs_config_pdu,
+                          ue->nr_csi_info,
+                          N_ports,
+                          csi_rs_estimated_channel_freq,
+                          log2_maxh,
+                          &rank_indicator);
+
+  nr_csi_rs_pmi_estimation(ue,
+                           csirs_config_pdu,
+                           ue->nr_csi_info,
+                           N_ports,
+                           csi_rs_estimated_channel_freq,
+                           ue->nr_csi_info->csi_im_meas_computed ? ue->nr_csi_info->interference_plus_noise_power : noise_power,
+                           rank_indicator,
+                           log2_re,
+                           i1,
+                           i2,
+                           &precoded_sinr_dB);
+
+  nr_csi_rs_cqi_estimation(precoded_sinr_dB, &cqi);
+
+  LOG_I(NR_PHY, "RSRP = %i dBm, RI = %i, i1 = %i.%i.%i, i2 = %i, SINR = %i dB, CQI = %i\n",
+        rsrp_dBm, rank_indicator+1, i1[0], i1[1], i1[2], i2[0], precoded_sinr_dB, cqi);
+
+  // Send CSI measurements to MAC
+  fapi_nr_csirs_measurements_t csirs_measurements;
+  csirs_measurements.rsrp = rsrp;
+  csirs_measurements.rsrp_dBm = rsrp_dBm;
+  csirs_measurements.rank_indicator = rank_indicator;
+  csirs_measurements.i1 = *i1;
+  csirs_measurements.i2 = *i2;
+  csirs_measurements.cqi = cqi;
+  nr_downlink_indication_t dl_indication;
+  fapi_nr_rx_indication_t *rx_ind = calloc(sizeof(*rx_ind),1);
+  nr_fill_dl_indication(&dl_indication, NULL, rx_ind, proc, ue, gNB_id, NULL);
+  nr_fill_rx_indication(rx_ind, FAPI_NR_CSIRS_IND, gNB_id, ue, NULL, NULL, 1, proc, (void *)&csirs_measurements);
+  if (ue->if_inst && ue->if_inst->dl_indication) {
+    ue->if_inst->dl_indication(&dl_indication, NULL);
+  } else {
+    free(rx_ind);
+  }
+
+  return 0;
+}
diff --git a/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c b/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c
index 308d033fbeea72b66beca5fcf57e12be2a5d8017..68a0ec56d8fb5ef0b78f3d2f8c1f49960218a4aa 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c
@@ -142,7 +142,8 @@ static void nr_pdcch_demapping_deinterleaving(uint32_t *llr,
 
   int B_rb = reg_bundle_size_L/coreset_time_dur; // nb of RBs occupied by each REG bundle
   int num_bundles_per_cce = 6/reg_bundle_size_L;
-  int max_bundles = NR_MAX_PDCCH_AGG_LEVEL*num_bundles_per_cce;
+  int n_cce = N_regs/6;
+  int max_bundles = n_cce*num_bundles_per_cce;
   int f_bundle_j_list[max_bundles];
 
   // for each bundle
@@ -359,10 +360,7 @@ void nr_pdcch_extract_rbs_single(int32_t **rxdataF,
    * According to this equations, DM-RS PDCCH are mapped on k where k%12==1 || k%12==5 || k%12==9
    *
    */
-  // the bitmap coreset_frq_domain contains 45 bits
-#define CORESET_FREQ_DOMAIN_BITMAP_SIZE   45
-  // each bit is associated to 6 RBs
-#define BIT_TO_NBR_RB_CORESET_FREQ_DOMAIN  6
+
 #define NBR_RE_PER_RB_WITH_DMRS           12
   // after removing the 3 DMRS RE, the RB contains 9 RE with PDCCH
 #define NBR_RE_PER_RB_WITHOUT_DMRS         9
@@ -920,7 +918,7 @@ uint8_t nr_dci_decoding_procedure(PHY_VARS_NR_UE *ue,
               proc->frame_rx, proc->nr_slot_rx,n_rnti,nr_dci_format_string[rel15->dci_format_options[k]],CCEind,dci_length,*(unsigned long long*)dci_estimation);
         uint16_t mb = nr_dci_false_detection(dci_estimation,tmp_e,L*108,n_rnti, NR_POLAR_DCI_MESSAGE_TYPE, dci_length, L);
         ue->dci_thres = (ue->dci_thres + mb) / 2;
-        if (mb > (ue->dci_thres+20)) {
+        if (mb > (ue->dci_thres+30)) {
           LOG_W(PHY,"DCI false positive. Dropping DCI index %d. Mismatched bits: %d/%d. Current DCI threshold: %d\n",j,mb,L*108,ue->dci_thres);
           continue;
         }
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
index 95d2cd95779347f81396d59b61b3c0e87b14ff84..1635c8bba9c30b69a948b7ad94818b3aa77f1386 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
@@ -140,7 +140,6 @@ NR_UE_DLSCH_t *new_nr_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint
     dlsch->Mdlharq = Mdlharq;
     dlsch->number_harq_processes_for_pdsch = Mdlharq;
     dlsch->Nsoft = Nsoft;
-    dlsch->Mlimit = 4;
     dlsch->max_ldpc_iterations = max_ldpc_iterations;
 
     for (int i=0; i<Mdlharq; i++) {
@@ -222,7 +221,6 @@ bool nr_ue_postDecode(PHY_VARS_NR_UE *phy_vars_ue, notifiedFIFO_elt_t *req, bool
       //LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for nr_slot_rx %d TBS %d mcs %d nb_rb %d harq_process->round %d\n",
       //      phy_vars_ue->Mod_id,nr_slot_rx,harq_process->TBS,harq_process->mcs,harq_process->nb_rb, harq_process->round);
       harq_process->status = SCH_IDLE;
-      harq_process->DLround  = 0;
       harq_process->ack = 1;
 
       //LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d, mcs %d)\n",
@@ -237,11 +235,6 @@ bool nr_ue_postDecode(PHY_VARS_NR_UE *phy_vars_ue, notifiedFIFO_elt_t *req, bool
       //LOG_D(PHY,"[UE %d] DLSCH: Setting NAK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d, mcs %d) Kr %d r %d harq_process->round %d\n",
       //      phy_vars_ue->Mod_id, frame, nr_slot_rx, harq_pid,harq_process->status, harq_process->round,harq_process->TBS,harq_process->mcs,Kr,r,harq_process->round);
       harq_process->ack = 0;
-      if (harq_process->DLround >= dlsch->Mlimit) {
-        harq_process->status = SCH_IDLE;
-        harq_process->DLround  = 0;
-        phy_vars_ue->dl_stats[4]++;
-      }
 
       //if(is_crnti) {
       //  LOG_D(PHY,"[UE %d] DLSCH: Setting NACK for nr_slot_rx %d (pid %d, pid status %d, round %d/Max %d, TBS %d)\n",
@@ -289,8 +282,6 @@ void nr_processDLSegment(void* arg) {
   __m128i *pv = (__m128i*)&z;
   __m128i *pl = (__m128i*)&l;
 
-  uint8_t Ilbrm = 1;
-
   Kr = harq_process->K; // [hna] overwrites this line "Kr = p_decParams->Z*kb"
   Kr_bytes = Kr>>3;
   K_bits_F = Kr-harq_process->F;
@@ -323,8 +314,7 @@ void nr_processDLSegment(void* arg) {
         harq_process->round); */
   //VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_RATE_MATCHING, VCD_FUNCTION_IN);
 
-  if (nr_rate_matching_ldpc_rx(Ilbrm,
-                               Tbslbrm,
+  if (nr_rate_matching_ldpc_rx(Tbslbrm,
                                p_decoderParms->BG,
                                p_decoderParms->Z,
                                harq_process->d[r],
@@ -433,8 +423,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
                            uint16_t nb_symb_sch,
                            uint8_t nr_slot_rx,
                            uint8_t harq_pid,
-                           uint8_t is_crnti,
-                           uint8_t llr8_flag) {
+                           uint8_t is_crnti) {
   uint32_t A,E;
   uint32_t G;
   uint32_t ret,offset;
@@ -451,9 +440,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
   phy_vars_ue->dl_stats[harq_process->DLround]++;
   LOG_D(PHY,"Round %d RV idx %d\n",harq_process->DLround,harq_process->rvidx);
   uint8_t kc;
-  uint32_t Tbslbrm;// = 950984;
   uint16_t nb_rb;// = 30;
-  double Coderate;// = 0.0;
   uint8_t dmrs_Type = harq_process->dmrsConfigType;
   AssertFatal(dmrs_Type == 0 || dmrs_Type == 1, "Illegal dmrs_type %d\n", dmrs_Type);
   uint8_t nb_re_dmrs;
@@ -502,22 +489,17 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
   }
   */
   nb_rb = harq_process->nb_rb;
-  harq_process->trials[harq_process->DLround]++;
-  uint16_t nb_rb_oh = 0; // it was not computed at UE side even before and set to 0 in nr_compute_tbs
-  harq_process->TBS = nr_compute_tbs(harq_process->Qm,harq_process->R,nb_rb,nb_symb_sch,nb_re_dmrs*dmrs_length, nb_rb_oh, 0, harq_process->Nl);
   A = harq_process->TBS;
   ret = dlsch->max_ldpc_iterations + 1;
   dlsch->last_iteration_cnt = ret;
   harq_process->G = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, dmrs_length, harq_process->Qm,harq_process->Nl);
   G = harq_process->G;
 
-  LOG_D(PHY,"%d.%d DLSCH Decoding, harq_pid %d TBS %d (%d) G %d nb_re_dmrs %d length dmrs %d mcs %d Nl %d nb_symb_sch %d nb_rb %d\n",
-        frame,nr_slot_rx,harq_pid,A,A/8,G, nb_re_dmrs, dmrs_length, harq_process->mcs, harq_process->Nl, nb_symb_sch,nb_rb);
+  // target_code_rate is in 0.1 units
+  float Coderate = (float) harq_process->R / 10240.0f;
 
-  if ((harq_process->R)<1024)
-    Coderate = (float) (harq_process->R) /(float) 1024;
-  else
-    Coderate = (float) (harq_process->R) /(float) 2048;
+  LOG_D(PHY,"%d.%d DLSCH Decoding, harq_pid %d TBS %d (%d) G %d nb_re_dmrs %d length dmrs %d mcs %d Nl %d nb_symb_sch %d nb_rb %d Qm %d Coderate %f\n",
+        frame,nr_slot_rx,harq_pid,A,A/8,G, nb_re_dmrs, dmrs_length, harq_process->mcs, harq_process->Nl, nb_symb_sch, nb_rb, harq_process->Qm, Coderate);
 
   if ((A <=292) || ((A <= NR_MAX_PDSCH_TBS) && (Coderate <= 0.6667)) || Coderate <= 0.25) {
     p_decParams->BG = 2;
@@ -567,10 +549,6 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
     if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD) && (!frame%100))
       LOG_I(PHY,"K %d C %d Z %d nl %d \n", harq_process->K, harq_process->C, p_decParams->Z, harq_process->Nl);
   }
-  if ((harq_process->Nl)<4)
-    Tbslbrm = nr_compute_tbslbrm(harq_process->mcs_table,nb_rb,harq_process->Nl);
-  else
-    Tbslbrm = nr_compute_tbslbrm(harq_process->mcs_table,nb_rb,4);
 
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_SEGMENTATION, VCD_FUNCTION_OUT);
   p_decParams->Z = harq_process->Z;
@@ -621,7 +599,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
     rdata->r_offset = r_offset;
     rdata->Kr_bytes = Kr_bytes;
     rdata->rv_index = harq_process->rvidx;
-    rdata->Tbslbrm = Tbslbrm;
+    rdata->Tbslbrm = harq_process->tbslbrm;
     rdata->offset = offset;
     rdata->dlsch = dlsch;
     rdata->dlsch_id = 0;
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
index 9cedc333569b4f3d86275135bc1d2018abb4db99..6728f0260c093cdaacee71d757bbcee9c5c0e5d7 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
@@ -260,13 +260,6 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
     return -1;
   }
 
-  dlsch0_harq->Qm = nr_get_Qm_dl(dlsch[0]->harq_processes[harq_pid]->mcs, dlsch[0]->harq_processes[harq_pid]->mcs_table);
-  dlsch0_harq->R = nr_get_code_rate_dl(dlsch[0]->harq_processes[harq_pid]->mcs, dlsch[0]->harq_processes[harq_pid]->mcs_table);
-  if (dlsch0_harq->Qm == 0 || dlsch0_harq->R == 0) {
-    LOG_W(MAC, "Invalid code rate or Mod order, likely due to unexpected DL DCI.\n");
-      return -1;
-  }
-
   #ifdef DEBUG_HARQ
     printf("[DEMOD] MIMO mode = %d\n", dlsch0_harq->mimo_mode);
     printf("[DEMOD] cw for TB0 = %d, cw for TB1 = %d\n", codeword_TB0, codeword_TB1);
@@ -326,7 +319,8 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
                        dlsch0_harq->n_dmrs_cdm_groups,
                        dlsch0_harq->Nl,
                        frame_parms,
-                       dlsch0_harq->dlDmrsSymbPos);
+                       dlsch0_harq->dlDmrsSymbPos,
+                       ue->chest_time);
   stop_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
   if (cpumeas(CPUMEAS_GETSTATE))
     LOG_D(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d type %d: Pilot/Data extraction %5.2f \n",
@@ -472,88 +466,87 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
   if (cpumeas(CPUMEAS_GETSTATE))
     LOG_D(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d: Channel Combine and zero forcing %5.2f \n",frame,nr_slot_rx,slot,symbol,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
 
-    start_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
+  start_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
   /* Store the valid DL RE's */
-    pdsch_vars[gNB_id]->dl_valid_re[symbol-1] = nb_re_pdsch;
+  pdsch_vars[gNB_id]->dl_valid_re[symbol-1] = nb_re_pdsch;
 
-    if(dlsch0_harq->status == ACTIVE) {
-      startSymbIdx = dlsch0_harq->start_symbol;
-      nbSymb = dlsch0_harq->nb_symbols;
-      pduBitmap = dlsch0_harq->pduBitmap;
-    }
-    if(dlsch1_harq) {
-      startSymbIdx = dlsch1_harq->start_symbol;
-      nbSymb = dlsch1_harq->nb_symbols;
-      pduBitmap = dlsch1_harq->pduBitmap;
-    }
+  if(dlsch0_harq->status == ACTIVE) {
+    startSymbIdx = dlsch0_harq->start_symbol;
+    nbSymb = dlsch0_harq->nb_symbols;
+    pduBitmap = dlsch0_harq->pduBitmap;
+  }
+  if(dlsch1_harq) {
+    startSymbIdx = dlsch1_harq->start_symbol;
+    nbSymb = dlsch1_harq->nb_symbols;
+    pduBitmap = dlsch1_harq->pduBitmap;
+  }
 
-    /* Check for PTRS bitmap and process it respectively */
-    if((pduBitmap & 0x1) && (type == PDSCH)) {
-      nr_pdsch_ptrs_processing(ue,
-                               pdsch_vars,
-                               frame_parms,
-                               dlsch0_harq,
-                               dlsch1_harq,
-                               gNB_id,
-                               nr_slot_rx,
-                               symbol,
-                               (nb_rb_pdsch*12),
-                               dlsch[0]->rnti,rx_type);
-      pdsch_vars[gNB_id]->dl_valid_re[symbol-1] -= pdsch_vars[gNB_id]->ptrs_re_per_slot[0][symbol];
-    }
+  /* Check for PTRS bitmap and process it respectively */
+  if((pduBitmap & 0x1) && (type == PDSCH)) {
+    nr_pdsch_ptrs_processing(ue,
+			     pdsch_vars,
+			     frame_parms,
+			     dlsch0_harq,
+			     dlsch1_harq,
+			     gNB_id,
+			     nr_slot_rx,
+			     symbol,
+			     (nb_rb_pdsch*12),
+			     dlsch[0]->rnti,rx_type);
+    pdsch_vars[gNB_id]->dl_valid_re[symbol-1] -= pdsch_vars[gNB_id]->ptrs_re_per_slot[0][symbol];
+  }
 
-    /* at last symbol in a slot calculate LLR's for whole slot */
-    if(symbol == (startSymbIdx + nbSymb -1)) {
-      for(uint8_t i =startSymbIdx; i < (startSymbIdx+nbSymb);i++) {
-        /* re evaluating the first symbol flag as LLR's are done in symbol loop  */
-        if(i == startSymbIdx && i < 3) {
-          first_symbol_flag =1;
-        }
-        else {
-          first_symbol_flag=0;
-        }
-        /* Calculate LLR's for each symbol */
-        nr_dlsch_llr(pdsch_vars, frame_parms,
-                     rxdataF_comp_ptr, dl_ch_mag_ptr,
-                     dlsch0_harq, dlsch1_harq,
-                     rx_type, harq_pid,
-                     gNB_id, gNB_id_i,
-                     first_symbol_flag,
-                     i, nb_rb_pdsch,
-                     codeword_TB0, codeword_TB1,
-                     pdsch_vars[gNB_id]->dl_valid_re[i-1],
-                     nr_slot_rx, beamforming_mode);
+  /* at last symbol in a slot calculate LLR's for whole slot */
+  if(symbol == (startSymbIdx + nbSymb -1)) {
+    for(uint8_t i =startSymbIdx; i < (startSymbIdx+nbSymb);i++) {
+      /* re evaluating the first symbol flag as LLR's are done in symbol loop  */
+      if(i == startSymbIdx && i < 3) {
+	first_symbol_flag =1;
       }
-
-      int dmrs_type = dlsch[0]->harq_processes[harq_pid]->dmrsConfigType;
-      uint8_t nb_re_dmrs;
-      uint16_t dmrs_len = get_num_dmrs(dlsch[0]->harq_processes[harq_pid]->dlDmrsSymbPos);
-      if (dmrs_type==NFAPI_NR_DMRS_TYPE1) {
-        nb_re_dmrs = 6*dlsch[0]->harq_processes[harq_pid]->n_dmrs_cdm_groups;
-      } else {
-        nb_re_dmrs = 4*dlsch[0]->harq_processes[harq_pid]->n_dmrs_cdm_groups;
+      else {
+	first_symbol_flag=0;
       }
-      dlsch[0]->harq_processes[harq_pid]->G = nr_get_G(dlsch[0]->harq_processes[harq_pid]->nb_rb,
-                                                       dlsch[0]->harq_processes[harq_pid]->nb_symbols,
-                                                       nb_re_dmrs,
-                                                       dmrs_len,
-                                                       dlsch[0]->harq_processes[harq_pid]->Qm,
-                                                       dlsch[0]->harq_processes[harq_pid]->Nl);
-      nr_dlsch_layer_demapping(pdsch_vars[gNB_id]->llr,
-                               dlsch[0]->harq_processes[harq_pid]->Nl,
-                               dlsch[0]->harq_processes[harq_pid]->Qm,
-                               dlsch[0]->harq_processes[harq_pid]->G,
-                               codeword_TB0,
-                               codeword_TB1,
-                               pdsch_vars[gNB_id]->layer_llr);
+      /* Calculate LLR's for each symbol */
+      nr_dlsch_llr(pdsch_vars, frame_parms,
+		   rxdataF_comp_ptr, dl_ch_mag_ptr,
+		   dlsch0_harq, dlsch1_harq,
+		   rx_type, harq_pid,
+		   gNB_id, gNB_id_i,
+		   first_symbol_flag,
+		   i, nb_rb_pdsch,
+		   codeword_TB0, codeword_TB1,
+		   pdsch_vars[gNB_id]->dl_valid_re[i-1],
+		   nr_slot_rx, beamforming_mode);
+    }
 
+    int dmrs_type = dlsch[0]->harq_processes[harq_pid]->dmrsConfigType;
+    uint8_t nb_re_dmrs;
+    uint16_t dmrs_len = get_num_dmrs(dlsch[0]->harq_processes[harq_pid]->dlDmrsSymbPos);
+    if (dmrs_type==NFAPI_NR_DMRS_TYPE1) {
+      nb_re_dmrs = 6*dlsch[0]->harq_processes[harq_pid]->n_dmrs_cdm_groups;
+    } else {
+      nb_re_dmrs = 4*dlsch[0]->harq_processes[harq_pid]->n_dmrs_cdm_groups;
     }
+    dlsch[0]->harq_processes[harq_pid]->G = nr_get_G(dlsch[0]->harq_processes[harq_pid]->nb_rb,
+						     dlsch[0]->harq_processes[harq_pid]->nb_symbols,
+						     nb_re_dmrs,
+						     dmrs_len,
+						     dlsch[0]->harq_processes[harq_pid]->Qm,
+						     dlsch[0]->harq_processes[harq_pid]->Nl);
+    nr_dlsch_layer_demapping(pdsch_vars[gNB_id]->llr,
+			     dlsch[0]->harq_processes[harq_pid]->Nl,
+			     dlsch[0]->harq_processes[harq_pid]->Qm,
+			     dlsch[0]->harq_processes[harq_pid]->G,
+			     codeword_TB0,
+			     codeword_TB1,
+			     pdsch_vars[gNB_id]->layer_llr);
+  }
 
-    stop_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
-    if (cpumeas(CPUMEAS_GETSTATE))
-      LOG_D(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d: LLR Computation  %5.2f \n",frame,nr_slot_rx,slot,symbol,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
+  stop_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
+  if (cpumeas(CPUMEAS_GETSTATE))
+    LOG_D(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d: LLR Computation  %5.2f \n",frame,nr_slot_rx,slot,symbol,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
 
-// Please keep it: useful for debugging
+  // Please keep it: useful for debugging
 #ifdef DEBUG_PDSCH_RX
   char filename[50];
   uint8_t aa = 0;
@@ -1617,7 +1610,8 @@ unsigned short nr_dlsch_extract_rbs_single(int **rxdataF,
                                            unsigned short nb_rb_pdsch,
                                            uint8_t n_dmrs_cdm_groups,
                                            NR_DL_FRAME_PARMS *frame_parms,
-                                           uint16_t dlDmrsSymbPos)
+                                           uint16_t dlDmrsSymbPos,
+                                           int chest_time_type)
 {
   if (config_type == NFAPI_NR_DMRS_TYPE1) {
     AssertFatal(n_dmrs_cdm_groups == 1 || n_dmrs_cdm_groups == 2,
@@ -1628,7 +1622,12 @@ unsigned short nr_dlsch_extract_rbs_single(int **rxdataF,
   }
 
   const unsigned short start_re = (frame_parms->first_carrier_offset + start_rb * NR_NB_SC_PER_RB) % frame_parms->ofdm_symbol_size;
-  const int8_t validDmrsEst     = get_valid_dmrs_idx_for_channel_est(dlDmrsSymbPos, symbol);
+  int8_t validDmrsEst;
+
+  if (chest_time_type == 0)
+    validDmrsEst = get_valid_dmrs_idx_for_channel_est(dlDmrsSymbPos,symbol);
+  else
+    validDmrsEst = get_next_dmrs_symbol_in_slot(dlDmrsSymbPos,0,14); // get first dmrs symbol index
 
   for (unsigned char aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) {
 
@@ -1715,7 +1714,8 @@ void nr_dlsch_extract_rbs(int **rxdataF,
                           uint8_t n_dmrs_cdm_groups,
                           uint8_t Nl,
                           NR_DL_FRAME_PARMS *frame_parms,
-                          uint16_t dlDmrsSymbPos)
+                          uint16_t dlDmrsSymbPos,
+                          int chest_time_type)
 {
 
   unsigned short k,rb;
@@ -1733,7 +1733,10 @@ void nr_dlsch_extract_rbs(int **rxdataF,
     nushift = (n_dmrs_cdm_groups -1)<<1;//delta in Table 7.4.1.1.2-2
   }
 
-  validDmrsEst = get_valid_dmrs_idx_for_channel_est(dlDmrsSymbPos,symbol);
+  if (chest_time_type == 0)
+    validDmrsEst = get_valid_dmrs_idx_for_channel_est(dlDmrsSymbPos,symbol);
+  else
+    validDmrsEst = get_next_dmrs_symbol_in_slot(dlDmrsSymbPos,0,14); // get first dmrs symbol index
 
   for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
 
@@ -2600,7 +2603,7 @@ static int nr_dlsch_llr(NR_UE_PDSCH **pdsch_vars,
   }
 
   if (dlsch1_harq) {
-    switch (nr_get_Qm_dl(dlsch1_harq->mcs,dlsch1_harq->mcs_table)) {
+    switch (dlsch1_harq->Qm) {
     case 2 :
       if (rx_type==rx_standard) {
         nr_dlsch_qpsk_llr(frame_parms,
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_llr_computation.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_llr_computation.c
index 7c75884fa6b3da080ba4f2587c784f26f30137fe..ca15a5b5be8433cc6521819c203e2ce5cc970871 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_llr_computation.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_llr_computation.c
@@ -638,11 +638,10 @@ int nr_dlsch_qpsk_llr(NR_DL_FRAME_PARMS *frame_parms,
                    uint8_t beamforming_mode)
 {
 
-  uint32_t *rxF = (uint32_t *)&rxdataF_comp[((int32_t)symbol*nb_rb*12)];
-  uint32_t *llr32;
+  c16_t *rxF   = (c16_t *)&rxdataF_comp[((int32_t)symbol*nb_rb*12)];
+  c16_t *llr32 = (c16_t *)dlsch_llr;
   int i;
 
-  llr32 = (uint32_t*)dlsch_llr;
   if (!llr32) {
     LOG_E(PHY,"nr_dlsch_qpsk_llr: llr is null, symbol %d, llr32=%p\n",symbol, llr32);
     return(-1);
@@ -656,8 +655,10 @@ int nr_dlsch_qpsk_llr(NR_DL_FRAME_PARMS *frame_parms,
              llr32);
   */
   for (i=0; i<len; i++) {
-    *llr32 = *rxF;
-     //printf("dlsch_qpsk_llr %d : (%d,%d)\n",i,((int16_t*)llr32)[0],((int16_t*)llr32)[1]);
+    //*llr32 = *rxF;
+    llr32->r = rxF->r >> 3;
+    llr32->i = rxF->i >> 3;
+    //printf("dlsch_qpsk_llr %d : (%d,%d)\n", i, llr32->r, llr32->i);
     rxF++;
     llr32++;
   }
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c
index e248ce87cb23ca88ddcf34a506be282e61d46b32..ea7bde5377ffc9eb10aed4f776849348c24ab6f5 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c
@@ -362,6 +362,8 @@ int nr_initial_sync(UE_nr_rxtx_proc_t *proc,
           nr_gold_pdsch(ue, i, ue->scramblingID_dlsch[i]);
         }
 
+        nr_init_csi_rs(fp, ue->nr_csi_info->nr_gold_csi_rs, fp->Nid_cell);
+
         // initialize the pusch dmrs
         for (int i=0; i<NR_NB_NSCID; i++) {
           ue->scramblingID_ulsch[i]=fp->Nid_cell;
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_prach.c b/openair1/PHY/NR_UE_TRANSPORT/nr_prach.c
index 4927fe37a2516eac1dd8d6524067f8c5cf350cdf..8437b8f8f3782eda710138cffe054c74ea02a40f 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_prach.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_prach.c
@@ -67,7 +67,7 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, int frame, uint8_t
   uint8_t Mod_id, fd_occasion, preamble_index, restricted_set, not_found;
   uint16_t rootSequenceIndex, prach_fmt_id, NCS, *prach_root_sequence_map, preamble_offset = 0;
   uint16_t preamble_shift = 0, preamble_index0, n_shift_ra, n_shift_ra_bar, d_start=INT16_MAX, numshift, N_ZC, u, offset, offset2, first_nonzero_root_idx;
-  int16_t prach_tmp[98304*2*4] __attribute__((aligned(32)));
+  int16_t prach_tmp[(4688+4*24576)*4*2] __attribute__((aligned(32)));
 
   int16_t Ncp = 0, amp, *prach, *prach2, *prachF, *Xu;
   int32_t Xu_re, Xu_im;
@@ -102,10 +102,19 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, int frame, uint8_t
                        nrUE_config->prach_config.num_prach_fd_occasions_list[fd_occasion].prach_root_sequence_index,
                        ue->X_u);
 
-  if (slot % (fp->slots_per_subframe / 2) == 0)
-    sample_offset_slot = (prachStartSymbol==0?0:fp->ofdm_symbol_size*prachStartSymbol+fp->nb_prefix_samples0+fp->nb_prefix_samples*(prachStartSymbol-1));
-  else
-    sample_offset_slot = (fp->ofdm_symbol_size + fp->nb_prefix_samples) * prachStartSymbol;
+  if (prachStartSymbol == 0) {
+    sample_offset_slot = 0;
+  } else if (fp->slots_per_subframe == 1) {
+    if (prachStartSymbol <= 7)
+      sample_offset_slot = (fp->ofdm_symbol_size + fp->nb_prefix_samples) * (prachStartSymbol - 1) + (fp->ofdm_symbol_size + fp->nb_prefix_samples0);
+    else
+      sample_offset_slot = (fp->ofdm_symbol_size + fp->nb_prefix_samples) * (prachStartSymbol - 2) + (fp->ofdm_symbol_size + fp->nb_prefix_samples0) * 2;
+  } else {
+    if (slot % (fp->slots_per_subframe / 2) == 0)
+      sample_offset_slot = (fp->ofdm_symbol_size + fp->nb_prefix_samples) * (prachStartSymbol - 1) + (fp->ofdm_symbol_size + fp->nb_prefix_samples0);
+    else
+      sample_offset_slot = (fp->ofdm_symbol_size + fp->nb_prefix_samples) * prachStartSymbol;
+  }
 
   prach_start = fp->get_samples_slot_timestamp(slot, fp, 0) + sample_offset_slot;
 
@@ -232,897 +241,254 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, int frame, uint8_t
         preamble_offset,
         first_nonzero_root_idx);
 
-  Xu = (int16_t*)ue->X_u[preamble_offset-first_nonzero_root_idx];
-
-  #if defined (PRACH_WRITE_OUTPUT_DEBUG)
-    LOG_M("X_u.m", "X_u", (int16_t*)ue->X_u[preamble_offset-first_nonzero_root_idx], N_ZC, 1, 1);
-  #endif
-
-  /********************************************************
-   *
-   * In function init_prach_tables:
-   * to compute quantized roots of unity ru(n) = 32767 * exp j*[ (2 * PI * n) / N_ZC ]
-   *
-   * In compute_prach_seq:
-   * to calculate Xu = DFT xu = xu (inv_u*k) * Xu[0] (This is a Zadoff-Chou sequence property: DFT ZC sequence is another ZC sequence)
-   *
-   * In generate_prach:
-   * to do the cyclic-shifted DFT by multiplying Xu[k] * ru[k*preamble_shift] as:
-   * If X[k] = DFT x(n) -> X_shifted[k] = DFT x(n+preamble_shift) = X[k] * exp -j*[ (2*PI*k*preamble_shift) / N_ZC ]
-   *
-   *********************************************************/
-
-  if (mu==1) {
-    switch(fp->samples_per_subframe) {
-    case 15360:
-      // 10, 15 MHz @ 15.36 Ms/s
-      if (prach_sequence_length == 0) {
-        if (prach_fmt_id == 0 || prach_fmt_id == 1 || prach_fmt_id == 2)
-          dftlen = 12288;
-        if (prach_fmt_id == 3)
-          dftlen = 3072;
-      } else { // 839 sequence
-        dftlen = 512;
-      }
-      break;
-
-    case 30720:
-      // 20, 25, 30 MHz @ 30.72 Ms/s
-      if (prach_sequence_length == 0) {
-        if (prach_fmt_id == 0 || prach_fmt_id == 1 || prach_fmt_id == 2)
-          dftlen = 24576;
-        if (prach_fmt_id == 3)
-          dftlen = 6144;
-      } else { // 839 sequence
-        dftlen = 1024;
-      }
-      break;
-
-    case 46080:
-      // 40 MHz @ 46.08 Ms/s
-      if (prach_sequence_length == 0) {
-        if (prach_fmt_id == 0 || prach_fmt_id == 1 || prach_fmt_id == 2)
-          dftlen = 36864;
-        if (prach_fmt_id == 3)
-          dftlen = 9216;
-      } else { // 839 sequence
-        dftlen = 1536;
-      }
-      break;
-
-    case 61440:
-      // 40, 50, 60 MHz @ 61.44 Ms/s
-      if (prach_sequence_length == 0) {
-        if (prach_fmt_id == 0 || prach_fmt_id == 1 || prach_fmt_id == 2)
-          dftlen = 49152;
-        if (prach_fmt_id == 3)
-          dftlen = 12288;
-      } else { // 839 sequence
-        dftlen = 2048;
-      }
-      break;
-
-    case 92160:
-      // 50, 60, 70, 80, 90 MHz @ 92.16 Ms/s
-      if (prach_sequence_length == 0) {
-        if (prach_fmt_id == 0 || prach_fmt_id == 1 || prach_fmt_id == 2)
-          dftlen = 73728;
-        if (prach_fmt_id == 3)
-          dftlen = 18432;
-      } else { // 839 sequence
-        dftlen = 3072;
-      }
-      break;
-
-    case 122880:
-      // 70, 80, 90, 100 MHz @ 122.88 Ms/s
-      if (prach_sequence_length == 0) {
-        if (prach_fmt_id == 0 || prach_fmt_id == 1 || prach_fmt_id == 2)
-          dftlen = 98304;
-        if (prach_fmt_id == 3)
-          dftlen = 24576;
-      } else { // 839 sequence
-        dftlen = 4096;
-      }
-      break;
-
-    default:
-      AssertFatal(1==0,"sample rate %f MHz not supported for numerology %d\n", fp->samples_per_subframe / 1000.0, mu);
-    }
-  }
-  else if (mu==3) {
-    if (fp->threequarter_fs) 
-      AssertFatal(1==0,"3/4 sampling not supported for numerology %d\n",mu);
-    
-    if (prach_sequence_length == 0) 
-	AssertFatal(1==0,"long prach not supported for numerology %d\n",mu);
-
-    if (fp->N_RB_UL == 32) 
-      dftlen=512;
-    else if (fp->N_RB_UL == 66) 
-      dftlen=1024;
-    else 
-      AssertFatal(1==0,"N_RB_UL %d not support for numerology %d\n",fp->N_RB_UL,mu);
-  }
-
-
-  for (offset=0,offset2=0; offset<N_ZC; offset++,offset2+=preamble_shift) {
-
-    if (offset2 >= N_ZC)
-      offset2 -= N_ZC;
-
-    Xu_re = (((int32_t)Xu[offset<<1]*amp)>>15);
-    Xu_im = (((int32_t)Xu[1+(offset<<1)]*amp)>>15);
-    prachF[k++]= ((Xu_re*nr_ru[offset2<<1]) - (Xu_im*nr_ru[1+(offset2<<1)]))>>15;
-    prachF[k++]= ((Xu_im*nr_ru[offset2<<1]) + (Xu_re*nr_ru[1+(offset2<<1)]))>>15;
-
-    if (k==dftlen) k=0;
-  }
-
-  #if defined (PRACH_WRITE_OUTPUT_DEBUG)
-    LOG_M("prachF.m", "prachF", &prachF[1804], 1024, 1, 1);
-    LOG_M("Xu.m", "Xu", Xu, N_ZC, 1, 1);
-  #endif
-
+  // Ncp and dftlen here is given in terms of T_s wich is 30.72MHz sampling
   if (prach_sequence_length == 0) {
-
-    AssertFatal(prach_fmt_id < 4, "Illegal PRACH format %d for sequence length 839\n", prach_fmt_id);
-
-    // Ncp here is given in terms of T_s wich is 30.72MHz sampling
     switch (prach_fmt_id) {
     case 0:
       Ncp = 3168;
+      dftlen = 24576;
       break;
+
     case 1:
       Ncp = 21024;
+      dftlen = 24576;
       break;
+
     case 2:
       Ncp = 4688;
+      dftlen = 24576;
       break;
+
     case 3:
       Ncp = 3168;
+      dftlen = 6144;
       break;
-    }
 
+    default:
+      AssertFatal(1==0, "Illegal PRACH format %d for sequence length 839\n", prach_fmt_id);
+      break;
+    }
   } else {
-
     switch (prach_fmt_id) {
     case 4: //A1
-      Ncp = 288/(1<<mu);
+      Ncp = 288 >> mu;
       break;
+
     case 5: //A2
-      Ncp = 576/(1<<mu);
+      Ncp = 576 >> mu;
       break;
+
     case 6: //A3
-      Ncp = 864/(1<<mu);
+      Ncp = 864 >> mu;
       break;
+
     case 7: //B1
-      Ncp = 216/(1<<mu);
-    break;
+      Ncp = 216 >> mu;
+      break;
+
     /*
     case 4: //B2
-      Ncp = 360/(1<<mu);
+      Ncp = 360 >> mu;
       break;
+
     case 5: //B3
-      Ncp = 504/(1<<mu);
+      Ncp = 504 >> mu;
       break;
     */
+
     case 8: //B4
-      Ncp = 936/(1<<mu);
+      Ncp = 936 >> mu;
       break;
+
     case 9: //C0
-      Ncp = 1240/(1<<mu);
+      Ncp = 1240 >> mu;
       break;
+
     case 10: //C2
-      Ncp = 2048/(1<<mu);
+      Ncp = 2048 >> mu;
       break;
+
     default:
       AssertFatal(1==0,"Unknown PRACH format ID %d\n", prach_fmt_id);
       break;
     }
+    dftlen = 2048 >> mu;
   }
 
-  #ifdef NR_PRACH_DEBUG
-    LOG_D(PHY, "PRACH [UE %d] Ncp %d, dftlen %d \n", Mod_id, Ncp, dftlen);
-  #endif
-
   //actually what we should be checking here is how often the current prach crosses a 0.5ms boundary. I am not quite sure for which paramter set this would be the case, so I will ignore it for now and just check if the prach starts on a 0.5ms boundary
-  uint8_t  use_extended_prach_prefix = 0;
   if(fp->numerology_index == 0) {
     if (prachStartSymbol == 0 || prachStartSymbol == 7)
-      use_extended_prach_prefix = 1;
+      Ncp += 16;
   }
   else {
     if (slot%(fp->slots_per_subframe/2)==0 && prachStartSymbol == 0)
-      use_extended_prach_prefix = 1;
+      Ncp += 16;
   }
 
-  if (mu == 3) {
-    switch (fp->samples_per_subframe) {
-    case 61440: // 32 PRB case, 61.44 Msps
-      Ncp<<=1; //to account for 61.44Mbps
-      // This is after cyclic prefix 
-      prach2 = prach+(Ncp<<1); //times 2 for complex samples
-      if (prach_sequence_length == 0)
-	AssertFatal(1==0,"no long PRACH for this PRACH size %d\n",fp->N_RB_UL);
-      else {
-	if (use_extended_prach_prefix) 
-          Ncp+=32;  // 16*kappa, kappa=2 for 61.44Msps
-	prach2 = prach+(Ncp<<1); //times 2 for complex samples
-        if (prach_fmt_id == 4 || prach_fmt_id == 7 || prach_fmt_id == 9) {
-          idft(IDFT_512,prachF,prach2,1);
-          // here we have |empty | Prach512 |
-          if (prach_fmt_id != 9) {
-            memmove(prach2+(512<<1),prach2,(512<<2));
-            prach_len = (512*2)+Ncp;
-          }
-          else prach_len = (512*1)+Ncp;
-          memmove(prach,prach+(512<<1),(Ncp<<2));
-          // here we have |Prefix | Prach512 | Prach512 (if ! 0xc0)  |
-        } else if (prach_fmt_id == 5) { // 6x512
-          idft(IDFT_512,prachF,prach2,1);
-          // here we have |empty | Prach512 |
-          memmove(prach2+(512<<1),prach2,(512<<2));
-          // here we have |empty | Prach512 | Prach512| empty512 | empty512 |
-          memmove(prach2+(512<<2),prach2,(512<<3));
-          // here we have |empty | Prach512 | Prach512| Prach512 | Prach512 |
-          memmove(prach,prach+(512<<1),(Ncp<<2));
-          // here we have |Prefix | Prach512 |
-          prach_len = (512*4)+Ncp;
-        } else if (prach_fmt_id == 6) { // 6x512
-          idft(IDFT_512,prachF,prach2,1);
-          // here we have |empty | Prach512 |
-          memmove(prach2+(512<<1),prach2,(512<<2));
-          // here we have |empty | Prach512 | Prach512| empty512 | empty512 | empty512 | empty512
-          memmove(prach2+(512<<2),prach2,(512<<3));
-          // here we have |empty | Prach512 | Prach512| Prach512 | Prach512 | empty512 | empty512
-          memmove(prach2+(512<<3),prach2,(512<<3));
-          // here we have |empty | Prach512 | Prach512| Prach512 | Prach512 | Prach512 | Prach512
-          memmove(prach,prach+(512<<1),(Ncp<<2));
-          // here we have |Prefix | Prach512 |
-          prach_len = (512*6)+Ncp;
-        } else if (prach_fmt_id == 8) { // 12x512
-          idft(IDFT_512,prachF,prach2,1);
-          // here we have |empty | Prach512 |
-          memmove(prach2+(512<<1),prach2,(512<<2));
-          // here we have |empty | Prach512 | Prach512| empty512 | empty512 | empty512 | empty512
-          memmove(prach2+(512<<2),prach2,(512<<3));
-          // here we have |empty | Prach512 | Prach512| Prach512 | Prach512 | empty512 | empty512
-          memmove(prach2+(512<<3),prach2,(512<<3));
-          // here we have |empty | Prach512 | Prach512| Prach512 | Prach512 | Prach512 | Prach512
-          memmove(prach2+(512<<1)*6,prach2,(512<<2)*6);
-          // here we have |empty | Prach512 | Prach512| Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512| Prach512 | Prach512 | Prach512 | Prach512|
-          memmove(prach,prach+(512<<1),(Ncp<<2));
-          // here we have |Prefix | Prach512 | Prach512| Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512| Prach512 | Prach512 | Prach512 | Prach512|
-          prach_len = (512*12)+Ncp;
-	}		
-      }
-      break;
+  switch(fp->samples_per_subframe) {
+  case 7680:
+    // 5 MHz @ 7.68 Ms/s
+    Ncp >>= 2;
+    dftlen >>= 2;
+    break;
 
-    case 122880: // 66 PRB case, 122.88 Msps
-      Ncp<<=2; //to account for 122.88Mbps
-      // This is after cyclic prefix 
-      prach2 = prach+(Ncp<<1); //times 2 for complex samples
-      if (prach_sequence_length == 0)
-	AssertFatal(1==0,"no long PRACH for this PRACH size %d\n",fp->N_RB_UL);
-      else {
-	if (use_extended_prach_prefix) 
-          Ncp+=64;  // 16*kappa, kappa=4 for 122.88Msps
-	prach2 = prach+(Ncp<<1); //times 2 for complex samples
-        if (prach_fmt_id == 4 || prach_fmt_id == 7 || prach_fmt_id == 9) {
-          idft(IDFT_1024,prachF,prach2,1);
-          // here we have |empty | Prach1024 |
-          if (prach_fmt_id != 9) {
-            memmove(prach2+(1024<<1),prach2,(1024<<2));
-            prach_len = (1024*2)+Ncp;
-          }
-          else prach_len = (1024*1)+Ncp;
-          memmove(prach,prach+(1024<<1),(Ncp<<2));
-          // here we have |Prefix | Prach1024 | Prach1024 (if ! 0xc0)  |
-        } else if (prach_fmt_id == 5) { // 6x1024
-          idft(IDFT_1024,prachF,prach2,1);
-          // here we have |empty | Prach1024 |
-          memmove(prach2+(1024<<1),prach2,(1024<<2));
-          // here we have |empty | Prach1024 | Prach1024| empty1024 | empty1024 |
-          memmove(prach2+(1024<<2),prach2,(1024<<3));
-          // here we have |empty | Prach1024 | Prach1024| Prach1024 | Prach1024 |
-          memmove(prach,prach+(1024<<1),(Ncp<<2));
-          // here we have |Prefix | Prach1024 |
-          prach_len = (1024*4)+Ncp;
-        } else if (prach_fmt_id == 6) { // 6x1024
-          idft(IDFT_1024,prachF,prach2,1);
-          // here we have |empty | Prach1024 |
-          memmove(prach2+(1024<<1),prach2,(1024<<2));
-          // here we have |empty | Prach1024 | Prach1024| empty1024 | empty1024 | empty1024 | empty1024
-          memmove(prach2+(1024<<2),prach2,(1024<<3));
-          // here we have |empty | Prach1024 | Prach1024| Prach1024 | Prach1024 | empty1024 | empty1024
-          memmove(prach2+(1024<<3),prach2,(1024<<3));
-          // here we have |empty | Prach1024 | Prach1024| Prach1024 | Prach1024 | Prach1024 | Prach1024
-          memmove(prach,prach+(1024<<1),(Ncp<<2));
-          // here we have |Prefix | Prach1024 |
-          prach_len = (1024*6)+Ncp;
-        } else if (prach_fmt_id == 8) { // 12x1024
-          idft(IDFT_1024,prachF,prach2,1);
-          // here we have |empty | Prach1024 |
-          memmove(prach2+(1024<<1),prach2,(1024<<2));
-          // here we have |empty | Prach1024 | Prach1024| empty1024 | empty1024 | empty1024 | empty1024
-          memmove(prach2+(1024<<2),prach2,(1024<<3));
-          // here we have |empty | Prach1024 | Prach1024| Prach1024 | Prach1024 | empty1024 | empty1024
-          memmove(prach2+(1024<<3),prach2,(1024<<3));
-          // here we have |empty | Prach1024 | Prach1024| Prach1024 | Prach1024 | Prach1024 | Prach1024
-          memmove(prach2+(1024<<1)*6,prach2,(1024<<2)*6);
-          // here we have |empty | Prach1024 | Prach1024| Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024| Prach1024 | Prach1024 | Prach1024 | Prach1024|
-          memmove(prach,prach+(1024<<1),(Ncp<<2));
-          // here we have |Prefix | Prach1024 | Prach1024| Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024| Prach1024 | Prach1024 | Prach1024 | Prach1024|
-          prach_len = (1024*12)+Ncp;
-	}	
-      }
-      break;
+  case 15360:
+    // 10, 15 MHz @ 15.36 Ms/s
+    Ncp >>= 1;
+    dftlen >>= 1;
+    break;
 
-    default:
-      AssertFatal(1==0,"sample rate %f MHz not supported for numerology %d\n", fp->samples_per_subframe / 1000.0, mu);
-    }
-  } else if (mu == 1) {
-    switch (fp->samples_per_subframe) {
-    case 15360: // full sampling @ 15.36 Ms/s
-      Ncp = Ncp/2; // to account for 15.36 Ms/s
-      // This is after cyclic prefix
-      prach2 = prach+(2*Ncp); // times 2 for complex samples
-      if (prach_sequence_length == 0){
-        if (prach_fmt_id == 0) { // 24576 samples @ 30.72 Ms/s, 12288 samples @ 15.36 Ms/s
-          idft(IDFT_12288,prachF,prach2,1);
-          // here we have | empty  | Prach12288 |
-          memmove(prach,prach+(12288<<1),(Ncp<<2));
-          // here we have | Prefix | Prach12288 |
-          prach_len = 12288+Ncp;
-        } else if (prach_fmt_id == 1) { // 24576 samples @ 30.72 Ms/s, 12288 samples @ 15.36 Ms/s
-          idft(IDFT_12288,prachF,prach2,1);
-          // here we have | empty  | Prach12288 | empty12288 |
-          memmove(prach2+(12288<<1),prach2,(12288<<2));
-          // here we have | empty  | Prach12288 | Prach12288 |
-          memmove(prach,prach+(12288<<2),(Ncp<<2));
-          // here we have | Prefix | Prach12288 | Prach12288 |
-          prach_len = (12288*2)+Ncp;
-        } else if (prach_fmt_id == 2) { // 24576 samples @ 30.72 Ms/s, 12288 samples @ 15.36 Ms/s
-          idft(IDFT_12288,prachF,prach2,1);
-          // here we have | empty  | Prach12288 | empty12288 | empty12288 | empty12288 |
-          memmove(prach2+(12288<<1),prach2,(12288<<2));
-          // here we have | empty  | Prach12288 | Prach12288 | empty12288 | empty12288 |
-          memmove(prach2+(12288<<2),prach2,(12288<<3));
-          // here we have | empty  | Prach12288 | Prach12288 | Prach12288 | Prach12288 |
-          memmove(prach,prach+(12288<<3),(Ncp<<2));
-          // here we have | Prefix | Prach12288 | Prach12288 | Prach12288 | Prach12288 |
-          prach_len = (12288*4)+Ncp;
-        } else if (prach_fmt_id == 3) { // 6144 samples @ 30.72 Ms/s, 3072 samples @ 15.36 Ms/s
-          idft(IDFT_3072,prachF,prach2,1);
-          // here we have | empty  | Prach3072 | empty3072 | empty3072 | empty3072 |
-          memmove(prach2+(3072<<1),prach2,(3072<<2));
-          // here we have | empty  | Prach3072 | Prach3072 | empty3072 | empty3072 |
-          memmove(prach2+(3072<<2),prach2,(3072<<3));
-          // here we have | empty  | Prach3072 | Prach3072 | Prach3072 | Prach3072 |
-          memmove(prach,prach+(3072<<3),(Ncp<<2));
-          // here we have | Prefix | Prach3072 | Prach3072 | Prach3072 | Prach3072 |
-          prach_len = (3072*4)+Ncp;
-        }
-      } else { // short PRACH sequence
-	if (use_extended_prach_prefix)
-	  Ncp += 8; // 16*kappa, kappa=0.5 for 15.36 Ms/s
-	prach2 = prach+(2*Ncp); // times 2 for complex samples
-        if (prach_fmt_id == 9) {
-          idft(IDFT_512,prachF,prach2,1);
-          // here we have | empty  | Prach512 |
-          memmove(prach,prach+(512<<1),(Ncp<<2));
-          // here we have | Prefix | Prach512 |
-          prach_len = (512*1)+Ncp;
-        } else if (prach_fmt_id == 4 || prach_fmt_id == 7) {
-          idft(IDFT_512,prachF,prach2,1);
-          // here we have | empty  | Prach512 | empty512 |
-          memmove(prach2+(512<<1),prach2,(512<<2));
-          // here we have | empty  | Prach512 | Prach512 |
-          memmove(prach,prach+(512<<1),(Ncp<<2));
-          // here we have | Prefix | Prach512 | Prach512 |
-          prach_len = (512*2)+Ncp;
-        } else if (prach_fmt_id == 5) { // 4x512
-          idft(IDFT_512,prachF,prach2,1);
-          // here we have | empty  | Prach512 | empty512 | empty512 | empty512 |
-          memmove(prach2+(512<<1),prach2,(512<<2));
-          // here we have | empty  | Prach512 | Prach512 | empty512 | empty512 |
-          memmove(prach2+(512<<2),prach2,(512<<3));
-          // here we have | empty  | Prach512 | Prach512 | Prach512 | Prach512 |
-          memmove(prach,prach+(512<<1),(Ncp<<2));
-          // here we have | Prefix | Prach512 | Prach512 | Prach512 | Prach512 |
-          prach_len = (512*4)+Ncp;
-        } else if (prach_fmt_id == 6) { // 6x512
-          idft(IDFT_512,prachF,prach2,1);
-          // here we have | empty  | Prach512 | empty512 | empty512 | empty512 | empty512 | empty512 |
-          memmove(prach2+(512<<1),prach2,(512<<2));
-          // here we have | empty  | Prach512 | Prach512 | empty512 | empty512 | empty512 | empty512 |
-          memmove(prach2+(512<<2),prach2,(512<<3));
-          // here we have | empty  | Prach512 | Prach512 | Prach512 | Prach512 | empty512 | empty512 |
-          memmove(prach2+(512<<3),prach2,(512<<3));
-          // here we have | empty  | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 |
-          memmove(prach,prach+(512<<1),(Ncp<<2));
-          // here we have | Prefix | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 |
-          prach_len = (512*6)+Ncp;
-        } else if (prach_fmt_id == 8) { // 12x512
-          idft(IDFT_512,prachF,prach2,1);
-          // here we have | empty  | Prach512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 |
-          memmove(prach2+(512<<1),prach2,(512<<2));
-          // here we have | empty  | Prach512 | Prach512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 |
-          memmove(prach2+(512<<2),prach2,(512<<3));
-          // here we have | empty  | Prach512 | Prach512 | Prach512 | Prach512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 |
-          memmove(prach2+(512<<3),prach2,(512<<3));
-          // here we have | empty  | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 |
-          memmove(prach2+(512<<1)*6,prach2,(512<<2)*6);
-          // here we have | empty  | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 |
-          memmove(prach,prach+(512<<1),(Ncp<<2));
-          // here we have | Prefix | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 |
-          prach_len = (512*12)+Ncp;
-        }
-      }
-      break;
+  case 30720:
+    // 20, 25, 30 MHz @ 30.72 Ms/s
+    Ncp = Ncp;
+    dftlen = dftlen;
+    break;
 
-    case 30720: // full sampling @ 30.72 Ms/s
-      Ncp = Ncp*1; // to account for 30.72 Ms/s
-      // This is after cyclic prefix
-      prach2 = prach+(2*Ncp); // times 2 for complex samples
-      if (prach_sequence_length == 0){
-        if (prach_fmt_id == 0) { // 24576 samples @ 30.72 Ms/s
-          idft(IDFT_24576,prachF,prach2,1);
-          // here we have | empty  | Prach24576 |
-          memmove(prach,prach+(24576<<1),(Ncp<<2));
-          // here we have | Prefix | Prach24576 |
-          prach_len = 24576+Ncp;
-        } else if (prach_fmt_id == 1) { // 24576 samples @ 30.72 Ms/s
-          idft(IDFT_24576,prachF,prach2,1);
-          // here we have | empty  | Prach24576 | empty24576 |
-          memmove(prach2+(24576<<1),prach2,(24576<<2));
-          // here we have | empty  | Prach24576 | Prach24576 |
-          memmove(prach,prach+(24576<<2),(Ncp<<2));
-          // here we have | Prefix | Prach24576 | Prach24576 |
-          prach_len = (24576*2)+Ncp;
-        } else if (prach_fmt_id == 2) { // 24576 samples @ 30.72 Ms/s
-          idft(IDFT_24576,prachF,prach2,1);
-          // here we have | empty  | Prach24576 | empty24576 | empty24576 | empty24576 |
-          memmove(prach2+(24576<<1),prach2,(24576<<2));
-          // here we have | empty  | Prach24576 | Prach24576 | empty24576 | empty24576 |
-          memmove(prach2+(24576<<2),prach2,(24576<<3));
-          // here we have | empty  | Prach24576 | Prach24576 | Prach24576 | Prach24576 |
-          memmove(prach,prach+(24576<<3),(Ncp<<2));
-          // here we have | Prefix | Prach24576 | Prach24576 | Prach24576 | Prach24576 |
-          prach_len = (24576*4)+Ncp;
-        } else if (prach_fmt_id == 3) { // 6144 samples @ 30.72 Ms/s
-          idft(IDFT_6144,prachF,prach2,1);
-          // here we have | empty  | Prach6144 | empty6144 | empty6144 | empty6144 |
-          memmove(prach2+(6144<<1),prach2,(6144<<2));
-          // here we have | empty  | Prach6144 | Prach6144 | empty6144 | empty6144 |
-          memmove(prach2+(6144<<2),prach2,(6144<<3));
-          // here we have | empty  | Prach6144 | Prach6144 | Prach6144 | Prach6144 |
-          memmove(prach,prach+(6144<<3),(Ncp<<2));
-          // here we have | Prefix | Prach6144 | Prach6144 | Prach6144 | Prach6144 |
-          prach_len = (6144*4)+Ncp;
-        }
-      } else { // short PRACH sequence
-	if (use_extended_prach_prefix)
-	  Ncp += 16; // 16*kappa, kappa=1 for 30.72Msps
-	prach2 = prach+(2*Ncp); // times 2 for complex samples
-        if (prach_fmt_id == 9) {
-          idft(IDFT_1024,prachF,prach2,1);
-          // here we have | empty  | Prach1024 |
-          memmove(prach,prach+(1024<<1),(Ncp<<2));
-          // here we have | Prefix | Prach1024 |
-          prach_len = (1024*1)+Ncp;
-        } else if (prach_fmt_id == 4 || prach_fmt_id == 7) {
-          idft(IDFT_1024,prachF,prach2,1);
-          // here we have | empty  | Prach1024 | empty1024 |
-          memmove(prach2+(1024<<1),prach2,(1024<<2));
-          // here we have | empty  | Prach1024 | Prach1024 |
-          memmove(prach,prach+(1024<<1),(Ncp<<2));
-          // here we have | Prefix | Prach1024 | Prach1024 |
-          prach_len = (1024*2)+Ncp;
-        } else if (prach_fmt_id == 5) { // 4x1024
-          idft(IDFT_1024,prachF,prach2,1);
-          // here we have | empty  | Prach1024 | empty1024 | empty1024 | empty1024 |
-          memmove(prach2+(1024<<1),prach2,(1024<<2));
-          // here we have | empty  | Prach1024 | Prach1024 | empty1024 | empty1024 |
-          memmove(prach2+(1024<<2),prach2,(1024<<3));
-          // here we have | empty  | Prach1024 | Prach1024 | Prach1024 | Prach1024 |
-          memmove(prach,prach+(1024<<1),(Ncp<<2));
-          // here we have | Prefix | Prach1024 | Prach1024 | Prach1024 | Prach1024 |
-          prach_len = (1024*4)+Ncp;
-        } else if (prach_fmt_id == 6) { // 6x1024
-          idft(IDFT_1024,prachF,prach2,1);
-          // here we have | empty  | Prach1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 |
-          memmove(prach2+(1024<<1),prach2,(1024<<2));
-          // here we have | empty  | Prach1024 | Prach1024 | empty1024 | empty1024 | empty1024 | empty1024 |
-          memmove(prach2+(1024<<2),prach2,(1024<<3));
-          // here we have | empty  | Prach1024 | Prach1024 | Prach1024 | Prach1024 | empty1024 | empty1024 |
-          memmove(prach2+(1024<<3),prach2,(1024<<3));
-          // here we have | empty  | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 |
-          memmove(prach,prach+(1024<<1),(Ncp<<2));
-          // here we have | Prefix | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 |
-          prach_len = (1024*6)+Ncp;
-        } else if (prach_fmt_id == 8) { // 12x1024
-          idft(IDFT_1024,prachF,prach2,1);
-          // here we have | empty  | Prach1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 |
-          memmove(prach2+(1024<<1),prach2,(1024<<2));
-          // here we have | empty  | Prach1024 | Prach1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 |
-          memmove(prach2+(1024<<2),prach2,(1024<<3));
-          // here we have | empty  | Prach1024 | Prach1024 | Prach1024 | Prach1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 |
-          memmove(prach2+(1024<<3),prach2,(1024<<3));
-          // here we have | empty  | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 |
-          memmove(prach2+(1024<<1)*6,prach2,(1024<<2)*6);
-          // here we have | empty  | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 |
-          memmove(prach,prach+(1024<<1),(Ncp<<2));
-          // here we have | Prefix | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 |
-          prach_len = (1024*12)+Ncp;
-        }
-      }
-      break;
+  case 46080:
+    // 40 MHz @ 46.08 Ms/s
+    Ncp = (Ncp*3)/2;
+    dftlen = (dftlen*3)/2;
+    break;
 
-    case 61440: // full sampling @ 61.44 Ms/s
-      Ncp = Ncp*2; // to account for 61.44 Ms/s
-      // This is after cyclic prefix 
-      prach2 = prach+(Ncp<<1); //times 2 for complex samples
-      if (prach_sequence_length == 0){
-        if (prach_fmt_id == 0) { //24576 samples @ 30.72 Ms/s, 49152 samples @ 61.44 Ms/s
-          idft(IDFT_49152,prachF,prach2,1);
-          // here we have |empty | Prach49152|
-          memmove(prach,prach+(49152<<1),(Ncp<<2));
-          // here we have |Prefix | Prach49152|
-          prach_len = 49152+Ncp;
-        } else if (prach_fmt_id == 1) { //24576 samples @ 30.72 Ms/s, 49152 samples @ 61.44 Ms/s
-          idft(IDFT_49152,prachF,prach2,1);
-          memmove(prach2+(49152<<1),prach2,(49152<<2));
-          // here we have |empty | Prach49152 | Prach49152|
-          memmove(prach,prach+(49152<<2),(Ncp<<2));
-          // here we have |Prefix | Prach49152 | Prach49152|
-          prach_len = (49152*2)+Ncp;
-        } else if (prach_fmt_id == 2) { //24576 samples @ 30.72 Ms/s, 49152 samples @ 61.44 Ms/s
-          idft(IDFT_49152,prachF,prach2,1);
-          memmove(prach2+(49152<<1),prach2,(49152<<2));
-          // here we have |empty | Prach49152 | Prach49152| empty49152 | empty49152
-          memmove(prach2+(49152<<2),prach2,(49152<<3));
-          // here we have |empty | Prach49152 | Prach49152| Prach49152 | Prach49152
-          memmove(prach,prach+(49152<<3),(Ncp<<2));
-          // here we have |Prefix | Prach49152 | Prach49152| Prach49152 | Prach49152
-          prach_len = (49152*4)+Ncp;
-        } else if (prach_fmt_id == 3) { // 6144 samples @ 30.72 Ms/s, 12288 samples @ 61.44 Ms/s
-          idft(IDFT_12288,prachF,prach2,1);
-          memmove(prach2+(12288<<1),prach2,(12288<<2));
-          // here we have |empty | Prach12288 | Prach12288| empty12288 | empty12288
-          memmove(prach2+(12288<<2),prach2,(12288<<3));
-          // here we have |empty | Prach12288 | Prach12288| Prach12288 | Prach12288
-          memmove(prach,prach+(12288<<3),(Ncp<<2));
-          // here we have |Prefix | Prach12288 | Prach12288| Prach12288 | Prach12288
-          prach_len = (12288*4)+Ncp;
-        }
-      } else { // short PRACH sequence
-	if (use_extended_prach_prefix) 
-	  Ncp+=32; // 16*kappa, kappa=2 for 61.44Msps 
-	prach2 = prach+(Ncp<<1); //times 2 for complex samples
-        if (prach_fmt_id == 4 || prach_fmt_id == 7 || prach_fmt_id == 9) {
-          idft(IDFT_2048,prachF,prach2,1);
-          // here we have |empty | Prach2048 |
-          if (prach_fmt_id != 9) {
-            memmove(prach2+(2048<<1),prach2,(2048<<2));
-            prach_len = (2048*2)+Ncp;
-          }
-          else prach_len = (2048*1)+Ncp;
-          memmove(prach,prach+(2048<<1),(Ncp<<2));
-          // here we have |Prefix | Prach2048 | Prach2048 (if ! 0xc0)  |
-        } else if (prach_fmt_id == 5) { // 6x2048
-          idft(IDFT_2048,prachF,prach2,1);
-          // here we have |empty | Prach2048 |
-          memmove(prach2+(2048<<1),prach2,(2048<<2));
-          // here we have |empty | Prach2048 | Prach2048| empty2048 | empty2048 |
-          memmove(prach2+(2048<<2),prach2,(2048<<3));
-          // here we have |empty | Prach2048 | Prach2048| Prach2048 | Prach2048 |
-          memmove(prach,prach+(2048<<1),(Ncp<<2));
-          // here we have |Prefix | Prach2048 |
-          prach_len = (2048*4)+Ncp;
-        } else if (prach_fmt_id == 6) { // 6x2048
-          idft(IDFT_2048,prachF,prach2,1);
-          // here we have |empty | Prach2048 |
-          memmove(prach2+(2048<<1),prach2,(2048<<2));
-          // here we have |empty | Prach2048 | Prach2048| empty2048 | empty2048 | empty2048 | empty2048
-          memmove(prach2+(2048<<2),prach2,(2048<<3));
-          // here we have |empty | Prach2048 | Prach2048| Prach2048 | Prach2048 | empty2048 | empty2048
-          memmove(prach2+(2048<<3),prach2,(2048<<3));
-          // here we have |empty | Prach2048 | Prach2048| Prach2048 | Prach2048 | Prach2048 | Prach2048
-          memmove(prach,prach+(2048<<1),(Ncp<<2));
-          // here we have |Prefix | Prach2048 |
-          prach_len = (2048*6)+Ncp;
-        } else if (prach_fmt_id == 8) { // 12x2048
-          idft(IDFT_2048,prachF,prach2,1);
-          // here we have |empty | Prach2048 |
-          memmove(prach2+(2048<<1),prach2,(2048<<2));
-          // here we have |empty | Prach2048 | Prach2048| empty2048 | empty2048 | empty2048 | empty2048
-          memmove(prach2+(2048<<2),prach2,(2048<<3));
-          // here we have |empty | Prach2048 | Prach2048| Prach2048 | Prach2048 | empty2048 | empty2048
-          memmove(prach2+(2048<<3),prach2,(2048<<3));
-          // here we have |empty | Prach2048 | Prach2048| Prach2048 | Prach2048 | Prach2048 | Prach2048
-          memmove(prach2+(2048<<1)*6,prach2,(2048<<2)*6);
-          // here we have |empty | Prach2048 | Prach2048| Prach2048 | Prach2048 | Prach2048 | Prach2048 | Prach2048 | Prach2048| Prach2048 | Prach2048 | Prach2048 | Prach2048|
-          memmove(prach,prach+(2048<<1),(Ncp<<2));
-          // here we have |Prefix | Prach2048 | Prach2048| Prach2048 | Prach2048 | Prach2048 | Prach2048 | Prach2048 | Prach2048| Prach2048 | Prach2048 | Prach2048 | Prach2048|
-          prach_len = (2048*12)+Ncp;
-        }
-      }
-      break;
+  case 61440:
+    // 40, 50, 60 MHz @ 61.44 Ms/s
+    Ncp <<= 1;
+    dftlen <<= 1;
+    break;
 
-    case 46080: // threequarter sampling @ 46.08 Ms/s
-      Ncp = (Ncp*3)/2;
-      prach2 = prach+(Ncp<<1);
-      if (prach_sequence_length == 0){
-        if (prach_fmt_id == 0) {
-          idft(IDFT_36864,prachF,prach2,1);
-          // here we have |empty | Prach73728|
-          memmove(prach,prach+(36864<<1),(Ncp<<2));
-          // here we have |Prefix | Prach73728|
-          prach_len = (36864*1)+Ncp;
-        } else if (prach_fmt_id == 1) {
-          idft(IDFT_36864,prachF,prach2,1);
-          memmove(prach2+(36864<<1),prach2,(36864<<2));
-          // here we have |empty | Prach73728 | Prach73728|
-          memmove(prach,prach+(36864<<2),(Ncp<<2));
-          // here we have |Prefix | Prach73728 | Prach73728|
-          prach_len = (36864*2)+Ncp;
-        } else if (prach_fmt_id == 2) {
-          idft(IDFT_36864,prachF,prach2,1);
-          memmove(prach2+(36864<<1),prach2,(36864<<2));
-          // here we have |empty | Prach73728 | Prach73728| empty73728 | empty73728
-          memmove(prach2+(36864<<2),prach2,(36864<<3));
-          // here we have |empty | Prach73728 | Prach73728| Prach73728 | Prach73728
-          memmove(prach,prach+(36864<<3),(Ncp<<2));
-          // here we have |Prefix | Prach73728 | Prach73728| Prach73728 | Prach73728
-          prach_len = (36864*4)+Ncp;
-        } else if (prach_fmt_id == 3) {
-          idft(IDFT_9216,prachF,prach2,1);
-          memmove(prach2+(9216<<1),prach2,(9216<<2));
-          // here we have |empty | Prach9216 | Prach9216| empty9216 | empty9216
-          memmove(prach2+(9216<<2),prach2,(9216<<3));
-          // here we have |empty | Prach9216 | Prach9216| Prach9216 | Prach9216
-          memmove(prach,prach+(9216<<3),(Ncp<<2));
-          // here we have |Prefix | Prach9216 | Prach9216| Prach9216 | Prach9216
-          prach_len = (9216*4)+Ncp;
-        }
-      } else { // short sequence
-	if (use_extended_prach_prefix) 
-	  Ncp+=24; // 16*kappa, kappa=1.5 for 46.08Msps 
-	prach2 = prach+(Ncp<<1); //times 2 for complex samples
-        if (prach_fmt_id == 4 || prach_fmt_id == 7 || prach_fmt_id == 9) {
-          idft(IDFT_1536,prachF,prach2,1);
-          // here we have |empty | Prach1536 |
-          if (prach_fmt_id != 9) {
-            memmove(prach2+(1536<<1),prach2,(1536<<2));
-            prach_len = (1536*2)+Ncp;
-          }	else prach_len = (1536*1)+Ncp;
-
-          memmove(prach,prach+(1536<<1),(Ncp<<2));
-          // here we have |Prefix | Prach1536 | Prach1536 (if ! 0xc0) |
-
-        } else if (prach_fmt_id == 5) { // 6x1536
-          idft(IDFT_1536,prachF,prach2,1);
-          // here we have |empty | Prach1536 |
-          memmove(prach2+(1536<<1),prach2,(1536<<2));
-          // here we have |empty | Prach1536 | Prach1536| empty1536 | empty1536 |
-          memmove(prach2+(1536<<2),prach2,(1536<<3));
-          // here we have |empty | Prach1536 | Prach1536| Prach1536 | Prach1536 |
-          memmove(prach,prach+(1536<<1),(Ncp<<2));
-          // here we have |Prefix | Prach1536 |
-          prach_len = (1536*4)+Ncp;
-        } else if (prach_fmt_id == 6) { // 6x1536
-          idft(IDFT_1536,prachF,prach2,1);
-          // here we have |empty | Prach1536 |
-          memmove(prach2+(1536<<1),prach2,(1536<<2));
-          // here we have |empty | Prach1536 | Prach1536| empty1536 | empty1536 | empty1536 | empty1536
-          memmove(prach2+(1536<<2),prach2,(1536<<3));
-          // here we have |empty | Prach1536 | Prach1536| Prach1536 | Prach1536 | empty1536 | empty1536
-          memmove(prach2+(1536<<3),prach2,(1536<<3));
-          // here we have |empty | Prach1536 | Prach1536| Prach1536 | Prach1536 | Prach1536 | Prach1536
-          memmove(prach,prach+(1536<<1),(Ncp<<2));
-          // here we have |Prefix | Prach1536 |
-          prach_len = (1536*6)+Ncp;
-        } else if (prach_fmt_id == 8) { // 12x1536
-          idft(IDFT_1536,prachF,prach2,1);
-          // here we have |empty | Prach1536 |
-          memmove(prach2+(1536<<1),prach2,(1536<<2));
-          // here we have |empty | Prach1536 | Prach1536| empty1536 | empty1536 | empty1536 | empty1536
-          memmove(prach2+(1536<<2),prach2,(1536<<3));
-          // here we have |empty | Prach1536 | Prach1536| Prach1536 | Prach1536 | empty1536 | empty1536
-          memmove(prach2+(1536<<3),prach2,(1536<<3));
-          // here we have |empty | Prach1536 | Prach1536| Prach1536 | Prach1536 | Prach1536 | Prach1536
-          memmove(prach2+(1536<<1)*6,prach2,(1536<<2)*6);
-          // here we have |empty | Prach1536 | Prach1536| Prach1536 | Prach1536 | Prach1536 | Prach1536 | Prach1536 | Prach1536| Prach1536 | Prach1536 | Prach1536 | Prach1536|
-          memmove(prach,prach+(1536<<1),(Ncp<<2));
-          // here we have |Prefix | Prach1536 | Prach1536| Prach1536 | Prach1536 | Prach1536 | Prach1536 | Prach1536 | Prach1536| Prach1536 | Prach1536 | Prach1536 | Prach1536|
-          prach_len = (1536*12)+Ncp;
-        }
-      }
-      break;
+  case 92160:
+    // 50, 60, 70, 80, 90 MHz @ 92.16 Ms/s
+    Ncp *= 3;
+    dftlen *= 3;
+    break;
 
-    case 122880: // full sampling @ 122.88 Ms/s
-      Ncp<<=2; //to account for 122.88Mbps
-      // This is after cyclic prefix
-      prach2 = prach+(Ncp<<1); //times 2 for complex samples
-      if (prach_sequence_length == 0){
-        if (prach_fmt_id == 0) { //24576 samples @ 30.72 Ms/s, 98304 samples @ 122.88 Ms/s
-          idft(IDFT_98304,prachF,prach2,1);
-          // here we have |empty | Prach98304|
-          memmove(prach,prach+(98304<<1),(Ncp<<2));
-          // here we have |Prefix | Prach98304|
-          prach_len = (98304*1)+Ncp;
-        } else if (prach_fmt_id == 1) {
-          idft(IDFT_98304,prachF,prach2,1);
-          memmove(prach2+(98304<<1),prach2,(98304<<2));
-          // here we have |empty | Prach98304 | Prach98304|
-          memmove(prach,prach+(98304<<2),(Ncp<<2));
-          // here we have |Prefix | Prach98304 | Prach98304|
-          prach_len = (98304*2)+Ncp;
-        } else if (prach_fmt_id == 2) {
-          idft(IDFT_98304,prachF,prach2,1);
-          memmove(prach2+(98304<<1),prach2,(98304<<2));
-          // here we have |empty | Prach98304 | Prach98304| empty98304 | empty98304
-          memmove(prach2+(98304<<2),prach2,(98304<<3));
-          // here we have |empty | Prach98304 | Prach98304| Prach98304 | Prach98304
-          memmove(prach,prach+(98304<<3),(Ncp<<2));
-          // here we have |Prefix | Prach98304 | Prach98304| Prach98304 | Prach98304
-          prach_len = (98304*4)+Ncp;
-        } else if (prach_fmt_id == 3) { // 4x6144, Ncp 3168
-          idft(IDFT_24576,prachF,prach2,1);
-          memmove(prach2+(24576<<1),prach2,(24576<<2));
-          // here we have |empty | Prach24576 | Prach24576| empty24576 | empty24576
-          memmove(prach2+(24576<<2),prach2,(24576<<3));
-          // here we have |empty | Prach24576 | Prach24576| Prach24576 | Prach24576
-          memmove(prach,prach+(24576<<3),(Ncp<<2));
-          // here we have |Prefix | Prach24576 | Prach24576| Prach24576 | Prach24576
-          prach_len = (24576*4)+Ncp;
-        }
-      } else { // short sequence
-	if (use_extended_prach_prefix) 
-          Ncp+=64; // 16*kappa, kappa=4 for 122.88Msps
-	prach2 = prach+(Ncp<<1); //times 2 for complex samples
-        if (prach_fmt_id == 4 || prach_fmt_id == 7 || prach_fmt_id == 9) {
-          idft(IDFT_4096,prachF,prach2,1);
-          // here we have |empty | Prach4096 |
-          if (prach_fmt_id != 9) {
-            memmove(prach2+(4096<<1),prach2,(4096<<2));
-            prach_len = (4096*2)+Ncp; 
-          }	else 	prach_len = (4096*1)+Ncp;
-          memmove(prach,prach+(4096<<1),(Ncp<<2));
-          // here we have |Prefix | Prach4096 | Prach4096 (if ! 0xc0) |
-        } else if (prach_fmt_id == 5) { // 4x4096
-          idft(IDFT_4096,prachF,prach2,1);
-          // here we have |empty | Prach4096 |
-          memmove(prach2+(4096<<1),prach2,(4096<<2));
-          // here we have |empty | Prach4096 | Prach4096| empty4096 | empty4096 |
-          memmove(prach2+(4096<<2),prach2,(4096<<3));
-          // here we have |empty | Prach4096 | Prach4096| Prach4096 | Prach4096 |
-          memmove(prach,prach+(4096<<1),(Ncp<<2));
-          // here we have |Prefix | Prach4096 |
-          prach_len = (4096*4)+Ncp;
-        } else if (prach_fmt_id == 6) { // 6x4096
-          idft(IDFT_4096,prachF,prach2,1);
-          // here we have |empty | Prach4096 |
-          memmove(prach2+(4096<<1),prach2,(4096<<2));
-          // here we have |empty | Prach4096 | Prach4096| empty4096 | empty4096 | empty4096 | empty4096
-          memmove(prach2+(4096<<2),prach2,(4096<<3));
-          // here we have |empty | Prach4096 | Prach4096| Prach4096 | Prach4096 | empty4096 | empty4096
-          memmove(prach2+(4096<<3),prach2,(4096<<3));
-          // here we have |empty | Prach4096 | Prach4096| Prach4096 | Prach4096 | Prach4096 | Prach4096
-          memmove(prach,prach+(4096<<1),(Ncp<<2));
-          // here we have |Prefix | Prach4096 |
-          prach_len = (4096*6)+Ncp;
-        } else if (prach_fmt_id == 8) { // 12x4096
-          idft(IDFT_4096,prachF,prach2,1);
-          // here we have |empty | Prach4096 |
-          memmove(prach2+(4096<<1),prach2,(4096<<2));
-          // here we have |empty | Prach4096 | Prach4096| empty4096 | empty4096 | empty4096 | empty4096
-          memmove(prach2+(4096<<2),prach2,(4096<<3));
-          // here we have |empty | Prach4096 | Prach4096| Prach4096 | Prach4096 | empty4096 | empty4096
-          memmove(prach2+(4096<<3),prach2,(4096<<3));
-          // here we have |empty | Prach4096 | Prach4096| Prach4096 | Prach4096 | Prach4096 | Prach4096
-          memmove(prach2+(4096<<1)*6,prach2,(4096<<2)*6);
-          // here we have |empty | Prach4096 | Prach4096| Prach4096 | Prach4096 | Prach4096 | Prach4096 | Prach4096 | Prach4096| Prach4096 | Prach4096 | Prach4096 | Prach4096|
-          memmove(prach,prach+(4096<<1),(Ncp<<2));
-          // here we have |Prefix | Prach4096 | Prach4096| Prach4096 | Prach4096 | Prach4096 | Prach4096 | Prach4096 | Prach4096| Prach4096 | Prach4096 | Prach4096 | Prach4096|
-          prach_len = (4096*12)+Ncp;
-        }
-      }
-      break;
+  case 122880:
+    // 70, 80, 90, 100 MHz @ 122.88 Ms/s
+    Ncp <<= 2;
+    dftlen <<= 2;
+    break;
 
-    case 92160: // three quarter sampling @ 92.16 Ms/s
-      Ncp = (Ncp*3); //to account for 92.16 Msps
-      prach2 = prach+(Ncp<<1); //times 2 for complex samples
-      if (prach_sequence_length == 0){
-        if (prach_fmt_id == 0) {
-          idft(IDFT_73728,prachF,prach2,1);
-          // here we have |empty | Prach73728|
-          memmove(prach,prach+(73728<<1),(Ncp<<2));
-          // here we have |Prefix | Prach73728|
-          prach_len = (73728*1)+Ncp;
-        } else if (prach_fmt_id == 1) {
-          idft(IDFT_73728,prachF,prach2,1);
-          memmove(prach2+(73728<<1),prach2,(73728<<2));
-          // here we have |empty | Prach73728 | Prach73728|
-          memmove(prach,prach+(73728<<2),(Ncp<<2));
-          // here we have |Prefix | Prach73728 | Prach73728|
-          prach_len = (73728*2)+Ncp;
-        } if (prach_fmt_id == 2) {
-          idft(IDFT_73728,prachF,prach2,1);
-          memmove(prach2+(73728<<1),prach2,(73728<<2));
-          // here we have |empty | Prach73728 | Prach73728| empty73728 | empty73728
-          memmove(prach2+(73728<<2),prach2,(73728<<3));
-          // here we have |empty | Prach73728 | Prach73728| Prach73728 | Prach73728
-          memmove(prach,prach+(73728<<3),(Ncp<<2));
-          // here we have |Prefix | Prach73728 | Prach73728| Prach73728 | Prach73728
-          prach_len = (73728*4)+Ncp;
-        } else if (prach_fmt_id == 3) {
-          idft(IDFT_18432,prachF,prach2,1);
-          memmove(prach2+(18432<<1),prach2,(18432<<2));
-          // here we have |empty | Prach18432 | Prach18432| empty18432 | empty18432
-          memmove(prach2+(18432<<2),prach2,(18432<<3));
-          // here we have |empty | Prach18432 | Prach18432| Prach18432 | Prach18432
-          memmove(prach,prach+(18432<<3),(Ncp<<2));
-          // here we have |Prefix | Prach18432 | Prach18432| Prach18432 | Prach18432
-          prach_len = (18432*4)+Ncp;
-        }
-      } else { // short sequence
-	if (use_extended_prach_prefix) 
-          Ncp+=48; // 16*kappa, kappa=3 for 92.16Msps 
-	prach2 = prach+(Ncp<<1); //times 2 for complex samples
-	if (prach_fmt_id == 4 || prach_fmt_id == 7 || prach_fmt_id == 9) {
-          idft(IDFT_3072,prachF,prach2,1);
-          // here we have |empty | Prach3072 |
-          if (prach_fmt_id != 9) {
-            memmove(prach2+(3072<<1),prach2,(3072<<2));
-            prach_len = (3072*2)+Ncp;
-          } else 	  prach_len = (3072*1)+Ncp;
-	  memmove(prach,prach+(3072<<1),(Ncp<<2));
-	  // here we have |Prefix | Prach3072 | Prach3072 (if ! 0xc0) |
-        } else if (prach_fmt_id == 6) { // 6x3072
-          idft(IDFT_3072,prachF,prach2,1);
-          // here we have |empty | Prach3072 |
-          memmove(prach2+(3072<<1),prach2,(3072<<2));
-          // here we have |empty | Prach3072 | Prach3072| empty3072 | empty3072 | empty3072 | empty3072
-          memmove(prach2+(3072<<2),prach2,(3072<<3));
-          // here we have |empty | Prach3072 | Prach3072| Prach3072 | Prach3072 | empty3072 | empty3072
-          memmove(prach2+(3072<<3),prach2,(3072<<3));
-          // here we have |empty | Prach3072 | Prach3072| Prach3072 | Prach3072 | Prach3072 | Prach3072
-          memmove(prach,prach+(3072<<1),(Ncp<<2));
-          // here we have |Prefix | Prach3072 |
-          prach_len = (3072*6)+Ncp;
-        } else if (prach_fmt_id == 5) { // 4x3072
-          idft(IDFT_3072,prachF,prach2,1);
-          // here we have |empty | Prach3072 |
-          memmove(prach2+(3072<<1),prach2,(3072<<2));
-          // here we have |empty | Prach3072 | Prach3072| empty3072 | empty3072 |
-          memmove(prach2+(3072<<2),prach2,(3072<<3));
-          // here we have |empty | Prach3072 | Prach3072| Prach3072 | Prach3072 |
-          memmove(prach,prach+(3072<<1),(Ncp<<2));
-          // here we have |Prefix | Prach3072 |
-          prach_len = (3072*4)+Ncp;
-        } else if (prach_fmt_id == 6) { // 12x3072
-          idft(IDFT_3072,prachF,prach2,1);
-          // here we have |empty | Prach3072 |
-          memmove(prach2+(3072<<1),prach2,(3072<<2));
-          // here we have |empty | Prach3072 | Prach3072| empty3072 | empty3072 | empty3072 | empty3072
-          memmove(prach2+(3072<<2),prach2,(3072<<3));
-          // here we have |empty | Prach3072 | Prach3072| Prach3072 | Prach3072 | empty3072 | empty3072
-          memmove(prach2+(3072<<3),prach2,(3072<<3));
-          // here we have |empty | Prach3072 | Prach3072| Prach3072 | Prach3072 | Prach3072 | Prach3072
-          memmove(prach2+(3072<<1)*6,prach2,(3072<<2)*6);
-          // here we have |empty | Prach3072 | Prach3072| Prach3072 | Prach3072 | Prach3072 | Prach3072 | Prach3072 | Prach3072| Prach3072 | Prach3072 | Prach3072 | Prach3072|
-          memmove(prach,prach+(3072<<1),(Ncp<<2));
-          // here we have |Prefix | Prach3072 | Prach3072| Prach3072 | Prach3072 | Prach3072 | Prach3072 | Prach3072 | Prach3072| Prach3072 | Prach3072 | Prach3072 | Prach3072|
-          prach_len = (3072*12)+Ncp;
-        }
-      }
-      break;
+  default:
+    AssertFatal(1==0,"sample rate %f MHz not supported for numerology %d\n", fp->samples_per_subframe / 1000.0, mu);
+  }
 
-    default:
-      AssertFatal(1==0,"sample rate %f MHz not supported for numerology %d\n", fp->samples_per_subframe / 1000.0, mu);
+  #ifdef NR_PRACH_DEBUG
+    LOG_I(PHY, "PRACH [UE %d] Ncp %d, dftlen %d \n", Mod_id, Ncp, dftlen);
+  #endif
+
+  /********************************************************
+   *
+   * In function init_prach_tables:
+   * to compute quantized roots of unity ru(n) = 32767 * exp j*[ (2 * PI * n) / N_ZC ]
+   *
+   * In compute_prach_seq:
+   * to calculate Xu = DFT xu = xu (inv_u*k) * Xu[0] (This is a Zadoff-Chou sequence property: DFT ZC sequence is another ZC sequence)
+   *
+   * In generate_prach:
+   * to do the cyclic-shifted DFT by multiplying Xu[k] * ru[k*preamble_shift] as:
+   * If X[k] = DFT x(n) -> X_shifted[k] = DFT x(n+preamble_shift) = X[k] * exp -j*[ (2*PI*k*preamble_shift) / N_ZC ]
+   *
+   *********************************************************/
+
+  Xu = (int16_t*)ue->X_u[preamble_offset-first_nonzero_root_idx];
+
+  #if defined (PRACH_WRITE_OUTPUT_DEBUG)
+    LOG_M("X_u.m", "X_u", (int16_t*)ue->X_u[preamble_offset-first_nonzero_root_idx], N_ZC, 1, 1);
+  #endif
+
+  for (offset=0,offset2=0; offset<N_ZC; offset++,offset2+=preamble_shift) {
+
+    if (offset2 >= N_ZC)
+      offset2 -= N_ZC;
+
+    Xu_re = (((int32_t)Xu[offset<<1]*amp)>>15);
+    Xu_im = (((int32_t)Xu[1+(offset<<1)]*amp)>>15);
+    prachF[k++]= ((Xu_re*nr_ru[offset2<<1]) - (Xu_im*nr_ru[1+(offset2<<1)]))>>15;
+    prachF[k++]= ((Xu_im*nr_ru[offset2<<1]) + (Xu_re*nr_ru[1+(offset2<<1)]))>>15;
+
+    if (k==dftlen) k=0;
+  }
+
+  #if defined (PRACH_WRITE_OUTPUT_DEBUG)
+    LOG_M("prachF.m", "prachF", &prachF[1804], 1024, 1, 1);
+    LOG_M("Xu.m", "Xu", Xu, N_ZC, 1, 1);
+  #endif
+
+  // This is after cyclic prefix
+  prach2 = prach+(2*Ncp); // times 2 for complex samples
+  const idft_size_idx_t idft_size = get_idft(dftlen);
+  idft(idft_size, prachF, prach, 1);
+  memmove(prach2, prach, (dftlen<<2));
+
+  if (prach_sequence_length == 0) {
+    if (prach_fmt_id == 0) {
+      // here we have | empty  | Prach |
+      memcpy(prach, prach+(dftlen<<1), (Ncp<<2));
+      // here we have | Prefix | Prach |
+      prach_len = dftlen+Ncp;
+    } else if (prach_fmt_id == 1) {
+      // here we have | empty  | Prach | empty |
+      memcpy(prach2+(dftlen<<1), prach2, (dftlen<<2));
+      // here we have | empty  | Prach | Prach |
+      memcpy(prach, prach+(dftlen<<2), (Ncp<<2));
+      // here we have | Prefix | Prach | Prach |
+      prach_len = (dftlen*2)+Ncp;
+    } else if (prach_fmt_id == 2 || prach_fmt_id == 3) {
+      // here we have | empty  | Prach | empty | empty | empty |
+      memcpy(prach2+(dftlen<<1), prach2, (dftlen<<2));
+      // here we have | empty  | Prach | Prach | empty | empty |
+      memcpy(prach2+(dftlen<<2), prach2, (dftlen<<3));
+      // here we have | empty  | Prach | Prach | Prach | Prach |
+      memcpy(prach, prach+(dftlen<<3), (Ncp<<2));
+      // here we have | Prefix | Prach | Prach | Prach | Prach |
+      prach_len = (dftlen*4)+Ncp;
+    }
+  } else { // short PRACH sequence
+    if (prach_fmt_id == 9) {
+      // here we have | empty  | Prach |
+      memcpy(prach, prach+(dftlen<<1), (Ncp<<2));
+      // here we have | Prefix | Prach |
+      prach_len = (dftlen*1)+Ncp;
+    } else if (prach_fmt_id == 4 || prach_fmt_id == 7) {
+      // here we have | empty  | Prach | empty |
+      memcpy(prach2+(dftlen<<1), prach2, (dftlen<<2));
+      // here we have | empty  | Prach | Prach |
+      memcpy(prach, prach+(dftlen<<1), (Ncp<<2));
+      // here we have | Prefix | Prach | Prach |
+      prach_len = (dftlen*2)+Ncp;
+    } else if (prach_fmt_id == 5) { // 4xdftlen
+      // here we have | empty  | Prach | empty | empty | empty |
+      memcpy(prach2+(dftlen<<1), prach2, (dftlen<<2));
+      // here we have | empty  | Prach | Prach | empty | empty |
+      memcpy(prach2+(dftlen<<2), prach2, (dftlen<<3));
+      // here we have | empty  | Prach | Prach | Prach | Prach |
+      memcpy(prach, prach+(dftlen<<1), (Ncp<<2));
+      // here we have | Prefix | Prach | Prach | Prach | Prach |
+      prach_len = (dftlen*4)+Ncp;
+    } else if (prach_fmt_id == 6) { // 6xdftlen
+      // here we have | empty  | Prach | empty | empty | empty | empty | empty |
+      memcpy(prach2+(dftlen<<1), prach2, (dftlen<<2));
+      // here we have | empty  | Prach | Prach | empty | empty | empty | empty |
+      memcpy(prach2+(dftlen<<2), prach2, (dftlen<<3));
+      // here we have | empty  | Prach | Prach | Prach | Prach | empty | empty |
+      memcpy(prach2+(dftlen<<3), prach2, (dftlen<<3));
+      // here we have | empty  | Prach | Prach | Prach | Prach | Prach | Prach |
+      memcpy(prach, prach+(dftlen<<1), (Ncp<<2));
+      // here we have | Prefix | Prach | Prach | Prach | Prach | Prach | Prach |
+      prach_len = (dftlen*6)+Ncp;
+    } else if (prach_fmt_id == 8) { // 12xdftlen
+      // here we have | empty  | Prach | empty | empty | empty | empty | empty | empty | empty | empty | empty | empty | empty |
+      memcpy(prach2+(dftlen<<1), prach2, (dftlen<<2));
+      // here we have | empty  | Prach | Prach | empty | empty | empty | empty | empty | empty | empty | empty | empty | empty |
+      memcpy(prach2+(dftlen<<2), prach2, (dftlen<<3));
+      // here we have | empty  | Prach | Prach | Prach | Prach | empty | empty | empty | empty | empty | empty | empty | empty |
+      memcpy(prach2+(dftlen<<3), prach2, (dftlen<<3));
+      // here we have | empty  | Prach | Prach | Prach | Prach | Prach | Prach | empty | empty | empty | empty | empty | empty |
+      memcpy(prach2+(dftlen<<1)*6, prach2, (dftlen<<2)*6);
+      // here we have | empty  | Prach | Prach | Prach | Prach | Prach | Prach | Prach | Prach | Prach | Prach | Prach | Prach |
+      memcpy(prach, prach+(dftlen<<1), (Ncp<<2));
+      // here we have | Prefix | Prach | Prach | Prach | Prach | Prach | Prach | Prach | Prach | Prach | Prach | Prach | Prach |
+      prach_len = (dftlen*12)+Ncp;
     }
   }
 
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
index 72fa255955b06ef2c8d09bb10761700002e4c217..6d99ac9b8c234c7562aa00dcf912d3c32968a966 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
@@ -63,10 +63,12 @@ void free_nr_ue_dlsch(NR_UE_DLSCH_t **dlsch, uint16_t N_RB_DL);
 */
 NR_UE_DLSCH_t *new_nr_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint8_t max_turbo_iterations,uint16_t N_RB_DL);
 
+void free_nr_ue_ulsch(NR_UE_ULSCH_t **ulschptr,
+                      uint16_t N_RB_UL,
+                      NR_DL_FRAME_PARMS* frame_parms);
 
-void free_nr_ue_ulsch(NR_UE_ULSCH_t **ulsch, uint16_t N_RB_UL);
 
-NR_UE_ULSCH_t *new_nr_ue_ulsch(uint16_t N_RB_UL, int number_of_harq_pids);
+NR_UE_ULSCH_t *new_nr_ue_ulsch(uint16_t N_RB_UL, int number_of_harq_pids, NR_DL_FRAME_PARMS* frame_parms);
 
 /** \brief This function computes the LLRs for ML (max-logsum approximation) dual-stream QPSK/QPSK reception.
     @param stream0_in Input from channel compensated (MR combined) stream 0
@@ -707,7 +709,8 @@ unsigned short nr_dlsch_extract_rbs_single(int **rxdataF,
                                         unsigned short nb_rb_pdsch,
                                         uint8_t n_dmrs_cdm_groups,
                                         NR_DL_FRAME_PARMS *frame_parms,
-                                        uint16_t dlDmrsSymbPos);
+                                        uint16_t dlDmrsSymbPos,
+                                        int chest_time_type);
 
 /** \fn dlsch_extract_rbs_multiple(int32_t **rxdataF,
     int32_t **dl_ch_estimates,
@@ -745,7 +748,8 @@ void nr_dlsch_extract_rbs(int **rxdataF,
                                         uint8_t n_dmrs_cdm_groups,
                                         uint8_t Nl,
                                         NR_DL_FRAME_PARMS *frame_parms,
-                                        uint16_t dlDmrsSymbPos);
+                                        uint16_t dlDmrsSymbPos,
+                                        int chest_time_type);
 
 /** \fn dlsch_extract_rbs_TM7(int32_t **rxdataF,
     int32_t **dl_bf_ch_estimates,
@@ -851,10 +855,6 @@ void construct_HhH_elements(int *ch0conj_ch0,
                          int32_t *after_mf_11,
                          unsigned short nb_rb);
 
-void squared_matrix_element(int32_t *Hh_h_00,
-                            int32_t *Hh_h_00_sq,
-                            unsigned short nb_rb);
-
 void dlsch_channel_level_TM34_meas(int *ch00,
                                    int *ch01,
                                    int *ch10,
@@ -881,19 +881,15 @@ void nr_dlsch_detection_mrc(int **rxdataF_comp,
                             unsigned short nb_rb,
                             int length);
 
-void det_HhH(int32_t *after_mf_00,
-             int32_t *after_mf_01,
-             int32_t *after_mf_10,
-             int32_t *after_mf_11,
-             int32_t *det_fin_128,
-             unsigned short nb_rb);
+void nr_conjch0_mult_ch1(int *ch0,
+                         int *ch1,
+                         int32_t *ch0conj_ch1,
+                         unsigned short nb_rb,
+                         unsigned char output_shift0);
 
-void numer(int32_t *Hh_h_00_sq,
-           int32_t *Hh_h_01_sq,
-           int32_t *Hh_h_10_sq,
-           int32_t *Hh_h_11_sq,
-           int32_t *num_fin,
-           unsigned short nb_rb);
+void nr_a_sum_b(__m128i *input_x,
+                __m128i *input_y,
+                unsigned short nb_rb);
 
 uint8_t rank_estimation_tm3_tm4(int *dl_ch_estimates_00,
                                 int *dl_ch_estimates_01,
@@ -1011,8 +1007,7 @@ uint32_t  nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
                          uint16_t nb_symb_sch,
                          uint8_t nr_slot_rx,
                          uint8_t harq_pid,
-                         uint8_t is_crnti,
-                         uint8_t llr8_flag);
+                         uint8_t is_crnti);
 
 int nr_ulsch_encoding(PHY_VARS_NR_UE *ue,
                      NR_UE_ULSCH_t *ulsch,
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h
index 4086f60f02e956f5f2fe4c10bea0f5f9a7cbbf8b..96f31a1624be335f01edb38492edc5ad05dd34d5 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h
@@ -84,9 +84,9 @@ typedef struct {
   /// Pointer to the payload + CRC 
   uint8_t *b;
   /// Pointers to transport block segments
-  uint8_t *c[MAX_NUM_NR_ULSCH_SEGMENTS];
+  uint8_t **c;
   /// LDPC-code outputs
-  uint8_t *d[MAX_NUM_NR_ULSCH_SEGMENTS];
+  uint8_t **d;
   /// LDPC-code outputs (TS 36.212 V15.4.0, Sec 5.3.2 p. 17)
   uint8_t *e;
   /// Rate matching (Interleaving) outputs (TS 36.212 V15.4.0, Sec 5.4.2.2 p. 30)
@@ -161,15 +161,13 @@ typedef struct {
   //uint8_t num_cba_dci[10];
   /// allocated CBA RNTI
   //uint16_t cba_rnti[4];//NUM_MAX_CBA_GROUP];
-  /// UL max-harq-retransmission
-  uint16_t Mlimit;
 } NR_UE_ULSCH_t;
 
 typedef struct {
   /// Indicator of first reception
   uint8_t first_rx;
   /// Last Ndi received for this process on DCI (used for C-RNTI only)
-  uint8_t DCINdi;
+  uint8_t Ndi;
   /// DLSCH status flag indicating
   SCH_status_t status;
   /// Transport block size
@@ -241,10 +239,6 @@ typedef struct {
   vrb_t vrb_type;
   /// downlink power offset field
   uint8_t dl_power_off;
-  /// trials per round statistics
-  uint32_t trials[8];
-  /// error statistics per round
-  uint32_t errors[8];
   /// codeword this transport block is mapped to
   uint8_t codeword;
   /// HARQ-ACKs
@@ -260,6 +254,7 @@ typedef struct {
   uint16_t ptrs_symbols;
   // PTRS symbol index, to be updated every PTRS symbol within a slot.
   uint8_t ptrs_symbol_index;
+  uint32_t tbslbrm;
   uint8_t nscid;
   uint16_t dlDmrsScramblingId;
   /// PDU BITMAP 
@@ -310,9 +305,7 @@ typedef struct {
   /// Maximum number of LDPC iterations
   uint8_t max_ldpc_iterations;
   /// number of iterations used in last turbo decoding
-  uint8_t last_iteration_cnt;  
-  /// Maximum number of HARQ rounds 
-  uint8_t Mlimit;
+  uint8_t last_iteration_cnt;
 } NR_UE_DLSCH_t;
 
 typedef enum {format0_0,
@@ -341,7 +334,7 @@ typedef struct {
   /// Position of first CCE of the dci
   int firstCCE;
   /// flag to indicate that this is a RA response
-  boolean_t ra_flag;
+  bool ra_flag;
   /// rnti
   rnti_t rnti;
   /// rnti type
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_ue_rf_helpers.c b/openair1/PHY/NR_UE_TRANSPORT/nr_ue_rf_helpers.c
index d3f362b90cc4aeb2c5af6773e1ac92241001b240..80b803779dcc0dff1c042e9d5527dd09f56a97e1 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_ue_rf_helpers.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_ue_rf_helpers.c
@@ -67,7 +67,7 @@ void nr_rf_card_config_gain(openair0_config_t *openair0_cfg,
     openair0_cfg->autocal[i] = 1;
 
     if (i < openair0_cfg->rx_num_channels) {
-      LOG_I(PHY, "HW: Configuring channel %d (rf_chain %d): setting tx_gain %f, rx_gain %f\n",
+      LOG_I(PHY, "HW: Configuring channel %d (rf_chain %d): setting tx_gain %.0f, rx_gain %.0f\n",
         i,
         rf_chain,
         openair0_cfg->tx_gain[i],
@@ -103,11 +103,12 @@ void nr_rf_card_config_freq(openair0_config_t *openair0_cfg,
     openair0_cfg->autocal[i] = 1;
 
     if (i < openair0_cfg->rx_num_channels) {
-      LOG_I(PHY, "HW: Configuring channel %d (rf_chain %d): setting tx_freq %f Hz, rx_freq %f Hz\n",
+      LOG_I(PHY, "HW: Configuring channel %d (rf_chain %d): setting tx_freq %.0f Hz, rx_freq %.0f Hz, tune_offset %.0f\n",
         i,
         rf_chain,
         openair0_cfg->tx_freq[i],
-        openair0_cfg->rx_freq[i]);
+        openair0_cfg->rx_freq[i],
+        openair0_cfg->tune_offset);
     }
 
   }
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c
index 87ba2090e7c1997209b2008939595a615ef1b158..ef952b01529a890764a7f81948757f7f533fe229 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c
@@ -43,10 +43,10 @@
 
 //#define DEBUG_ULSCH_CODING
 
-void free_nr_ue_ulsch(NR_UE_ULSCH_t **ulschptr, uint16_t N_RB_UL)
+void free_nr_ue_ulsch(NR_UE_ULSCH_t **ulschptr,
+                      uint16_t N_RB_UL,
+                      NR_DL_FRAME_PARMS* frame_parms) {
 
-{
-  int i, r;
   NR_UE_ULSCH_t *ulsch = *ulschptr;
 
   if (ulsch) {
@@ -54,15 +54,15 @@ void free_nr_ue_ulsch(NR_UE_ULSCH_t **ulschptr, uint16_t N_RB_UL)
     printf("Freeing ulsch %p\n",ulsch);
 #endif
 
-  uint16_t a_segments = MAX_NUM_NR_ULSCH_SEGMENTS;  //number of segments to be allocated
-
-  if (N_RB_UL != 273) {
-    a_segments = a_segments*N_RB_UL;
-    a_segments = a_segments/273 +1;
-  }  
+    int max_layers = (frame_parms->nb_antennas_tx<NR_MAX_NB_LAYERS) ? frame_parms->nb_antennas_tx : NR_MAX_NB_LAYERS;
+    uint16_t a_segments = MAX_NUM_NR_ULSCH_SEGMENTS_PER_LAYER*max_layers;  //number of segments to be allocated
 
+    if (N_RB_UL != 273) {
+      a_segments = a_segments*N_RB_UL;
+      a_segments = a_segments/273 +1;
+    }
 
-    for (i=0; i<NR_MAX_ULSCH_HARQ_PROCESSES; i++) {
+    for (int i=0; i<NR_MAX_ULSCH_HARQ_PROCESSES; i++) {
       if (ulsch->harq_processes[i]) {
 
         if (ulsch->harq_processes[i]->a) {
@@ -81,7 +81,7 @@ void free_nr_ue_ulsch(NR_UE_ULSCH_t **ulschptr, uint16_t N_RB_UL)
           free16(ulsch->harq_processes[i]->f,14*N_RB_UL*12*8);
           ulsch->harq_processes[i]->f = NULL;
         }
-        for (r=0; r<a_segments; r++) {
+        for (int r=0; r<a_segments; r++) {
           if (ulsch->harq_processes[i]->c[r]) {
             free16(ulsch->harq_processes[i]->c[r],((r==0)?8:0) + 3+768);
             ulsch->harq_processes[i]->c[r] = NULL;
@@ -94,6 +94,15 @@ void free_nr_ue_ulsch(NR_UE_ULSCH_t **ulschptr, uint16_t N_RB_UL)
 
         }
 
+        if (ulsch->harq_processes[i]->c) {
+          free16(ulsch->harq_processes[i]->c,a_segments);
+          ulsch->harq_processes[i]->c = NULL;
+        }
+        if (ulsch->harq_processes[i]->d) {
+          free16(ulsch->harq_processes[i]->d,a_segments);
+          ulsch->harq_processes[i]->d = NULL;
+        }
+
         free16(ulsch->harq_processes[i],sizeof(NR_UL_UE_HARQ_t));
         ulsch->harq_processes[i] = NULL;
       }
@@ -101,13 +110,13 @@ void free_nr_ue_ulsch(NR_UE_ULSCH_t **ulschptr, uint16_t N_RB_UL)
     free16(ulsch,sizeof(NR_UE_ULSCH_t));
     *ulschptr = NULL;
   }
-
 }
 
 
-NR_UE_ULSCH_t *new_nr_ue_ulsch(uint16_t N_RB_UL, int number_of_harq_pids)
-{
-  uint16_t a_segments = MAX_NUM_NR_ULSCH_SEGMENTS;  //number of segments to be allocated
+NR_UE_ULSCH_t *new_nr_ue_ulsch(uint16_t N_RB_UL, int number_of_harq_pids, NR_DL_FRAME_PARMS* frame_parms) {
+
+  int max_layers = (frame_parms->nb_antennas_tx<NR_MAX_NB_LAYERS) ? frame_parms->nb_antennas_tx : NR_MAX_NB_LAYERS;
+  uint16_t a_segments = MAX_NUM_NR_ULSCH_SEGMENTS_PER_LAYER*max_layers;  //number of segments to be allocated
 
   if (N_RB_UL != 273) {
     a_segments = a_segments*N_RB_UL;
@@ -121,10 +130,6 @@ NR_UE_ULSCH_t *new_nr_ue_ulsch(uint16_t N_RB_UL, int number_of_harq_pids)
   memset(ulsch, 0, sizeof(*ulsch));
 
   ulsch->number_harq_processes_for_pusch = NR_MAX_ULSCH_HARQ_PROCESSES;
-  ulsch->Mlimit = 4; // maximum harq retransmissions
-
-  //for (i=0; i<10; i++)
-    //ulsch->harq_ids[i] = 0;
 
   for (int i = 0; i < number_of_harq_pids; i++) {
 
@@ -140,6 +145,8 @@ NR_UE_ULSCH_t *new_nr_ue_ulsch(uint16_t N_RB_UL, int number_of_harq_pids)
     DevAssert(ulsch->harq_processes[i]->b);
     bzero(ulsch->harq_processes[i]->b,ulsch_bytes);
 
+    ulsch->harq_processes[i]->c = malloc16(a_segments*sizeof(uint8_t *));
+    ulsch->harq_processes[i]->d = malloc16(a_segments*sizeof(uint16_t *));
     for (int r = 0; r < a_segments; r++) {
       // account for filler in first segment and CRCs for multiple segment case
       ulsch->harq_processes[i]->c[r] = malloc16(8448);
@@ -171,8 +178,8 @@ int nr_ulsch_encoding(PHY_VARS_NR_UE *ue,
                       NR_UE_ULSCH_t *ulsch,
                       NR_DL_FRAME_PARMS* frame_parms,
                       uint8_t harq_pid,
-                      unsigned int G)
-{
+                      unsigned int G) {
+
   start_meas(&ue->ulsch_encoding_stats);
 
 /////////////////////////parameters and variables initialization/////////////////////////
@@ -181,23 +188,22 @@ int nr_ulsch_encoding(PHY_VARS_NR_UE *ue,
   unsigned int crc = 1;
   NR_UL_UE_HARQ_t *harq_process = ulsch->harq_processes[harq_pid];
   uint16_t nb_rb = harq_process->pusch_pdu.rb_size;
-  uint32_t A = harq_process->pusch_pdu.pusch_data.tb_size*8;
+  uint32_t A = harq_process->pusch_pdu.pusch_data.tb_size<<3;
   uint32_t *pz = &harq_process->Z;
-  uint8_t mod_order = nr_get_Qm_ul(harq_process->pusch_pdu.mcs_index, harq_process->pusch_pdu.mcs_table);
-  uint16_t R = nr_get_code_rate_ul(harq_process->pusch_pdu.mcs_index, harq_process->pusch_pdu.mcs_table);
+  uint8_t mod_order = harq_process->pusch_pdu.qam_mod_order;
   uint16_t Kr=0;
   uint32_t r_offset=0;
   uint32_t F=0;
-  uint8_t Ilbrm = 0;
-  uint32_t Tbslbrm = 950984; //max tbs
-  float Coderate = 0.0;
+  // target_code_rate is in 0.1 units
+  float Coderate = (float) harq_process->pusch_pdu.target_code_rate / 10240.0f;
+
 ///////////
 /////////////////////////////////////////////////////////////////////////////////////////  
 
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_UE_ULSCH_ENCODING, VCD_FUNCTION_IN);
 
   LOG_D(NR_PHY, "ulsch coding nb_rb %d, Nl = %d\n", nb_rb, harq_process->pusch_pdu.nrOfLayers);
-  LOG_D(NR_PHY, "ulsch coding A %d G %d mod_order %d\n", A, G, mod_order);
+  LOG_D(NR_PHY, "ulsch coding A %d G %d mod_order %d Coderate %f\n", A, G, mod_order, Coderate);
   LOG_D(NR_PHY, "harq_pid %d harq_process->ndi %d, pusch_data.new_data_indicator %d\n",
         harq_pid,harq_process->ndi,harq_process->pusch_pdu.pusch_data.new_data_indicator);
 
@@ -217,6 +223,8 @@ int nr_ulsch_encoding(PHY_VARS_NR_UE *ue,
     printf("\n");
    */ 
 
+    int max_payload_bytes = MAX_NUM_NR_ULSCH_SEGMENTS_PER_LAYER*harq_process->pusch_pdu.nrOfLayers*1056;
+
     if (A > 3824) {
       // Add 24-bit crc (polynomial A) to payload
       crc = crc24a(harq_process->a,A)>>8;
@@ -228,7 +236,7 @@ int nr_ulsch_encoding(PHY_VARS_NR_UE *ue,
 
       harq_process->B = A+24;
 
-      AssertFatal((A/8)+4 <= MAX_NR_ULSCH_PAYLOAD_BYTES,"A %d is too big (A/8+4 = %d > %d)\n",A,(A/8)+4,MAX_NR_ULSCH_PAYLOAD_BYTES);
+      AssertFatal((A/8)+4 <= max_payload_bytes,"A %d is too big (A/8+4 = %d > %d)\n",A,(A/8)+4,max_payload_bytes);
 
       memcpy(harq_process->b,harq_process->a,(A/8)+4);
     }
@@ -242,7 +250,7 @@ int nr_ulsch_encoding(PHY_VARS_NR_UE *ue,
 
       harq_process->B = A+16;
 
-      AssertFatal((A/8)+3 <= MAX_NR_ULSCH_PAYLOAD_BYTES,"A %d is too big (A/8+3 = %d > %d)\n",A,(A/8)+3,MAX_NR_ULSCH_PAYLOAD_BYTES);
+      AssertFatal((A/8)+3 <= max_payload_bytes,"A %d is too big (A/8+3 = %d > %d)\n",A,(A/8)+3,max_payload_bytes);
 
       memcpy(harq_process->b,harq_process->a,(A/8)+3);  // using 3 bytes to mimic the case of 24 bit crc
     }
@@ -252,11 +260,6 @@ int nr_ulsch_encoding(PHY_VARS_NR_UE *ue,
 ///////////////////////// b---->| block segmentation |---->c /////////////////////////
 ///////////
 
-    if (R<1024)
-      Coderate = (float) R /(float) 1024;
-    else
-      Coderate = (float) R /(float) 2048;
-
     if ((A <=292) || ((A<=3824) && (Coderate <= 0.6667)) || Coderate <= 0.25){
       harq_process->BG = 2;
     }
@@ -302,7 +305,7 @@ int nr_ulsch_encoding(PHY_VARS_NR_UE *ue,
       printf("start ldpc encoder segment %d/%d\n",r,harq_process->C);
       printf("input %d %d %d %d %d \n", harq_process->c[r][0], harq_process->c[r][1], harq_process->c[r][2],harq_process->c[r][3], harq_process->c[r][4]);
       for (int cnt =0 ; cnt < 22*(*pz)/8; cnt ++){
-      printf("%d ", harq_process->c[r][cnt]);
+        printf("%d ", harq_process->c[r][cnt]);
       }
       printf("\n");
 
@@ -376,12 +379,9 @@ int nr_ulsch_encoding(PHY_VARS_NR_UE *ue,
 
     uint32_t E = nr_get_E(G, harq_process->C, mod_order, harq_process->pusch_pdu.nrOfLayers, r);
 
-    Tbslbrm = nr_compute_tbslbrm(0,nb_rb,harq_process->pusch_pdu.nrOfLayers);
-
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_RATE_MATCHING_LDPC, VCD_FUNCTION_IN);
     start_meas(&ue->ulsch_rate_matching_stats);
-    if (nr_rate_matching_ldpc(Ilbrm,
-                              Tbslbrm,
+    if (nr_rate_matching_ldpc(0,
                               harq_process->BG,
                               *pz,
                               harq_process->d[r],
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c
index bab0c75aff198ee80778f809d62c3de80eb43ca9..eaeffd08099a987c9c848d9043fb5a862311dace 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c
@@ -38,6 +38,7 @@
 #include "PHY/MODULATION/nr_modulation.h"
 #include "PHY/MODULATION/modulation_common.h"
 #include "common/utils/assertions.h"
+#include "common/utils/nr/nr_common.h"
 #include "common/utils/LOG/vcd_signal_dumper.h"
 #include "PHY/NR_TRANSPORT/nr_transport_common_proto.h"
 #include "PHY/NR_TRANSPORT/nr_sch_dmrs.h"
@@ -114,15 +115,14 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
 
   LOG_D(PHY,"nr_ue_ulsch_procedures hard_id %d %d.%d\n",harq_pid,frame,slot);
 
-  uint32_t available_bits;
-  int32_t **txdataF;
   int8_t Wf[2], Wt[2];
   int l_prime[2], delta;
   uint8_t nb_dmrs_re_per_rb;
-  int ap, i;
+  int i;
   int sample_offsetF, N_RE_prime;
 
   NR_DL_FRAME_PARMS *frame_parms = &UE->frame_parms;
+  int32_t **txdataF = UE->common_vars.txdataF;
 
   int      N_PRB_oh = 0; // higher layer (RRC) parameter xOverhead in PUSCH-ServingCellConfig
   uint16_t number_dmrs_symbols = 0;
@@ -155,9 +155,8 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
 
   nb_dmrs_re_per_rb = ((dmrs_type == pusch_dmrs_type1) ? 6:4)*cdm_grps_no_data;
 
-  LOG_D(PHY,"ulsch %x : start_rb %d bwp_start %d start_sc %d start_symbol %d num_symbols %d cdmgrpsnodata %d num_dmrs %d dmrs_re_per_rb %d\n",
-        rnti,start_rb,pusch_pdu->bwp_start,start_sc,start_symbol,number_of_symbols,cdm_grps_no_data,number_dmrs_symbols,nb_dmrs_re_per_rb);
-
+  LOG_D(PHY,"ulsch TX %x : start_rb %d nb_rb %d mod_order %d Nl %d Tpmi %d bwp_start %d start_sc %d start_symbol %d num_symbols %d cdmgrpsnodata %d num_dmrs %d dmrs_re_per_rb %d\n",
+        rnti,start_rb,nb_rb,mod_order,Nl,pusch_pdu->Tpmi,pusch_pdu->bwp_start,start_sc,start_symbol,number_of_symbols,cdm_grps_no_data,number_dmrs_symbols,nb_dmrs_re_per_rb);
   // TbD num_of_mod_symbols is set but never used
   N_RE_prime = NR_NB_SC_PER_RB*number_of_symbols - nb_dmrs_re_per_rb*number_dmrs_symbols - N_PRB_oh;
   harq_process_ul_ue->num_of_mod_symbols = N_RE_prime*nb_rb;
@@ -172,7 +171,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
   trace_NRpdu(DIRECTION_UPLINK,
               harq_process_ul_ue->a,
               harq_process_ul_ue->pusch_pdu.pusch_data.tb_size,
-              0, WS_C_RNTI, rnti, frame, slot, 0, 0);
+              WS_C_RNTI, rnti, frame, slot, 0, 0);
 
   if (nr_ulsch_encoding(UE, ulsch_ue, frame_parms, harq_pid, G) == -1)
     return;
@@ -184,7 +183,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
   /////////////////////////ULSCH scrambling/////////////////////////
   ///////////
 
-  available_bits = G;
+  uint32_t available_bits = G;
   uint32_t scrambled_output[(available_bits>>5)+1];
   memset(scrambled_output, 0, ((available_bits>>5)+1)*sizeof(uint32_t));
 
@@ -201,7 +200,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
   /////////////////////////ULSCH modulation/////////////////////////
   ///////////
 
-  int max_num_re = number_of_symbols*nb_rb*NR_NB_SC_PER_RB;
+  int max_num_re = Nl*number_of_symbols*nb_rb*NR_NB_SC_PER_RB;
   int32_t d_mod[max_num_re] __attribute__ ((aligned(16)));
 
   nr_modulation(scrambled_output, // assume one codeword for the moment
@@ -209,7 +208,6 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
                 mod_order,
                 (int16_t *)d_mod);
 
-
     
   ///////////
   ////////////////////////////////////////////////////////////////////////
@@ -284,8 +282,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
   /// Transform-coded "y"-sequences (for definition see 38-211 V15.3.0 2018-09, subsection 6.3.1.4)
   int32_t y[max_num_re] __attribute__ ((aligned(16)));
 
-  // if  transform precoding is enbaled (value 0)
-  if (pusch_pdu->transform_precoding == 0) {
+  if (pusch_pdu->transform_precoding == transformPrecoder_enabled) {
 
     uint32_t nb_re_pusch=nb_rb * NR_NB_SC_PER_RB;
     uint32_t y_offset = 0;
@@ -315,20 +312,20 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
       LOG_D(PHY,"Transform precoding being done on data- symbol: %d, nb_re_pusch: %d, y_offset: %d\n", l, nb_re_pusch, y_offset);
 
 #ifdef DEBUG_PUSCH_MAPPING
-        printf("NR_ULSCH_UE: y_offset %d\t nb_re_pusch %d \t Symbol %d \t nb_rb %d \n",
-               y_offset, nb_re_pusch, l, nb_rb);
+      printf("NR_ULSCH_UE: y_offset %d\t nb_re_pusch %d \t Symbol %d \t nb_rb %d \n",
+             y_offset, nb_re_pusch, l, nb_rb);
 #endif
     }
 
 #ifdef DEBUG_DFT_IDFT
-    int32_t debug_symbols[max_num_re] __attribute__ ((aligned(16)));
+    int32_t debug_symbols[MAX_NUM_NR_RE] __attribute__ ((aligned(16)));
     int offset = 0;
     printf("NR_ULSCH_UE: available_bits: %d, mod_order: %d", available_bits,mod_order);
 
     for (int ll = 0; ll < (available_bits/mod_order); ll++) {
-      debug_symbols[ll] = y[ll];
+        debug_symbols[ll] = ulsch_ue->y[ll];     
     }
-
+      
     printf("NR_ULSCH_UE: numSym: %d, num_dmrs_sym: %d", number_of_symbols,number_dmrs_symbols);
     for (int ll = 0; ll < (number_of_symbols-number_dmrs_symbols); ll++) {
       nr_idft(&debug_symbols[offset], nb_re_pusch);
@@ -341,32 +338,33 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
 #endif
 
   }
-  else
-    memcpy(y, tx_layers[0], (available_bits/mod_order)*sizeof(int32_t));
   
-  for (int nl = 0; nl < Nl; nl++)
-    free_and_zero(tx_layers[nl]);
-  free_and_zero(tx_layers);
+  ///////////
+  ////////////////////////////////////////////////////////////////////////
+
+
 
   /////////////////////////ULSCH RE mapping/////////////////////////
   ///////////
 
-  txdataF = UE->common_vars.txdataF;
-
-  for (ap=0; ap< Nl; ap++) {
+  int encoded_length = frame_parms->N_RB_UL*14*NR_NB_SC_PER_RB*mod_order*Nl;
+  int16_t **tx_precoding = (int16_t **)malloc16_clear(Nl*sizeof(int16_t *));
+  for (int nl=0; nl<Nl; nl++)
+    tx_precoding[nl] = (int16_t *)malloc16_clear((encoded_length<<1)*sizeof(int16_t));
 
+  for (int nl=0; nl < Nl; nl++) {
     uint8_t k_prime = 0;
     uint16_t m = 0;
-
     
 #ifdef DEBUG_PUSCH_MAPPING
     printf("NR_ULSCH_UE: Value of CELL ID %d /t, u %d \n", frame_parms->Nid_cell, u);
 #endif
 
-    // DMRS params for this ap
-    get_Wt(Wt, ap, dmrs_type);
-    get_Wf(Wf, ap, dmrs_type);
-    delta = get_delta(ap, dmrs_type);
+    int dmrs_port = get_dmrs_port(nl,pusch_pdu->dmrs_ports);
+    // DMRS params for this dmrs port
+    get_Wt(Wt, dmrs_port, dmrs_type);
+    get_Wf(Wf, dmrs_port, dmrs_type);
+    delta = get_delta(dmrs_port, dmrs_type);
 
     for (int l=start_symbol; l<start_symbol+number_of_symbols; l++) {
 
@@ -379,8 +377,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
       if ((ul_dmrs_symb_pos >> l) & 0x01) {
         is_dmrs_sym = 1;
 
-        // transform precoding disabled (value 1)
-        if (pusch_pdu->transform_precoding == 1){
+        if (pusch_pdu->transform_precoding == transformPrecoder_disabled){
         
           if (dmrs_type == pusch_dmrs_type1)
             dmrs_idx = (pusch_pdu->bwp_start + start_rb)*6;
@@ -396,7 +393,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
         }
       } else if (pusch_pdu->pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_PTRS) {
 
-        AssertFatal(pusch_pdu->transform_precoding == 1, "PTRS NOT SUPPORTED IF TRANSFORM PRECODING IS ENABLED\n");
+        AssertFatal(pusch_pdu->transform_precoding == transformPrecoder_disabled, "PTRS NOT SUPPORTED IF TRANSFORM PRECODING IS ENABLED\n");
 
         if(is_ptrs_symbol(l, ulsch_ue->ptrs_symbols)) {
           is_ptrs_sym = 1;
@@ -405,7 +402,6 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
       }
 
       for (i=0; i< nb_rb*NR_NB_SC_PER_RB; i++) {
-
         uint8_t is_dmrs = 0;
         uint8_t is_ptrs = 0;
 
@@ -417,7 +413,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
         } else if (is_ptrs_sym) {
           is_ptrs = is_ptrs_subcarrier(k,
                                        rnti,
-                                       ap,
+                                       nl,
                                        dmrs_type,
                                        K_ptrs,
                                        nb_rb,
@@ -428,67 +424,146 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
 
         if (is_dmrs == 1) {
           // if transform precoding is enabled
-          if (pusch_pdu->transform_precoding == 0) {
-
-            ((int16_t*)txdataF[ap])[(sample_offsetF)<<1] = (Wt[l_prime[0]]*Wf[k_prime]*AMP*dmrs_seq[2*dmrs_idx]) >> 15;
-            ((int16_t*)txdataF[ap])[((sample_offsetF)<<1) + 1] = (Wt[l_prime[0]]*Wf[k_prime]*AMP*dmrs_seq[(2*dmrs_idx) + 1]) >> 15;
-
+          if (pusch_pdu->transform_precoding == transformPrecoder_enabled) {
+            ((int16_t*)tx_precoding[nl])[(sample_offsetF)<<1] = (Wt[l_prime[0]]*Wf[k_prime]*AMP*dmrs_seq[2*dmrs_idx]) >> 15;
+            ((int16_t*)tx_precoding[nl])[((sample_offsetF)<<1) + 1] = (Wt[l_prime[0]]*Wf[k_prime]*AMP*dmrs_seq[(2*dmrs_idx) + 1]) >> 15;
           } else {
-
-            ((int16_t*)txdataF[ap])[(sample_offsetF)<<1] = (Wt[l_prime[0]]*Wf[k_prime]*AMP*mod_dmrs[dmrs_idx<<1]) >> 15;
-            ((int16_t*)txdataF[ap])[((sample_offsetF)<<1) + 1] = (Wt[l_prime[0]]*Wf[k_prime]*AMP*mod_dmrs[(dmrs_idx<<1) + 1]) >> 15;
-
+            ((int16_t*)tx_precoding[nl])[(sample_offsetF)<<1] = (Wt[l_prime[0]]*Wf[k_prime]*AMP*mod_dmrs[dmrs_idx<<1]) >> 15;
+            ((int16_t*)tx_precoding[nl])[((sample_offsetF)<<1) + 1] = (Wt[l_prime[0]]*Wf[k_prime]*AMP*mod_dmrs[(dmrs_idx<<1) + 1]) >> 15;
           }
 
 #ifdef DEBUG_PUSCH_MAPPING
-          printf("dmrs_idx %d\t l %d \t k %d \t k_prime %d \t n %d \t dmrs: %d %d\n",
-                 dmrs_idx, l, k, k_prime, n, ((int16_t*)txdataF[ap])[(sample_offsetF)<<1],
-                 ((int16_t*)txdataF[ap])[((sample_offsetF)<<1) + 1]);
+          printf("DMRS: Layer: %d\t, dmrs_idx %d\t l %d \t k %d \t k_prime %d \t n %d \t dmrs: %d %d\n",
+                 nl, dmrs_idx, l, k, k_prime, n, ((int16_t*)tx_precoding[nl])[(sample_offsetF)<<1],
+                 ((int16_t*)tx_precoding[nl])[((sample_offsetF)<<1) + 1]);
 #endif
 
-
           dmrs_idx++;
           k_prime++;
           k_prime&=1;
           n+=(k_prime)?0:1;
-
+      
         }  else if (is_ptrs == 1) {
-
-          ((int16_t*)txdataF[ap])[(sample_offsetF)<<1] = (beta_ptrs*AMP*mod_ptrs[ptrs_idx<<1]) >> 15;
-          ((int16_t*)txdataF[ap])[((sample_offsetF)<<1) + 1] = (beta_ptrs*AMP*mod_ptrs[(ptrs_idx<<1) + 1]) >> 15;
-
+          ((int16_t*)tx_precoding[nl])[(sample_offsetF)<<1] = (beta_ptrs*AMP*mod_ptrs[ptrs_idx<<1]) >> 15;
+          ((int16_t*)tx_precoding[nl])[((sample_offsetF)<<1) + 1] = (beta_ptrs*AMP*mod_ptrs[(ptrs_idx<<1) + 1]) >> 15;
           ptrs_idx++;
-
         } else if (!is_dmrs_sym || allowed_xlsch_re_in_dmrs_symbol(k, start_sc, frame_parms->ofdm_symbol_size, cdm_grps_no_data, dmrs_type)) {
-
-          ((int16_t*)txdataF[ap])[(sample_offsetF)<<1]       = ((int16_t *) y)[m<<1];
-          ((int16_t*)txdataF[ap])[((sample_offsetF)<<1) + 1] = ((int16_t *) y)[(m<<1) + 1];
+          if (pusch_pdu->transform_precoding == transformPrecoder_disabled) {
+            ((int16_t*)tx_precoding[nl])[(sample_offsetF)<<1]       = ((int16_t *)tx_layers[nl])[m<<1];
+            ((int16_t*)tx_precoding[nl])[((sample_offsetF)<<1) + 1] = ((int16_t *)tx_layers[nl])[(m<<1) + 1];
+          }
+          else {
+            ((int16_t*)tx_precoding[nl])[(sample_offsetF)<<1]       = ((int16_t *) y)[m<<1];
+            ((int16_t*)tx_precoding[nl])[((sample_offsetF)<<1) + 1] = ((int16_t *) y)[(m<<1) + 1];
+          }
 
 #ifdef DEBUG_PUSCH_MAPPING
-          printf("m %d\t l %d \t k %d \t txdataF: %d %d\n",
-                 m, l, k, ((int16_t*)txdataF[ap])[(sample_offsetF)<<1],
-                 ((int16_t*)txdataF[ap])[((sample_offsetF)<<1) + 1]);
+          printf("DATA: layer %d\t m %d\t l %d \t k %d \t tx_precoding: %d %d\n",
+                 nl, m, l, k, ((int16_t*)tx_precoding[nl])[(sample_offsetF)<<1],
+                 ((int16_t*)tx_precoding[nl])[((sample_offsetF)<<1) + 1]);
 #endif
 
           m++;
 
         } else {
-
-          ((int16_t*)txdataF[ap])[(sample_offsetF)<<1]       = 0;
-          ((int16_t*)txdataF[ap])[((sample_offsetF)<<1) + 1] = 0;
-
+          ((int16_t*)tx_precoding[nl])[(sample_offsetF)<<1]       = 0;
+          ((int16_t*)tx_precoding[nl])[((sample_offsetF)<<1) + 1] = 0;
         }
 
         if (++k >= frame_parms->ofdm_symbol_size)
           k -= frame_parms->ofdm_symbol_size;
-      }
-    }
-  }
+      } //for (i=0; i< nb_rb*NR_NB_SC_PER_RB; i++) 
+    }//for (l=start_symbol; l<start_symbol+number_of_symbols; l++)
+  }//for (nl=0; nl < Nl; nl++)
+
+
+
+  /////////////////////////ULSCH precoding/////////////////////////
+  ///////////
+  ///Layer Precoding and Antenna port mapping
+  // tx_layers 0-3 are mapped on antenna ports
+  // The precoding info is supported by nfapi such as num_prgs, prg_size, prgs_list and pm_idx
+  // The same precoding matrix is applied on prg_size RBs, Thus
+  //        pmi = prgs_list[rbidx/prg_size].pm_idx, rbidx =0,...,rbSize-1
+  // The Precoding matrix:
+  for (int ap=0; ap<frame_parms->nb_antennas_tx; ap++) {
+    for (int l=start_symbol; l<start_symbol+number_of_symbols; l++) {
+      uint16_t k = start_sc;
+
+      for (int rb=0; rb<nb_rb; rb++) {
+        //get pmi info
+        uint8_t pmi=pusch_pdu->Tpmi;
+          
+        if (pmi == 0) {//unitary Precoding
+          if(ap< pusch_pdu->nrOfLayers)
+            memcpy((void*)&txdataF[ap][l*frame_parms->ofdm_symbol_size  + k],
+                   (void*)&tx_precoding[ap][2*(l*frame_parms->ofdm_symbol_size + k)],
+                   NR_NB_SC_PER_RB*sizeof(int32_t));
+          else
+            memset((void*)&txdataF[ap][l*frame_parms->ofdm_symbol_size + k],
+                   0,
+                   NR_NB_SC_PER_RB*sizeof(int32_t));
+
+          k += NR_NB_SC_PER_RB;
+          if (k >= frame_parms->ofdm_symbol_size) {
+            k -= frame_parms->ofdm_symbol_size;
+          }
+        }
+        else {
+          //get the precoding matrix weights:
+          char *W_prec;
+          switch (frame_parms->nb_antennas_tx) {
+            case 1://1 antenna port
+              W_prec = nr_W_1l_2p[pmi][ap];
+              break;
+            case 2://2 antenna ports
+              if (pusch_pdu->nrOfLayers == 1)//1 layer
+                W_prec = nr_W_1l_2p[pmi][ap];
+              else//2 layers
+                W_prec = nr_W_2l_2p[pmi][ap];
+              break;
+            case 4://4 antenna ports
+              if (pusch_pdu->nrOfLayers == 1)//1 layer
+                W_prec = nr_W_1l_4p[pmi][ap];
+              else if (pusch_pdu->nrOfLayers == 2)//2 layers
+                W_prec = nr_W_2l_4p[pmi][ap];
+              else if (pusch_pdu->nrOfLayers == 3)//3 layers
+                W_prec = nr_W_3l_4p[pmi][ap];
+              else//4 layers
+                W_prec = nr_W_4l_4p[pmi][ap];
+              break;
+            default:
+              LOG_D(PHY,"Precoding 1,2, or 4 antenna ports are currently supported\n");
+              W_prec = nr_W_1l_2p[pmi][ap];
+              break;
+          }
+
+          for (int i=0; i<NR_NB_SC_PER_RB; i++) {
+            int32_t re_offset = l*frame_parms->ofdm_symbol_size + k;
+            int32_t precodatatx_F = nr_layer_precoder(tx_precoding, W_prec, pusch_pdu->nrOfLayers, re_offset);
+            ((int16_t*)txdataF[ap])[(re_offset<<1)] = ((int16_t *) &precodatatx_F)[0];
+            ((int16_t*)txdataF[ap])[(re_offset<<1) + 1] = ((int16_t *) &precodatatx_F)[1];
+                            
+            if (++k >= frame_parms->ofdm_symbol_size) {
+              k -= frame_parms->ofdm_symbol_size;
+            }
+          }
+        }
+      } //RB loop
+    } // symbol loop
+  }// port loop
 
   NR_UL_UE_HARQ_t *harq_process_ulsch=NULL;
   harq_process_ulsch = UE->ulsch[thread_id][gNB_id]->harq_processes[harq_pid];
   harq_process_ulsch->status = SCH_IDLE;
 
+  for (int nl = 0; nl < Nl; nl++) {
+    free_and_zero(tx_layers[nl]);
+    free_and_zero(tx_precoding[nl]);
+  }
+  free_and_zero(tx_layers);
+  free_and_zero(tx_precoding);
+
   ///////////
   ////////////////////////////////////////////////////////////////////////
 
@@ -498,7 +573,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
 uint8_t nr_ue_pusch_common_procedures(PHY_VARS_NR_UE *UE,
                                       uint8_t slot,
                                       NR_DL_FRAME_PARMS *frame_parms,
-                                      uint8_t Nl) {
+                                      uint8_t n_antenna_ports) {
 
   int tx_offset, ap;
   int32_t **txdata;
@@ -520,25 +595,23 @@ uint8_t nr_ue_pusch_common_procedures(PHY_VARS_NR_UE *UE,
   txdataF = UE->common_vars.txdataF;
 
   int symb_offset = (slot%frame_parms->slots_per_subframe)*frame_parms->symbols_per_slot;
-  for(ap = 0; ap < Nl; ap++) {
+  for(ap = 0; ap < n_antenna_ports; ap++) {
     for (int s=0;s<NR_NUMBER_OF_SYMBOLS_PER_SLOT;s++){
-
-      LOG_D(PHY,"In %s: rotating txdataF symbol %d (%d) => (%d.%d)\n",
-        __FUNCTION__,
-        s,
-        s + symb_offset,
-        frame_parms->symbol_rotation[1][2 * (s + symb_offset)],
-        frame_parms->symbol_rotation[1][1 + (2 * (s + symb_offset))]);
-
-      rotate_cpx_vector((int16_t *)&txdataF[ap][frame_parms->ofdm_symbol_size * s],
-                        &frame_parms->symbol_rotation[1][2 * (s + symb_offset)],
-                        (int16_t *)&txdataF[ap][frame_parms->ofdm_symbol_size * s],
+      c16_t rot=((c16_t*)frame_parms->symbol_rotation[1])[s + symb_offset];
+      LOG_D(PHY,"rotating txdataF symbol %d (%d) => (%d.%d)\n",
+	    s,
+	    s + symb_offset,
+	    rot.r, rot.i);
+
+      rotate_cpx_vector((c16_t *)&txdataF[ap][frame_parms->ofdm_symbol_size * s],
+                        &rot,
+                        (c16_t *)&txdataF[ap][frame_parms->ofdm_symbol_size * s],
                         frame_parms->ofdm_symbol_size,
                         15);
     }
   }
 
-  for (ap = 0; ap < Nl; ap++) {
+  for (ap = 0; ap < n_antenna_ports; ap++) {
     if (frame_parms->Ncp == 1) { // extended cyclic prefix
       PHY_ofdm_mod(txdataF[ap],
                    &txdata[ap][tx_offset],
diff --git a/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c b/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c
index 52f9e67b25152d4d97366a364e5f74f44c9215eb..d2034f3abf45d567d1915be0ce40736227bd613f 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c
@@ -48,138 +48,8 @@
 #include "PHY/NR_REFSIG/sss_nr.h"
 #include "PHY/NR_UE_TRANSPORT/cic_filter_nr.h"
 
-/*******************************************************************
-*
-* NAME :         get_idft
-*
-* PARAMETERS :   size of ofdm symbol
-*
-* RETURN :       index pointing to the dft func in the dft library
-*
-* DESCRIPTION :  get idft function depending of ofdm size
-*
-*********************************************************************/
-
 //#define DBG_PSS_NR
 
-idft_size_idx_t get_idft(int ofdm_symbol_size)
-{
-  
- 
-  switch (ofdm_symbol_size) {
-    case 128:
-      return IDFT_128;
-      break;
-
-    case 256:
-      return IDFT_256;
-      break;
-
-    case 512:
-      return IDFT_512;
-      break;
-
-    case 768:
-      return IDFT_768;
-      break;
-
-    case 1024:
-      return IDFT_1024;
-      break;
-
-    case 1536:
-      return IDFT_1536;
-      break;
-
-    case 2048:
-      return IDFT_2048;
-      break;
-
-    case 3072:
-      return IDFT_3072;
-      break;
-
-    case 4096:
-      return IDFT_4096;
-      break;
-
-    case 8192:
-      return IDFT_8192;
-      break;
-
-    default:
-      printf("function get_idft : unsupported ofdm symbol size \n");
-      assert(0);
-      break;
- }
- return IDFT_SIZE_IDXTABLESIZE; // never reached and will trigger assertion in idft function
-}
-
-/*******************************************************************
-*
-* NAME :         get_dft
-*
-* PARAMETERS :   size of ofdm symbol
-*
-* RETURN :       function for discrete fourier transform
-*
-* DESCRIPTION :  get dft function depending of ofdm size
-*
-*********************************************************************/
-
-dft_size_idx_t get_dft(int ofdm_symbol_size)
-{
-
-
-  switch (ofdm_symbol_size) {
-    case 128:
-      return DFT_128;
-      break;
-
-    case 256:
-      return DFT_256;
-      break;
-
-    case 384:
-      return DFT_384;
-      break;
-
-    case 512:
-      return DFT_512;
-      break;
-
-    case 768:
-      return DFT_768;
-      break;
-
-    case 1024:
-      return DFT_1024;
-      break;
-
-    case 1536:
-      return DFT_1536;
-      break;
-
-    case 2048:
-      return DFT_2048;
-      break;
-
-    case 4096:
-      return DFT_4096;
-      break;
-
-    case 8192:
-      return DFT_8192;
-      break;
-
-    default:
-      printf("function get_dft : unsupported ofdm symbol size \n");
-      assert(0);
-      break;
- }
- return DFT_SIZE_IDXTABLESIZE; // never reached and will trigger assertion in idft function;
-}
-
 /*******************************************************************
 *
 * NAME :         generate_pss_nr
diff --git a/openair1/PHY/TOOLS/calibration_scope.c b/openair1/PHY/TOOLS/calibration_scope.c
index da1acb517570e78fa352fcbb289def26fcc67064..d3397b033f1da10d07fd343a7f6fa951392b1874 100644
--- a/openair1/PHY/TOOLS/calibration_scope.c
+++ b/openair1/PHY/TOOLS/calibration_scope.c
@@ -34,7 +34,7 @@ typedef struct OAIgraph {
   int h;
   int waterFallh;
   double *waterFallAvg;
-  boolean_t initDone;
+  bool initDone;
   int iteration;
   void (*funct) (struct OAIgraph *graph, calibData_t *);
 } OAIgraph_t;
@@ -159,7 +159,7 @@ static void oai_xygraph_getbuff(OAIgraph_t *graph, float **x, float **y, int len
   *y=old_y;
 }
 
-static void oai_xygraph(OAIgraph_t *graph, float *x, float *y, int len, int layer, boolean_t NoAutoScale) {
+static void oai_xygraph(OAIgraph_t *graph, float *x, float *y, int len, int layer, bool NoAutoScale) {
   fl_redraw_object(graph->graph);
 
   if ( NoAutoScale && graph->iteration%NoAutoScale == 0) {
diff --git a/openair1/PHY/TOOLS/cmult_sv.c b/openair1/PHY/TOOLS/cmult_sv.c
index dc57964ca52a60ff699ff0d0066c5376512ce5ec..a9d502b9eb1b5d7a9ff0259030af7324389394c7 100644
--- a/openair1/PHY/TOOLS/cmult_sv.c
+++ b/openair1/PHY/TOOLS/cmult_sv.c
@@ -144,207 +144,10 @@ void multadd_real_four_symbols_vector_complex_scalar(int16_t *x,
   _m_empty();
 
 }
-
-/*
-int rotate_cpx_vector(int16_t *x,
-                      int16_t *alpha,
-                      int16_t *y,
-                      uint32_t N,
-                      uint16_t output_shift,
-                      uint8_t format)
-{
-  // Multiply elementwise two complex vectors of N elements
-  // x        - input 1    in the format  |Re0  Im0 Re0 Im0|,......,|Re(N-1)  Im(N-1) Re(N-1) Im(N-1)|
-  //            We assume x1 with a dynamic of 15 bit maximum
-  //
-  // alpha      - input 2    in the format  |Re0 Im0|
-  //            We assume x2 with a dynamic of 15 bit maximum
-  //
-  // y        - output     in the format  |Re0  Im0 Re0 Im0|,......,|Re(N-1)  Im(N-1) Re(N-1) Im(N-1)|
-  //
-  // N        - the size f the vectors (this function does N cpx mpy. WARNING: N>=4;
-  //
-  // output_shift - shift at output to return in Q1.15
-  // format - 0 means alpha is in shuffled format, 1 means x is in shuffled format
-
-  uint32_t i;                 // loop counter
-
-  register __m128i m0,m1;
-
-
-
-  __m128i *x_128;
-  __m128i *y_128;
-
-
-  shift = _mm_cvtsi32_si128(output_shift);
-  x_128 = (__m128i *)&x[0];
-
-  if (format==0) {  // alpha is in shuffled format for complex multiply
-    ((int16_t *)&alpha_128)[0] = alpha[0];
-    ((int16_t *)&alpha_128)[1] = -alpha[1];
-    ((int16_t *)&alpha_128)[2] = alpha[1];
-    ((int16_t *)&alpha_128)[3] = alpha[0];
-    ((int16_t *)&alpha_128)[4] = alpha[0];
-    ((int16_t *)&alpha_128)[5] = -alpha[1];
-    ((int16_t *)&alpha_128)[6] = alpha[1];
-    ((int16_t *)&alpha_128)[7] = alpha[0];
-  } else { // input is in shuffled format for complex multiply
-    ((int16_t *)&alpha_128)[0] = alpha[0];
-    ((int16_t *)&alpha_128)[1] = alpha[1];
-    ((int16_t *)&alpha_128)[2] = alpha[0];
-    ((int16_t *)&alpha_128)[3] = alpha[1];
-    ((int16_t *)&alpha_128)[4] = alpha[0];
-    ((int16_t *)&alpha_128)[5] = alpha[1];
-    ((int16_t *)&alpha_128)[6] = alpha[0];
-    ((int16_t *)&alpha_128)[7] = alpha[1];
-  }
-
-  y_128 = (__m128i *)&y[0];
-
-  //  _mm_empty();
-  //  return(0);
-
-  // we compute 4 cpx multiply for each loop
-  for(i=0; i<(N>>3); i++) {
-
-    m0 = _mm_madd_epi16(x_128[0],alpha_128); //pmaddwd_r2r(mm1,mm0);         // 1- compute x1[0]*x2[0]
-    m0 = _mm_sra_epi32(m0,shift);        // 1- shift right by shift in order to  compensate for the input amplitude
-    m1=m0;
-    m0 = _mm_packs_epi32(m1,m0);        // 1- pack in a 128 bit register [re im re im]
-    y_128[0] = _mm_unpacklo_epi32(m0,m0);        // 1- pack in a 128 bit register [re im re im]
-    m0 = _mm_madd_epi16(x_128[1],alpha_128); //pmaddwd_r2r(mm1,mm0);         // 1- compute x1[0]*x2[0]
-    m0 = _mm_sra_epi32(m0,shift);        // 1- shift right by shift in order to  compensate for the input amplitude
-    m1 = m0;
-    m1 = _mm_packs_epi32(m1,m0);        // 1- pack in a 128 bit register [re im re im]
-    y_128[1] = _mm_unpacklo_epi32(m1,m1);        // 1- pack in a 128 bit register [re im re im]
-    m0 = _mm_madd_epi16(x_128[2],alpha_128); //pmaddwd_r2r(mm1,mm0);         // 1- compute x1[0]*x2[0]
-    m0 = _mm_sra_epi32(m0,shift);        // 1- shift right by shift in order to  compensate for the input amplitude
-    m1 = m0;
-    m1 = _mm_packs_epi32(m1,m0);        // 1- pack in a 128 bit register [re im re im]
-    y_128[2] = _mm_unpacklo_epi32(m1,m1);        // 1- pack in a 128 bit register [re im re im]
-    m0 = _mm_madd_epi16(x_128[3],alpha_128); //pmaddwd_r2r(mm1,mm0);         // 1- compute x1[0]*x2[0]
-    m0 = _mm_sra_epi32(m0,shift);        // 1- shift right by shift in order to  compensate for the input amplitude
-    m1 = m0;
-    m1 = _mm_packs_epi32(m1,m0);        // 1- pack in a 128 bit register [re im re im]
-    y_128[3] = _mm_unpacklo_epi32(m1,m1);        // 1- pack in a 128 bit register [re im re im]
-    if (format==1) {  // Put output in proper format (Re,-Im,Im,Re), shuffle = (0,1,3,2) = 0x1e
-
-      y_128[0] = _mm_shufflelo_epi16(y_128[0],0x1e);
-      y_128[0] = _mm_shufflehi_epi16(y_128[0],0x1e);
-      ((int16_t*)&y_128[0])[1] = -((int16_t*)&y_128[0])[1];
-      ((int16_t*)&y_128[0])[5] = -((int16_t*)&y_128[0])[5];
-      y_128[1] = _mm_shufflelo_epi16(y_128[1],0x1e);
-      y_128[1] = _mm_shufflehi_epi16(y_128[1],0x1e);
-      ((int16_t*)&y_128[1])[1] = -((int16_t*)&y_128[1])[1];
-      ((int16_t*)&y_128[1])[5] = -((int16_t*)&y_128[1])[5];
-      y_128[2] = _mm_shufflelo_epi16(y_128[2],0x1e);
-      y_128[2] = _mm_shufflehi_epi16(y_128[2],0x1e);
-      ((int16_t*)&y_128[2])[1] = -((int16_t*)&y_128[2])[1];
-      ((int16_t*)&y_128[2])[5] = -((int16_t*)&y_128[2])[5];
-      y_128[3] = _mm_shufflelo_epi16(y_128[3],0x1e);
-      y_128[3] = _mm_shufflehi_epi16(y_128[3],0x1e);
-      ((int16_t*)&y_128[3])[1] = -((int16_t*)&y_128[3])[1];
-      ((int16_t*)&y_128[3])[5] = -((int16_t*)&y_128[3])[5];
-    }
-
-
-    x_128+=4;
-    y_128 +=4;
-  }
-
-
-  _mm_empty();
-  _m_empty();
-
-  return(0);
-}
-
-int rotate_cpx_vector2(int16_t *x,
-                       int16_t *alpha,
-                       int16_t *y,
-                       uint32_t N,
-                       uint16_t output_shift,
-                       uint8_t format)
-{
-  // Multiply elementwise two complex vectors of N elements
-  // x        - input 1    in the format  |Re0  Im0 Re0 Im0|,......,|Re(N-1)  Im(N-1) Re(N-1) Im(N-1)|
-  //            We assume x1 with a dynamic of 15 bit maximum
-  //
-  // alpha      - input 2    in the format  |Re0 Im0|
-  //            We assume x2 with a dynamic of 15 bit maximum
-  //
-  // y        - output     in the format  |Re0  Im0 Re0 Im0|,......,|Re(N-1)  Im(N-1) Re(N-1) Im(N-1)|
-  //
-  // N        - the size f the vectors (this function does N cpx mpy. WARNING: N>=4;
-  //
-  // log2_amp - increase the output amplitude by a factor 2^log2_amp (default is 0)
-  //            WARNING: log2_amp>0 can cause overflow!!
-
-  uint32_t i;                 // loop counter
-
-  register __m128i m0,m1;
-
-
-  __m128i *x_128;
-  __m128i *y_128;
-
-
-  shift = _mm_cvtsi32_si128(output_shift);
-  x_128 = (__m128i *)&x[0];
-
-  if (format==0) {  // alpha is in shuffled format for complex multiply
-    ((int16_t *)&alpha_128)[0] = alpha[0];
-    ((int16_t *)&alpha_128)[1] = -alpha[1];
-    ((int16_t *)&alpha_128)[2] = alpha[1];
-    ((int16_t *)&alpha_128)[3] = alpha[0];
-    ((int16_t *)&alpha_128)[4] = alpha[0];
-    ((int16_t *)&alpha_128)[5] = -alpha[1];
-    ((int16_t *)&alpha_128)[6] = alpha[1];
-    ((int16_t *)&alpha_128)[7] = alpha[0];
-  } else { // input is in shuffled format for complex multiply
-    ((int16_t *)&alpha_128)[0] = alpha[0];
-    ((int16_t *)&alpha_128)[1] = alpha[1];
-    ((int16_t *)&alpha_128)[2] = alpha[0];
-    ((int16_t *)&alpha_128)[3] = alpha[1];
-    ((int16_t *)&alpha_128)[4] = alpha[0];
-    ((int16_t *)&alpha_128)[5] = alpha[1];
-    ((int16_t *)&alpha_128)[6] = alpha[0];
-    ((int16_t *)&alpha_128)[7] = alpha[1];
-  }
-
-  y_128 = (__m128i *)&y[0];
-
-  // we compute 4 cpx multiply for each loop
-  for(i=0; i<(N>>1); i++) {
-
-
-    m0 = _mm_madd_epi16(x_128[i],alpha_128); //pmaddwd_r2r(mm1,mm0);         // 1- compute x1[0]*x2[0]
-    m0 = _mm_sra_epi32(m0,shift);        // 1- shift right by shift in order to  compensate for the input amplitude
-    m1=m0;
-    m1 = _mm_packs_epi32(m1,m0);        // 1- pack in a 128 bit register [re im re im]
-    y_128[i] = _mm_unpacklo_epi32(m1,m1);        // 1- pack in a 128 bit register [re im re im]
-    if (format==1) {  // Put output in proper format (Re,-Im,Im,Re), shuffle = (0,1,3,2) = 0x1e
-
-      y_128[i] = _mm_shufflelo_epi16(y_128[i],0x1e);
-      y_128[i] = _mm_shufflehi_epi16(y_128[i],0x1e);
-      ((int16_t*)&y_128[i])[1] = -((int16_t*)&y_128[i])[1];
-      ((int16_t*)&y_128[i])[5] = -((int16_t*)&y_128[i])[5];
-    }
-  }
-
-
-  _mm_empty();
-  _m_empty();
-
-
-  return(0);
-}
-*/
-
-int rotate_cpx_vector(int16_t *x,
-                      int16_t *alpha,
-                      int16_t *y,
+#ifdef __AVX2__
+void rotate_cpx_vector(c16_t *x,
+                      c16_t *alpha,
+                      c16_t *y,
                       uint32_t N,
                       uint16_t output_shift)
 {
@@ -372,28 +175,28 @@ int rotate_cpx_vector(int16_t *x,
   __m128i shift = _mm_cvtsi32_si128(output_shift);
   register simd_q15_t m0,m1,m2,m3;
 
-  ((int16_t *)&alpha_128)[0] = alpha[0];
-  ((int16_t *)&alpha_128)[1] = -alpha[1];
-  ((int16_t *)&alpha_128)[2] = alpha[1];
-  ((int16_t *)&alpha_128)[3] = alpha[0];
-  ((int16_t *)&alpha_128)[4] = alpha[0];
-  ((int16_t *)&alpha_128)[5] = -alpha[1];
-  ((int16_t *)&alpha_128)[6] = alpha[1];
-  ((int16_t *)&alpha_128)[7] = alpha[0];
+  ((int16_t *)&alpha_128)[0] = alpha->r;
+  ((int16_t *)&alpha_128)[1] = -alpha->i;
+  ((int16_t *)&alpha_128)[2] = alpha->i;
+  ((int16_t *)&alpha_128)[3] = alpha->r;
+  ((int16_t *)&alpha_128)[4] = alpha->r;
+  ((int16_t *)&alpha_128)[5] = -alpha->i;
+  ((int16_t *)&alpha_128)[6] = alpha->i;
+  ((int16_t *)&alpha_128)[7] = alpha->r;
 #elif defined(__arm__)
   int32x4_t shift;
   int32x4_t ab_re0,ab_re1,ab_im0,ab_im1,re32,im32;
   int16_t reflip[8]  __attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1};
   int32x4x2_t xtmp;
 
-  ((int16_t *)&alpha_128)[0] = alpha[0];
-  ((int16_t *)&alpha_128)[1] = alpha[1];
-  ((int16_t *)&alpha_128)[2] = alpha[0];
-  ((int16_t *)&alpha_128)[3] = alpha[1];
-  ((int16_t *)&alpha_128)[4] = alpha[0];
-  ((int16_t *)&alpha_128)[5] = alpha[1];
-  ((int16_t *)&alpha_128)[6] = alpha[0];
-  ((int16_t *)&alpha_128)[7] = alpha[1];
+  ((int16_t *)&alpha_128)[0] = alpha->r;
+  ((int16_t *)&alpha_128)[1] = alpha->i;
+  ((int16_t *)&alpha_128)[2] = alpha->r;
+  ((int16_t *)&alpha_128)[3] = alpha->i;
+  ((int16_t *)&alpha_128)[4] = alpha->r;
+  ((int16_t *)&alpha_128)[5] = alpha->i;
+  ((int16_t *)&alpha_128)[6] = alpha->r;
+  ((int16_t *)&alpha_128)[7] = alpha->i;
   int16x8_t bflip = vrev32q_s16(alpha_128);
   int16x8_t bconj = vmulq_s16(alpha_128,*(int16x8_t *)reflip);
   shift = vdupq_n_s32(-output_shift);
@@ -439,9 +242,9 @@ int rotate_cpx_vector(int16_t *x,
   _mm_empty();
   _m_empty();
 
-  return(0);
+  return;
 }
-
+#endif
 /*
 int mult_vector32_scalar(int16_t *x1,
                          int x2,
@@ -536,7 +339,7 @@ main ()
   int16_t input[256] __attribute__((aligned(16)));
   int16_t input2[256] __attribute__((aligned(16)));
   int16_t output[256] __attribute__((aligned(16)));
-  int16_t alpha[2];
+  c16_t alpha;
 
   int i;
 
@@ -574,8 +377,8 @@ main ()
   input2[14] = 1000;
   input2[15] = 2000;
 
-  alpha[0]=32767;
-  alpha[1]=0;
+  alpha->r=32767;
+  alpha->i=0;
 
   //mult_cpx_vector(input,input2,output,L,0);
   rotate_cpx_vector_norep(input,alpha,input,L,15);
diff --git a/openair1/PHY/TOOLS/lte_ue_scope.c b/openair1/PHY/TOOLS/lte_ue_scope.c
index 9b3f65d7d1315ef34144268248a18dbbf374169e..2c45437cdfa309c4abc61e0470482095757a73df 100644
--- a/openair1/PHY/TOOLS/lte_ue_scope.c
+++ b/openair1/PHY/TOOLS/lte_ue_scope.c
@@ -51,9 +51,9 @@ void reset_stats(FL_OBJECT *button, long arg) {
   int i,j,k;
   PHY_VARS_eNB *phy_vars_eNB = RC.eNB[0][0];
 
-  for (i=0; i<NUMBER_OF_DLSCH_MAX; i++) {
-    for (k=0; k<8; k++) { //harq_processes
-      for (j=0; j<phy_vars_eNB->dlsch[i][0]->Mlimit; j++) {
+  for (i=0; i<NUMBER_OF_UE_MAX; i++) {
+    for (k=0; k<NUMBER_OF_DLSCH_MAX; k++) { //harq_processes
+      for (j=0; j<phy_vars_eNB->dlsch[k][0]->Mlimit; j++) {
         phy_vars_eNB->UE_stats[i].dlsch_NAK[k][j]=0;
         phy_vars_eNB->UE_stats[i].dlsch_ACK[k][j]=0;
         phy_vars_eNB->UE_stats[i].dlsch_trials[k][j]=0;
diff --git a/openair1/PHY/TOOLS/nr_phy_scope.c b/openair1/PHY/TOOLS/nr_phy_scope.c
index 723813fbb62632ba31b8f82e609a5dc74685174a..d4b28361d2420afc856a36e312ce8dd62bfac026 100644
--- a/openair1/PHY/TOOLS/nr_phy_scope.c
+++ b/openair1/PHY/TOOLS/nr_phy_scope.c
@@ -60,7 +60,7 @@ typedef struct OAIgraph {
   int h;
   int waterFallh;
   double *waterFallAvg;
-  boolean_t initDone;
+  bool initDone;
   int iteration;
   void (*gNBfunct) (struct OAIgraph *graph, scopeData_t *p, int UE_id);
   void (*nrUEfunct)(scopeGraphData_t **data, struct OAIgraph *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id);
@@ -208,7 +208,7 @@ static void oai_xygraph_getbuff(OAIgraph_t *graph, float **x, float **y, int len
   *y=old_y;
 }
 
-static void oai_xygraph(OAIgraph_t *graph, float *x, float *y, int len, int layer, boolean_t NoAutoScale) {
+static void oai_xygraph(OAIgraph_t *graph, float *x, float *y, int len, int layer, bool NoAutoScale) {
   fl_redraw_object(graph->graph);
 
   if ( NoAutoScale && graph->iteration%NoAutoScale == 0) {
diff --git a/openair1/PHY/TOOLS/tools_defs.h b/openair1/PHY/TOOLS/tools_defs.h
index f272e513c2acd99e6576e7da44bf356f6170de26..a539b9d77193520a99c8371abc9b01fe5088cf0f 100644
--- a/openair1/PHY/TOOLS/tools_defs.h
+++ b/openair1/PHY/TOOLS/tools_defs.h
@@ -33,8 +33,11 @@
 extern "C" {
 #endif
 
+#include <stdio.h>
 #include <stdint.h>
+#include <assert.h>
 #include "PHY/sse_intrin.h"
+#include "common/utils/assertions.h"
 
 #define CEILIDIV(a,b) ((a+b-1)/b)
 #define ROUNDIDIV(a,b) (((a<<1)+b)/(b<<1))
@@ -102,15 +105,6 @@ void multadd_complex_vector_real_scalar(int16_t *x,
                                         uint8_t zero_flag,
                                         uint32_t N);
 
-int rotate_cpx_vector(int16_t *x,
-                      int16_t *alpha,
-                      int16_t *y,
-                      uint32_t N,
-                      uint16_t output_shift);
-
-
-
-
 /*!\fn void init_fft(uint16_t size,uint8_t logsize,uint16_t *rev)
 \brief Initialize the FFT engine for a given size
 @param size Size of the FFT
@@ -319,6 +313,65 @@ typedef enum dft_size_idx {
 
 #define SZ_iENUM(Sz) IDFT_ ## Sz,
 
+/*******************************************************************
+*
+* NAME :         get_dft
+*
+* PARAMETERS :   size of ofdm symbol
+*
+* RETURN :       function for discrete fourier transform
+*
+* DESCRIPTION :  get dft function depending of ofdm size
+*
+*********************************************************************/
+static inline
+dft_size_idx_t get_dft(int ofdm_symbol_size)
+{
+  switch (ofdm_symbol_size) {
+    case 128:
+      return DFT_128;
+    case 256:
+      return DFT_256;
+    case 512:
+      return DFT_512;
+    case 1024:
+      return DFT_1024;
+    case 1536:
+      return DFT_1536;
+    case 2048:
+      return DFT_2048;
+    case 3072:
+      return DFT_3072;
+    case 4096:
+      return DFT_4096;
+    case 6144:
+      return DFT_6144;
+    case 8192:
+      return DFT_8192;
+    case 9216:
+      return DFT_9216;
+    case 12288:
+      return DFT_12288;
+    case 18432:
+      return DFT_18432;
+    case 24576:
+      return DFT_24576;
+    case 36864:
+      return DFT_36864;
+    case 49152:
+      return DFT_49152;
+    case 73728:
+      return DFT_73728;
+    case 98304:
+      return DFT_98304;
+    default:
+      printf("function get_dft : unsupported ofdm symbol size \n");
+      assert(0);
+      break;
+ }
+ return DFT_SIZE_IDXTABLESIZE; // never reached and will trigger assertion in idft function;
+}
+
 typedef enum idft_size_idx {
   FOREACH_IDFTSZ(SZ_iENUM)
   IDFT_SIZE_IDXTABLESIZE
@@ -344,9 +397,67 @@ struct {
 
 #endif
 
+/*******************************************************************
+*
+* NAME :         get_idft
+*
+* PARAMETERS :   size of ofdm symbol
+*
+* RETURN :       index pointing to the dft func in the dft library
+*
+* DESCRIPTION :  get idft function depending of ofdm size
+*
+*********************************************************************/
+static inline
+idft_size_idx_t get_idft(int ofdm_symbol_size)
+{
+  switch (ofdm_symbol_size) {
+    case 128:
+      return IDFT_128;
+    case 256:
+      return IDFT_256;
+    case 512:
+      return IDFT_512;
+    case 1024:
+      return IDFT_1024;
+    case 1536:
+      return IDFT_1536;
+    case 2048:
+      return IDFT_2048;
+    case 3072:
+      return IDFT_3072;
+    case 4096:
+      return IDFT_4096;
+    case 6144:
+      return IDFT_6144;
+    case 8192:
+      return IDFT_8192;
+    case 9216:
+      return IDFT_9216;
+    case 12288:
+      return IDFT_12288;
+    case 18432:
+      return IDFT_18432;
+    case 24576:
+      return IDFT_24576;
+    case 36864:
+      return IDFT_36864;
+    case 49152:
+      return IDFT_49152;
+    case 73728:
+      return IDFT_73728;
+    case 98304:
+      return IDFT_98304;
+    default:
+      printf("function get_idft : unsupported ofdm symbol size \n");
+      assert(0);
+      break;
+ }
+ return IDFT_SIZE_IDXTABLESIZE; // never reached and will trigger assertion in idft function
+}
 
 
-/*!\fn int32_t rotate_cpx_vector(int16_t *x,int16_t *alpha,int16_t *y,uint32_t N,uint16_t output_shift)
+/*!\fn int32_t rotate_cpx_vector(c16_t *x,c16_t *alpha,c16_t *y,uint32_t N,uint16_t output_shift)
 This function performs componentwise multiplication of a vector with a complex scalar.
 @param x Vector input (Q1.15)  in the format  |Re0  Im0|,......,|Re(N-1) Im(N-1)|
 @param alpha Scalar input (Q1.15) in the format  |Re0 Im0|
@@ -356,11 +467,11 @@ This function performs componentwise multiplication of a vector with a complex s
 
 The function implemented is : \f$\mathbf{y} = \alpha\mathbf{x}\f$
 */
-int32_t rotate_cpx_vector(int16_t *x,
-                          int16_t *alpha,
-                          int16_t *y,
-                          uint32_t N,
-                          uint16_t output_shift);
+void rotate_cpx_vector(c16_t *x,
+                       c16_t *alpha,
+                       c16_t *y,
+                       uint32_t N,
+                       uint16_t output_shift);
 
 
 //cadd_sv.c
diff --git a/openair1/PHY/defs_common.h b/openair1/PHY/defs_common.h
index d13fe260deba559e3b0dcbf3077192289cfa16a5..c93e3a7de9c0fa32b5e81b6305d3a9184d4ff107 100644
--- a/openair1/PHY/defs_common.h
+++ b/openair1/PHY/defs_common.h
@@ -754,7 +754,7 @@ typedef struct {
   /// Position of first CCE of the dci
   int firstCCE;
   /// flag to indicate that this is a RA response
-  boolean_t ra_flag;
+  bool ra_flag;
   /// rnti
   rnti_t rnti;
   /// harq_pid
@@ -775,7 +775,7 @@ typedef struct {
   /// Position of first CCE of the dci
   int firstCCE;
   /// flag to indicate that this is a RA response
-  boolean_t ra_flag;
+  bool ra_flag;
   /// rnti
   rnti_t rnti;
   /// Format
@@ -806,7 +806,7 @@ typedef struct {
   /// Position of first CCE of the dci
   int firstCCE;
   /// flag to indicate that this is a RA response
-  boolean_t ra_flag;
+  bool ra_flag;
   /// rnti
   rnti_t rnti;
   /// Format
@@ -907,7 +907,7 @@ typedef enum {no_relay=1,unicast_relay_type1,unicast_relay_type2, multicast_rela
 
 
 
-#define MCS_COUNT 28
+#define MCS_COUNT 29
 #define MCS_TABLE_LENGTH_MAX 64
 
 
diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h
index 0b9fd8564ec5ad903b74606ab3c9d0ebbe7bd560..bc93b5820a159be4af39aeb30fd5544dc65cf9a3 100644
--- a/openair1/PHY/defs_gNB.h
+++ b/openair1/PHY/defs_gNB.h
@@ -48,7 +48,6 @@
 #define MAX_NUM_RU_PER_gNB MAX_NUM_RU_PER_eNB
 #define MAX_PUCCH0_NID 8
 
-
 typedef struct {
   int nb_id;
   int Nid[MAX_PUCCH0_NID];
@@ -97,6 +96,8 @@ typedef struct {
   uint32_t subframe;
   /// MIMO mode for this DLSCH
   MIMO_mode_t mimo_mode;
+  /// Interleaver outputs
+  uint8_t *f;
   /// LDPC lifting size
   uint32_t Z;
 } NR_DL_gNB_HARQ_t;
@@ -187,8 +188,6 @@ typedef struct {
   uint8_t codebook_index;
   /// Maximum number of HARQ processes
   uint8_t Mdlharq;
-  /// Maximum number of HARQ rounds
-  uint8_t Mlimit;
   /// MIMO transmission mode indicator for this sub-frame
   uint8_t Kmimo;
   /// Nsoft parameter related to UE Category
@@ -277,7 +276,7 @@ typedef struct {
   /// The payload + CRC (24 bits) in bits (38.212 V15.4.0 section 5.1)
   uint32_t B;
   /// Pointers to code blocks after code block segmentation and CRC attachment (38.212 V15.4.0 section 5.2.2)
-  uint8_t *c[MAX_NUM_NR_ULSCH_SEGMENTS];
+  uint8_t **c;
   /// Number of bits in each code block (38.212 V15.4.0 section 5.2.2)
   uint32_t K;
   /// Number of "Filler" bits added in the code block segmentation (38.212 V15.4.0 section 5.2.2)
@@ -285,11 +284,9 @@ typedef struct {
   /// Number of code blocks after code block segmentation (38.212 V15.4.0 section 5.2.2)
   uint32_t C;
   /// Pointers to code blocks after LDPC coding (38.212 V15.4.0 section 5.3.2)
-  int16_t *d[MAX_NUM_NR_ULSCH_SEGMENTS];
+  int16_t **d;
   /// LDPC lifting size (38.212 V15.4.0 table 5.3.2-1)
   uint32_t Z;
-  /// code blocks after bit selection in rate matching for LDPC code (38.212 V15.4.0 section 5.4.2.1)
-  int16_t e[MAX_NUM_NR_ULSCH_SEGMENTS][3*8448];
   /// Number of bits in each code block after rate matching for LDPC code (38.212 V15.4.0 section 5.4.2.1)
   uint32_t E;
   /// Number of segments processed so far
@@ -344,8 +341,6 @@ typedef struct {
   int16_t q_RI[MAX_RI_PAYLOAD];
   /// Temporary h sequence to flag PUSCH_x/PUSCH_y symbols which are not scrambled
   uint8_t h[MAX_NUM_CHANNEL_BITS];
-  /// soft bits for each received segment ("w"-sequence)(for definition see 36-212 V8.6 2009-03, p.15)
-  int16_t *w[MAX_NUM_NR_ULSCH_SEGMENTS];
   //////////////////////////////////////////////////////////////
 } NR_UL_gNB_HARQ_t;
 
@@ -353,8 +348,6 @@ typedef struct {
 typedef struct {
   /// Pointers to 16 HARQ processes for the ULSCH
   NR_UL_gNB_HARQ_t *harq_processes[NR_MAX_ULSCH_HARQ_PROCESSES];
-  /// Current HARQ process id
-  int harq_process_id[NR_MAX_SLOTS_PER_FRAME];
   /// HARQ process mask, indicates which processes are currently active
   uint16_t harq_mask;
   /// ACK/NAK Bundling flag
@@ -381,8 +374,6 @@ typedef struct {
   uint8_t cyclicShift;
   /// for cooperative communication
   uint8_t cooperation_flag;
-  /// Maximum number of HARQ rounds
-  uint8_t Mlimit;
   /// Maximum number of LDPC iterations
   uint8_t max_ldpc_iterations;
   /// number of iterations used in last LDPC decoding
@@ -438,10 +429,6 @@ typedef struct {
   /// - first index: rx antenna id [0..nb_antennas_rx[
   /// - second index: ? [0..2*ofdm_symbol_size[
   int32_t **rxdataF_ext;
-  /// \brief Holds the received data in the frequency domain for the allocated RBs in normal format.
-  /// - first index: rx antenna id [0..nb_antennas_rx[
-  /// - second index (definition from phy_init_lte_eNB()): ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[
-  int32_t **rxdataF_ext2;
   /// \brief Hold the channel estimates in time domain based on DRS.
   /// - first index: rx antenna id [0..nb_antennas_rx[
   /// - second index: ? [0..4*ofdm_symbol_size[
@@ -454,14 +441,6 @@ typedef struct {
   /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
   /// - second index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[
   int32_t **ul_ch_estimates_ext;
-  /// \brief Hold the PTRS phase estimates in frequency domain.
-  /// - first index: rx antenna id [0..nb_antennas_rx[
-  /// - second index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[
-  int32_t **ul_ch_ptrs_estimates;
-  /// \brief Uplink phase estimates extracted in PRBS.
-  /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
-  /// - second index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[
-  int32_t **ul_ch_ptrs_estimates_ext;
   /// \brief Holds the compensated signal.
   /// - first index: rx antenna id [0..nb_antennas_rx[
   /// - second index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[
@@ -477,7 +456,7 @@ typedef struct {
   /// \brief Cross-correlation of two UE signals.
   /// - first index: rx antenna [0..nb_antennas_rx[
   /// - second index: symbol [0..]
-  int32_t **rho;
+  int32_t ***rho;
   /// \f$\log_2(\max|H_i|^2)\f$
   int16_t log2_maxh;
   /// \brief Magnitude of Uplink Channel first layer (16QAM level/First 64QAM level).
@@ -507,6 +486,10 @@ typedef struct {
   /// \brief llr values.
   /// - first index: ? [0..1179743] (hard coded)
   int16_t *llr;
+  /// \brief llr values per layer.
+  /// - first index: ? [0..3] (hard coded)
+  /// - first index: ? [0..1179743] (hard coded)
+  int16_t **llr_layers;
   /// DMRS symbol index, to be updated every DMRS symbol within a slot.
   uint8_t dmrs_symbol;
   // PTRS symbol index, to be updated every PTRS symbol within a slot.
@@ -782,6 +765,9 @@ typedef struct PHY_VARS_gNB_s {
   /// SRS variables
   nr_srs_info_t *nr_srs_info[NUMBER_OF_NR_SRS_MAX];
 
+  /// CSI variables
+  nr_csi_info_t *nr_csi_info;
+
   uint8_t pbch_configured;
   char gNB_generate_rar;
 
@@ -813,12 +799,9 @@ typedef struct PHY_VARS_gNB_s {
   // Mask of occupied RBs, per symbol and PRB
   uint32_t rb_mask_ul[14][9];
 
-  /// CSI  RS sequence
-  uint32_t ***nr_gold_csi_rs;
-
   /// PRS sequence
   uint32_t ****nr_gold_prs;
-  
+
   /// Indicator set to 0 after first SR
   uint8_t first_sr[NUMBER_OF_NR_SR_MAX];
 
@@ -848,14 +831,17 @@ typedef struct PHY_VARS_gNB_s {
   int              **dl_precoder_SgNB[3];
   char             log2_maxp; /// holds the maximum channel/precoder coefficient
 
-  int  prb_interpolation;
+  int max_ldpc_iterations;
+  /// indicate the channel estimation technique in time domain
+  int chest_time;
+  /// indicate the channel estimation technique in freq domain
+  int chest_freq;
 
   /// if ==0 enables phy only test mode
   int mac_enabled;
   /// counter to average prach energh over first 100 prach opportunities
   int prach_energy_counter;
 
-  int csi_gold_init;
   int pdcch_gold_init;
   int pdsch_gold_init[2];
   int pusch_gold_init[2];
@@ -945,8 +931,8 @@ typedef struct LDPCDecode_s {
   int segment_r;
   int r_offset;
   int offset;
-  int Tbslbrm;
   int decodeIterations;
+  uint32_t tbslbrm;
 } ldpcDecode_t;
 
 struct ldpcReqId {
diff --git a/openair1/PHY/defs_nr_UE.h b/openair1/PHY/defs_nr_UE.h
index 2991a4b95662a77bc8de723e4baec0f8dce999c6..61b84cfe042a33843b37c2b9f88fbdbaf9d740e4 100644
--- a/openair1/PHY/defs_nr_UE.h
+++ b/openair1/PHY/defs_nr_UE.h
@@ -279,10 +279,6 @@ typedef struct {
   /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
   /// - second index: ? [0..168*N_RB_DL[
   int32_t **dl_ch_estimates_ext;
-  /// \brief Downlink channel estimates extracted in PRBS.
-  /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
-  /// - second index: ? [0..168*N_RB_DL[
-  int32_t **dl_ch_ptrs_estimates_ext;
   /// \brief Downlink beamforming channel estimates in frequency domain.
   /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
   /// - second index: samples? [0..symbols_per_tti*(ofdm_symbol_size+LTE_CE_FILTER_LENGTH)[
@@ -611,6 +607,16 @@ typedef struct {
   fapi_nr_ul_config_prach_pdu prach_pdu;
 } NR_UE_PRACH;
 
+typedef struct {
+  bool active;
+  fapi_nr_dl_config_csiim_pdu_rel15_t csiim_config_pdu;
+} NR_UE_CSI_IM;
+
+typedef struct {
+  bool active;
+  fapi_nr_dl_config_csirs_pdu_rel15_t csirs_config_pdu;
+} NR_UE_CSI_RS;
+
 typedef struct {
   bool active;
   fapi_nr_ul_config_srs_pdu srs_config_pdu;
@@ -724,6 +730,8 @@ typedef struct {
   NR_UE_PBCH      *pbch_vars[NUMBER_OF_CONNECTED_gNB_MAX];
   NR_UE_PDCCH     *pdcch_vars[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_gNB_MAX];
   NR_UE_PRACH     *prach_vars[NUMBER_OF_CONNECTED_gNB_MAX];
+  NR_UE_CSI_IM    *csiim_vars[NUMBER_OF_CONNECTED_gNB_MAX];
+  NR_UE_CSI_RS    *csirs_vars[NUMBER_OF_CONNECTED_gNB_MAX];
   NR_UE_SRS       *srs_vars[NUMBER_OF_CONNECTED_gNB_MAX];
   NR_UE_PUCCH     *pucch_vars[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_gNB_MAX];
   NR_UE_DLSCH_t   *dlsch[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_gNB_MAX][NR_MAX_NB_LAYERS>4 ? 2:1]; // two RxTx Threads
@@ -783,11 +791,10 @@ typedef struct {
   
   uint32_t X_u[64][839];
 
-
-  uint32_t perfect_ce;
   // flag to activate PRB based averaging of channel estimates
   // when off, defaults to frequency domain interpolation
-  int prb_interpolation;
+  int chest_freq;
+  int chest_time;
   int generate_ul_signal[NUMBER_OF_CONNECTED_gNB_MAX];
 
   UE_NR_SCAN_INFO_t scan_info[NB_BANDS_MAX];
@@ -875,6 +882,8 @@ typedef struct {
   /// N0 (used for abstraction)
   double N0;
 
+  uint8_t max_ldpc_iterations;
+
   /// PDSCH Varaibles
   PDSCH_CONFIG_DEDICATED pdsch_config_dedicated[NUMBER_OF_CONNECTED_gNB_MAX];
 
@@ -887,6 +896,9 @@ typedef struct {
   /// SRS variables
   nr_srs_info_t *nr_srs_info;
 
+  /// CSI variables
+  nr_csi_info_t *nr_csi_info;
+
   //#if defined(UPGRADE_RAT_NR)
 #if 1
   SystemInformationBlockType1_nr_t systemInformationBlockType1_nr;
@@ -984,8 +996,8 @@ typedef struct {
   SLIST_HEAD(ral_thresholds_gen_poll_s, ral_threshold_phy_t) ral_thresholds_gen_polled[RAL_LINK_PARAM_GEN_MAX];
   SLIST_HEAD(ral_thresholds_lte_poll_s, ral_threshold_phy_t) ral_thresholds_lte_polled[RAL_LINK_PARAM_LTE_MAX];
 #endif
-  
-  int dl_stats[5];
+  int dl_errors;
+  int dl_stats[8];
   void* scopeData;
 } PHY_VARS_NR_UE;
 
diff --git a/openair1/PHY/defs_nr_common.h b/openair1/PHY/defs_nr_common.h
index 71360623bfc81c091260a83fdc0230194717bd1d..d102858a579479c32a60b08881cbf46b0e9e4d05 100644
--- a/openair1/PHY/defs_nr_common.h
+++ b/openair1/PHY/defs_nr_common.h
@@ -43,6 +43,7 @@
 #define nr_slot_t lte_subframe_t
 
 #define MAX_NUM_SUBCARRIER_SPACING 5
+#define NR_MAX_OFDM_SYMBOL_SIZE 4096
 
 #define NR_NB_SC_PER_RB 12
 #define NR_NB_REG_PER_CCE 6
@@ -85,16 +86,21 @@
 #define NR_MAX_CSET_DURATION 3
 
 #define NR_MAX_NB_RBG 18
+
 #define NR_MAX_NB_LAYERS 4 // 8
+#define NR_MAX_NB_PORTS 32
+
 #define NR_MAX_NB_HARQ_PROCESSES 16
 
 #define NR_MAX_PDSCH_TBS 3824
 #define NR_MAX_SIB_LENGTH 2976 // 3GPP TS 38.331 section 5.2.1 - The physical layer imposes a limit to the maximum size a SIB can take. The maximum SIB1 or SI message size is 2976 bits.
 
-#define MAX_NUM_NR_DLSCH_SEGMENTS_PER_LAYER 34
+#define MAX_NUM_NR_DLSCH_SEGMENTS_PER_LAYER 36
+
+#define MAX_NUM_NR_ULSCH_SEGMENTS_PER_LAYER 34
 
-#define MAX_NUM_NR_ULSCH_SEGMENTS 34
-#define MAX_NR_ULSCH_PAYLOAD_BYTES (MAX_NUM_NR_ULSCH_SEGMENTS*1056)
+#define MAX_NUM_NR_CHANNEL_BITS (4*14*273*12*8)  // 14 symbols, 273 RB
+#define MAX_NUM_NR_RE (4*14*273*12)
 
 #define MAX_NUM_NR_SRS_SYMBOLS 4
 
@@ -242,17 +248,20 @@ typedef struct {
 
 typedef struct {
   uint16_t sc_list_length;
-  uint16_t *sc_list;
+  uint16_t sc_list[6*273];
   uint8_t srs_generated_signal_bits;
-  int32_t *srs_generated_signal;
-  int32_t **srs_received_signal;
-  int32_t **srs_ls_estimated_channel;
-  int32_t **srs_estimated_channel_freq;
-  int32_t **srs_estimated_channel_time;
-  int32_t **srs_estimated_channel_time_shifted;
-  uint32_t *noise_power;
+  int32_t srs_generated_signal[OFDM_SYMBOL_SIZE_SAMPLES_MAX * MAX_NUM_NR_SRS_SYMBOLS];
 } nr_srs_info_t;
 
+typedef struct {
+  uint16_t csi_gold_init;
+  uint32_t ***nr_gold_csi_rs;
+  uint8_t csi_rs_generated_signal_bits;
+  int32_t **csi_rs_generated_signal;
+  bool csi_im_meas_computed;
+  uint32_t interference_plus_noise_power;
+} nr_csi_info_t;
+
 typedef struct NR_DL_FRAME_PARMS NR_DL_FRAME_PARMS;
 
 typedef uint32_t (*get_samples_per_slot_t)(int slot, NR_DL_FRAME_PARMS* fp);
@@ -341,10 +350,10 @@ struct NR_DL_FRAME_PARMS {
   lte_prefix_type_t Ncp;
   /// sequence which is computed based on carrier frequency and numerology to rotate/derotate each OFDM symbol according to Section 5.3 in 38.211
   /// First dimension is for the direction of the link (0 DL, 1 UL)
-  int16_t symbol_rotation[2][224*2];
+  c16_t symbol_rotation[2][224];
   /// sequence used to compensate the phase rotation due to timeshifted OFDM symbols
   /// First dimenstion is for different CP lengths
-  int16_t timeshift_symbol_rotation[4096*2] __attribute__ ((aligned (16)));
+  c16_t timeshift_symbol_rotation[4096*2] __attribute__ ((aligned (16)));
   /// shift of pilot position in one RB
   uint8_t nushift;
   /// SRS configuration from TS 38.331 RRC
diff --git a/openair1/SCHED/ru_procedures.c b/openair1/SCHED/ru_procedures.c
index dc84279a961b5d3b024d96244923e8d758cb10af..443b1c79897ee07cfebb1072a95c1e89d2cf68c9 100644
--- a/openair1/SCHED/ru_procedures.c
+++ b/openair1/SCHED/ru_procedures.c
@@ -71,9 +71,9 @@
 #include "common/utils/system.h"
 
 #include <time.h>
-
-extern int oai_exit;
-
+#include "openair1/SCHED/sched_common_extern.h"
+#include "targets/RT/USER/lte-softmodem.h"
+#include "common/ran_context.h"
 
 void feptx0(RU_t *ru,
             int slot)
@@ -616,9 +616,11 @@ void init_fep_thread(RU_t *ru,
 }
 
 
-extern void kill_fep_thread(RU_t *ru)
+void kill_fep_thread(RU_t *ru)
 {
   RU_proc_t *proc = &ru->proc;
+  if (proc->pthread_fep == 0)
+    return;
   pthread_mutex_lock( &proc->mutex_fep );
   proc->instance_cnt_fep         = 0;
   pthread_cond_signal(&proc->cond_fep);
@@ -630,9 +632,11 @@ extern void kill_fep_thread(RU_t *ru)
 }
 
 
-extern void kill_feptx_thread(RU_t *ru)
+void kill_feptx_thread(RU_t *ru)
 {
   RU_proc_t *proc = &ru->proc;
+  if (proc->pthread_feptx == 0)
+    return;
   pthread_mutex_lock( &proc->mutex_feptx );
   proc->instance_cnt_feptx         = 0;
   pthread_cond_signal(&proc->cond_feptx);
diff --git a/openair1/SCHED/sched_common_extern.h b/openair1/SCHED/sched_common_extern.h
index b5edc6f38e390dc027a1f3699c2a05c157778092..2236c5f31dc6d8002c3db22baa3c8e39db1f1403 100644
--- a/openair1/SCHED/sched_common_extern.h
+++ b/openair1/SCHED/sched_common_extern.h
@@ -29,4 +29,6 @@
 extern int16_t hundred_times_delta_TF[100];
 extern uint16_t hundred_times_log10_NPRB[100];
 
+void kill_fep_thread(RU_t *ru);
+
 #endif /*__SCHED_EXTERN_H__ */
diff --git a/openair1/SCHED_NR/fapi_nr_l1.c b/openair1/SCHED_NR/fapi_nr_l1.c
index 48728ba44addaee8fa48cc8330c681862289bb99..5c08a0f479f820785ef5cf83d29481e0cfcf1619 100644
--- a/openair1/SCHED_NR/fapi_nr_l1.c
+++ b/openair1/SCHED_NR/fapi_nr_l1.c
@@ -251,7 +251,6 @@ void nr_schedule_response(NR_Sched_Rsp_t *Sched_INFO){
 
     if (number_dl_pdu>0)
       oai_nfapi_dl_tti_req(DL_req);
-
   }
   stop_meas(&gNB->schedule_response_stats);
 }
diff --git a/openair1/SCHED_NR/nr_ru_procedures.c b/openair1/SCHED_NR/nr_ru_procedures.c
index b90f14a129d44de093a8109d0563326a6ce047b8..3d5e4a0ce4d7b1f8a424b91e303fbc9126d6d376 100644
--- a/openair1/SCHED_NR/nr_ru_procedures.c
+++ b/openair1/SCHED_NR/nr_ru_procedures.c
@@ -526,7 +526,8 @@ void nr_fep0(RU_t *ru, int first_half) {
     end_symbol = NR_SYMBOLS_PER_SLOT;
   }
 
-  LOG_D(PHY,"In fep0 for slot = %d, first_half = %d, start_symbol = %d, end_symbol = %d\n", proc->tti_rx, first_half, start_symbol, end_symbol);
+  LOG_D(PHY,"In fep0 for slot = %d, first_half = %d, start_symbol = %d, end_symbol = %d, nb_antennas_rx = %d,N_TA_offset = %d\n", 
+        proc->tti_rx, first_half, start_symbol, end_symbol,fp->nb_antennas_rx,ru->N_TA_offset);
   //  printf("fep0: slot %d\n",slot);
 
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPRX+proc->tti_rx, 1);
diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
index ffbedf3da72e78ea3b646a3556c3f9cf59db3623..2e3a5dd58bf35568d2bf05887ff05cb7bafdc6ff 100644
--- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c
+++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
@@ -45,24 +45,12 @@
 #include "intertask_interface.h"
 
 //#define DEBUG_RXDATA
+//#define SRS_IND_DEBUG
 
 uint8_t SSB_Table[38]={0,2,4,6,8,10,12,14,254,254,16,18,20,22,24,26,28,30,254,254,32,34,36,38,40,42,44,46,254,254,48,50,52,54,56,58,60,62};
 
 extern uint8_t nfapi_mode;
 
-void nr_set_ssb_first_subcarrier(nfapi_nr_config_request_scf_t *cfg, NR_DL_FRAME_PARMS *fp) {
-
-  uint8_t sco = 0;
-  if (((fp->freq_range == nr_FR1) && (cfg->ssb_table.ssb_subcarrier_offset.value<24)) ||
-      ((fp->freq_range == nr_FR2) && (cfg->ssb_table.ssb_subcarrier_offset.value<12)) ) {
-    if (fp->freq_range == nr_FR1)
-      sco = cfg->ssb_table.ssb_subcarrier_offset.value>>cfg->ssb_config.scs_common.value;
-  }
-
-  fp->ssb_start_subcarrier = (12 * cfg->ssb_table.ssb_offset_point_a.value + sco);
-  LOG_D(PHY, "SSB first subcarrier %d (%d,%d)\n", fp->ssb_start_subcarrier,cfg->ssb_table.ssb_offset_point_a.value,sco);
-}
-
 void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame,int slot,nfapi_nr_dl_tti_ssb_pdu ssb_pdu) {
 
   NR_DL_FRAME_PARMS *fp=&gNB->frame_parms;
@@ -84,7 +72,12 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame,int slot,nfapi_nr_
   int ssb_start_symbol_abs = nr_get_ssb_start_symbol(fp,ssb_index); // computing the starting symbol for current ssb
   ssb_start_symbol = ssb_start_symbol_abs % fp->symbols_per_slot;  // start symbol wrt slot
 
-  nr_set_ssb_first_subcarrier(cfg, fp);  // setting the first subcarrier
+  // setting the first subcarrier
+  const int scs = cfg->ssb_config.scs_common.value;
+  const int prb_offset = (fp->freq_range == nr_FR1) ? ssb_pdu.ssb_pdu_rel15.ssbOffsetPointA>>scs : ssb_pdu.ssb_pdu_rel15.ssbOffsetPointA>>(scs-2);
+  const int sc_offset = (fp->freq_range == nr_FR1) ? ssb_pdu.ssb_pdu_rel15.SsbSubcarrierOffset>>scs : ssb_pdu.ssb_pdu_rel15.SsbSubcarrierOffset;
+  fp->ssb_start_subcarrier = (12 * prb_offset + sc_offset);
+  LOG_D(PHY, "SSB first subcarrier %d (%d,%d)\n", fp->ssb_start_subcarrier, prb_offset, sc_offset);
 
   LOG_D(PHY,"SS TX: frame %d, slot %d, start_symbol %d\n",frame,slot, ssb_start_symbol);
   nr_generate_pss(&txdataF[0][txdataF_offset], AMP, ssb_start_symbol, cfg, fp);
@@ -192,8 +185,8 @@ void phy_procedures_gNB_TX(processingData_L1tx_t *msgTx,
     NR_gNB_CSIRS_t *csirs = &msgTx->csirs_pdu[i];
     if (csirs->active == 1) {
       LOG_D(PHY, "CSI-RS generation started in frame %d.%d\n",frame,slot);
-      nfapi_nr_dl_tti_csi_rs_pdu_rel15_t csi_params = csirs->csirs_pdu.csi_rs_pdu_rel15;
-      nr_generate_csi_rs(gNB, AMP, csi_params, slot);
+      nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *csi_params = &csirs->csirs_pdu.csi_rs_pdu_rel15;
+      nr_generate_csi_rs(&gNB->frame_parms, gNB->common_vars.txdataF, AMP, gNB->nr_csi_info, csi_params, slot, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
       csirs->active = 0;
     }
   }
@@ -267,13 +260,6 @@ void nr_postDecode(PHY_VARS_gNB *gNB, notifiedFIFO_elt_t *req) {
 	          ulsch_harq->ulsch_pdu.rb_size,
 	          ulsch_harq->TBS,
 	          r);
-      ulsch_harq->round++;
-      if (ulsch_harq->round >= ulsch->Mlimit) {
-        ulsch_harq->status = SCH_IDLE;
-        ulsch_harq->round  = 0;
-        ulsch_harq->handled  = 0;
-        ulsch->harq_mask &= ~(1 << rdata->harq_pid);
-      }
       ulsch_harq->handled  = 1;
 
       LOG_D(PHY, "ULSCH %d in error\n",rdata->ulsch_id);
@@ -364,6 +350,14 @@ void nr_ulsch_procedures(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx, int ULSCH
 	number_dmrs_symbols, // number of dmrs symbols irrespective of single or double symbol dmrs
 	pusch_pdu->qam_mod_order,
 	pusch_pdu->nrOfLayers);
+
+
+  nr_ulsch_layer_demapping(gNB->pusch_vars[ULSCH_id]->llr,
+                           pusch_pdu->nrOfLayers,
+                           pusch_pdu->qam_mod_order,
+                           G,
+                           gNB->pusch_vars[ULSCH_id]->llr_layers);
+             
   //----------------------------------------------------------
   //------------------- ULSCH unscrambling -------------------
   //----------------------------------------------------------
@@ -430,17 +424,8 @@ void nr_fill_indication(PHY_VARS_gNB *gNB, int frame, int slot_rx, int ULSCH_id,
   if (timing_advance_update > 63) timing_advance_update = 63;
 
   if (crc_flag == 0) LOG_D(PHY, "%d.%d : Received PUSCH : Estimated timing advance PUSCH is  = %d, timing_advance_update is %d \n", frame,slot_rx,sync_pos,timing_advance_update);
-  else if (harq_process->round>0 || dtx_flag == 0) { // increment round if crc_flag == 1 and not(dtx_flag ==1 and round==0)
-      harq_process->round++;
-      if (harq_process->round >= ulsch->Mlimit) {
-        harq_process->status = SCH_IDLE;
-        harq_process->round  = 0;
-        harq_process->handled  = 0;
-        ulsch->harq_mask &= ~(1 << harq_pid);
-      }
-  }
-  // estimate UL_CQI for MAC
 
+  // estimate UL_CQI for MAC
   int SNRtimes10 = dB_fixed_x10(gNB->pusch_vars[ULSCH_id]->ulsch_power_tot) -
                    dB_fixed_x10(gNB->pusch_vars[ULSCH_id]->ulsch_noise_power_tot);
 
@@ -590,7 +575,7 @@ void fill_ul_rb_mask(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) {
               LOG_D(PHY,"symbol %d Filling rb_mask_ul rb_size %d\n",symbol,ulsch_harq->ulsch_pdu.rb_size);
               for (rb=0; rb<ulsch_harq->ulsch_pdu.rb_size; rb++) {
                 rb2 = rb+ulsch_harq->ulsch_pdu.rb_start+ulsch_harq->ulsch_pdu.bwp_start;
-                gNB->rb_mask_ul[symbol][rb2>>5] |= (1<<(rb2&31));
+                gNB->rb_mask_ul[symbol][rb2 >> 5] |= 1U << (rb2 & 31);
               }
             }
           }
@@ -642,10 +627,38 @@ void phy_procedures_gNB_common_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx)
 
 }
 
+int fill_srs_reported_symbol_list(nfapi_nr_srs_indication_reported_symbol_t *reported_symbol_list,
+                                  const nfapi_nr_srs_pdu_t *srs_pdu,
+                                  const int N_RB_UL,
+                                  const int8_t *snr_per_rb,
+                                  const int srs_est) {
+
+  reported_symbol_list->num_rbs = srs_bandwidth_config[srs_pdu->config_index][srs_pdu->bandwidth_index][0];
+
+  if (!reported_symbol_list->rb_list) {
+    reported_symbol_list->rb_list = (nfapi_nr_srs_indication_reported_symbol_resource_block_t*) calloc(1, N_RB_UL*sizeof(nfapi_nr_srs_indication_reported_symbol_resource_block_t));
+  }
+
+  for(int rb = 0; rb < reported_symbol_list->num_rbs; rb++) {
+    if (srs_est<0) {
+      reported_symbol_list->rb_list[rb].rb_snr = 0xFF;
+    } else if (snr_per_rb[rb] < -64) {
+      reported_symbol_list->rb_list[rb].rb_snr = 0;
+    } else if (snr_per_rb[rb] > 63) {
+      reported_symbol_list->rb_list[rb].rb_snr = 0xFE;
+    } else {
+      reported_symbol_list->rb_list[rb].rb_snr = (snr_per_rb[rb] + 64)<<1;
+    }
+  }
+
+  return 0;
+}
+
 int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) {
   /* those variables to log T_GNB_PHY_PUCCH_PUSCH_IQ only when we try to decode */
   int pucch_decode_done = 0;
   int pusch_decode_done = 0;
+  int pusch_DTX = 0;
 
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_gNB_UESPEC_RX,1);
   LOG_D(PHY,"phy_procedures_gNB_uespec_RX frame %d, slot %d\n",frame_rx,slot_rx);
@@ -785,7 +798,8 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) {
           if (no_sig) {
             LOG_D(PHY, "PUSCH not detected in frame %d, slot %d\n", frame_rx, slot_rx);
             nr_fill_indication(gNB, frame_rx, slot_rx, ULSCH_id, harq_pid, 1,1);
-            return 1;
+            pusch_DTX++;
+            continue;
           }
           gNB->pusch_vars[ULSCH_id]->ulsch_power_tot=0;
           gNB->pusch_vars[ULSCH_id]->ulsch_noise_power_tot=0;
@@ -803,10 +817,15 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) {
                    dB_fixed_x10(gNB->pusch_vars[ULSCH_id]->ulsch_power_tot),
                    dB_fixed_x10(gNB->pusch_vars[ULSCH_id]->ulsch_noise_power_tot),gNB->pusch_thres);
              gNB->pusch_vars[ULSCH_id]->ulsch_power_tot = gNB->pusch_vars[ULSCH_id]->ulsch_noise_power_tot;
-             nr_fill_indication(gNB,frame_rx, slot_rx, ULSCH_id, harq_pid, 1,1);
              gNB->pusch_vars[ULSCH_id]->DTX=1;
              if (stats) stats->DTX++;
-             return 1;
+             if (!get_softmodem_params()->phy_test) {
+               /* in case of phy_test mode, we still want to decode to measure execution time. 
+                  Therefore, we don't yet call nr_fill_indication, it will be called later */
+               nr_fill_indication(gNB,frame_rx, slot_rx, ULSCH_id, harq_pid, 1,1);
+               pusch_DTX++;
+               continue;
+             }
           } else {
             LOG_D(PHY, "PUSCH detected in %d.%d (%d,%d,%d)\n",frame_rx,slot_rx,
                   dB_fixed_x10(gNB->pusch_vars[ULSCH_id]->ulsch_power_tot),
@@ -836,29 +855,88 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) {
 
         LOG_D(NR_PHY, "(%d.%d) gNB is waiting for SRS, id = %i\n", frame_rx, slot_rx, i);
 
+        NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
         nfapi_nr_srs_pdu_t *srs_pdu = &srs->srs_pdu;
+        uint8_t N_symb_SRS = 1<<srs_pdu->num_symbols;
+        int32_t srs_received_signal[frame_parms->nb_antennas_rx][frame_parms->ofdm_symbol_size*N_symb_SRS];
+        int32_t srs_ls_estimated_channel[frame_parms->nb_antennas_rx][frame_parms->ofdm_symbol_size*N_symb_SRS];
+        int32_t srs_estimated_channel_freq[frame_parms->nb_antennas_rx][frame_parms->ofdm_symbol_size*N_symb_SRS] __attribute__ ((aligned(32)));
+        int32_t srs_estimated_channel_time[frame_parms->nb_antennas_rx][frame_parms->ofdm_symbol_size] __attribute__ ((aligned(32)));
+        int32_t srs_estimated_channel_time_shifted[frame_parms->nb_antennas_rx][frame_parms->ofdm_symbol_size];
+        uint32_t noise_power_per_rb[srs_pdu->bwp_size];
+        int8_t snr_per_rb[srs_pdu->bwp_size];
+        uint32_t signal_power;
+        uint32_t noise_power;
+        int8_t snr;
 
         // At least currently, the configuration is constant, so it is enough to generate the sequence just once.
         if(gNB->nr_srs_info[i]->sc_list_length == 0) {
-          generate_srs_nr(srs_pdu, &gNB->frame_parms, gNB->nr_srs_info[i]->srs_generated_signal, gNB->nr_srs_info[i], AMP, frame_rx, slot_rx);
+          generate_srs_nr(srs_pdu, frame_parms, gNB->nr_srs_info[i]->srs_generated_signal, gNB->nr_srs_info[i], AMP, frame_rx, slot_rx);
         }
 
-        nr_get_srs_signal(gNB,frame_rx,slot_rx,srs_pdu, gNB->nr_srs_info[i], gNB->nr_srs_info[i]->srs_received_signal);
-
-        nr_srs_channel_estimation(gNB,frame_rx,slot_rx,srs_pdu,
-                                  gNB->nr_srs_info[i],
-                                  gNB->nr_srs_info[i]->srs_generated_signal,
-                                  gNB->nr_srs_info[i]->srs_received_signal,
-                                  gNB->nr_srs_info[i]->srs_estimated_channel_freq,
-                                  gNB->nr_srs_info[i]->srs_estimated_channel_time,
-                                  gNB->nr_srs_info[i]->srs_estimated_channel_time_shifted,
-                                  gNB->nr_srs_info[i]->noise_power);
+        const int srs_est = nr_get_srs_signal(gNB,frame_rx,slot_rx, srs_pdu, gNB->nr_srs_info[i], srs_received_signal);
+
+        if (srs_est >= 0) {
+          nr_srs_channel_estimation(gNB,
+                                    frame_rx,
+                                    slot_rx,
+                                    srs_pdu,
+                                    gNB->nr_srs_info[i],
+                                    gNB->nr_srs_info[i]->srs_generated_signal,
+                                    srs_received_signal,
+                                    srs_ls_estimated_channel,
+                                    srs_estimated_channel_freq,
+                                    srs_estimated_channel_time,
+                                    srs_estimated_channel_time_shifted,
+                                    &signal_power,
+                                    noise_power_per_rb,
+                                    &noise_power,
+                                    snr_per_rb,
+                                    &snr);
+        }
 
         T(T_GNB_PHY_UL_FREQ_CHANNEL_ESTIMATE, T_INT(0), T_INT(srs_pdu->rnti), T_INT(frame_rx), T_INT(0), T_INT(0),
-          T_BUFFER(gNB->nr_srs_info[i]->srs_estimated_channel_freq[0], gNB->frame_parms.ofdm_symbol_size*sizeof(int32_t)));
+          T_BUFFER(srs_estimated_channel_freq[0], frame_parms->ofdm_symbol_size*sizeof(int32_t)));
 
         T(T_GNB_PHY_UL_TIME_CHANNEL_ESTIMATE, T_INT(0), T_INT(srs_pdu->rnti), T_INT(frame_rx), T_INT(0), T_INT(0),
-          T_BUFFER(gNB->nr_srs_info[i]->srs_estimated_channel_time_shifted[0], gNB->frame_parms.ofdm_symbol_size*sizeof(int32_t)));
+          T_BUFFER(srs_estimated_channel_time_shifted[0], frame_parms->ofdm_symbol_size*sizeof(int32_t)));
+
+        const uint16_t num_srs = gNB->UL_INFO.srs_ind.number_of_pdus;
+        gNB->UL_INFO.srs_ind.pdu_list = &gNB->srs_pdu_list[0];
+        gNB->UL_INFO.srs_ind.sfn = frame_rx;
+        gNB->UL_INFO.srs_ind.slot = slot_rx;
+        gNB->srs_pdu_list[num_srs].handle = srs_pdu->handle;
+        gNB->srs_pdu_list[num_srs].rnti = srs_pdu->rnti;
+        gNB->srs_pdu_list[num_srs].timing_advance = srs_est >= 0 ? nr_est_timing_advance_srs(frame_parms,
+                                                                                             srs_estimated_channel_time) : 0xFFFF;
+        gNB->srs_pdu_list[num_srs].num_symbols = 1<<srs_pdu->num_symbols;
+        gNB->srs_pdu_list[num_srs].wide_band_snr = srs_est >= 0 ? (snr + 64)<<1 : 0xFF; // 0xFF will be set if this field is invalid
+        gNB->srs_pdu_list[num_srs].num_reported_symbols = 1<<srs_pdu->num_symbols;
+        if(!gNB->srs_pdu_list[num_srs].reported_symbol_list) {
+          gNB->srs_pdu_list[num_srs].reported_symbol_list = (nfapi_nr_srs_indication_reported_symbol_t*) calloc(1, gNB->srs_pdu_list[num_srs].num_reported_symbols*sizeof(nfapi_nr_srs_indication_reported_symbol_t));
+        }
+        fill_srs_reported_symbol_list(&gNB->srs_pdu_list[num_srs].reported_symbol_list[0],
+                                      srs_pdu,
+                                      frame_parms->N_RB_UL,
+                                      snr_per_rb,
+                                      srs_est);
+
+        gNB->UL_INFO.srs_ind.number_of_pdus += 1;
+
+#ifdef SRS_IND_DEBUG
+        LOG_I(NR_PHY, "gNB->UL_INFO.srs_ind.sfn = %i\n", gNB->UL_INFO.srs_ind.sfn);
+        LOG_I(NR_PHY, "gNB->UL_INFO.srs_ind.slot = %i\n", gNB->UL_INFO.srs_ind.slot);
+        LOG_I(NR_PHY, "gNB->srs_pdu_list[%i].rnti = 0x%04x\n", num_srs, gNB->srs_pdu_list[num_srs].rnti);
+        LOG_I(NR_PHY, "gNB->srs_pdu_list[%i].timing_advance = %i\n", num_srs, gNB->srs_pdu_list[num_srs].timing_advance);
+        LOG_I(NR_PHY, "gNB->srs_pdu_list[%i].num_symbols = %i\n", num_srs, gNB->srs_pdu_list[num_srs].num_symbols);
+        LOG_I(NR_PHY, "gNB->srs_pdu_list[%i].wide_band_snr = %i\n", num_srs, gNB->srs_pdu_list[num_srs].wide_band_snr);
+        LOG_I(NR_PHY, "gNB->srs_pdu_list[%i].num_reported_symbols = %i\n", num_srs, gNB->srs_pdu_list[num_srs].num_reported_symbols);
+        LOG_I(NR_PHY, "gNB->srs_pdu_list[%i].reported_symbol_list[0].num_rbs = %i\n", num_srs, gNB->srs_pdu_list[num_srs].reported_symbol_list[0].num_rbs);
+        for(int rb = 0; rb < gNB->srs_pdu_list[num_srs].reported_symbol_list[0].num_rbs; rb++) {
+          LOG_I(NR_PHY, "gNB->srs_pdu_list[%i].reported_symbol_list[0].rb_list[%3i].rb_snr = %i\n",
+                num_srs, rb, gNB->srs_pdu_list[num_srs].reported_symbol_list[0].rb_list[rb].rb_snr);
+        }
+#endif
 
         srs->active = 0;
       }
@@ -866,15 +944,11 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) {
   }
 
   stop_meas(&gNB->phy_proc_rx);
-  // figure out a better way to choose slot_rx, 19 is ok for a particular TDD configuration with 30kHz SCS
-  if ((frame_rx&127) == 0 && slot_rx==19) {
-    LOG_I(NR_PHY, "Number of bad PUCCH received: %lu\n", gNB->bad_pucch);
-  }
 
   if (pucch_decode_done || pusch_decode_done) {
     T(T_GNB_PHY_PUCCH_PUSCH_IQ, T_INT(frame_rx), T_INT(slot_rx), T_BUFFER(&gNB->common_vars.rxdataF[0][0], gNB->frame_parms.symbols_per_slot * gNB->frame_parms.ofdm_symbol_size * 4));
   }
 
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_gNB_UESPEC_RX,0);
-  return 0;
+  return pusch_DTX;
 }
diff --git a/openair1/SCHED_NR_UE/defs.h b/openair1/SCHED_NR_UE/defs.h
index 9bcf659eac83b4a279521acdc6cbeece4e980109..fa354d228432f85487f1e3f76c2597b250671c7f 100644
--- a/openair1/SCHED_NR_UE/defs.h
+++ b/openair1/SCHED_NR_UE/defs.h
@@ -373,6 +373,7 @@ int get_tx_harq_id(NR_UE_ULSCH_t *ulsch, int slot_tx);
 
 int is_pbch_in_slot(fapi_nr_config_request_t *config, int frame, int slot, NR_DL_FRAME_PARMS *fp);
 int is_ssb_in_slot(fapi_nr_config_request_t *config, int frame, int slot, NR_DL_FRAME_PARMS *fp);
+bool is_csi_rs_in_symbol(fapi_nr_dl_config_csirs_pdu_rel15_t csirs_config_pdu, int symbol);
 
 /*! \brief This function prepares the dl indication to pass to the MAC
     @param
@@ -404,7 +405,7 @@ void nr_fill_rx_indication(fapi_nr_rx_indication_t *rx_ind,
                            NR_UE_DLSCH_t *dlsch1,
                            uint16_t n_pdus,
                            UE_nr_rxtx_proc_t *proc,
-			   void * typeSpecific);
+                           void *typeSpecific);
 
 bool nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
                             UE_nr_rxtx_proc_t *proc,
@@ -427,6 +428,9 @@ int nr_ue_pdcch_procedures(uint8_t gNB_id,
                            NR_UE_PDCCH_CONFIG *phy_pdcch_config,
                            int n_ss);
 
+int nr_ue_csi_im_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t gNB_id);
+
+int nr_ue_csi_rs_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t gNB_id);
 
 #endif
 
diff --git a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c
index 51b34fb9baa9d2014129041190a74a2fe5d37759..f4c863bb408c417ae5728986f229a3880fc5b9f9 100644
--- a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c
+++ b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c
@@ -44,7 +44,7 @@
 
 extern PHY_VARS_NR_UE ***PHY_vars_UE_g;
 
-const char *dl_pdu_type[]={"DCI", "DLSCH", "RA_DLSCH", "SI_DLSCH", "P_DLSCH"};
+const char *dl_pdu_type[]={"DCI", "DLSCH", "RA_DLSCH", "SI_DLSCH", "P_DLSCH", "CSI_RS", "CSI_IM"};
 const char *ul_pdu_type[]={"PRACH", "PUCCH", "PUSCH", "SRS"};
 queue_t nr_rx_ind_queue;
 queue_t nr_crc_ind_queue;
@@ -315,6 +315,10 @@ void configure_dlsch(NR_UE_DLSCH_t *dlsch0,
   dlsch0_harq->mcs = dlsch_config_pdu->mcs;
   dlsch0_harq->rvidx = dlsch_config_pdu->rv;
   dlsch0->g_pucch = dlsch_config_pdu->accumulated_delta_PUCCH;
+  dlsch0_harq->R = dlsch_config_pdu->targetCodeRate;
+  dlsch0_harq->Qm = dlsch_config_pdu->qamModOrder;
+  dlsch0_harq->TBS = dlsch_config_pdu->TBS;
+  dlsch0_harq->tbslbrm = dlsch_config_pdu->tbslbrm;
   dlsch0_harq->nscid = dlsch_config_pdu->nscid;
   dlsch0_harq->dlDmrsScramblingId = dlsch_config_pdu->dlDmrsScramblingId;
   //get nrOfLayers from DCI info
@@ -341,6 +345,7 @@ void configure_dlsch(NR_UE_DLSCH_t *dlsch0,
   LOG_D(MAC, ">>>> \tdlsch0->g_pucch = %d\tdlsch0_harq.mcs = %d\n", dlsch0->g_pucch, dlsch0_harq->mcs);
 }
 
+
 int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){
 
   bool found = false;
@@ -355,12 +360,16 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){
     NR_UE_DLSCH_t *dlsch0 = NULL;
     NR_UE_ULSCH_t *ulsch = PHY_vars_UE_g[module_id][cc_id]->ulsch[thread_id][0];
     NR_UE_PUCCH *pucch_vars = PHY_vars_UE_g[module_id][cc_id]->pucch_vars[thread_id][0];
+    NR_UE_CSI_IM *csiim_vars = PHY_vars_UE_g[module_id][cc_id]->csiim_vars[0];
+    NR_UE_CSI_RS *csirs_vars = PHY_vars_UE_g[module_id][cc_id]->csirs_vars[0];
     NR_UE_PDCCH_CONFIG *phy_pdcch_config = NULL;
 
     if(scheduled_response->dl_config != NULL){
       fapi_nr_dl_config_request_t *dl_config = scheduled_response->dl_config;
       fapi_nr_dl_config_dlsch_pdu_rel15_t *dlsch_config_pdu;
       fapi_nr_dl_config_dci_dl_pdu_rel15_t *pdcch_config;
+      fapi_nr_dl_config_csiim_pdu_rel15_t *csiim_config_pdu;
+      fapi_nr_dl_config_csirs_pdu_rel15_t *csirs_config_pdu;
 
       for (int i = 0; i < dl_config->number_pdus; ++i){
         AssertFatal(dl_config->number_pdus < FAPI_NR_DL_CONFIG_LIST_NUM,"dl_config->number_pdus %d out of bounds\n",dl_config->number_pdus);
@@ -382,10 +391,14 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){
             LOG_D(PHY,"Number of DCI SearchSpaces %d\n",phy_pdcch_config->nb_search_space);
             break;
           case FAPI_NR_DL_CONFIG_TYPE_CSI_IM:
-            LOG_I(PHY,"Received CSI-IM PDU at FAPI\n");
+            csiim_config_pdu = &dl_config->dl_config_list[i].csiim_config_pdu.csiim_config_rel15;
+            memcpy((void*)&(csiim_vars->csiim_config_pdu), (void*)csiim_config_pdu, sizeof(fapi_nr_dl_config_csiim_pdu_rel15_t));
+            csiim_vars->active = true;
             break;
           case FAPI_NR_DL_CONFIG_TYPE_CSI_RS:
-            LOG_I(PHY,"Received CSI-RS PDU at FAPI\n");
+            csirs_config_pdu = &dl_config->dl_config_list[i].csirs_config_pdu.csirs_config_rel15;
+            memcpy((void*)&(csirs_vars->csirs_config_pdu), (void*)csirs_config_pdu, sizeof(fapi_nr_dl_config_csirs_pdu_rel15_t));
+            csirs_vars->active = true;
             break;
           case FAPI_NR_DL_CONFIG_TYPE_RA_DLSCH:
             dlsch_config_pdu = &dl_config->dl_config_list[i].dlsch_config_pdu.dlsch_config_rel15;
@@ -424,7 +437,7 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){
       for (int i = 0; i < ul_config->number_pdus; ++i){
 
         AssertFatal(ul_config->ul_config_list[i].pdu_type <= FAPI_NR_UL_CONFIG_TYPES,"pdu_type %d out of bounds\n",ul_config->ul_config_list[i].pdu_type);
-        LOG_D(PHY, "In %s: processing %s PDU of %d total UL PDUs (ul_config %p) \n", __FUNCTION__, ul_pdu_type[ul_config->ul_config_list[i].pdu_type - 1], ul_config->number_pdus, ul_config);
+        LOG_D(PHY, "In %s i %d: processing %s PDU of %d total UL PDUs (ul_config %p) \n", __FUNCTION__, i, ul_pdu_type[ul_config->ul_config_list[i].pdu_type - 1], ul_config->number_pdus, ul_config);
 
         uint8_t pdu_type = ul_config->ul_config_list[i].pdu_type, current_harq_pid, gNB_id = 0;
         /* PRACH */
@@ -449,6 +462,8 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){
           if (harq_process_ul_ue){
 
             nfapi_nr_ue_pusch_pdu_t *pusch_pdu = &harq_process_ul_ue->pusch_pdu;
+            
+            LOG_D(PHY, "In %s i %d: copy pusch_config_pdu nrOfLayers:%d, num_dmrs_cdm_grps_no_data:%d \n", __FUNCTION__, i, pusch_config_pdu->nrOfLayers,pusch_config_pdu->num_dmrs_cdm_grps_no_data);
 
             memcpy(pusch_pdu, pusch_config_pdu, sizeof(nfapi_nr_ue_pusch_pdu_t));
 
diff --git a/openair1/SCHED_NR_UE/harq_nr.c b/openair1/SCHED_NR_UE/harq_nr.c
index a9ff01d78a471cb5dc51016a3cbfd04f476c575e..795cea5dfa7a04bcc16abd9d8747559bc9853ee4 100644
--- a/openair1/SCHED_NR_UE/harq_nr.c
+++ b/openair1/SCHED_NR_UE/harq_nr.c
@@ -308,7 +308,7 @@ void init_downlink_harq_status(NR_DL_UE_HARQ_t *dl_harq)
   dl_harq->status = SCH_IDLE;
   dl_harq->first_rx = 1;
   dl_harq->DLround  = 0;
-  dl_harq->DCINdi = 1;
+  dl_harq->Ndi = 1;
   dl_harq->ack = DL_ACKNACK_NO_SET;
 }
 
@@ -329,7 +329,7 @@ void init_downlink_harq_status(NR_DL_UE_HARQ_t *dl_harq)
 *
 *********************************************************************/
 
-void downlink_harq_process(NR_DL_UE_HARQ_t *dl_harq, int harq_pid, int ndi, int rv, uint8_t rnti_type) {
+void downlink_harq_process(NR_DL_UE_HARQ_t *dl_harq, int harq_pid, int dci_ndi, int rv, uint8_t rnti_type) {
 
   if (rnti_type == _SI_RNTI_ ||
       rnti_type == _P_RNTI_ ||
@@ -339,10 +339,9 @@ void downlink_harq_process(NR_DL_UE_HARQ_t *dl_harq, int harq_pid, int ndi, int
     dl_harq->first_rx = 1;
   }  else {
     LOG_D(PHY,"receive harq process: %p harqPid=%d, rv=%d, ndi=%d, rntiType=%d new transmission= %s\n",
-	  dl_harq, harq_pid, rv, ndi, rnti_type, dl_harq->DCINdi != ndi ? "yes":"no");
+	  dl_harq, harq_pid, rv, dci_ndi, rnti_type, dl_harq->Ndi != dci_ndi ? "yes":"no");
     AssertFatal(rv<4 && rv>=0, "invalid redondancy version %d\n", rv);
-    
-    if (ndi!=dl_harq->DCINdi) {
+    if (dci_ndi!=dl_harq->Ndi) {
       if (dl_harq->ack == DL_NACK)
         LOG_D(PHY,"New transmission on a harq pid (%d) never acknowledged\n", harq_pid);
       else
@@ -354,7 +353,7 @@ void downlink_harq_process(NR_DL_UE_HARQ_t *dl_harq, int harq_pid, int ndi, int
         LOG_D(PHY,"Starting retransmission on a harq pid (%d), rv (%d)\n", harq_pid, rv);
     }
 
-    if (ndi!=dl_harq->DCINdi) {
+    if (dci_ndi!=dl_harq->Ndi) {
       dl_harq->first_rx = true;
       dl_harq->DLround = 0;
     } else {
@@ -364,7 +363,7 @@ void downlink_harq_process(NR_DL_UE_HARQ_t *dl_harq, int harq_pid, int ndi, int
     
     dl_harq->status = ACTIVE;
 
-    dl_harq->DCINdi = ndi;
+    dl_harq->Ndi = dci_ndi;
     //dl_harq->status = SCH_IDLE;
    }
 }
diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
index 4a8abe83e96be0f77587fdc89e83044485a9c0c0..8ef26ffd8ab32deb77443ccd04b1434006ea4f42 100644
--- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
+++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
@@ -36,6 +36,7 @@
 #include "assertions.h"
 #include "defs.h"
 #include "PHY/defs_nr_UE.h"
+#include "PHY/NR_REFSIG/dmrs_nr.h"
 #include "PHY/phy_extern_nr_ue.h"
 #include "PHY/MODULATION/modulation_UE.h"
 #include "PHY/NR_UE_TRANSPORT/nr_transport_ue.h"
@@ -120,9 +121,8 @@ void nr_fill_rx_indication(fapi_nr_rx_indication_t *rx_ind,
                            NR_UE_DLSCH_t *dlsch0,
                            NR_UE_DLSCH_t *dlsch1,
                            uint16_t n_pdus,
-			   UE_nr_rxtx_proc_t *proc,
-			   void * typeSpecific){
-
+                           UE_nr_rxtx_proc_t *proc,
+                           void *typeSpecific){
 
   NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
 
@@ -134,7 +134,6 @@ void nr_fill_rx_indication(fapi_nr_rx_indication_t *rx_ind,
     trace_NRpdu(DIRECTION_DOWNLINK,
 		dlsch0->harq_processes[dlsch0->current_harq_pid]->b,
 		dlsch0->harq_processes[dlsch0->current_harq_pid]->TBS / 8,
-		pdu_type,
 		WS_C_RNTI,
 		dlsch0->rnti,
 		proc->frame_rx,
@@ -176,6 +175,11 @@ void nr_fill_rx_indication(fapi_nr_rx_indication_t *rx_ind,
       rx_ind->rx_indication_body[n_pdus - 1].ssb_pdu.ssb_start_subcarrier = frame_parms->ssb_start_subcarrier;
       rx_ind->rx_indication_body[n_pdus - 1].ssb_pdu.rsrp_dBm = ue->measurements.rsrp_dBm[gNB_id];
     break;
+    case FAPI_NR_CSIRS_IND:
+      memcpy(&rx_ind->rx_indication_body[n_pdus - 1].csirs_measurements,
+             (fapi_nr_csirs_measurements_t*)typeSpecific,
+             sizeof(*(fapi_nr_csirs_measurements_t*)typeSpecific));
+      break;
     default:
     break;
   }
@@ -284,7 +288,8 @@ void phy_procedures_nrUE_TX(PHY_VARS_NR_UE *ue,
 
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX,VCD_FUNCTION_IN);
 
-  memset(ue->common_vars.txdataF[0], 0, sizeof(int)*14*ue->frame_parms.ofdm_symbol_size);
+  for(int i=0; i< ue->frame_parms.nb_antennas_tx; ++i)
+    memset(ue->common_vars.txdataF[i], 0, sizeof(int)*14*ue->frame_parms.ofdm_symbol_size);
 
   LOG_D(PHY,"****** start TX-Chain for AbsSubframe %d.%d ******\n", frame_tx, slot_tx);
 
@@ -611,6 +616,15 @@ int nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int gNB_
       }
     }
 
+    if (ue->chest_time == 1) { // averaging time domain channel estimates
+      nr_chest_time_domain_avg(&ue->frame_parms,
+                               ue->pdsch_vars[proc->thread_id][gNB_id]->dl_ch_estimates,
+                               dlsch0_harq->nb_symbols,
+                               dlsch0_harq->start_symbol,
+                               dlsch0_harq->dlDmrsSymbPos,
+                               pdsch_nb_rb);
+    }
+
     uint16_t first_symbol_with_data = s0;
     uint32_t dmrs_data_re;
 
@@ -801,8 +815,7 @@ bool nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
                             nb_symb_sch,
                             nr_slot_rx,
                             harq_pid,
-                            pdsch==PDSCH?1:0,
-                            dlsch0->harq_processes[harq_pid]->TBS>256?1:0);
+                            pdsch==PDSCH);
 
     LOG_T(PHY,"dlsch decoding, ret = %d\n", ret);
 
@@ -878,8 +891,7 @@ bool nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
                                nb_symb_sch,
                                nr_slot_rx,
                                harq_pid,
-                               pdsch==PDSCH?1:0,//proc->decoder_switch,
-                               dlsch1->harq_processes[harq_pid]->TBS>256?1:0);
+                               pdsch==PDSCH);//proc->decoder_switch
       LOG_T(PHY,"CW dlsch decoding, ret1 = %d\n", ret1);
 
       stop_meas(&ue->dlsch_decoding_stats[proc->thread_id]);
@@ -918,21 +930,25 @@ bool nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
       const double N_TA_max = Ta_max * bw_scaling * tc_factor;
 
       NR_UE_MAC_INST_t *mac = get_mac_inst(0);
+      NR_BWP_Id_t dl_bwp = mac->DL_BWP_Id;
+      NR_BWP_Id_t ul_bwp = mac->UL_BWP_Id;
 
       NR_PUSCH_TimeDomainResourceAllocationList_t *pusch_TimeDomainAllocationList = NULL;
-      if (mac->ULbwp[0] &&
-          mac->ULbwp[0]->bwp_Dedicated &&
-          mac->ULbwp[0]->bwp_Dedicated->pusch_Config &&
-          mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup &&
-          mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup->pusch_TimeDomainAllocationList) {
-        pusch_TimeDomainAllocationList = mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup->pusch_TimeDomainAllocationList->choice.setup;
-      }
-      else if (mac->ULbwp[0] &&
-               mac->ULbwp[0]->bwp_Common &&
-               mac->ULbwp[0]->bwp_Common->pusch_ConfigCommon &&
-               mac->ULbwp[0]->bwp_Common->pusch_ConfigCommon->choice.setup &&
-               mac->ULbwp[0]->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList) {
-        pusch_TimeDomainAllocationList = mac->ULbwp[0]->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
+      if(ul_bwp){
+        if (mac->ULbwp[ul_bwp-1] &&
+            mac->ULbwp[ul_bwp-1]->bwp_Dedicated &&
+            mac->ULbwp[ul_bwp-1]->bwp_Dedicated->pusch_Config &&
+            mac->ULbwp[ul_bwp-1]->bwp_Dedicated->pusch_Config->choice.setup &&
+            mac->ULbwp[ul_bwp-1]->bwp_Dedicated->pusch_Config->choice.setup->pusch_TimeDomainAllocationList) {
+          pusch_TimeDomainAllocationList = mac->ULbwp[ul_bwp-1]->bwp_Dedicated->pusch_Config->choice.setup->pusch_TimeDomainAllocationList->choice.setup;
+        }
+        else if (mac->ULbwp[ul_bwp-1] &&
+                 mac->ULbwp[ul_bwp-1]->bwp_Common &&
+                 mac->ULbwp[ul_bwp-1]->bwp_Common->pusch_ConfigCommon &&
+                 mac->ULbwp[ul_bwp-1]->bwp_Common->pusch_ConfigCommon->choice.setup &&
+                 mac->ULbwp[ul_bwp-1]->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList) {
+          pusch_TimeDomainAllocationList = mac->ULbwp[ul_bwp-1]->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
+        }
       }
       else if (mac->scc_SIB &&
                mac->scc_SIB->uplinkConfigCommon &&
@@ -943,12 +959,15 @@ bool nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
       }
       long mapping_type_ul = pusch_TimeDomainAllocationList ? pusch_TimeDomainAllocationList->list.array[0]->mappingType : NR_PUSCH_TimeDomainResourceAllocation__mappingType_typeA;
 
-      NR_PDSCH_Config_t *pdsch_Config = (mac->DLbwp[0] && mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup) ? mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup : NULL;
+      NR_PDSCH_Config_t *pdsch_Config = NULL;
       NR_PDSCH_TimeDomainResourceAllocationList_t *pdsch_TimeDomainAllocationList = NULL;
-      if (mac->DLbwp[0] && mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup->pdsch_TimeDomainAllocationList)
-        pdsch_TimeDomainAllocationList = pdsch_Config->pdsch_TimeDomainAllocationList->choice.setup;
-      else if (mac->DLbwp[0] && mac->DLbwp[0]->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList)
-        pdsch_TimeDomainAllocationList = mac->DLbwp[0]->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList;
+      if(dl_bwp){
+        pdsch_Config = (mac->DLbwp[dl_bwp-1] && mac->DLbwp[dl_bwp-1]->bwp_Dedicated->pdsch_Config->choice.setup) ? mac->DLbwp[dl_bwp-1]->bwp_Dedicated->pdsch_Config->choice.setup : NULL;
+        if (mac->DLbwp[dl_bwp-1] && mac->DLbwp[dl_bwp-1]->bwp_Dedicated->pdsch_Config->choice.setup->pdsch_TimeDomainAllocationList)
+          pdsch_TimeDomainAllocationList = pdsch_Config->pdsch_TimeDomainAllocationList->choice.setup;
+        else if (mac->DLbwp[dl_bwp-1] && mac->DLbwp[dl_bwp-1]->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList)
+          pdsch_TimeDomainAllocationList = mac->DLbwp[dl_bwp-1]->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList;
+      }
       else if (mac->scc_SIB && mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.pdsch_ConfigCommon->choice.setup)
         pdsch_TimeDomainAllocationList = mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList;
       long mapping_type_dl = pdsch_TimeDomainAllocationList ? pdsch_TimeDomainAllocationList->list.array[0]->mappingType : NR_PDSCH_TimeDomainResourceAllocation__mappingType_typeA;
@@ -1002,7 +1021,7 @@ bool nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
         d_2_1 = 1;
 
       /* d_2_2 */
-      const double d_2_2 = 0.0; // set to 0 because there is only 1 BWP: TODO this should corresponds to the switching time as defined in TS 38.133
+      const double d_2_2 = pusch_d_2_2_timing_capability_1[numerology][1];
 
       /* N_t_1 time duration in msec of N_1 symbols corresponding to a PDSCH reception time
       // N_t_2 time duration in msec of N_2 symbols corresponding to a PUSCH preparation time */
@@ -1306,8 +1325,7 @@ int is_ssb_in_slot(fapi_nr_config_request_t *config, int frame, int slot, NR_DL_
   //uint8_t half_frame_index = fp->half_frame_bit;
   //uint8_t i_ssb = fp->ssb_index;
   uint8_t Lmax = fp->Lmax;
-
-  if (!(frame%(1<<(config->ssb_table.ssb_period-1)))){
+  if ((config->ssb_table.ssb_period > 0) && !(frame % (1 << (config->ssb_table.ssb_period - 1)))) {
 
     if(Lmax <= 8) {
       if(slot <=3 && (((config->ssb_table.ssb_mask_list[0].ssb_mask << 2*slot)&0x80000000) == 0x80000000 || ((config->ssb_table.ssb_mask_list[0].ssb_mask << (2*slot +1))&0x80000000) == 0x80000000))
@@ -1484,7 +1502,17 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
 
   if ((frame_rx%64 == 0) && (nr_slot_rx==0)) {
     LOG_I(NR_PHY,"============================================\n");
-    LOG_I(NR_PHY,"Harq round stats for Downlink: %d/%d/%d/%d DLSCH errors: %d\n",ue->dl_stats[0],ue->dl_stats[1],ue->dl_stats[2],ue->dl_stats[3],ue->dl_stats[4]);
+    // fixed text + 8 HARQs rounds à 10 ("999999999/") + NULL
+    // if we use 999999999 HARQs, that should be sufficient for at least 138 hours
+    const size_t harq_output_len = 31 + 10 * 8 + 1;
+    char output[harq_output_len];
+    char *p = output;
+    const char *end = output + harq_output_len;
+    p += snprintf(p, end - p, "Harq round stats for Downlink: %d", ue->dl_stats[0]);
+    for (int round = 1; round < 16 && (round < 3 || ue->dl_stats[round] != 0); ++round)
+      p += snprintf(p, end - p,"/%d", ue->dl_stats[round]);
+    LOG_I(NR_PHY,"%s/0\n", output);
+
     LOG_I(NR_PHY,"============================================\n");
   }
 
@@ -1697,6 +1725,36 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
 
  }
 
+  // do procedures for CSI-IM
+  if ((ue->csiim_vars[gNB_id]) && (ue->csiim_vars[gNB_id]->active == 1)) {
+    int l_csiim[4] = {-1, -1, -1, -1};
+    for(int symb_idx = 0; symb_idx < 4; symb_idx++) {
+      bool nr_slot_fep_done = false;
+      for (int symb_idx2 = 0; symb_idx2 < symb_idx; symb_idx2++) {
+        if (l_csiim[symb_idx2] == ue->csiim_vars[gNB_id]->csiim_config_pdu.l_csiim[symb_idx]) {
+          nr_slot_fep_done = true;
+        }
+      }
+      l_csiim[symb_idx] = ue->csiim_vars[gNB_id]->csiim_config_pdu.l_csiim[symb_idx];
+      if(nr_slot_fep_done == false) {
+        nr_slot_fep(ue, proc, ue->csiim_vars[gNB_id]->csiim_config_pdu.l_csiim[symb_idx], nr_slot_rx);
+      }
+    }
+    nr_ue_csi_im_procedures(ue, proc, gNB_id);
+    ue->csiim_vars[gNB_id]->active = 0;
+  }
+
+  // do procedures for CSI-RS
+  if ((ue->csirs_vars[gNB_id]) && (ue->csirs_vars[gNB_id]->active == 1)) {
+    for(int symb = 0; symb < NR_SYMBOLS_PER_SLOT; symb++) {
+      if(is_csi_rs_in_symbol(ue->csirs_vars[gNB_id]->csirs_config_pdu,symb)) {
+        nr_slot_fep(ue, proc, symb, nr_slot_rx);
+      }
+    }
+    nr_ue_csi_rs_procedures(ue, proc, gNB_id);
+    ue->csirs_vars[gNB_id]->active = 0;
+  }
+
   start_meas(&ue->generic_stat);
 
   if (nr_slot_rx==9) {
diff --git a/openair1/SCHED_NR_UE/phy_sch_processing_time.h b/openair1/SCHED_NR_UE/phy_sch_processing_time.h
index 1962df22eed3d2b92bca7b756420894b75fdcecc..81cc4496a2634384722c13273d81c97c3aa695cc 100644
--- a/openair1/SCHED_NR_UE/phy_sch_processing_time.h
+++ b/openair1/SCHED_NR_UE/phy_sch_processing_time.h
@@ -106,4 +106,36 @@ float pusch_N_2_timing_capability_2[3][2] = {
 {  0,      5   },
 {  1,      5.5 },
 {  2,      11  },
-};
\ No newline at end of file
+};
+
+/* TS 38.133 Table 8.6.2-1: BWP switch delay capability 1
+//   corresponding to the PUSCH preparation time d_2_2 [slots]
+// where mu corresponds to the one of {mu_DL, mu_UL}
+//   resulting with the largest T_proc_2
+// where mu_DL is the SCS with which the PDCCH
+//   carrying the DCI scheduling the PUSCH was transmitted
+//   mu_UL is the SCS of the UL channel with which PUSCH to be transmitted
+*/
+float pusch_d_2_2_timing_capability_1[4][2] = {
+/* mu      d_2_2   */
+{  0,      1   },
+{  1,      2   },
+{  2,      3   },
+{  3,      6   },
+};
+
+/* TS 38.133 Table 8.6.2-1: BWP switch delay capability 2
+//   corresponding to the PUSCH preparation time d_2_2 [slots]
+// where mu corresponds to the one of {mu_DL, mu_UL}
+//   resulting with the largest T_proc_2
+// where mu_DL is the SCS with which the PDCCH
+//   carrying the DCI scheduling the PUSCH was transmitted
+//   mu_UL is the SCS of the UL channel with which PUSCH to be transmitted
+*/
+float pusch_d_2_2_timing_capability_2[4][2] = {
+/* mu      d_2_2   */
+{  0,      3   },
+{  1,      5   },
+{  2,      9   },
+{  3,      18  },
+};
diff --git a/openair1/SCHED_UE/phy_procedures_lte_ue.c b/openair1/SCHED_UE/phy_procedures_lte_ue.c
index aa0ff0db80fe9506d796f9f927464e11add22a38..cdf4cf39f9a59696050985080b93f40a82769fe7 100644
--- a/openair1/SCHED_UE/phy_procedures_lte_ue.c
+++ b/openair1/SCHED_UE/phy_procedures_lte_ue.c
@@ -460,7 +460,7 @@ void ue_compute_srs_occasion(PHY_VARS_UE *ue,
       is_pucch2_subframe = (is_ri_TXOp(ue,proc,eNB_id) && (ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.ri_ConfigIndex>0)) || is_pucch2_subframe;
 
       // check ACK/SR transmission
-      if(frame_parms->soundingrs_ul_config_common.ackNackSRS_SimultaneousTransmission == FALSE) {
+      if(frame_parms->soundingrs_ul_config_common.ackNackSRS_SimultaneousTransmission == false) {
         if(is_SR_TXOp(ue,proc,eNB_id)) {
           uint32_t SR_payload = 0;
 
diff --git a/openair1/SIMULATION/LTE_PHY/dlsim.c b/openair1/SIMULATION/LTE_PHY/dlsim.c
index 231d63cf047254821caa07336cf5c1401c4bf775..8aff47c86b8159ab260d10741042833de90f18db 100644
--- a/openair1/SIMULATION/LTE_PHY/dlsim.c
+++ b/openair1/SIMULATION/LTE_PHY/dlsim.c
@@ -512,12 +512,16 @@ int main(int argc, char **argv) {
   int re;
   int s,Kr,Kr_bytes;
   LTE_DL_FRAME_PARMS *frame_parms;
-  double s_re0[30720*2],s_im0[30720*2],r_re0[30720*2],r_im0[30720*2];
-  double s_re1[30720*2],s_im1[30720*2],r_re1[30720*2],r_im1[30720*2];
-  double *s_re[2]= {s_re0,s_re1};
-  double *s_im[2]= {s_im0,s_im1};
-  double *r_re[2]= {r_re0,r_re1};
-  double *r_im[2]= {r_im0,r_im1};
+  double *tmpTX[4], *tmpRX[4] ;
+  for (int i = 0; i < 4; i++) {
+    tmpTX[i] = malloc(30720 * NB_ANTENNAS_TX * sizeof(*tmpTX));
+    tmpRX[i] = malloc(30720 * NB_ANTENNAS_RX * sizeof(*tmpRX));
+  }
+  double *s_re[NB_ANTENNAS_TX] = {tmpTX[0], tmpTX[1]};
+  double *s_im[NB_ANTENNAS_TX] = {tmpTX[2], tmpTX[3]};
+  double *r_re[NB_ANTENNAS_RX] = {tmpRX[0], tmpRX[1]};
+  double *r_im[NB_ANTENNAS_RX] = {tmpRX[2], tmpRX[3]};
+  
   uint8_t transmission_mode=1,n_tx_port=1,n_tx_phy=1,n_rx=2;
   int eNB_id = 0;
   unsigned char round;
diff --git a/openair1/SIMULATION/LTE_PHY/mbmssim.c b/openair1/SIMULATION/LTE_PHY/mbmssim.c
index 7efe9f4530e6b212fc68a3d598ee38aa5c46ed3c..5aad30405bf49f487566d9dbdd265b77498ff824 100644
--- a/openair1/SIMULATION/LTE_PHY/mbmssim.c
+++ b/openair1/SIMULATION/LTE_PHY/mbmssim.c
@@ -1338,20 +1338,16 @@ int main(int argc, char **argv) {
       break;
   }
 
-  for (k=0; k<NUMBER_OF_UE_MAX; k++) {
-    // Create transport channel structures for 2 transport blocks (MIMO)
-    for (i=0; i<2; i++) {
-      eNB->dlsch[k][i] = new_eNB_dlsch(Kmimo,8,Nsoft,N_RB_DL,0,&eNB->frame_parms);
-
-      if (!eNB->dlsch[k][i]) {
-        printf("Can't get eNB dlsch structures\n");
-        exit(-1);
-      }
+    // Create transport channel structures for 1 transport block
+  eNB->dlsch[0][0] = new_eNB_dlsch(Kmimo,8,Nsoft,N_RB_DL,0,&eNB->frame_parms);
 
-      eNB->dlsch[k][i]->rnti = n_rnti+k;
-    }
+  if (!eNB->dlsch[0][0]) {
+      printf("Can't get eNB dlsch structures\n");
+      exit(-1);
   }
 
+  eNB->dlsch[0][0]->rnti = n_rnti+k;
+
 #ifdef ENABLE_MBMS_SIM
   eNB->dlsch_MCH = new_eNB_dlsch(1,8,Nsoft,N_RB_DL, 0, &eNB->frame_parms);
 #endif
diff --git a/openair1/SIMULATION/LTE_PHY/ulsim.c b/openair1/SIMULATION/LTE_PHY/ulsim.c
index a1894d03d7384f6650723cd3b5f73635a09b429c..0f98eb337a66d42b18b1971791dce39263e3cf87 100644
--- a/openair1/SIMULATION/LTE_PHY/ulsim.c
+++ b/openair1/SIMULATION/LTE_PHY/ulsim.c
@@ -358,7 +358,7 @@ int main(int argc, char **argv) {
   unsigned short input_buffer_length;
   unsigned int ret;
   unsigned int coded_bits_per_codeword,nsymb;
-  unsigned int tx_lev=0,tx_lev_dB,trials,errs[5]= {0,0,0,0,0},round_trials[4]= {0,0,0,0};
+  unsigned int tx_lev = 0, tx_lev_dB = 0, trials, errs[6] = {0}, round_trials[4] = {0};
   FILE *bler_fd=NULL;
   char bler_fname[512];
   FILE *time_meas_fd=NULL;
@@ -387,7 +387,6 @@ int main(int argc, char **argv) {
   double cpu_freq_GHz;
   int iter_trials;
   uint32_t UL_alloc_pdu;
-  int s,Kr,Kr_bytes;
   int dump_perf=0;
   static int dump_table =0;
   double effective_rate=0.0;
@@ -1233,20 +1232,21 @@ int main(int argc, char **argv) {
 
             if (n_frames==1) {
               printf("ULSCH errors found o_ACK[0]= %d\n",eNB->ulsch[0]->harq_processes[harq_pid]->o_ACK[0]);
-
+#ifdef DUMP_EACH_VALUE
+              int Kr_bytes;
               for (s=0; s<eNB->ulsch[0]->harq_processes[harq_pid]->C; s++) {
                 if (s<eNB->ulsch[0]->harq_processes[harq_pid]->Cminus)
-                  Kr = eNB->ulsch[0]->harq_processes[harq_pid]->Kminus;
+                  Kr_bytes = eNB->ulsch[0]->harq_processes[harq_pid]->Kminus;
                 else
-                  Kr = eNB->ulsch[0]->harq_processes[harq_pid]->Kplus;
-
-                Kr_bytes = Kr>>3;
+                  Kr_bytes = eNB->ulsch[0]->harq_processes[harq_pid]->Kplus;
+                Kr_bytes = Kr_bytes >> 3;
                 printf("Decoded_output (Segment %d):\n",s);
 
                 for (i=0; i<Kr_bytes; i++)
                   printf("%d : %x (%x)\n",i,eNB->ulsch[0]->harq_processes[harq_pid]->c[s][i],
                          eNB->ulsch[0]->harq_processes[harq_pid]->c[s][i]^UE->ulsch[0]->harq_processes[harq_pid]->c[s][i]);
               }
+#endif
 
               dump_ulsch(eNB,eNB->proc.frame_rx,subframe,0,round);
               round=5;
diff --git a/openair1/SIMULATION/NR_PHY/dlschsim.c b/openair1/SIMULATION/NR_PHY/dlschsim.c
index 6f747b36a63e59715d927a9398fadae8fc2b15cc..39cd5407955400f69478c7cd2e7717ba5bc1515c 100644
--- a/openair1/SIMULATION/NR_PHY/dlschsim.c
+++ b/openair1/SIMULATION/NR_PHY/dlschsim.c
@@ -47,14 +47,18 @@
 #include "openair1/SIMULATION/RF/rf.h"
 #include "openair1/SIMULATION/NR_PHY/nr_unitary_defs.h"
 #include "openair1/SIMULATION/NR_PHY/nr_dummy_functions.c"
+#include "openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h"
+
 
 //#define DEBUG_NR_DLSCHSIM
 
+THREAD_STRUCT thread_struct;
 PHY_VARS_gNB *gNB;
 PHY_VARS_NR_UE *UE;
 RAN_CONTEXT_t RC;
 UE_nr_rxtx_proc_t proc;
 int32_t uplink_frequency_offset[MAX_NUM_CCs][4];
+uint64_t downlink_frequency[MAX_NUM_CCs][4];
 
 double cpuf;
 //uint8_t nfapi_mode = 0;
@@ -110,15 +114,16 @@ int main(int argc, char **argv)
 	//int run_initial_sync=0;
 	int loglvl = OAILOG_WARNING;
 	uint8_t dlsch_threads = 0;
-	float target_error_rate = 0.01;
-        uint64_t SSB_positions=0x01;
-	uint16_t nb_symb_sch = 12;
-	uint16_t nb_rb = 50;
-	uint8_t Imcs = 9;
-        uint8_t mcs_table = 0;
-        double DS_TDL = .03;
-	cpuf = get_cpu_freq_GHz();
-	char gNBthreads[128]="n";
+  float target_error_rate = 0.01;
+  uint64_t SSB_positions=0x01;
+  uint16_t nb_symb_sch = 12;
+  uint16_t nb_rb = 50;
+  uint8_t Imcs = 9;
+  uint8_t mcs_table = 0;
+  double DS_TDL = .03;
+  cpuf = get_cpu_freq_GHz();
+  char gNBthreads[128]="n";
+  int Tbslbrm = 950984;
 
 	if (load_configmodule(argc, argv, CONFIG_ENABLECMDLINEONLY) == 0) {
 		exit_fun("[NR_DLSCHSIM] Error, configuration module init failed\n");
@@ -294,7 +299,7 @@ int main(int argc, char **argv)
 			break;
 
 		case 'X':
-		  strncpy(gNBthreads, optarg, sizeof(gNBthreads));
+		  strncpy(gNBthreads, optarg, sizeof(gNBthreads)-1);
 		  gNBthreads[sizeof(gNBthreads)-1]=0;
 		  break;
 
@@ -426,13 +431,10 @@ int main(int argc, char **argv)
 	NR_gNB_DLSCH_t *dlsch = msgDataTx.dlsch[0][0];
 	nfapi_nr_dl_tti_pdsch_pdu_rel15_t *rel15 = &dlsch->harq_process.pdsch_pdu.pdsch_pdu_rel15;
 	//time_stats_t *rm_stats, *te_stats, *i_stats;
-	uint8_t is_crnti = 0, llr8_flag = 0;
+	uint8_t is_crnti = 0;
 	unsigned int TBS = 8424;
-	unsigned int available_bits;
 	uint8_t nb_re_dmrs = 6;  // No data in dmrs symbol
 	uint16_t length_dmrs = 1;
-	unsigned char mod_order;
-        uint16_t rate;
 	uint8_t Nl = 1;
 	uint8_t rvidx = 0;
 	dlsch->rnti = 1;
@@ -440,9 +442,9 @@ int main(int argc, char **argv)
 	 dlsch->harq_processes[0]->rvidx = rvidx;*/
 	//printf("dlschsim harqid %d nb_rb %d, mscs %d\n",dlsch->harq_ids[subframe],
 	//    dlsch->harq_processes[0]->nb_rb,dlsch->harq_processes[0]->mcs,dlsch->harq_processes[0]->Nl);
-	mod_order = nr_get_Qm_dl(Imcs, mcs_table);
-        rate = nr_get_code_rate_dl(Imcs, mcs_table);
-	available_bits = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, mod_order, 1);
+	unsigned char mod_order = nr_get_Qm_dl(Imcs, mcs_table);
+        uint16_t rate = nr_get_code_rate_dl(Imcs, mcs_table);
+	unsigned int available_bits = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, mod_order, 1);
 	TBS = nr_compute_tbs(mod_order,rate, nb_rb, nb_symb_sch, nb_re_dmrs*length_dmrs, 0, 0, Nl);
 	printf("available bits %u TBS %u mod_order %d\n", available_bits, TBS, mod_order);
 	//dlsch->harq_ids[subframe]= 0;
@@ -457,6 +459,7 @@ int main(int argc, char **argv)
 	rel15->dlDmrsSymbPos = 4;
 	rel15->mcsIndex[0] = Imcs;
         rel15->numDmrsCdmGrpsNoData = 1;
+        rel15->maintenance_parms_v3.tbSizeLbrmBytes = Tbslbrm;
 	double modulated_input[16 * 68 * 384]; // [hna] 16 segments, 68*Zc
 	short channel_output_fixed[16 * 68 * 384];
 	//unsigned char *estimated_output;
@@ -473,9 +476,11 @@ int main(int argc, char **argv)
 	harq_process->Qm = mod_order;
 	harq_process->rvidx = rvidx;
 	harq_process->R = rate;
+        harq_process->TBS = TBS;
 	harq_process->dmrsConfigType = NFAPI_NR_DMRS_TYPE1;
 	harq_process->dlDmrsSymbPos = 4;
 	harq_process->n_dmrs_cdm_groups = 1;
+        harq_process->tbslbrm = Tbslbrm;
 	printf("harq process ue mcs = %d Qm = %d, symb %d\n", harq_process->mcs, harq_process->Qm, nb_symb_sch);
 
 	unsigned char *test_input=dlsch->harq_process.pdu;
@@ -492,8 +497,8 @@ int main(int argc, char **argv)
 
 	//printf("crc32: [0]->0x%08x\n",crc24c(test_input, 32));
 	// generate signal
-	    unsigned char output[rel15->rbSize * NR_SYMBOLS_PER_SLOT * NR_NB_SC_PER_RB * 8 * NR_MAX_NB_LAYERS] __attribute__((aligned(32)));
-    bzero(output,rel15->rbSize * NR_SYMBOLS_PER_SLOT * NR_NB_SC_PER_RB * 8 * NR_MAX_NB_LAYERS);
+        unsigned char output[rel15->rbSize * NR_SYMBOLS_PER_SLOT * NR_NB_SC_PER_RB * 8 * NR_MAX_NB_LAYERS] __attribute__((aligned(32)));
+        bzero(output,rel15->rbSize * NR_SYMBOLS_PER_SLOT * NR_NB_SC_PER_RB * 8 * NR_MAX_NB_LAYERS);
 	if (input_fd == NULL) {
 	  nr_dlsch_encoding(gNB, frame, slot, &dlsch->harq_process, frame_parms,output,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
 	}
@@ -545,7 +550,7 @@ int main(int argc, char **argv)
 
 			ret = nr_dlsch_decoding(UE, &proc, 0, channel_output_fixed, &UE->frame_parms,
 					dlsch0_ue, dlsch0_ue->harq_processes[0], frame, nb_symb_sch,
-					slot,harq_pid, is_crnti, llr8_flag);
+					slot,harq_pid, is_crnti);
 
 			vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_DECODING0, VCD_FUNCTION_OUT);
 
diff --git a/openair1/SIMULATION/NR_PHY/dlsim.c b/openair1/SIMULATION/NR_PHY/dlsim.c
index eff65fa6069c98d38ad106242c4e34e5ed77f4a9..57c6589ca4ef928ed1e9fd5544e903cc276e03b1 100644
--- a/openair1/SIMULATION/NR_PHY/dlsim.c
+++ b/openair1/SIMULATION/NR_PHY/dlsim.c
@@ -66,6 +66,7 @@
 #include "NR_RRCReconfiguration.h"
 #define inMicroS(a) (((double)(a))/(get_cpu_freq_GHz()*1000.0))
 #include "SIMULATION/LTE_PHY/common_sim.h"
+#include "PHY/NR_REFSIG/dmrs_nr.h"
 
 #include <openair2/LAYER2/MAC/mac_vars.h>
 #include <openair2/RRC/LTE/rrc_vars.h>
@@ -96,13 +97,20 @@ uint16_t sl_ahead=0;
 uint64_t downlink_frequency[MAX_NUM_CCs][4];
 THREAD_STRUCT thread_struct;
 nfapi_ue_release_request_body_t release_rntis;
-uint32_t N_RB_DL = 106;
 //Fixme: Uniq dirty DU instance, by global var, datamodel need better management
 instance_t DUuniqInstance=0;
 instance_t CUuniqInstance=0;
-teid_t newGtpuCreateTunnel(instance_t instance, rnti_t rnti, int incoming_bearer_id, int outgoing_bearer_id, teid_t outgoing_teid,
-                           transport_layer_addr_t remoteAddr, int port, gtpCallback callBack) {
-return 0;
+teid_t newGtpuCreateTunnel(instance_t instance,
+                           rnti_t rnti,
+                           int incoming_bearer_id,
+                           int outgoing_bearer_id,
+                           teid_t outgoing_teid,
+                           int qfi,
+                           transport_layer_addr_t remoteAddr,
+                           int port,
+                           gtpCallback callBack,
+                           gtpCallbackSDAP callBackSDAP) {
+  return 0;
 }
 
 int newGtpuDeleteAllTunnels(instance_t instance, rnti_t rnti) {
@@ -210,11 +218,9 @@ int nr_derive_key(int alg_type, uint8_t alg_id,
 }
 
 void config_common(int Mod_idP,
-                   int ssb_SubcarrierOffset,
-                   rrc_pdsch_AntennaPorts_t pdsch_AntennaPorts,
+                   int pdsch_AntennaPorts,
                    int pusch_AntennaPorts,
-		   NR_ServingCellConfigCommon_t *scc
-		   );
+                   NR_ServingCellConfigCommon_t *scc);
 
 int generate_dlsch_header(unsigned char *mac_header,
                           unsigned char num_sdus,
@@ -243,10 +249,10 @@ int DU_send_INITIAL_UL_RRC_MESSAGE_TRANSFER(module_id_t     module_idP,
   return 0;
 }
 
-nr_bler_struct nr_bler_data[NR_NUM_MCS];
-
 void processSlotTX(void *arg) {}
 
+nr_bler_struct nr_bler_data[NR_NUM_MCS];
+
 //nFAPI P7 dummy functions to avoid linking errors 
 
 int oai_nfapi_dl_tti_req(nfapi_nr_dl_tti_request_t *dl_config_req) { return(0);  }
@@ -265,35 +271,50 @@ void update_ptrs_config(NR_CellGroupConfig_t *secondaryCellGroup, uint16_t *rbSi
 void update_dmrs_config(NR_CellGroupConfig_t *scg, int8_t* dmrs_arg);
 extern void fix_scd(NR_ServingCellConfig_t *scd);// forward declaration
 
-/* specific dlsim DL preprocessor: uses rbStart/rbSize/mcs/nrOfLayers from command line of
-   dlsim, does not search for CCE/PUCCH occasion but simply sets to 0 */
+/* specific dlsim DL preprocessor: uses rbStart/rbSize/mcs/nrOfLayers from command line of dlsim */
 int g_mcsIndex = -1, g_mcsTableIdx = 0, g_rbStart = -1, g_rbSize = -1, g_nrOfLayers = 1;
 void nr_dlsim_preprocessor(module_id_t module_id,
                            frame_t frame,
                            sub_frame_t slot) {
-  NR_UE_info_t *UE_info = &RC.nrmac[module_id]->UE_info;
-  AssertFatal(UE_info->num_UEs == 1, "can have only a single UE\n");
-  NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[0];
+
+  NR_UE_info_t *UE_info = RC.nrmac[module_id]->UE_info.list[0];
+  AssertFatal(RC.nrmac[module_id]->UE_info.list[1]==NULL, "can have only a single UE\n");
+  NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl;
   NR_ServingCellConfigCommon_t *scc = RC.nrmac[0]->common_channels[0].ServingCellConfigCommon;
 
-  /* manually set free CCE to 0 */
   const int target_ss = NR_SearchSpace__searchSpaceType_PR_ue_Specific;
   sched_ctrl->search_space = get_searchspace(NULL, scc, sched_ctrl->active_bwp ? sched_ctrl->active_bwp->bwp_Dedicated : NULL, target_ss);
-  uint8_t nr_of_candidates;
-  find_aggregation_candidates(&sched_ctrl->aggregation_level,
-                              &nr_of_candidates,
-                              sched_ctrl->search_space,4);
-  sched_ctrl->coreset = get_coreset(module_id, scc, sched_ctrl->active_bwp->bwp_Dedicated, sched_ctrl->search_space, target_ss);
-  sched_ctrl->cce_index = 0;
+  uint8_t nr_of_candidates = 0;
+  if (g_mcsIndex < 4) {
+    find_aggregation_candidates(&sched_ctrl->aggregation_level,
+                                &nr_of_candidates,
+                                sched_ctrl->search_space,8);
+  }
+  if (nr_of_candidates == 0) {
+    find_aggregation_candidates(&sched_ctrl->aggregation_level,
+                                &nr_of_candidates,
+                                sched_ctrl->search_space,4);
+  }
+  sched_ctrl->coreset = get_coreset(RC.nrmac[module_id], scc, sched_ctrl->active_bwp->bwp_Dedicated, sched_ctrl->search_space, target_ss);
+  uint32_t Y = get_Y(sched_ctrl->search_space, slot, UE_info->rnti);
+  int CCEIndex = find_pdcch_candidate(RC.nrmac[module_id],
+                                      /* CC_id = */ 0,
+                                      sched_ctrl->aggregation_level,
+                                      nr_of_candidates,
+                                      &sched_ctrl->sched_pdcch,
+                                      sched_ctrl->coreset,
+                                      Y);
+  AssertFatal(CCEIndex>=0, "%4d.%2d could not find CCE for DL DCI UE %d/RNTI %04x\n", frame, slot, 0, UE_info->rnti);
+  sched_ctrl->cce_index = CCEIndex;
 
   NR_pdsch_semi_static_t *ps = &sched_ctrl->pdsch_semi_static;
 
   nr_set_pdsch_semi_static(NULL,
                            scc,
-                           UE_info->CellGroup[0],
+                           UE_info->CellGroup,
                            sched_ctrl->active_bwp,
                            NULL,
-                           /* tda = */ 2,
+                           /* tda = */ 0,
                            g_nrOfLayers,
                            sched_ctrl,
                            ps);
@@ -315,8 +336,7 @@ void nr_dlsim_preprocessor(module_id_t module_id,
                                         ps->N_PRB_DMRS * ps->N_DMRS_SLOT,
                                         0 /* N_PRB_oh, 0 for initialBWP */,
                                         0 /* tb_scaling */,
-                                        ps->nrOfLayers)
-                         >> 3;
+                                        ps->nrOfLayers) >> 3;
 
   /* the simulator assumes the HARQ PID is equal to the slot number */
   sched_pdsch->dl_harq_pid = slot;
@@ -360,10 +380,13 @@ int main(int argc, char **argv)
   int i,aa;//,l;
   double sigma2, sigma2_dB=10, SNR, snr0=-2.0, snr1=2.0;
   uint8_t snr1set=0;
-  double roundStats[500] = {0};
-  double blerStats[500] = {0};
-  double berStats[500] = {0};
-  double snrStats[500] = {0};
+  uint32_t errors_scrambling[4][100] = {{0}};
+  int      n_errors[4][100]          = {{0}};
+  int      round_trials[4][100]      = {{0}};
+  double   roundStats[100]           = {0};
+  double   blerStats[4][100]         = {{0}};
+  double   berStats[4][100]          = {{0}};
+  double   snrStats[100]             = {0};
   float effRate;
   //float psnr;
   float eff_tp_check = 0.7;
@@ -381,7 +404,7 @@ int main(int argc, char **argv)
   //int freq_offset;
   //  int subframe_offset;
   //  char fname[40], vname[40];
-  int trial, n_trials = 1, n_errors = 0, n_false_positive = 0;
+  int trial, n_trials = 1, n_false_positive = 0;
   //int n_errors2, n_alamouti;
   uint8_t n_tx=1,n_rx=1;
   uint8_t round;
@@ -437,7 +460,8 @@ int main(int argc, char **argv)
   uint16_t rbSize = 106;
   uint8_t  mcsIndex = 9;
   uint8_t  dlsch_threads = 0;
-  int      prb_inter = 0;
+  int      chest_type[2] = {0};
+  uint8_t  max_ldpc_iterations = 5;
   if ( load_configmodule(argc,argv,CONFIG_ENABLECMDLINEONLY) == 0) {
     exit_fun("[NR_DLSIM] Error, configuration module init failed\n");
   }
@@ -448,7 +472,7 @@ int main(int argc, char **argv)
 
   FILE *scg_fd=NULL;
   
-  while ((c = getopt (argc, argv, "f:hA:pf:g:in:s:S:t:x:y:z:M:N:F:GR:dPIL:Ea:b:d:e:q:m:w:T:U:X:")) != -1) {
+  while ((c = getopt (argc, argv, "f:hA:pf:g:i:n:s:S:t:x:y:z:M:N:F:GR:dPI:L:Ea:b:d:e:m:w:T:U:q:X:Y")) != -1) {
     switch (c) {
     case 'f':
       scg_fd = fopen(optarg,"r");
@@ -505,7 +529,9 @@ int main(int argc, char **argv)
       break;
 
     case 'i':
-      prb_inter=1;
+      for(i=0; i < atoi(optarg); i++){
+        chest_type[i] = atoi(argv[optind++]);
+      }
       break;
 
     case 'n':
@@ -592,9 +618,7 @@ int main(int argc, char **argv)
       break;
       
     case 'I':
-      run_initial_sync=1;
-      //target_error_rate=0.1;
-      slot = 0;
+      max_ldpc_iterations = atoi(optarg);
       break;
 
     case 'L':
@@ -652,15 +676,21 @@ int main(int argc, char **argv)
         dmrs_arg[i] = atoi(argv[optind++]);
       }
       break;
-      
+
     case 'X':
-      strncpy(gNBthreads, optarg, sizeof(gNBthreads));
+      strncpy(gNBthreads, optarg, sizeof(gNBthreads)-1);
       gNBthreads[sizeof(gNBthreads)-1]=0;
       break;
-      
+
+    case 'Y':
+      run_initial_sync=1;
+      //target_error_rate=0.1;
+      slot = 0;
+      break;
+
     default:
     case 'h':
-      printf("%s -h(elp) -p(extended_prefix) -N cell_id -f output_filename -F input_filename -g channel_model -n n_frames -t Delayspread -s snr0 -S snr1 -x transmission_mode -y TXant -z RXant -i Intefrence0 -j Interference1 -A interpolation_file -C(alibration offset dB) -N CellId\n",
+      printf("%s -h(elp) -p(extended_prefix) -N cell_id -f output_filename -F input_filename -g channel_model -n n_frames -s snr0 -S snr1 -x transmission_mode -y TXant -z RXant -i Intefrence0 -j Interference1 -A interpolation_file -C(alibration offset dB) -N CellId\n",
              argv[0]);
       printf("-h This message\n");
       printf("-L <log level, 0(errors), 1(warning), 2(analysis), 3(info), 4(debug), 5(trace)>\n");
@@ -669,11 +699,11 @@ int main(int argc, char **argv)
       printf("-n Number of frames to simulate\n");
       printf("-s Starting SNR, runs from SNR0 to SNR0 + 5 dB.  If n_frames is 1 then just SNR is simulated\n");
       printf("-S Ending SNR, runs from SNR0 to SNR1\n");
-      printf("-t Delay spread for multipath channel\n");
+      //printf("-t Delay spread for multipath channel\n");
       printf("-g [A,B,C,D,E,F,G,R] Use 3GPP SCM (A,B,C,D) or 36-101 (E-EPA,F-EVA,G-ETU) models or R for MIMO model (ignores delay spread and Ricean factor)\n");
       printf("-y Number of TX antennas used in gNB\n");
       printf("-z Number of RX antennas used in UE\n");
-      printf("-i Activate PRB based averaging for channel estimation. Frequncy domain interpolation by default.\n");
+      printf("-i Change channel estimation technique. Arguments list: Frequency domain {0:Linear interpolation, 1:PRB based averaging}, Time domain {0:Estimates of last DMRS symbol, 1:Average of DMRS symbols}\n");
       //printf("-j Relative strength of second intefering gNB (in dB) - cell_id mod 3 = 2\n");
       printf("-R N_RB_DL\n");
       printf("-O oversampling factor (1,2,4,8,16)\n");
@@ -690,12 +720,14 @@ int main(int argc, char **argv)
       printf("-e MSC index\n");
       printf("-q MCS Table index\n");
       printf("-t Acceptable effective throughput (in percentage)\n");
+      printf("-I Maximum LDPC decoder iterations\n");
       printf("-T Enable PTRS, arguments list L_PTRS{0,1,2} K_PTRS{2,4}, e.g. -T 2 0 2 \n");
       printf("-U Change DMRS Config, arguments list DMRS TYPE{0=A,1=B} DMRS AddPos{0:2} DMRS ConfType{1:2}, e.g. -U 3 0 2 1 \n");
       printf("-P Print DLSCH performances\n");
       printf("-w Write txdata to binary file (one frame)\n");
       printf("-d number of dlsch threads, 0: no dlsch parallelization\n");
-      printf("-X gNB thread pool configuration, n => no threads");
+      printf("-X gNB thread pool configuration, n => no threads\n");
+      printf("-Y Run initial sync in UE\n");
       exit (-1);
       break;
     }
@@ -709,6 +741,7 @@ int main(int argc, char **argv)
 
   get_softmodem_params()->phy_test = 1;
   get_softmodem_params()->do_ra = 0;
+  set_softmodem_optmask(SOFTMODEM_DLSIM_BIT);
 
   if (snr1set==0)
     snr1 = snr0+10;
@@ -736,6 +769,8 @@ int main(int argc, char **argv)
   gNB_RRC_INST rrc;
   memset((void*)&rrc,0,sizeof(rrc));
 
+  gNB_mac->dl_bler.harq_round_max = num_rounds;
+
   /*
   // read in SCGroupConfig
   AssertFatal(scg_fd != NULL,"no reconfig.raw file\n");
@@ -831,16 +866,15 @@ int main(int argc, char **argv)
   gNB->if_inst->NR_PHY_config_req      = nr_phy_config_request;
 
   // common configuration
-  rrc_mac_config_req_gNB(0,0, pdsch_AntennaPorts, n_tx, 0, 6, scc, NULL, NULL, 0, 0, NULL);
+  rrc_mac_config_req_gNB(0, pdsch_AntennaPorts, n_tx, 0, 6, scc, NULL, NULL, 0, 0, NULL);
   // UE dedicated configuration
-  rrc_mac_config_req_gNB(0,0, pdsch_AntennaPorts, n_tx, 0, 6, scc, NULL, NULL, 1, secondaryCellGroup->spCellConfig->reconfigurationWithSync->newUE_Identity,secondaryCellGroup);
+  rrc_mac_config_req_gNB(0, pdsch_AntennaPorts, n_tx, 0, 6, scc, NULL, NULL, 1, secondaryCellGroup->spCellConfig->reconfigurationWithSync->newUE_Identity,secondaryCellGroup);
   // reset preprocessor to the one of DLSIM after it has been set during
   // rrc_mac_config_req_gNB
   gNB_mac->pre_processor_dl = nr_dlsim_preprocessor;
   phy_init_nr_gNB(gNB,0,1);
   N_RB_DL = gNB->frame_parms.N_RB_DL;
-  NR_UE_info_t *UE_info = &RC.nrmac[0]->UE_info;
-  UE_info->num_UEs=1;
+  NR_UE_info_t *UE_info = RC.nrmac[0]->UE_info.list[0];
 
   // stub to configure frame_parms
   //  nr_phy_config_request_sim(gNB,N_RB_DL,N_RB_DL,mu,Nid_cell,SSB_positions);
@@ -855,10 +889,14 @@ int main(int argc, char **argv)
 
   double fs,bw;
 
-  if (mu == 1 && N_RB_DL == 217) { 
+  if (mu == 0 && N_RB_DL == 25) {
+    fs = 7.68e6;
+    bw = 5e6;
+  }
+  else if (mu == 1 && N_RB_DL == 217) {
     fs = 122.88e6;
     bw = 80e6;
-  }					       
+  }
   else if (mu == 1 && N_RB_DL == 245) {
     fs = 122.88e6;
     bw = 90e6;
@@ -871,14 +909,18 @@ int main(int argc, char **argv)
     fs = 61.44e6;
     bw = 40e6;
   }
-  else if (mu == 1 && N_RB_DL == 133) { 
+  else if (mu == 1 && N_RB_DL == 133) {
     fs = 61.44e6;
     bw = 50e6;
   }
-  else if (mu == 1 && N_RB_DL == 162) { 
+  else if (mu == 1 && N_RB_DL == 162) {
     fs = 61.44e6;
     bw = 60e6;
   }
+  else if (mu == 1 && N_RB_DL == 24) {
+    fs = 15.36e6;
+    bw = 10e6;
+  }
   else if (mu == 3 && N_RB_DL == 66) {
     fs = 122.88e6;
     bw = 100e6;
@@ -944,11 +986,10 @@ int main(int argc, char **argv)
   PHY_vars_UE_g[0][0] = UE;
   memcpy(&UE->frame_parms,frame_parms,sizeof(NR_DL_FRAME_PARMS));
   UE->frame_parms.nb_antennas_rx = n_rx;
+  UE->max_ldpc_iterations = max_ldpc_iterations;
 
   if (run_initial_sync==1)  UE->is_synchronized = 0;
   else                      {UE->is_synchronized = 1; UE->UE_mode[0]=PUSCH;}
-                      
-  UE->perfect_ce = 0;
 
   if (init_nr_ue_signal(UE, 1) != 0)
   {
@@ -978,8 +1019,8 @@ int main(int argc, char **argv)
   UE->if_inst->phy_config_request = nr_ue_phy_config_request;
   UE->if_inst->dl_indication = nr_ue_dl_indication;
   UE->if_inst->ul_indication = dummy_nr_ue_ul_indication;
-  UE->prb_interpolation = prb_inter;
-
+  UE->chest_freq = chest_type[0];
+  UE->chest_time = chest_type[1];
 
   UE_mac->if_module = nr_ue_if_module_init(0);
 
@@ -987,7 +1028,6 @@ int main(int argc, char **argv)
   unsigned char *estimated_output_bit;
   unsigned char *test_input_bit;
   unsigned int errors_bit    = 0;
-  uint32_t errors_scrambling = 0;
 
   initTpool("N", &(nrUE_params.Tpool), false);
 
@@ -1028,6 +1068,7 @@ int main(int argc, char **argv)
   nr_ue_phy_config_request(&UE_mac->phy_config);
   //NR_COMMON_channels_t *cc = RC.nrmac[0]->common_channels;
   snrRun = 0;
+  int n_errs = 0;
 
   gNB->threadPool = (tpool_t*)malloc(sizeof(tpool_t));
   initTpool(gNBthreads, gNB->threadPool, true);
@@ -1061,11 +1102,9 @@ int main(int argc, char **argv)
 
     clear_pdsch_stats(gNB);
 
-    n_errors = 0;
     effRate = 0;
     //n_errors2 = 0;
     //n_alamouti = 0;
-    errors_scrambling=0;
     n_false_positive = 0;
     if (n_trials== 1) num_rounds = 1;
 
@@ -1097,16 +1136,12 @@ int main(int argc, char **argv)
       UE_harq_process->first_rx = 1;
         
       while ((round<num_rounds) && (UE_harq_process->ack==0)) {
+        round_trials[round][snrRun]++;
 
         clear_nr_nfapi_information(RC.nrmac[0], 0, frame, slot);
+        UE_info->UE_sched_ctrl.harq_processes[harq_pid].ndi = !(trial&1);
+        UE_info->UE_sched_ctrl.harq_processes[harq_pid].round = round;
 
-        UE_info->UE_sched_ctrl[0].harq_processes[harq_pid].ndi = !(trial&1);
-
-
-        UE_info->UE_sched_ctrl[0].harq_processes[harq_pid].round = round;
-        for (int i=0; i<MAX_NUM_CORESET; i++)
-          gNB_mac->pdcch_cand[i] = 0;
-      
         if (css_flag == 0) {
           nr_schedule_ue_spec(0, frame, slot);
         } else {
@@ -1117,7 +1152,7 @@ int main(int argc, char **argv)
         Sched_INFO.frame     = frame;
         Sched_INFO.slot      = slot;
         Sched_INFO.DL_req    = &gNB_mac->DL_req[0];
-        Sched_INFO.UL_tti_req    = gNB_mac->UL_tti_req_ahead[slot];
+        Sched_INFO.UL_tti_req    = gNB_mac->UL_tti_req_ahead[0];
         Sched_INFO.UL_dci_req  = NULL;
         Sched_INFO.TX_req    = &gNB_mac->TX_req[0];
         pushNotifiedFIFO(gNB->L1_tx_free,msgL1Tx);
@@ -1269,49 +1304,45 @@ int main(int argc, char **argv)
                                &phy_pdcch_config,
                                NULL);
         
-        //printf("dlsim round %d ends\n",round);
-        round++;
-      } // round
+        //----------------------------------------------------------
+        //---------------------- count errors ----------------------
+        //----------------------------------------------------------
 
-      //----------------------------------------------------------
-      //---------------------- count errors ----------------------
-      //----------------------------------------------------------
+        if (UE->dlsch[UE_proc.thread_id][0][0]->last_iteration_cnt >=
+          UE->dlsch[UE_proc.thread_id][0][0]->max_ldpc_iterations+1)
+          n_errors[round][snrRun]++;
 
-      if (UE->dlsch[UE_proc.thread_id][0][0]->last_iteration_cnt >=
-        UE->dlsch[UE_proc.thread_id][0][0]->max_ldpc_iterations+1)
-        n_errors++;
+        NR_UE_PDSCH **pdsch_vars = UE->pdsch_vars[UE_proc.thread_id];
+        int16_t *UE_llr = pdsch_vars[0]->llr[0];
 
-      //NR_UE_PDSCH **pdsch_vars = UE->pdsch_vars[UE_proc.thread_id];
-      //int16_t *UE_llr = pdsch_vars[0]->llr[0];
+        TBS                  = UE_harq_process->TBS;//rel15->TBSize[0];
+        uint16_t length_dmrs = get_num_dmrs(rel15->dlDmrsSymbPos);
+        uint16_t nb_rb       = rel15->rbSize;
+        uint8_t  nb_re_dmrs  = rel15->dmrsConfigType == NFAPI_NR_DMRS_TYPE1 ? 6*UE_harq_process->n_dmrs_cdm_groups : 4*UE_harq_process->n_dmrs_cdm_groups;
+        uint8_t  mod_order   = rel15->qamModOrder[0];
+        uint8_t  nb_symb_sch = rel15->NrOfSymbols;
 
-      TBS                  = UE_harq_process->TBS;//rel15->TBSize[0];
-      uint16_t length_dmrs = get_num_dmrs(rel15->dlDmrsSymbPos);
-      uint16_t nb_rb       = rel15->rbSize;
-      uint8_t  nb_re_dmrs  = rel15->dmrsConfigType == NFAPI_NR_DMRS_TYPE1 ? 6*UE_harq_process->n_dmrs_cdm_groups : 4*UE_harq_process->n_dmrs_cdm_groups;
-      uint8_t  mod_order   = rel15->qamModOrder[0];
-      uint8_t  nb_symb_sch = rel15->NrOfSymbols;
+        available_bits = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, mod_order, rel15->nrOfLayers);
+        if(pdu_bit_map & 0x1) {
+          available_bits-= (ptrsSymbPerSlot * ptrsRePerSymb *rel15->nrOfLayers* 2);
+          printf("[DLSIM][PTRS] Available bits are: %5u, removed PTRS bits are: %5u \n",available_bits, (ptrsSymbPerSlot * ptrsRePerSymb *rel15->nrOfLayers* 2) );
+        }
 
-      available_bits = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, mod_order, rel15->nrOfLayers);
-      if(pdu_bit_map & 0x1) {
-        available_bits-= (ptrsSymbPerSlot * ptrsRePerSymb *rel15->nrOfLayers* 2);
-        LOG_D(PHY,"[DLSIM][PTRS] Available bits are: %5u, removed PTRS bits are: %5u \n",available_bits, (ptrsSymbPerSlot * ptrsRePerSymb *rel15->nrOfLayers* 2) );
-      }
+        for (i = 0; i < available_bits; i++) {
+          if(((gNB_dlsch->harq_process.f[i] == 0) && (UE_llr[i] <= 0)) ||
+             ((gNB_dlsch->harq_process.f[i] == 1) && (UE_llr[i] >= 0)))
+          {
+            if(errors_scrambling[round][snrRun] == 0) {
+              LOG_D(PHY,"First bit in error in unscrambling = %d\n",i);
+            }
+            errors_scrambling[round][snrRun]++;
+          }
+        }
 
-      /*
-      for (i = 0; i < available_bits; i++) {
-
-	if(((gNB_dlsch->harq_process.f[i] == 0) && (UE_llr[i] <= 0)) ||
-	   ((gNB_dlsch->harq_process.f[i] == 1) && (UE_llr[i] >= 0)))
-	  {
-	    if(errors_scrambling == 0) {
-	      LOG_D(PHY,"\n");
-	      LOG_D(PHY,"First bit in error in unscrambling = %d\n",i);
-	    }
-	    errors_scrambling++;
-	  }
+        //printf("dlsim round %d ends\n",round);
+        round++;
+      } // round
 
-      }
-      */
       for (i = 0; i < TBS; i++) {
 
 	estimated_output_bit[i] = (UE_harq_process->b[i/8] & (1 << (i & 7))) >> (i & 7);
@@ -1319,19 +1350,14 @@ int main(int argc, char **argv)
 	
 	if (estimated_output_bit[i] != test_input_bit[i]) {
 	  if(errors_bit == 0)
-	    LOG_D(PHY,"First bit in error in decoding = %d (errors scrambling %d)\n",i,errors_scrambling);
+	    LOG_D(PHY,"First bit in error in decoding = %d\n",i);
 	  errors_bit++;
 	}
 	
       }
       
       ////////////////////////////////////////////////////////////
-      
-      if (errors_scrambling > 0) {
-	if (n_trials == 1)
-	  printf("errors_scrambling = %u/%u (trial %d)\n", errors_scrambling, available_bits,trial);
-      }
-      
+
       if (errors_bit > 0) {
 	n_false_positive++;
 	if (n_trials == 1)
@@ -1341,18 +1367,48 @@ int main(int argc, char **argv)
       if (UE_harq_process->ack==1) effRate += ((float)TBS)/round;
     } // noise trials
 
-    blerStats[snrRun] = (float) n_errors / (float) n_trials;
     roundStats[snrRun]/=((float)n_trials);
-    berStats[snrRun] = (double)errors_scrambling/available_bits/n_trials;
+
+    blerStats[0][snrRun] = (double)n_errors[0][snrRun]/round_trials[0][snrRun];
+    blerStats[1][snrRun] = (double)n_errors[1][snrRun]/round_trials[1][snrRun];
+    blerStats[2][snrRun] = (double)n_errors[2][snrRun]/round_trials[2][snrRun];
+    blerStats[3][snrRun] = (double)n_errors[3][snrRun]/round_trials[3][snrRun];
+
+    berStats[0][snrRun] = (double)errors_scrambling[0][snrRun]/available_bits/round_trials[0][snrRun];
+    berStats[1][snrRun] = (double)errors_scrambling[1][snrRun]/available_bits/round_trials[1][snrRun];
+    berStats[2][snrRun] = (double)errors_scrambling[2][snrRun]/available_bits/round_trials[2][snrRun];
+    berStats[3][snrRun] = (double)errors_scrambling[3][snrRun]/available_bits/round_trials[3][snrRun];
+
     effRate /= n_trials;
     printf("*****************************************\n");
-    printf("SNR %f, (false positive %f)\n", SNR,
-           (float) n_errors / (float) n_trials);
-    printf("*****************************************\n");
+    printf("SNR %f: n_errors (%d/%d,%d/%d,%d/%d,%d/%d) (negative CRC), false_positive %d/%d, errors_scrambling (%u/%u,%u/%u,%u/%u,%u/%u\n",
+           SNR,
+           n_errors[0][snrRun], round_trials[0][snrRun],
+           n_errors[1][snrRun], round_trials[1][snrRun],
+           n_errors[2][snrRun], round_trials[2][snrRun],
+           n_errors[3][snrRun], round_trials[3][snrRun],
+           n_false_positive, n_trials,
+           errors_scrambling[0][snrRun], available_bits*round_trials[0][snrRun],
+           errors_scrambling[1][snrRun], available_bits*round_trials[1][snrRun],
+           errors_scrambling[2][snrRun], available_bits*round_trials[2][snrRun],
+           errors_scrambling[3][snrRun], available_bits*round_trials[3][snrRun]);
     printf("\n");
     dump_pdsch_stats(stdout,gNB);
-    printf("SNR %f : n_errors (negative CRC) = %d/%d, Avg round %.2f, Channel BER %e, BLER %.2f, Eff Rate %.4f bits/slot, Eff Throughput %.2f, TBS %u bits/slot\n",
-           SNR, n_errors, n_trials,roundStats[snrRun],berStats[snrRun],blerStats[snrRun],effRate,effRate/TBS*100,TBS);
+    printf("SNR %f: Channel BLER (%e,%e,%e,%e), Channel BER (%e,%e,%e,%e) Avg round %.2f, Eff Rate %.4f bits/slot, Eff Throughput %.2f, TBS %u bits/slot\n",
+           SNR,
+           blerStats[0][snrRun],
+           blerStats[1][snrRun],
+           blerStats[2][snrRun],
+           blerStats[3][snrRun],
+           berStats[0][snrRun],
+           berStats[1][snrRun],
+           berStats[2][snrRun],
+           berStats[3][snrRun],
+           roundStats[snrRun],
+           effRate,
+           effRate/TBS*100,
+           TBS);
+    printf("*****************************************\n");
     printf("\n");
 
     if (print_perf==1) {
@@ -1412,6 +1468,7 @@ int main(int argc, char **argv)
       LOG_M("rxsig0.m","rxs0", UE->common_vars.rxdata[0], frame_length_complex_samples, 1, 1);
       if (UE->frame_parms.nb_antennas_rx>1)
 	LOG_M("rxsig1.m","rxs1", UE->common_vars.rxdata[1], frame_length_complex_samples, 1, 1);
+      LOG_M("rxF0.m","rxF0", UE->common_vars.common_vars_rx_data_per_thread[UE_proc.thread_id].rxdataF[0], frame_parms->samples_per_slot_wCP, 1, 1);
       LOG_M("chestF0.m","chF0",&UE->pdsch_vars[0][0]->dl_ch_estimates_ext[0][0],g_rbSize*12*14,1,1);
       write_output("rxF_comp.m","rxFc",&UE->pdsch_vars[0][0]->rxdataF_comp0[0][0],N_RB_DL*12*14,1,1);
       LOG_M("rxF_llr.m","rxFllr",UE->pdsch_vars[UE_proc.thread_id][0]->llr[0],available_bits,1,0);
@@ -1425,6 +1482,7 @@ int main(int argc, char **argv)
 
     snrStats[snrRun] = SNR;
     snrRun++;
+    n_errs = n_errors[0][snrRun];
   } // NSR
 
   LOG_M("dlsimStats.m","SNR",snrStats,snrRun,1,7);
@@ -1468,8 +1526,8 @@ int main(int argc, char **argv)
 
   if (scg_fd)
     fclose(scg_fd);
-  return(n_errors);
-  
+
+  return n_errs;
 }
 
 
diff --git a/openair1/SIMULATION/NR_PHY/nr_dummy_functions.c b/openair1/SIMULATION/NR_PHY/nr_dummy_functions.c
index 2d1fc597557518e993d84c2d83636c37457b01c1..75e3d998ff9a1fb5771e99f86d30a4f6cdffb181 100644
--- a/openair1/SIMULATION/NR_PHY/nr_dummy_functions.c
+++ b/openair1/SIMULATION/NR_PHY/nr_dummy_functions.c
@@ -21,6 +21,8 @@ nfapi_mode_t nfapi_mod;
 nfapi_mode_t nfapi_getmode(void) {
   return nfapi_mod;
 }
+void nfapi_setmode(nfapi_mode_t nfapi_mode) {}
+
 int dummy_nr_ue_dl_indication(nr_downlink_indication_t *dl_info)            { return(0);  }
 int dummy_nr_ue_ul_indication(nr_uplink_indication_t *ul_info)              { return(0);  }
 void nr_fill_dl_indication(nr_downlink_indication_t *dl_ind,
@@ -38,4 +40,4 @@ void nr_fill_rx_indication(fapi_nr_rx_indication_t *rx_ind,
                            NR_UE_DLSCH_t *dlsch1,
                            uint16_t n_pdus,
                            UE_nr_rxtx_proc_t *proc,
-			   void * typeSpecific ) {}
+                           void *typeSpecific ) {}
diff --git a/openair1/SIMULATION/NR_PHY/pbchsim.c b/openair1/SIMULATION/NR_PHY/pbchsim.c
index 41ed64ae5f00ede73ef420a290ab373d7d9fe9ef..2670b7891719792430069f1f68a05c625573124e 100644
--- a/openair1/SIMULATION/NR_PHY/pbchsim.c
+++ b/openair1/SIMULATION/NR_PHY/pbchsim.c
@@ -67,7 +67,10 @@ openair0_config_t openair0_cfg[MAX_CARDS];
 uint8_t const nr_rv_round_map[4] = {0, 2, 3, 1};
 
 uint64_t get_softmodem_optmask(void) {return 0;}
-softmodem_params_t *get_softmodem_params(void) {return 0;}
+static softmodem_params_t softmodem_params;
+softmodem_params_t *get_softmodem_params(void) {
+  return &softmodem_params;
+}
 
 void init_downlink_harq_status(NR_DL_UE_HARQ_t *dl_harq) {}
 
@@ -172,8 +175,10 @@ int main(int argc, char **argv)
   uint8_t transmission_mode = 1,n_tx=1,n_rx=1;
   uint16_t Nid_cell=0;
   uint64_t SSB_positions=0x01;
+  int ssb_subcarrier_offset = 0;
 
   channel_desc_t *gNB2UE;
+  get_softmodem_params()->sa = 1;
 
   //uint8_t extended_prefix_flag=0;
   //int8_t interf1=-21,interf2=-21;
@@ -215,7 +220,7 @@ int main(int argc, char **argv)
     exit_fun("[NR_PBCHSIM] Error, configuration module init failed\n");
   }
 
-  while ((c = getopt (argc, argv, "F:g:hIL:m:M:n:N:o:P:r:R:s:S:x:y:z:")) != -1) {
+  while ((c = getopt (argc, argv, "F:g:hIL:m:M:n:N:o:O:P:r:R:s:S:x:y:z:")) != -1) {
     switch (c) {
     /*case 'f':
       write_output_file=1;
@@ -328,6 +333,10 @@ int main(int argc, char **argv)
       Nid_cell = atoi(optarg);
       break;
 
+    case 'O':
+      ssb_subcarrier_offset = atoi(optarg);
+      break;
+
     case 'o':
       cfo = atof(optarg);
 #ifdef DEBUG_NR_PBCHSIM
@@ -430,6 +439,7 @@ int main(int argc, char **argv)
       printf("-n Number of frames to simulate\n");
       printf("-N Nid_cell\n");
       printf("-o Carrier frequency offset in Hz\n");
+      printf("-O SSB subcarrier offset\n");
       //printf("-O oversampling factor (1,2,4,8,16)\n");
       //printf("-p Use extended prefix mode\n");
       printf("-P PBCH phase, allowed values 0-3\n");
@@ -470,10 +480,11 @@ int main(int argc, char **argv)
   frame_parms->Nid_cell = Nid_cell;
   frame_parms->nushift = Nid_cell%4;
   frame_parms->ssb_type = nr_ssb_type_C;
+  frame_parms->freq_range = mu<2 ? nr_FR1 : nr_FR2;
 
   nr_phy_config_request_sim_pbchsim(gNB,N_RB_DL,N_RB_DL,mu,Nid_cell,SSB_positions);
   phy_init_nr_gNB(gNB,0,1);
-  nr_set_ssb_first_subcarrier(&gNB->gNB_config,frame_parms);
+  frame_parms->ssb_start_subcarrier = 12 * gNB->gNB_config.ssb_table.ssb_offset_point_a.value + ssb_subcarrier_offset;
 
   uint8_t n_hf = 0;
   int cyclic_prefix_type = NFAPI_CP_NORMAL;
@@ -575,8 +586,6 @@ int main(int argc, char **argv)
   if (run_initial_sync==1)  UE->is_synchronized = 0;
   else                      UE->is_synchronized = 1;
                       
-  UE->perfect_ce = 0;
-
   if(eps!=0.0)
 	UE->UE_fo_compensation = 1; // if a frequency offset is set then perform fo estimation and compensation
 
@@ -594,8 +603,12 @@ int main(int argc, char **argv)
     for (i=0; i<frame_parms->Lmax; i++) {
       if((SSB_positions >> i) & 0x01) {
 
+        const int sc_offset = frame_parms->freq_range == nr_FR1 ? ssb_subcarrier_offset<<mu : ssb_subcarrier_offset;
+        const int prb_offset = frame_parms->freq_range == nr_FR1 ? gNB->gNB_config.ssb_table.ssb_offset_point_a.value<<mu : gNB->gNB_config.ssb_table.ssb_offset_point_a.value << (mu - 2);
         msgDataTx.ssb[i].ssb_pdu.ssb_pdu_rel15.bchPayload = 0x55dd33;
         msgDataTx.ssb[i].ssb_pdu.ssb_pdu_rel15.SsbBlockIndex = i;
+        msgDataTx.ssb[i].ssb_pdu.ssb_pdu_rel15.SsbSubcarrierOffset = sc_offset;
+        msgDataTx.ssb[i].ssb_pdu.ssb_pdu_rel15.ssbOffsetPointA = prb_offset;
 
         start_symbol = nr_get_ssb_start_symbol(frame_parms,i);
         int slot = start_symbol/14;
@@ -762,8 +775,8 @@ int main(int argc, char **argv)
 	if (ret<0) n_errors++;
       }
       else {
-	UE_nr_rxtx_proc_t proc={0};
-  NR_UE_PDCCH_CONFIG phy_pdcch_config={0};
+        UE_nr_rxtx_proc_t proc={0};
+        NR_UE_PDCCH_CONFIG phy_pdcch_config={0};
 
 	UE->rx_offset=0;
 	uint8_t ssb_index = 0;
diff --git a/openair1/SIMULATION/NR_PHY/prachsim.c b/openair1/SIMULATION/NR_PHY/prachsim.c
index 325cbb1eccf0915f7b5b98c1bb257f39c6953df6..76776ce1101a9a049661bdab78e3885c551f60af 100644
--- a/openair1/SIMULATION/NR_PHY/prachsim.c
+++ b/openair1/SIMULATION/NR_PHY/prachsim.c
@@ -92,9 +92,17 @@ int oai_nfapi_nr_rach_indication(nfapi_nr_rach_indication_t *ind) { return(0);
 //Fixme: Uniq dirty DU instance, by global var, datamodel need better management
 instance_t DUuniqInstance=0;
 instance_t CUuniqInstance=0;
-teid_t newGtpuCreateTunnel(instance_t instance, rnti_t rnti, int incoming_bearer_id, int outgoing_bearer_id, teid_t outgoing_teid,
-                           transport_layer_addr_t remoteAddr, int port, gtpCallback callBack) {
-return 0;
+teid_t newGtpuCreateTunnel(instance_t instance,
+                           rnti_t rnti,
+                           int incoming_bearer_id,
+                           int outgoing_bearer_id,
+                           teid_t outgoing_teid,
+                           int qfi,
+                           transport_layer_addr_t remoteAddr,
+                           int port,
+                           gtpCallback callBack,
+                           gtpCallbackSDAP callBackSDAP) {
+  return 0;
 }
 
 int newGtpuDeleteAllTunnels(instance_t instance, rnti_t rnti) {
@@ -240,7 +248,7 @@ int main(int argc, char **argv){
   int i, l, aa, aarx, **txdata, trial, n_frames = 1, prach_start, rx_prach_start; //, ntrials=1;
   int N_RB_UL = 106, delay = 0, NCS_config = 13, rootSequenceIndex = 1, threequarter_fs = 0, mu = 1, fd_occasion = 0, loglvl = OAILOG_INFO, numRA = 0, prachStartSymbol = 0;
   uint8_t snr1set = 0, ue_speed1set = 0, transmission_mode = 1, n_tx = 1, n_rx = 1, awgn_flag = 0, msg1_frequencystart = 0, num_prach_fd_occasions = 1, prach_format=0;
-  uint8_t frame = 1, slot=19, slot_gNB=19, config_index = 98, prach_sequence_length = 1, restrictedSetConfig = 0, N_dur, N_t_slot, start_symbol;
+  uint8_t config_index = 98, prach_sequence_length = 1, restrictedSetConfig = 0, N_dur, N_t_slot, start_symbol;
   uint16_t Nid_cell = 0, preamble_tx = 0, preamble_delay, format, format0, format1;
   uint32_t tx_lev = 10000, prach_errors = 0; //,tx_lev_dB;
   uint64_t SSB_positions = 0x01;
@@ -536,7 +544,7 @@ int main(int argc, char **argv){
   frame_parms->N_RB_UL          = N_RB_UL;
   frame_parms->threequarter_fs  = threequarter_fs;
   frame_parms->frame_type       = TDD;
-  frame_parms->freq_range       = (mu==1 ? nr_FR1 : nr_FR2);
+  frame_parms->freq_range       = (mu != 3 ? nr_FR1 : nr_FR2);
   frame_parms->numerology_index = mu;
 
   nr_phy_config_request_sim(gNB, N_RB_UL, N_RB_UL, mu, Nid_cell, SSB_positions);
@@ -546,9 +554,11 @@ int main(int argc, char **argv){
 				       frame_parms->numerology_index,
 				       frame_parms->N_RB_UL*(180e3)*(1 << frame_parms->numerology_index));
 
-  uint8_t subframe = slot/frame_parms->slots_per_subframe;
+  uint8_t frame = 1;
+  uint8_t subframe = 9;
+  uint8_t slot = 10 * frame_parms->slots_per_subframe - 1;
   
-  if (config_index<67 && mu==1)  { prach_sequence_length=0; slot = subframe*2; slot_gNB = 1+(subframe*2); }
+  if (config_index<67 && mu != 3)  { prach_sequence_length=0; slot = subframe * frame_parms->slots_per_subframe; }
   uint16_t N_ZC = prach_sequence_length == 0 ? 839 : 139;
 
   printf("Config_index %d, prach_sequence_length %d\n",config_index,prach_sequence_length);
@@ -569,9 +579,11 @@ int main(int argc, char **argv){
   ru->gNB_list[0]    = gNB;
   gNB->gNB_config.carrier_config.num_tx_ant.value = 1;
   gNB->gNB_config.carrier_config.num_rx_ant.value = 1;
-  if (mu==1)
+  if (mu == 0)
+    gNB->gNB_config.tdd_table.tdd_period.value = 7;
+  else if (mu == 1)
     gNB->gNB_config.tdd_table.tdd_period.value = 6;
-  else if (mu==3)
+  else if (mu == 3)
     gNB->gNB_config.tdd_table.tdd_period.value = 3;
   else {
     printf("unsupported numerology %d\n",mu);
@@ -585,7 +597,7 @@ int main(int argc, char **argv){
 
   int ret = get_nr_prach_info_from_index(config_index,
 					 (int)frame,
-					 (int)slot_gNB,
+					 (int)slot,
 					 absoluteFrequencyPointA,
 					 mu,
 					 frame_parms->frame_type,
@@ -717,12 +729,7 @@ int main(int argc, char **argv){
   bw = N_RB_UL*(180e3)*(1 << frame_parms->numerology_index);
   AssertFatal(bw<=122.88e6,"Illegal channel bandwidth %f (mu %d,N_RB_UL %d)\n", bw, frame_parms->numerology_index, N_RB_UL);
 
-  if (bw <= 30.72e6)
-    fs = 30.72e6;
-  else if (bw <= 61.44e6)
-    fs = 61.44e6;
-  else if (bw <= 122.88e6)
-    fs = 122.88e6;
+  fs = frame_parms->samples_per_subframe * 1e3;
 
   LOG_I(PHY,"Running with bandwidth %f Hz, fs %f samp/s, FRAME_LENGTH_COMPLEX_SAMPLES %d\n",bw,fs,FRAME_LENGTH_COMPLEX_SAMPLES);
 
diff --git a/openair1/SIMULATION/NR_PHY/pucchsim.c b/openair1/SIMULATION/NR_PHY/pucchsim.c
index b6dc3d8f11e8e804d4094e6d7074f511d1af9278..80a638db73e6fe94bf5f4b1aa00c30c0f72683b6 100644
--- a/openair1/SIMULATION/NR_PHY/pucchsim.c
+++ b/openair1/SIMULATION/NR_PHY/pucchsim.c
@@ -47,12 +47,13 @@
 #include "openair1/SIMULATION/NR_PHY/nr_unitary_defs.h"
 #include "openair1/SIMULATION/NR_PHY/nr_dummy_functions.c"
 
-
+THREAD_STRUCT thread_struct;
 PHY_VARS_gNB *gNB;
 PHY_VARS_NR_UE *UE;
 RAN_CONTEXT_t RC;
 openair0_config_t openair0_cfg[MAX_CARDS];
 int32_t uplink_frequency_offset[MAX_NUM_CCs][4];
+uint64_t downlink_frequency[MAX_NUM_CCs][4];
 
 double cpuf;
 //uint8_t nfapi_mode = 0;
@@ -475,7 +476,6 @@ int main(int argc, char **argv)
   UE = calloc(1,sizeof(PHY_VARS_NR_UE));
   memcpy(&UE->frame_parms,frame_parms,sizeof(NR_DL_FRAME_PARMS));
   UE->frame_parms.nb_antennas_rx=1;
-  UE->perfect_ce = 0;
 
   if(eps!=0.0)
     UE->UE_fo_compensation = 1; // if a frequency offset is set then perform fo estimation and compensation
@@ -640,6 +640,7 @@ int main(int argc, char **argv)
         pucch_pdu.initial_cyclic_shift  = 0;
         pucch_pdu.start_symbol_index    = startingSymbolIndex;
         pucch_pdu.prb_start             = startingPRB;
+        pucch_pdu.prb_size              = 1;
         pucch_pdu.bwp_start             = 0;
         pucch_pdu.bwp_size              = N_RB_DL;
         if (nrofSymbols>1) {
diff --git a/openair1/SIMULATION/NR_PHY/ulschsim.c b/openair1/SIMULATION/NR_PHY/ulschsim.c
index f6227e17697d15e5ec761294b82039caf2bd0a93..5392424285729463be925948ee877d336209cc7d 100644
--- a/openair1/SIMULATION/NR_PHY/ulschsim.c
+++ b/openair1/SIMULATION/NR_PHY/ulschsim.c
@@ -47,13 +47,16 @@
 #include "openair1/SIMULATION/NR_PHY/nr_unitary_defs.h"
 #include "openair1/SIMULATION/NR_PHY/nr_dummy_functions.c"
 #include "common/utils/threadPool/thread-pool.h"
+#include "openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h"
 
 //#define DEBUG_NR_ULSCHSIM
 
+THREAD_STRUCT thread_struct;
 PHY_VARS_gNB *gNB;
 PHY_VARS_NR_UE *UE;
 RAN_CONTEXT_t RC;
 int32_t uplink_frequency_offset[MAX_NUM_CCs][4];
+uint64_t downlink_frequency[MAX_NUM_CCs][4];
 
 void init_downlink_harq_status(NR_DL_UE_HARQ_t *dl_harq) {}
 
@@ -137,6 +140,8 @@ int main(int argc, char **argv)
   uint16_t nb_symb_sch = 12;
   uint16_t nb_rb = 50;
   uint8_t Imcs = 9;
+  uint8_t Nl = 1;
+  uint8_t max_ldpc_iterations = 5;
 
   double DS_TDL = .03;
 
@@ -150,7 +155,7 @@ int main(int argc, char **argv)
   randominit(0);
 
   //while ((c = getopt(argc, argv, "df:hpg:i:j:n:l:m:r:s:S:y:z:M:N:F:R:P:")) != -1) {
-  while ((c = getopt(argc, argv, "hg:n:s:S:py:z:M:N:R:F:m:l:r:")) != -1) {
+  while ((c = getopt(argc, argv, "hg:n:s:S:py:z:M:N:R:F:m:l:r:W:")) != -1) {
     switch (c) {
       /*case 'f':
          write_output_file = 1;
@@ -251,7 +256,7 @@ int main(int argc, char **argv)
       case 'y':
         n_tx = atoi(optarg);
 
-        if ((n_tx == 0) || (n_tx > 2)) {
+        if ((n_tx == 0) || (n_tx > 4)) {
           printf("Unsupported number of TX antennas %d. Exiting.\n", n_tx);
           exit(-1);
         }
@@ -261,7 +266,7 @@ int main(int argc, char **argv)
       case 'z':
         n_rx = atoi(optarg);
 
-        if ((n_rx == 0) || (n_rx > 2)) {
+        if ((n_rx == 0) || (n_rx > 4)) {
           printf("Unsupported number of RX antennas %d. Exiting.\n", n_rx);
           exit(-1);
         }
@@ -299,6 +304,10 @@ int main(int argc, char **argv)
           printf("Illegal PBCH phase (0-3) got %d\n", pbch_phase);
         break;*/
 
+      case 'W':
+        Nl = atoi(optarg);
+      break;
+
       case 'm':
         Imcs = atoi(optarg);
 #ifdef DEBUG_NR_ULSCHSIM
@@ -335,13 +344,14 @@ int main(int argc, char **argv)
           printf("-z Number of RX antennas used in UE\n");
           //printf("-i Relative strength of first intefering eNB (in dB) - cell_id mod 3 = 1\n");
           //printf("-j Relative strength of second intefering eNB (in dB) - cell_id mod 3 = 2\n");
+          printf("-W number of layer\n");
           printf("-M Multiple SSB positions in burst\n");
           printf("-N Nid_cell\n");
           printf("-R N_RB_UL\n");
           printf("-F Input filename (.txt format) for RX conformance testing\n");
-          printf("-m\n");
-          printf("-l\n");
-          printf("-r\n");
+          printf("-m MCS\n");
+          printf("-l number of symbol\n");
+          printf("-r number of RB\n");
           //printf("-O oversampling factor (1,2,4,8,16)\n");
           //printf("-A Interpolation_filname Run with Abstraction to generate Scatter plot using interpolation polynomial in file\n");
           //printf("-C Generate Calibration information for Abstraction (effective SNR adjustment to remove Pe bias w.r.t. AWGN)\n");
@@ -359,8 +369,8 @@ int main(int argc, char **argv)
     snr1 = snr0 + 10;
 
   gNB2UE = new_channel_desc_scm(n_tx,
-		                n_rx,
-				channel_model,
+                                n_rx,
+                                channel_model,
                                 61.44e6, //N_RB2sampling_rate(N_RB_DL),
                                 40e6, //N_RB2channel_bandwidth(N_RB_DL),
                                 DS_TDL,
@@ -383,15 +393,18 @@ int main(int argc, char **argv)
   initTpool(tp_param, gNB->threadPool, true);
   initNotifiedFIFO(gNB->respDecode);
   frame_parms = &gNB->frame_parms; //to be initialized I suppose (maybe not necessary for PBCH)
-  frame_parms->nb_antennas_tx = n_tx;
-  frame_parms->nb_antennas_rx = n_rx;
   frame_parms->N_RB_DL = N_RB_DL;
   frame_parms->N_RB_UL = N_RB_UL;
   frame_parms->Ncp = extended_prefix_flag ? EXTENDED : NORMAL;
+  gNB->max_ldpc_iterations = max_ldpc_iterations;
+
   crcTableInit();
 
   memcpy(&gNB->frame_parms, frame_parms, sizeof(NR_DL_FRAME_PARMS));
 
+  gNB->frame_parms.nb_antennas_tx = 1;
+  gNB->frame_parms.nb_antennas_rx = n_rx;
+
   nr_phy_config_request_sim(gNB, N_RB_UL, N_RB_UL, mu, Nid_cell, SSB_positions);
 
   phy_init_nr_gNB(gNB, 0, 1); //lowmem
@@ -400,6 +413,9 @@ int main(int argc, char **argv)
   UE = malloc(sizeof(PHY_VARS_NR_UE));
   memcpy(&UE->frame_parms, frame_parms, sizeof(NR_DL_FRAME_PARMS));
 
+  UE->frame_parms.nb_antennas_tx = n_tx;
+  UE->frame_parms.nb_antennas_rx = 1;
+
   //phy_init_nr_top(frame_parms);
   if (init_nr_ue_signal(UE, 1) != 0) {
     printf("Error at UE NR initialisation.\n");
@@ -407,7 +423,7 @@ int main(int argc, char **argv)
   }
 
   for (sf = 0; sf < 2; sf++) {
-    UE->ulsch[sf][0] = new_nr_ue_ulsch(N_RB_UL, 8);
+    UE->ulsch[sf][0] = new_nr_ue_ulsch(N_RB_UL, 8, frame_parms);
     if (!UE->ulsch[sf][0]) {
       printf("Can't get ue ulsch structures.\n");
       exit(-1);
@@ -421,8 +437,7 @@ int main(int argc, char **argv)
   uint8_t length_dmrs = 1;
   uint8_t N_PRB_oh;
   uint16_t N_RE_prime,code_rate;
-  unsigned char mod_order;
-  uint8_t Nl = 1;
+  unsigned char mod_order;  
   uint8_t rvidx = 0;
   uint8_t UE_id = 0;
 
@@ -432,9 +447,12 @@ int main(int argc, char **argv)
 
   NR_UE_ULSCH_t *ulsch_ue = UE->ulsch[0][0];
 
+  if ((Nl==4)||(Nl==3))
+    nb_re_dmrs = nb_re_dmrs*2;
+
   mod_order = nr_get_Qm_ul(Imcs, 0);
   code_rate = nr_get_code_rate_ul(Imcs, 0);
-  available_bits = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, mod_order, 1);
+  available_bits = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, mod_order, Nl);
   TBS = nr_compute_tbs(mod_order,code_rate, nb_rb, nb_symb_sch, nb_re_dmrs*length_dmrs, 0, 0, Nl);
 
   printf("\nAvailable bits %u TBS %u mod_order %d\n", available_bits, TBS, mod_order);
@@ -447,7 +465,7 @@ int main(int argc, char **argv)
   rel15_ul->pusch_data.rv_index = rvidx;
   rel15_ul->nrOfLayers          = Nl;
   rel15_ul->target_code_rate    = code_rate;
-  rel15_ul->pusch_data.tb_size  = TBS/8;
+  rel15_ul->pusch_data.tb_size  = TBS>>3;
   ///////////////////////////////////////////////////
 
   double modulated_input[16 * 68 * 384]; // [hna] 16 segments, 68*Zc
@@ -474,7 +492,9 @@ int main(int argc, char **argv)
   harq_process_ul_ue->pusch_pdu.nr_of_symbols = nb_symb_sch;
   harq_process_ul_ue->num_of_mod_symbols = N_RE_prime*nb_rb*nb_codewords;
   harq_process_ul_ue->pusch_pdu.pusch_data.rv_index = rvidx;
-  harq_process_ul_ue->pusch_pdu.pusch_data.tb_size  = TBS/8;
+  harq_process_ul_ue->pusch_pdu.pusch_data.tb_size  = TBS>>3;
+  harq_process_ul_ue->pusch_pdu.target_code_rate = code_rate;
+  harq_process_ul_ue->pusch_pdu.qam_mod_order = mod_order;
   unsigned char *test_input = harq_process_ul_ue->a;
 
   ///////////
@@ -610,7 +630,8 @@ int main(int argc, char **argv)
   }
 
   for (sf = 0; sf < 2; sf++)
-    free_nr_ue_ulsch(&UE->ulsch[sf][0], N_RB_UL);
+    free_nr_ue_ulsch(&UE->ulsch[sf][0], N_RB_UL, frame_parms);
+
   term_nr_ue_signal(UE, 1);
   free(UE);
 
diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c
index e70d08bdb3bcf5a77193d1fb75fc2ec12a1eff20..5df89283a806550463a776e37aa2cf3832963534 100644
--- a/openair1/SIMULATION/NR_PHY/ulsim.c
+++ b/openair1/SIMULATION/NR_PHY/ulsim.c
@@ -91,14 +91,21 @@ double cpuf;
 uint64_t downlink_frequency[MAX_NUM_CCs][4];
 THREAD_STRUCT thread_struct;
 nfapi_ue_release_request_body_t release_rntis;
-uint32_t N_RB_DL = 106;
 
 //Fixme: Uniq dirty DU instance, by global var, datamodel need better management
 instance_t DUuniqInstance=0;
 instance_t CUuniqInstance=0;
-teid_t newGtpuCreateTunnel(instance_t instance, rnti_t rnti, int incoming_bearer_id, int outgoing_bearer_id, teid_t outgoing_teid,
-                           transport_layer_addr_t remoteAddr, int port, gtpCallback callBack) {
-return 0;
+teid_t newGtpuCreateTunnel(instance_t instance,
+                           rnti_t rnti,
+                           int incoming_bearer_id,
+                           int outgoing_bearer_id,
+                           teid_t outgoing_teid,
+                           int qfi,
+                           transport_layer_addr_t remoteAddr,
+                           int port,
+                           gtpCallback callBack,
+                           gtpCallbackSDAP callBackSDAP) {
+  return 0;
 }
 
 int newGtpuDeleteAllTunnels(instance_t instance, rnti_t rnti) {
@@ -303,10 +310,9 @@ int main(int argc, char **argv)
   int gNB_id = 0;
   int ap;
   int tx_offset;
-  int32_t txlev=0;
+  int32_t txlev_sum = 0, atxlev[4];
   int start_rb = 0;
   int UE_id =0; // [hna] only works for UE_id = 0 because NUMBER_OF_NR_UE_MAX is set to 1 (phy_init_nr_gNB causes segmentation fault)
-  float target_error_rate = 0.01;
   int print_perf = 0;
   cpuf = get_cpu_freq_GHz();
   int msg3_flag = 0;
@@ -314,21 +320,20 @@ int main(int argc, char **argv)
   float roundStats[100];
   double effRate[100]; 
   double effTP[100]; 
-  //float eff_tp_check = 0.7;
+  float eff_tp_check = 100;
   uint8_t snrRun;
-  int prb_inter = 0;
+  int chest_type[2] = {0};
 
   int enable_ptrs = 0;
   int modify_dmrs = 0;
   /* L_PTRS = ptrs_arg[0], K_PTRS = ptrs_arg[1] */
   int ptrs_arg[2] = {-1,-1};// Invalid values
-  /* DMRS TYPE = dmrs_arg[0], Add Pos = dmrs_arg[1] */
-  int dmrs_arg[2] = {-1,-1};// Invalid values
+  int dmrs_arg[4] = {-1,-1,-1,-1};// Invalid values
   uint16_t ptrsSymPos = 0;
   uint16_t ptrsSymbPerSlot = 0;
   uint16_t ptrsRePerSymb = 0;
 
-  uint8_t transform_precoding = 1; // 0 - ENABLE, 1 - DISABLE
+  uint8_t transform_precoding = transformPrecoder_disabled; // 0 - ENABLE, 1 - DISABLE
   uint8_t num_dmrs_cdm_grps_no_data = 1;
   uint8_t mcs_table = 0;
 
@@ -340,6 +345,8 @@ int main(int argc, char **argv)
   int ibwps=24;
   int ibwp_rboffset=41;
   int params_from_file = 0;
+  int threadCnt=0;
+  int max_ldpc_iterations = 5;
   if ( load_configmodule(argc,argv,CONFIG_ENABLECMDLINEONLY) == 0 ) {
     exit_fun("[NR_ULSIM] Error, configuration module init failed\n");
   }
@@ -350,7 +357,7 @@ int main(int argc, char **argv)
   /* initialize the sin-cos table */
    InitSinLUT();
 
-  while ((c = getopt(argc, argv, "a:b:c:d:ef:g:h:ikl:m:n:p:r:s:u:w:y:z:F:G:H:M:N:PR:S:T:U:L:Z")) != -1) {
+  while ((c = getopt(argc, argv, "a:b:c:d:ef:g:h:i:kl:m:n:p:q:r:s:t:u:w:y:z:C:F:G:H:I:M:N:PR:S:T:U:L:ZW:")) != -1) {
     printf("handling optarg %c\n",c);
     switch (c) {
 
@@ -384,8 +391,8 @@ int main(int argc, char **argv)
       scg_fd = fopen(optarg, "r");
       
       if (scg_fd == NULL) {
-	printf("Error opening %s\n", optarg);
-	exit(-1);
+        printf("Error opening %s\n", optarg);
+        exit(-1);
       }
 
       break;
@@ -443,7 +450,9 @@ int main(int argc, char **argv)
       break;
       
     case 'i':
-      prb_inter=1;
+      for(i=0; i < atoi(optarg); i++){
+        chest_type[i] = atoi(argv[optind++]);
+      }
       break;
 	
     case 'k':
@@ -458,7 +467,11 @@ int main(int argc, char **argv)
     case 'm':
       Imcs = atoi(optarg);
       break;
-      
+
+    case 'W':
+      precod_nbr_layers = atoi(optarg);
+      break;
+
     case 'n':
       n_trials = atoi(optarg);
       break;
@@ -466,7 +479,11 @@ int main(int argc, char **argv)
     case 'p':
       extended_prefix_flag = 1;
       break;
-      
+
+    case 'q':
+      mcs_table = atoi(optarg);
+      break;
+
     case 'r':
       nb_rb = atoi(optarg);
       break;
@@ -476,6 +493,10 @@ int main(int argc, char **argv)
       printf("Setting SNR0 to %f\n", snr0);
       break;
 
+    case 'C':
+      threadCnt = atoi(optarg);
+      break;
+
     case 'u':
       mu = atoi(optarg);
       break;
@@ -484,11 +505,10 @@ int main(int argc, char **argv)
       start_rb = atoi(optarg);
       break;
 
-/*
     case 't':
-      eff_tp_check = (float)atoi(optarg)/100;
+      eff_tp_check = (float)atoi(optarg);
       break;
-*/
+
       /*
 	case 'r':
 	ricean_factor = pow(10,-.1*atof(optarg));
@@ -505,32 +525,26 @@ int main(int argc, char **argv)
       
     case 'y':
       n_tx = atoi(optarg);
-      
-      if ((n_tx == 0) || (n_tx > 2)) {
-	printf("Unsupported number of tx antennas %d\n", n_tx);
-	exit(-1);
+      if ((n_tx == 0) || (n_tx > 4)) {
+        printf("Unsupported number of tx antennas %d\n", n_tx);
+        exit(-1);
       }
-      
       break;
       
     case 'z':
       n_rx = atoi(optarg);
-      
       if ((n_rx == 0) || (n_rx > 8)) {
-	printf("Unsupported number of rx antennas %d\n", n_rx);
-	exit(-1);
+        printf("Unsupported number of rx antennas %d\n", n_rx);
+        exit(-1);
       }
-      
       break;
-      
+
     case 'F':
       input_fd = fopen(optarg, "r");
-      
       if (input_fd == NULL) {
-	printf("Problem with filename %s\n", optarg);
-	exit(-1);
+        printf("Problem with filename %s\n", optarg);
+        exit(-1);
       }
-      
       break;
 
     case 'G':
@@ -541,6 +555,10 @@ int main(int argc, char **argv)
       slot = atoi(optarg);
       break;
 
+    case 'I':
+      max_ldpc_iterations = atoi(optarg);
+      break;
+
     case 'M':
      // SSB_positions = atoi(optarg);
       break;
@@ -588,40 +606,39 @@ int main(int argc, char **argv)
       break;
 
     case 'Z':
-
-      transform_precoding = 0; // enabled
+      transform_precoding = transformPrecoder_enabled;
       num_dmrs_cdm_grps_no_data = 2;
       mcs_table = 3;
-      
-      printf("NOTE: TRANSFORM PRECODING (SC-FDMA) is ENABLED in UPLINK (0 - ENABLE, 1 - DISABLE) : %d \n",  transform_precoding);
-
+      printf("NOTE: TRANSFORM PRECODING (SC-FDMA) is ENABLED in UPLINK (0 - ENABLE, 1 - DISABLE) : %d \n", transform_precoding);
       break;
 
     default:
     case 'h':
-      printf("%s -h(elp) -p(extended_prefix) -N cell_id -f output_filename -F input_filename -g channel_model -n n_frames -t Delayspread -s snr0 -S snr1 -x transmission_mode -y TXant -z RXant -i Intefrence0 -j Interference1 -A interpolation_file -C(alibration offset dB) -N CellId -Z Enable SC-FDMA in Uplink \n", argv[0]);
+      printf("%s -h(elp) -p(extended_prefix) -N cell_id -f output_filename -F input_filename -g channel_model -i Intefrence0 -j Interference1 -n n_frames -s snr0 -S snr1 -t Delayspread -x transmission_mode -y TXant -z RXant -A interpolation_file -C(alibration offset dB) -N CellId -Z Enable SC-FDMA in Uplink \n", argv[0]);
       //printf("-d Use TDD\n");
       printf("-d Introduce delay in terms of number of samples\n");
       printf("-f Number of frames to simulate\n");
       printf("-g [A,B,C,D,E,F,G] Use 3GPP SCM (A,B,C,D) or 36-101 (E-EPA,F-EVA,G-ETU) models (ignores delay spread and Ricean factor)\n");
       printf("-h This message\n");
-      printf("-i Activate PRB based averaging for channel estimation. Frequncy domain interpolation by default.\n");
+      printf("-i Change channel estimation technique. Arguments list: Number of arguments=2, Frequency domain {0:Linear interpolation, 1:PRB based averaging}, Time domain {0:Estimates of last DMRS symbol, 1:Average of DMRS symbols}. e.g. -i 2 1 0\n");
       //printf("-j Relative strength of second intefering eNB (in dB) - cell_id mod 3 = 2\n");
       printf("-s Starting SNR, runs from SNR0 to SNR0 + 10 dB if ending SNR isn't given\n");
       printf("-m MCS value\n");
       printf("-n Number of trials to simulate\n");
       printf("-p Use extended prefix mode\n");
+      printf("-q MCS table\n");
       printf("-t Delay spread for multipath channel\n");
       printf("-u Set the numerology\n");
       printf("-w Start PRB for PUSCH\n");
       //printf("-x Transmission mode (1,2,6 for the moment)\n");
-      printf("-y Number of TX antennas used in eNB\n");
-      printf("-z Number of RX antennas used in UE\n");
+      printf("-y Number of TX antennas used at UE\n");
+      printf("-z Number of RX antennas used at gNB\n");
       printf("-A Interpolation_filname Run with Abstraction to generate Scatter plot using interpolation polynomial in file\n");
       //printf("-C Generate Calibration information for Abstraction (effective SNR adjustment to remove Pe bias w.r.t. AWGN)\n");
       printf("-F Input filename (.txt format) for RX conformance testing\n");
       printf("-G Offset of samples to read from file (0 default)\n");
-      printf("-L <log level, 0(errors), 1(warning), 2(info) 3(debug) 4 (trace)>\n"); 
+      printf("-L <log level, 0(errors), 1(warning), 2(info) 3(debug) 4 (trace)>\n");
+      printf("-I Maximum LDPC decoder iterations\n");
       printf("-M Multiple SSB positions in burst\n");
       printf("-N Nid_cell\n");
       printf("-O oversampling factor (1,2,4,8,16)\n");
@@ -629,10 +646,11 @@ int main(int argc, char **argv)
       printf("-t Acceptable effective throughput (in percentage)\n");
       printf("-S Ending SNR, runs from SNR0 to SNR1\n");
       printf("-P Print ULSCH performances\n");
-      printf("-T Enable PTRS, arguments list L_PTRS{0,1,2} K_PTRS{2,4}, e.g. -T 2 0 2 \n");
-      printf("-U Change DMRS Config, arguments list DMRS TYPE{0=A,1=B} DMRS AddPos{0:3}, e.g. -U 2 0 2 \n");
+      printf("-T Enable PTRS, arguments list: Number of arguments=2 L_PTRS{0,1,2} K_PTRS{2,4}, e.g. -T 2 0 2 \n");
+      printf("-U Change DMRS Config, arguments list: Number of arguments=4, DMRS Mapping Type{0=A,1=B}, DMRS AddPos{0:3}, DMRS Config Type{1,2}, Number of CDM groups without data{1,2,3} e.g. -U 4 0 2 0 1 \n");
       printf("-Q If -F used, read parameters from file\n");
       printf("-Z If -Z is used, SC-FDMA or transform precoding is enabled in Uplink \n");
+      printf("-W Num of layer for PUSCH\n");
       exit(-1);
       break;
 
@@ -653,16 +671,37 @@ int main(int argc, char **argv)
   double sampling_frequency;
   double bandwidth;
 
-  if (N_RB_UL >= 217) sampling_frequency = 122.88;
-  else if (N_RB_UL >= 106) sampling_frequency = 61.44;
-  else if (N_RB_UL >= 32) sampling_frequency = 32.72;
-  else { printf("Need at least 106 PRBs\b"); exit(-1); }
-  if (N_RB_UL == 273) bandwidth = 100;
-  else if (N_RB_UL == 217) bandwidth = 80;
-  else if (N_RB_UL == 106) bandwidth = 40;
-  else if (N_RB_UL == 32) bandwidth = 50;
-  else { printf("Add N_RB_UL %d\n",N_RB_UL); exit(-1); }
+  if (mu == 0 && N_RB_UL == 25 ) {
+    sampling_frequency = 7.68;
+    bandwidth = 5;
+  }
+  else if (mu == 1 && N_RB_UL == 273) {
+    sampling_frequency = 122.88;
+    bandwidth = 100;
+  }
+  else if (mu == 1 && N_RB_UL == 217) {
+    sampling_frequency = 122.88;
+    bandwidth = 80;
+  }
+  else if (mu == 1 && N_RB_UL == 106) {
+    sampling_frequency = 61.44;
+    bandwidth = 40;
+  }
+  else if (mu == 1 && N_RB_UL == 24) {
+    sampling_frequency = 15.36;
+    bandwidth = 10;
+  }
+  else if (mu == 3 && N_RB_UL == 32) {
+    sampling_frequency = 61.44;
+    bandwidth = 50;
+  }
+  else {
+    printf("Add N_RB_UL %d\n",N_RB_UL);
+    exit(-1);
+  }
+
   LOG_I( PHY,"++++++++++++++++++++++++++++++++++++++++++++++%i+++++++++++++++++++++++++++++++++++++++++",loglvl);  
+
   if (openair0_cfg[0].threequarter_fs == 1) sampling_frequency*=.75;
 
   UE2gNB = new_channel_desc_scm(n_tx, n_rx, channel_model,
@@ -684,7 +723,18 @@ int main(int argc, char **argv)
   gNB->ofdm_offset_divisor = UINT_MAX;
   gNB->threadPool = (tpool_t*)malloc(sizeof(tpool_t));
   gNB->respDecode = (notifiedFIFO_t*) malloc(sizeof(notifiedFIFO_t));
-  char tp_param[] = "n";
+  initNotifiedFIFO(gNB->respDecode);
+  char tp_param[80];
+  if (threadCnt>0)
+   sprintf(tp_param,"-1");
+  else
+   tp_param[0]='n';
+  int s_offset = 0;
+  for (int icpu=1; icpu<threadCnt; icpu++) {
+    sprintf(tp_param+2+s_offset,",-1");
+    s_offset += 3;
+  }
+
   initTpool(tp_param, gNB->threadPool, false);
   initNotifiedFIFO(gNB->respDecode);
   gNB->L1_tx_free = (notifiedFIFO_t*) malloc(sizeof(notifiedFIFO_t));
@@ -703,7 +753,8 @@ int main(int argc, char **argv)
   gNB->UL_INFO.crc_ind.crc_list = (nfapi_nr_crc_t *)malloc(NB_UE_INST*sizeof(nfapi_nr_crc_t));
   gNB->UL_INFO.rx_ind.number_of_pdus = 0;
   gNB->UL_INFO.crc_ind.number_crcs = 0;
-  gNB->prb_interpolation = prb_inter;
+  gNB->max_ldpc_iterations = max_ldpc_iterations;
+  gNB->pusch_thres = -20;
   frame_parms = &gNB->frame_parms; //to be initialized I suppose (maybe not necessary for PBCH)
 
   frame_parms->N_RB_DL = N_RB_DL;
@@ -739,7 +790,8 @@ int main(int argc, char **argv)
 
   // TODO do a UECAP for phy-sim
   const gNB_RrcConfigurationReq conf = {
-    .pdsch_AntennaPorts = { .N1 = n_tx, .N2 = 1, .XP = 1 },
+    .pdsch_AntennaPorts = { .N1 = 1, .N2 = 1, .XP = 1 },
+    .pusch_AntennaPorts = n_rx,
     .minRXTXTIME = 0,
     .do_CSIRS = 0,
     .do_SRS = 0,
@@ -752,19 +804,22 @@ int main(int argc, char **argv)
   /* RRC parameter validation for secondaryCellGroup */
   fix_scd(scd);
 
-  AssertFatal((gNB->if_inst         = NR_IF_Module_init(0))!=NULL,"Cannot register interface");
+  AssertFatal((gNB->if_inst = NR_IF_Module_init(0))!=NULL,"Cannot register interface");
 
-  gNB->if_inst->NR_PHY_config_req      = nr_phy_config_request;
+  gNB->if_inst->NR_PHY_config_req = nr_phy_config_request;
   // common configuration
-  rrc_mac_config_req_gNB(0,0, conf.pdsch_AntennaPorts, n_rx, 0, 6, scc, &rrc.carrier.mib, rrc.carrier.siblock1, 0, 0, NULL);
+  rrc_mac_config_req_gNB(0, conf.pdsch_AntennaPorts, n_rx, 0, 6, scc, &rrc.carrier.mib, rrc.carrier.siblock1, 0, 0, NULL);
   // UE dedicated configuration
-  rrc_mac_config_req_gNB(0,0, conf.pdsch_AntennaPorts, n_rx, 0, 6, scc, &rrc.carrier.mib, rrc.carrier.siblock1, 1, secondaryCellGroup->spCellConfig->reconfigurationWithSync->newUE_Identity,secondaryCellGroup);
-  frame_parms->nb_antennas_tx = n_tx;
+  rrc_mac_config_req_gNB(0, conf.pdsch_AntennaPorts, n_rx, 0, 6, scc, &rrc.carrier.mib, rrc.carrier.siblock1, 1,
+                         secondaryCellGroup->spCellConfig->reconfigurationWithSync->newUE_Identity, secondaryCellGroup);
+  frame_parms->nb_antennas_tx = 1;
   frame_parms->nb_antennas_rx = n_rx;
   nfapi_nr_config_request_scf_t *cfg = &gNB->gNB_config;
-  cfg->carrier_config.num_tx_ant.value = n_tx;
+  cfg->carrier_config.num_tx_ant.value = 1;
   cfg->carrier_config.num_rx_ant.value = n_rx;
 //  nr_phy_config_request_sim(gNB,N_RB_DL,N_RB_DL,mu,0,0x01);
+  gNB->chest_freq = chest_type[0];
+  gNB->chest_time = chest_type[1];
   phy_init_nr_gNB(gNB,0,1);
   N_RB_DL = gNB->frame_parms.N_RB_DL;
 
@@ -779,6 +834,8 @@ int main(int argc, char **argv)
   PHY_vars_UE_g[0] = malloc(sizeof(PHY_VARS_NR_UE*));
   PHY_vars_UE_g[0][0] = UE;
   memcpy(&UE->frame_parms, frame_parms, sizeof(NR_DL_FRAME_PARMS));
+  UE->frame_parms.nb_antennas_tx = n_tx;
+  UE->frame_parms.nb_antennas_rx = 0;
 
   if (init_nr_ue_signal(UE, 1) != 0) {
     printf("Error at UE NR initialisation\n");
@@ -831,7 +888,7 @@ int main(int argc, char **argv)
 
   unsigned char *estimated_output_bit;
   unsigned char *test_input_bit;
-  uint32_t errors_decoding   = 0;
+  uint32_t errors_decoding = 0;
   
 
   test_input_bit       = (unsigned char *) malloc16(sizeof(unsigned char) * 16 * 68 * 384);
@@ -864,23 +921,21 @@ int main(int argc, char **argv)
 
   /* validate parameters othwerwise default values are used */
   /* -U flag can be used to set DMRS parameters*/
-  if(modify_dmrs)
-  {
+  if(modify_dmrs) {
     if(dmrs_arg[0] == 0)
-    {
       mapping_type = typeA;
-    }
     else if (dmrs_arg[0] == 1)
-    {
       mapping_type = typeB;
-    }
     /* Additional DMRS positions */
     if(dmrs_arg[1] >= 0 && dmrs_arg[1] <=3 )
-    {
       add_pos = dmrs_arg[1];
-    }
+    /* DMRS Conf Type 1 or 2 */
+    if(dmrs_arg[2] == 1)
+      dmrs_config_type = pusch_dmrs_type1;
+    else if(dmrs_arg[2] == 2)
+      dmrs_config_type = pusch_dmrs_type2;
+    num_dmrs_cdm_grps_no_data = dmrs_arg[3];
   }
-  printf("NOTE: DMRS config is modified with Mapping Type %d , Additional Position %d \n", mapping_type, add_pos );
 
   uint8_t  length_dmrs         = pusch_len1;
   uint16_t l_prime_mask        = get_l_prime(nb_symb_sch, mapping_type, add_pos, length_dmrs, start_symbol, NR_MIB__dmrs_TypeA_Position_pos2);
@@ -888,22 +943,25 @@ int main(int argc, char **argv)
   printf("num dmrs sym %d\n",number_dmrs_symbols);
   uint8_t  nb_re_dmrs          = (dmrs_config_type == pusch_dmrs_type1) ? 6 : 4;
 
-  // if transform precoding is enabled
-  if (transform_precoding == 0) {
+  if ((UE->frame_parms.nb_antennas_tx==4)&&(precod_nbr_layers==4))
+    num_dmrs_cdm_grps_no_data = 2;
+
+  if (transform_precoding == transformPrecoder_enabled) {
 
     AssertFatal(enable_ptrs == 0, "PTRS NOT SUPPORTED IF TRANSFORM PRECODING IS ENABLED\n");
 
     int8_t index = get_index_for_dmrs_lowpapr_seq((NR_NB_SC_PER_RB/2) * nb_rb);
-	  AssertFatal(index >= 0, "Num RBs not configured according to 3GPP 38.211 section 6.3.1.4. For PUSCH with transform precoding, num RBs cannot be multiple of any other primenumber other than 2,3,5\n");
+    AssertFatal(index >= 0, "Num RBs not configured according to 3GPP 38.211 section 6.3.1.4. For PUSCH with transform precoding, num RBs cannot be multiple of any other primenumber other than 2,3,5\n");
     
     dmrs_config_type = pusch_dmrs_type1;
+    nb_re_dmrs       = 6;
 
     printf("[ULSIM]: TRANSFORM PRECODING ENABLED. Num RBs: %d, index for DMRS_SEQ: %d\n", nb_rb, index);
   }
 
-  nb_re_dmrs   = nb_re_dmrs * num_dmrs_cdm_grps_no_data;
+  nb_re_dmrs = nb_re_dmrs * num_dmrs_cdm_grps_no_data;
 
-  unsigned int available_bits  = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, number_dmrs_symbols, mod_order, 1);
+  unsigned int available_bits  = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, number_dmrs_symbols, mod_order, precod_nbr_layers);
   unsigned int TBS             = nr_compute_tbs(mod_order, code_rate, nb_rb, nb_symb_sch, nb_re_dmrs * number_dmrs_symbols, 0, 0, precod_nbr_layers);
 
   
@@ -928,17 +986,12 @@ int main(int argc, char **argv)
   double ts = 1.0/(frame_parms->subcarrier_spacing * frame_parms->ofdm_symbol_size);
 
   /* -T option enable PTRS */
-  if(enable_ptrs)
-  {
+  if(enable_ptrs) {
     /* validate parameters othwerwise default values are used */
     if(ptrs_arg[0] == 0 || ptrs_arg[0] == 1 || ptrs_arg[0] == 2 )
-    {
       ptrs_time_density = ptrs_arg[0];
-    }
     if(ptrs_arg[1] == 2 || ptrs_arg[1] == 4 )
-    {
       ptrs_freq_density = ptrs_arg[1];
-    }
     pdu_bit_map |= PUSCH_PDU_BITMAP_PUSCH_PTRS;
     printf("NOTE: PTRS Enabled with L %d, K %d \n", ptrs_time_density, ptrs_freq_density );
   }
@@ -970,7 +1023,6 @@ int main(int argc, char **argv)
   int slot_length = slot_offset - frame_parms->get_samples_slot_timestamp(slot-1,frame_parms,0);
 
   if (input_fd != NULL)	{
-    AssertFatal(frame_parms->nb_antennas_rx == 1, "nb_ant != 1\n");
     // 800 samples is N_TA_OFFSET for FR1 @ 30.72 Ms/s,
     AssertFatal(frame_parms->subcarrier_spacing==30000,"only 30 kHz for file input for now (%d)\n",frame_parms->subcarrier_spacing);
   
@@ -998,18 +1050,21 @@ int main(int argc, char **argv)
       printf("harq_pid %d\n",harq_pid);
     }
     fseek(input_fd,file_offset*sizeof(int16_t)*2,SEEK_SET);
-    read_errors+=fread((void*)&gNB->common_vars.rxdata[0][slot_offset-delay],
-    sizeof(int16_t),
-    slot_length<<1,
-    input_fd);
-    if (read_errors==0) {
-      printf("error reading file\n");
-      exit(1);
+    for (int irx=0; irx<frame_parms->nb_antennas_rx; irx++) {
+      fseek(input_fd,irx*(slot_length+15)*sizeof(int16_t)*2,SEEK_SET); // matlab adds samlples to the end to emulate channel delay
+      read_errors+=fread((void*)&gNB->common_vars.rxdata[irx][slot_offset-delay],
+      sizeof(int16_t),
+      slot_length<<1,
+      input_fd);
+      if (read_errors==0) {
+        printf("error reading file\n");
+        exit(1);
+      }
+      for (int i=0;i<16;i+=2) printf("slot_offset %d : %d,%d\n",
+             slot_offset,
+             ((int16_t*)&gNB->common_vars.rxdata[irx][slot_offset])[i],
+             ((int16_t*)&gNB->common_vars.rxdata[irx][slot_offset])[1+i]);
     }
-    for (int i=0;i<16;i+=2) printf("slot_offset %d : %d,%d\n",
-				   slot_offset,
-				   ((int16_t*)&gNB->common_vars.rxdata[0][slot_offset])[i],
-				   ((int16_t*)&gNB->common_vars.rxdata[0][slot_offset])[1+i]);
 
     mod_order = nr_get_Qm_ul(Imcs, mcs_table);
     code_rate = nr_get_code_rate_ul(Imcs, mcs_table);
@@ -1054,7 +1109,7 @@ int main(int argc, char **argv)
     uint8_t round = 0;
 
     crc_status = 1;
-    errors_decoding    = 0;
+    errors_decoding = 0;
     memset((void*)roundStats,0,50*sizeof(roundStats[0]));
     while (round<max_rounds && crc_status) {
       round_trials[round][snrRun]++;
@@ -1101,12 +1156,12 @@ int main(int argc, char **argv)
       pusch_pdu->qam_mod_order = mod_order;
       pusch_pdu->transform_precoding = transform_precoding;
       pusch_pdu->data_scrambling_id = *scc->physCellId;
-      pusch_pdu->nrOfLayers = 1;
+      pusch_pdu->nrOfLayers = precod_nbr_layers;
       pusch_pdu->ul_dmrs_symb_pos = l_prime_mask;
       pusch_pdu->dmrs_config_type = dmrs_config_type;
       pusch_pdu->ul_dmrs_scrambling_id =  *scc->physCellId;
       pusch_pdu->scid = 0;
-      pusch_pdu->dmrs_ports = 1;
+      pusch_pdu->dmrs_ports = ((1<<precod_nbr_layers)-1);
       pusch_pdu->num_dmrs_cdm_grps_no_data = num_dmrs_cdm_grps_no_data;
       pusch_pdu->resource_alloc = 1; 
       pusch_pdu->rb_start = start_rb;
@@ -1126,7 +1181,7 @@ int main(int argc, char **argv)
       pusch_pdu->pusch_ptrs.ptrs_ports_list[0].ptrs_re_offset = 0;
 
       // if transform precoding is enabled
-      if (transform_precoding == 0) {
+      if (transform_precoding == transformPrecoder_enabled) {
 
         pusch_pdu->dfts_ofdm.low_papr_group_number = *scc->physCellId % 30; // U as defined in 38.211 section 6.4.1.1.1.2 
         pusch_pdu->dfts_ofdm.low_papr_sequence_number = 0;     // V as defined in 38.211 section 6.4.1.1.1.2
@@ -1173,7 +1228,9 @@ int main(int argc, char **argv)
       ul_config.ul_config_list[0].pusch_config_pdu.mcs_table = mcs_table;
       ul_config.ul_config_list[0].pusch_config_pdu.num_dmrs_cdm_grps_no_data = num_dmrs_cdm_grps_no_data;
       ul_config.ul_config_list[0].pusch_config_pdu.nrOfLayers = precod_nbr_layers;
+      ul_config.ul_config_list[0].pusch_config_pdu.dmrs_ports = ((1<<precod_nbr_layers)-1);
       ul_config.ul_config_list[0].pusch_config_pdu.absolute_delta_PUSCH = 0;
+      ul_config.ul_config_list[0].pusch_config_pdu.target_code_rate = code_rate;
 
       ul_config.ul_config_list[0].pusch_config_pdu.pusch_data.tb_size = TBS/8;
       ul_config.ul_config_list[0].pusch_config_pdu.pusch_data.new_data_indicator = trial & 0x1;
@@ -1182,13 +1239,13 @@ int main(int argc, char **argv)
 
       ul_config.ul_config_list[0].pusch_config_pdu.pusch_ptrs.ptrs_time_density = ptrs_time_density;
       ul_config.ul_config_list[0].pusch_config_pdu.pusch_ptrs.ptrs_freq_density = ptrs_freq_density;
-      ul_config.ul_config_list[0].pusch_config_pdu.pusch_ptrs.ptrs_ports_list   = (nfapi_nr_ue_ptrs_ports_t *) malloc(2*sizeof(nfapi_nr_ue_ptrs_ports_t));
+      ul_config.ul_config_list[0].pusch_config_pdu.pusch_ptrs.ptrs_ports_list = (nfapi_nr_ue_ptrs_ports_t *) malloc(2*sizeof(nfapi_nr_ue_ptrs_ports_t));
       ul_config.ul_config_list[0].pusch_config_pdu.pusch_ptrs.ptrs_ports_list[0].ptrs_re_offset = 0;
 
       ul_config.ul_config_list[0].pusch_config_pdu.transform_precoding = transform_precoding;
 
       // if transform precoding is enabled
-      if (transform_precoding == 0) {
+      if (transform_precoding == transformPrecoder_enabled) {
    
         ul_config.ul_config_list[0].pusch_config_pdu.dfts_ofdm.low_papr_group_number = *scc->physCellId % 30;// U as defined in 38.211 section 6.4.1.1.1.2 
         ul_config.ul_config_list[0].pusch_config_pdu.dfts_ofdm.low_papr_sequence_number = 0;// V as defined in 38.211 section 6.4.1.1.1.2
@@ -1216,43 +1273,83 @@ int main(int argc, char **argv)
         LOG_D(PHY, "Sending Uplink data \n");
         nr_ue_pusch_common_procedures(UE,
                                       slot,
-                                      &UE->frame_parms,1);
+                                      &UE->frame_parms,
+                                      UE->frame_parms.nb_antennas_tx);
+
 
         if (n_trials==1) {
-          LOG_M("txsig0.m","txs0", UE->common_vars.txdata[0],frame_parms->samples_per_subframe*10,1,1);
+          LOG_M("txsig0.m","txs0", &UE->common_vars.txdata[0][slot_offset],slot_length,1,1);
           LOG_M("txsig0F.m","txs0F", UE->common_vars.txdataF[0],frame_parms->ofdm_symbol_size*14,1,1);
+          if (precod_nbr_layers > 1) {
+            LOG_M("txsig1.m","txs1", &UE->common_vars.txdata[1][slot_offset],slot_length,1,1);
+            LOG_M("txsig1F.m","txs1F", UE->common_vars.txdataF[1],frame_parms->ofdm_symbol_size*14,1,1);
+            if (precod_nbr_layers==4) {
+              LOG_M("txsig2.m","txs2", &UE->common_vars.txdata[2][slot_offset],slot_length,1,1);
+              LOG_M("txsig3.m","txs3", &UE->common_vars.txdata[3][slot_offset],slot_length,1,1);
+              LOG_M("txsig2F.m","txs2F", UE->common_vars.txdataF[2],frame_parms->ofdm_symbol_size*14,1,1);
+              LOG_M("txsig3F.m","txs3F", UE->common_vars.txdataF[3],frame_parms->ofdm_symbol_size*14,1,1);
+            }
+          }
         }
         ///////////
         ////////////////////////////////////////////////////
         tx_offset = frame_parms->get_samples_slot_timestamp(slot,frame_parms,0);
-
-        txlev = signal_energy(&UE->common_vars.txdata[0][tx_offset + 5*frame_parms->ofdm_symbol_size + 4*frame_parms->nb_prefix_samples + frame_parms->nb_prefix_samples0],
+        txlev_sum = 0;
+        for (int aa=0; aa<UE->frame_parms.nb_antennas_tx; aa++) {
+          atxlev[aa] = signal_energy(&UE->common_vars.txdata[aa][tx_offset + 5*frame_parms->ofdm_symbol_size + 4*frame_parms->nb_prefix_samples + frame_parms->nb_prefix_samples0],
                               frame_parms->ofdm_symbol_size + frame_parms->nb_prefix_samples);
-      }	
-      else n_trials = 1;
 
-      if (input_fd == NULL ) {
+          txlev_sum += atxlev[aa];
 
-        sigma_dB = 10 * log10((double)txlev * ((double)frame_parms->ofdm_symbol_size/(12*nb_rb))) - SNR;;
+          if (n_trials==1) printf("txlev[%d] = %d (%f dB) txlev_sum %d\n",aa,atxlev[aa],10*log10((double)atxlev[aa]),txlev_sum);
+        }
+      }
+      else
+        n_trials = 1;
+
+      if (input_fd == NULL) {
+        // Justification of division by precod_nbr_layers:
+        // When the channel is the identity matrix, the results in terms of SNR should be almost equal for 2x2 and 4x4.
+        sigma_dB = 10 * log10((double)txlev_sum/precod_nbr_layers * ((double)frame_parms->ofdm_symbol_size/(12*nb_rb))) - SNR;;
         sigma    = pow(10,sigma_dB/10);
 
 
-        if(n_trials==1) printf("sigma %f (%f dB), txlev %f (factor %f)\n",sigma,sigma_dB,10*log10((double)txlev),(double)(double)
-                                frame_parms->ofdm_symbol_size/(12*nb_rb));
+        if(n_trials==1) printf("sigma %f (%f dB), txlev_sum %f (factor %f)\n",sigma,sigma_dB,10*log10((double)txlev_sum),(double)(double)
+                               frame_parms->ofdm_symbol_size/(12*nb_rb));
 
         for (i=0; i<slot_length; i++) {
-          for (int aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
+          for (int aa=0; aa<UE->frame_parms.nb_antennas_tx; aa++) {
             s_re[aa][i] = ((double)(((short *)&UE->common_vars.txdata[aa][slot_offset]))[(i<<1)]);
             s_im[aa][i] = ((double)(((short *)&UE->common_vars.txdata[aa][slot_offset]))[(i<<1)+1]);
           }
         }
 
-
-        if (UE2gNB->max_Doppler == 0) {
-          multipath_channel(UE2gNB, s_re, s_im, r_re, r_im, slot_length, 0, (n_trials==1)?1:0);
+        // The multipath_channel() function calculates a channel matrix with only 1's. So the channel rank is 1, and we
+        // cannot use multi-layer. To solve this issue, for now we use the H_awgn_mimo matrix for multi-layer.
+        if (precod_nbr_layers == 1) {
+          if (UE2gNB->max_Doppler == 0) {
+            multipath_channel(UE2gNB, s_re, s_im, r_re, r_im, slot_length, 0, (n_trials==1)?1:0);
+          } else {
+            multipath_tv_channel(UE2gNB, s_re, s_im, r_re, r_im, 2*slot_length, 0);
+          }
         } else {
-          multipath_tv_channel(UE2gNB, s_re, s_im, r_re, r_im, 2*slot_length, 0);
+          double H_awgn_mimo[4][4] ={{1.0, 0.2, 0.1, 0.05},   //rx 0
+                                     {0.2, 1.0, 0.2, 0.1},    //rx 1
+                                     {0.1, 0.2, 1.0, 0.2},    //rx 2
+                                     {0.05, 0.1, 0.2, 1.0}};  //rx 3
+          for (i=0; i<slot_length; i++) {
+            for (ap = 0; ap < frame_parms->nb_antennas_rx; ap++) {
+              // sum up signals from different Tx antennas
+              r_re[ap][i] = 0;
+              r_im[ap][i] = 0;
+              for (int aa=0; aa<n_tx; aa++) {
+                r_re[ap][i] += s_re[aa][i]*H_awgn_mimo[ap][aa];
+                r_im[ap][i] += s_im[aa][i]*H_awgn_mimo[ap][aa];
+              }
+            }
+          }
         }
+
         for (i=0; i<slot_length; i++) {
           for (ap=0; ap<frame_parms->nb_antennas_rx; ap++) {
             ((int16_t*) &gNB->common_vars.rxdata[ap][slot_offset])[(2*i)   + (delay*2)] = (int16_t)((r_re[ap][i]) + (sqrt(sigma/2)*gaussdouble(0.0,1.0))); // convert to fixed point
@@ -1276,7 +1373,7 @@ int main(int argc, char **argv)
                           pusch_pdu->ul_dmrs_symb_pos);
         ptrsSymbPerSlot = get_ptrs_symbols_in_slot(ptrsSymPos, pusch_pdu->start_symbol_index, pusch_pdu->nr_of_symbols);
         ptrsRePerSymb = ((pusch_pdu->rb_size + ptrs_freq_density - 1)/ptrs_freq_density);
-        printf("[ULSIM] PTRS Symbols in a slot: %2u, RE per Symbol: %3u, RE in a slot %4d\n", ptrsSymbPerSlot,ptrsRePerSymb, ptrsSymbPerSlot*ptrsRePerSymb );
+        LOG_D(PHY,"[ULSIM] PTRS Symbols in a slot: %2u, RE per Symbol: %3u, RE in a slot %4d\n", ptrsSymbPerSlot,ptrsRePerSymb, ptrsSymbPerSlot*ptrsRePerSymb );
       }
 	////////////////////////////////////////////////////////////
 	
@@ -1286,130 +1383,152 @@ int main(int argc, char **argv)
 	gNB->UL_INFO.rx_ind.number_of_pdus = 0;
 	gNB->UL_INFO.crc_ind.number_crcs = 0;
 
-        phy_procedures_gNB_common_RX(gNB, frame, slot);
-
-        ul_proc_error = phy_procedures_gNB_uespec_RX(gNB, frame, slot);
-
-	if (n_trials==1 && round==0) {
-	  LOG_M("rxsig0.m","rx0",&gNB->common_vars.rxdata[0][slot_offset],slot_length,1,1);
-
-	  LOG_M("rxsigF0.m","rxsF0",gNB->common_vars.rxdataF[0]+start_symbol*frame_parms->ofdm_symbol_size,nb_symb_sch*frame_parms->ofdm_symbol_size,1,1);
-
-	}
+    phy_procedures_gNB_common_RX(gNB, frame, slot);
+
+    ul_proc_error = phy_procedures_gNB_uespec_RX(gNB, frame, slot);
+
+    if (n_trials==1 && round==0) {
+      LOG_M("rxsig0.m","rx0",&gNB->common_vars.rxdata[0][slot_offset],slot_length,1,1);
+      LOG_M("rxsigF0.m","rxsF0",gNB->common_vars.rxdataF[0],14*frame_parms->ofdm_symbol_size,1,1);
+      if (precod_nbr_layers > 1) {
+        LOG_M("rxsig1.m","rx1",&gNB->common_vars.rxdata[1][slot_offset],slot_length,1,1);
+        LOG_M("rxsigF1.m","rxsF1",gNB->common_vars.rxdataF[1],14*frame_parms->ofdm_symbol_size,1,1);
+        if (precod_nbr_layers==4) {
+          LOG_M("rxsig2.m","rx2",&gNB->common_vars.rxdata[2][slot_offset],slot_length,1,1);
+          LOG_M("rxsig3.m","rx3",&gNB->common_vars.rxdata[3][slot_offset],slot_length,1,1);
+          LOG_M("rxsigF2.m","rxsF2",gNB->common_vars.rxdataF[2],14*frame_parms->ofdm_symbol_size,1,1);
+          LOG_M("rxsigF3.m","rxsF3",gNB->common_vars.rxdataF[3],14*frame_parms->ofdm_symbol_size,1,1);
+        }
+      }
+    }
 
 
-	if (n_trials == 1  && round==0) {
+    if (n_trials == 1  && round==0) {
 #ifdef __AVX2__
-	  __attribute__((unused))
-	  int off = ((nb_rb&1) == 1)? 4:0;
+      __attribute__((unused))
+      int off = ((nb_rb&1) == 1)? 4:0;
 #else
-	  __attribute__((unused))
-	  int off = 0;
+      __attribute__((unused))
+      int off = 0;
 #endif
 
-	  LOG_M("rxsigF0_ext.m","rxsF0_ext",
-		&gNB->pusch_vars[0]->rxdataF_ext[0][start_symbol*NR_NB_SC_PER_RB * pusch_pdu->rb_size],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
-	  LOG_M("chestF0.m","chF0",
-		&gNB->pusch_vars[0]->ul_ch_estimates[0][start_symbol*frame_parms->ofdm_symbol_size],frame_parms->ofdm_symbol_size,1,1);
-	  LOG_M("chestT0.m","chT0",
-		&gNB->pusch_vars[0]->ul_ch_estimates_time[0][0],frame_parms->ofdm_symbol_size,1,1);
-	  LOG_M("chestF0_ext.m","chF0_ext",
-		&gNB->pusch_vars[0]->ul_ch_estimates_ext[0][(start_symbol+1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],
-		(nb_symb_sch-1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
-	  LOG_M("rxsigF0_comp.m","rxsF0_comp",
-		&gNB->pusch_vars[0]->rxdataF_comp[0][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
-    LOG_M("chmagF0.m","chmF0",
-    &gNB->pusch_vars[0]->ul_ch_mag[0][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
-    LOG_M("chmagbF0.m","chmbF0",
-    &gNB->pusch_vars[0]->ul_ch_magb[0][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
-    if (n_rx == 2) {
-      LOG_MM("rxsigF0_comp.m","rxsF1_comp",
-      &gNB->pusch_vars[0]->rxdataF_comp[1][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
-      LOG_MM("rxsigF0_ext.m","rxsF1_ext",
-      &gNB->pusch_vars[0]->rxdataF_ext[1][start_symbol*NR_NB_SC_PER_RB * pusch_pdu->rb_size],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
-      LOG_MM("chestF0_ext.m","chF1_ext",
-      &gNB->pusch_vars[0]->ul_ch_estimates_ext[1][(start_symbol+1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],
-      (nb_symb_sch-1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
-      LOG_MM("chmagF0.m","chmF1",
-      &gNB->pusch_vars[0]->ul_ch_mag[1][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
-      LOG_MM("chmagbF0.m","chmbF1",
-      &gNB->pusch_vars[0]->ul_ch_magb[1][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
-    } else if (n_rx == 4) {
-      LOG_MM("rxsigF0_comp.m","rxsF1_comp",
-      &gNB->pusch_vars[0]->rxdataF_comp[1][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
-      LOG_MM("rxsigF0_comp.m","rxsF2_comp",
-      &gNB->pusch_vars[0]->rxdataF_comp[2][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
-      LOG_MM("rxsigF0_comp.m","rxsF3_comp",
-      &gNB->pusch_vars[0]->rxdataF_comp[3][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
-      LOG_MM("rxsigF0_ext.m","rxsF1_ext",
-      &gNB->pusch_vars[0]->rxdataF_ext[1][start_symbol*NR_NB_SC_PER_RB * pusch_pdu->rb_size],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
-      LOG_MM("rxsigF0_ext.m","rxsF2_ext",
-      &gNB->pusch_vars[0]->rxdataF_ext[2][start_symbol*NR_NB_SC_PER_RB * pusch_pdu->rb_size],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
-      LOG_MM("rxsigF0_ext.m","rxsF3_ext",
-      &gNB->pusch_vars[0]->rxdataF_ext[3][start_symbol*NR_NB_SC_PER_RB * pusch_pdu->rb_size],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
-      LOG_MM("chestF0_ext.m","chF1_ext",
-      &gNB->pusch_vars[0]->ul_ch_estimates_ext[1][(start_symbol+1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],
-      (nb_symb_sch-1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
-      LOG_MM("chestF0_ext.m","chF2_ext",
-      &gNB->pusch_vars[0]->ul_ch_estimates_ext[2][(start_symbol+1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],
-      (nb_symb_sch-1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
-      LOG_MM("chestF0_ext.m","chF3_ext",
-      &gNB->pusch_vars[0]->ul_ch_estimates_ext[3][(start_symbol+1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],
-      (nb_symb_sch-1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
-      LOG_MM("chmagF0.m","chmF1",
-      &gNB->pusch_vars[0]->ul_ch_mag[1][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
-      LOG_MM("chmagF0.m","chmF2",
-      &gNB->pusch_vars[0]->ul_ch_mag[2][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
-      LOG_MM("chmagF0.m","chmF3",
-      &gNB->pusch_vars[0]->ul_ch_mag[3][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
-      LOG_MM("chmagbF0.m","chmbF1",
-      &gNB->pusch_vars[0]->ul_ch_magb[1][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
-      LOG_MM("chmagbF0.m","chmbF2",
-      &gNB->pusch_vars[0]->ul_ch_magb[2][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
-      LOG_MM("chmagbF0.m","chmbF3",
-      &gNB->pusch_vars[0]->ul_ch_magb[3][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
-    }
+      LOG_M("rxsigF0_ext.m","rxsF0_ext",
+            &gNB->pusch_vars[0]->rxdataF_ext[0][start_symbol*NR_NB_SC_PER_RB * pusch_pdu->rb_size],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
+      LOG_M("chestF0.m","chF0",
+            &gNB->pusch_vars[0]->ul_ch_estimates[0][start_symbol*frame_parms->ofdm_symbol_size],frame_parms->ofdm_symbol_size,1,1);
+      LOG_M("chestT0.m","chT0",
+            &gNB->pusch_vars[0]->ul_ch_estimates_time[0][0],frame_parms->ofdm_symbol_size,1,1);
+      LOG_M("chestF0_ext.m","chF0_ext",
+            &gNB->pusch_vars[0]->ul_ch_estimates_ext[0][(start_symbol+1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],
+            (nb_symb_sch-1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
+      LOG_M("rxsigF0_comp.m","rxsF0_comp",
+            &gNB->pusch_vars[0]->rxdataF_comp[0][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
+      LOG_M("chmagF0.m","chmF0",
+        &gNB->pusch_vars[0]->ul_ch_mag[0][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
+      LOG_M("chmagbF0.m","chmbF0",
+        &gNB->pusch_vars[0]->ul_ch_magb[0][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
+      LOG_M("rxsigF0_llrlayers0.m","rxsF0_llrlayers0",
+            &gNB->pusch_vars[0]->llr_layers[0][0],(nb_symb_sch-1)*NR_NB_SC_PER_RB * pusch_pdu->rb_size * mod_order,1,0);
+
+      if (precod_nbr_layers==2) {
+        LOG_M("rxsigF1_ext.m","rxsF1_ext",
+             &gNB->pusch_vars[0]->rxdataF_ext[1][start_symbol*NR_NB_SC_PER_RB * pusch_pdu->rb_size],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
+
+        LOG_M("chestF3.m","chF3",
+             &gNB->pusch_vars[0]->ul_ch_estimates[3][start_symbol*frame_parms->ofdm_symbol_size],frame_parms->ofdm_symbol_size,1,1);
+
+        LOG_M("chestF3_ext.m","chF3_ext",
+        &gNB->pusch_vars[0]->ul_ch_estimates_ext[3][(start_symbol+1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],
+              (nb_symb_sch-1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
+
+        LOG_M("rxsigF2_comp.m","rxsF2_comp",
+            &gNB->pusch_vars[0]->rxdataF_comp[2][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
+
+        LOG_M("rxsigF0_llrlayers1.m","rxsF0_llrlayers1",
+        &gNB->pusch_vars[0]->llr_layers[1][0],(nb_symb_sch-1)*NR_NB_SC_PER_RB * pusch_pdu->rb_size * mod_order,1,0);
 
-	  LOG_M("rxsigF0_llr.m","rxsF0_llr",
-		&gNB->pusch_vars[0]->llr[0],(nb_symb_sch-1)*NR_NB_SC_PER_RB * pusch_pdu->rb_size * mod_order,1,0);
-	}
+        }
+
+        if (precod_nbr_layers==4) {
+          LOG_M("rxsigF1_ext.m","rxsF1_ext",
+            &gNB->pusch_vars[0]->rxdataF_ext[1][start_symbol*NR_NB_SC_PER_RB * pusch_pdu->rb_size],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
+         LOG_M("rxsigF2_ext.m","rxsF2_ext",
+            &gNB->pusch_vars[0]->rxdataF_ext[2][start_symbol*NR_NB_SC_PER_RB * pusch_pdu->rb_size],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
+        LOG_M("rxsigF3_ext.m","rxsF3_ext",
+            &gNB->pusch_vars[0]->rxdataF_ext[3][start_symbol*NR_NB_SC_PER_RB * pusch_pdu->rb_size],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
+
+        LOG_M("chestF5.m","chF5",
+            &gNB->pusch_vars[0]->ul_ch_estimates[5][start_symbol*frame_parms->ofdm_symbol_size],frame_parms->ofdm_symbol_size,1,1);
+        LOG_M("chestF10.m","chF10",
+            &gNB->pusch_vars[0]->ul_ch_estimates[10][start_symbol*frame_parms->ofdm_symbol_size],frame_parms->ofdm_symbol_size,1,1);
+        LOG_M("chestF15.m","chF15",
+            &gNB->pusch_vars[0]->ul_ch_estimates[15][start_symbol*frame_parms->ofdm_symbol_size],frame_parms->ofdm_symbol_size,1,1);
+
+
+        LOG_M("chestF5_ext.m","chF5_ext",
+        &gNB->pusch_vars[0]->ul_ch_estimates_ext[5][(start_symbol+1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],
+              (nb_symb_sch-1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
+        LOG_M("chestF10_ext.m","chF10_ext",
+        &gNB->pusch_vars[0]->ul_ch_estimates_ext[10][(start_symbol+1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],
+              (nb_symb_sch-1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
+        LOG_M("chestF15_ext.m","chF15_ext",
+        &gNB->pusch_vars[0]->ul_ch_estimates_ext[15][(start_symbol+1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],
+             (nb_symb_sch-1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
+
+
+        LOG_M("rxsigF4_comp.m","rxsF4_comp",
+            &gNB->pusch_vars[0]->rxdataF_comp[4][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
+        LOG_M("rxsigF8_comp.m","rxsF8_comp",
+            &gNB->pusch_vars[0]->rxdataF_comp[8][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
+        LOG_M("rxsigF12_comp.m","rxsF12_comp",
+            &gNB->pusch_vars[0]->rxdataF_comp[12][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
+        LOG_M("rxsigF0_llrlayers1.m","rxsF0_llrlayers1",
+        &gNB->pusch_vars[0]->llr_layers[1][0],(nb_symb_sch-1)*NR_NB_SC_PER_RB * pusch_pdu->rb_size * mod_order,1,0);
+        LOG_M("rxsigF0_llrlayers2.m","rxsF0_llrlayers2",
+        &gNB->pusch_vars[0]->llr_layers[2][0],(nb_symb_sch-1)*NR_NB_SC_PER_RB * pusch_pdu->rb_size * mod_order,1,0);
+        LOG_M("rxsigF0_llrlayers3.m","rxsF0_llrlayers3",
+        &gNB->pusch_vars[0]->llr_layers[3][0],(nb_symb_sch-1)*NR_NB_SC_PER_RB * pusch_pdu->rb_size * mod_order,1,0);
+      }
+
+      LOG_M("rxsigF0_llr.m","rxsF0_llr",
+           &gNB->pusch_vars[0]->llr[0],precod_nbr_layers*(nb_symb_sch-1)*NR_NB_SC_PER_RB * pusch_pdu->rb_size * mod_order,1,0);
+    }
         ////////////////////////////////////////////////////////////
 
-	if ((gNB->ulsch[0]->last_iteration_cnt >=
-	    gNB->ulsch[0]->max_ldpc_iterations+1) || ul_proc_error == 1) {
-	  error_flag = 1; 
-	  n_errors[round][snrRun]++;
-	  crc_status = 1;
-	} else {
-	  crc_status = 0;
-	}
-	if(n_trials==1) printf("end of round %d rv_index %d\n",round, rv_index);
+    if ((gNB->ulsch[0]->last_iteration_cnt >=
+        gNB->ulsch[0]->max_ldpc_iterations+1) || ul_proc_error == 1) {
+      error_flag = 1;
+      n_errors[round][snrRun]++;
+      crc_status = 1;
+    } else
+      crc_status = 0;
+    if(n_trials==1) printf("end of round %d rv_index %d\n",round, rv_index);
+
+    //----------------------------------------------------------
+    //----------------- count and print errors -----------------
+    //----------------------------------------------------------
+
+    if ((pusch_pdu->pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_PTRS) && (SNR==snr0) && (trial==0) && (round==0)) {
+      ptrs_symbols = 0;
+      for (int i = pusch_pdu->start_symbol_index; i < pusch_pdu->start_symbol_index + pusch_pdu->nr_of_symbols; i++)
+        ptrs_symbols += ((gNB->pusch_vars[UE_id]->ptrs_symbols) >> i) & 1;
+
+      /*  2*5*(50/2), for RB = 50,K = 2 for 5 OFDM PTRS symbols */
+      available_bits -= 2 * ptrs_symbols * ((nb_rb + ptrs_freq_density - 1) /ptrs_freq_density);
+      printf("[ULSIM][PTRS] Available bits are: %5u, removed PTRS bits are: %5d \n",available_bits, (ptrsSymbPerSlot * ptrsRePerSymb * 2) );
+    }
 
-        //----------------------------------------------------------
-        //----------------- count and print errors -----------------
-        //----------------------------------------------------------
+    for (i = 0; i < available_bits; i++) {
 
-        if ((pusch_pdu->pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_PTRS) && (SNR==snr0) && (trial==0) && (round==0)) {
-            ptrs_symbols = 0;
-            for (int i = pusch_pdu->start_symbol_index; i < pusch_pdu->start_symbol_index + pusch_pdu->nr_of_symbols; i++){
-               ptrs_symbols += ((gNB->pusch_vars[UE_id]->ptrs_symbols) >> i) & 1;
-            }
-            /*  2*5*(50/2), for RB = 50,K = 2 for 5 OFDM PTRS symbols */
-            available_bits -= 2 * ptrs_symbols * ((nb_rb + ptrs_freq_density - 1) /ptrs_freq_density);
-            printf("[ULSIM][PTRS] Available bits are: %5u, removed PTRS bits are: %5d \n",available_bits, (ptrsSymbPerSlot * ptrsRePerSymb * 2) );
-        }
+      if(((ulsch_ue->harq_processes[harq_pid]->f[i] == 0) && (gNB->pusch_vars[UE_id]->llr[i] <= 0)) ||
+         ((ulsch_ue->harq_processes[harq_pid]->f[i] == 1) && (gNB->pusch_vars[UE_id]->llr[i] >= 0))) {
 
-	for (i = 0; i < available_bits; i++) {
-	  
-	  if(((ulsch_ue->harq_processes[harq_pid]->f[i] == 0) && (gNB->pusch_vars[UE_id]->llr[i] <= 0)) ||
-	     ((ulsch_ue->harq_processes[harq_pid]->f[i] == 1) && (gNB->pusch_vars[UE_id]->llr[i] >= 0)))
-	    {
-	      /*if(errors_scrambling == 0)
-		printf("\x1B[34m" "[frame %d][trial %d]\t1st bit in error in unscrambling = %d\n" "\x1B[0m", frame, trial, i);*/
-	      errors_scrambling[round][snrRun]++;
-	    }
-	}
-	round++;
+        /*if(errors_scrambling == 0)
+	  printf("\x1B[34m" "[frame %d][trial %d]\t1st bit in error in unscrambling = %d\n" "\x1B[0m", frame, trial, i);*/
+        errors_scrambling[round][snrRun]++;
+      }
+    }
+    round++;
 
     } // round
     
@@ -1476,7 +1595,12 @@ int main(int argc, char **argv)
 	   roundStats[snrRun],effRate[snrRun],effTP[snrRun],TBS);
 
     FILE *fd=fopen("nr_ulsim.log","w");
+    if (fd == NULL) {
+      printf("Problem with filename %s\n", "nr_ulsim.log");
+      exit(-1);
+    }
     dump_pusch_stats(fd,gNB);
+    fclose(fd);
 
     printf("*****************************************\n");
     printf("\n");
@@ -1506,7 +1630,7 @@ int main(int argc, char **argv)
     if(n_trials==1)
       break;
 
-    if ((float)n_errors[0][snrRun]/(float)n_trials <= target_error_rate) {
+    if ((float)effTP[snrRun] >= eff_tp_check) {
       printf("*************\n");
       printf("PUSCH test OK\n");
       printf("*************\n");
@@ -1536,17 +1660,19 @@ int main(int argc, char **argv)
           length_dmrs,
           num_dmrs_cdm_grps_no_data);
               
-  LOG_M("ulsimStats.m","SNR",snrStats,snrRun,1,7);
-  LOG_MM("ulsimStats.m","BLER_round0",blerStats[0],snrRun,1,7);
-  LOG_MM("ulsimStats.m","BLER_round1",blerStats[1],snrRun,1,7);
-  LOG_MM("ulsimStats.m","BLER_round2",blerStats[2],snrRun,1,7);
-  LOG_MM("ulsimStats.m","BLER_round3",blerStats[3],snrRun,1,7);
-  LOG_MM("ulsimStats.m","BER_round0",berStats[0],snrRun,1,7);
-  LOG_MM("ulsimStats.m","BER_round1",berStats[1],snrRun,1,7);
-  LOG_MM("ulsimStats.m","BER_round2",berStats[2],snrRun,1,7);
-  LOG_MM("ulsimStats.m","BER_round3",berStats[3],snrRun,1,7);
-  LOG_MM("ulsimStats.m","EffRate",effRate,snrRun,1,7);
-  LOG_MM("ulsimStats.m","EffTP",effTP,snrRun,1,7);
+  char opStatsFile[50];
+  sprintf(opStatsFile, "ulsimStats_z%d.m", n_rx);
+  LOG_M(opStatsFile,"SNR",snrStats,snrRun,1,7);
+  LOG_MM(opStatsFile,"BLER_round0",blerStats[0],snrRun,1,7);
+  LOG_MM(opStatsFile,"BLER_round1",blerStats[1],snrRun,1,7);
+  LOG_MM(opStatsFile,"BLER_round2",blerStats[2],snrRun,1,7);
+  LOG_MM(opStatsFile,"BLER_round3",blerStats[3],snrRun,1,7);
+  LOG_MM(opStatsFile,"BER_round0",berStats[0],snrRun,1,7);
+  LOG_MM(opStatsFile,"BER_round1",berStats[1],snrRun,1,7);
+  LOG_MM(opStatsFile,"BER_round2",berStats[2],snrRun,1,7);
+  LOG_MM(opStatsFile,"BER_round3",berStats[3],snrRun,1,7);
+  LOG_MM(opStatsFile,"EffRate",effRate,snrRun,1,7);
+  LOG_MM(opStatsFile,"EffTP",effTP,snrRun,1,7);
   free(test_input_bit);
   free(estimated_output_bit);
 
diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeCache.txt b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeCache.txt
new file mode 100644
index 0000000000000000000000000000000000000000..b9bfc668ed5a68b32de9a769193021062b73446a
--- /dev/null
+++ b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeCache.txt
@@ -0,0 +1,313 @@
+# This is the CMakeCache file.
+# For build in directory: /home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build
+# It was generated by CMake: /usr/bin/cmake
+# You can edit this file to change values found and used by cmake.
+# If you do not want to change any of the values, simply exit the editor.
+# If you do want to change a value, simply edit, save, and exit the editor.
+# The syntax for the file is as follows:
+# KEY:TYPE=VALUE
+# KEY is the name of a variable in the cache.
+# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!.
+# VALUE is the current value for the KEY.
+
+########################
+# EXTERNAL cache entries
+########################
+
+//Path to a program.
+CMAKE_AR:FILEPATH=/usr/bin/ar
+
+//Choose the type of build, options are: None(CMAKE_CXX_FLAGS or
+// CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel.
+CMAKE_BUILD_TYPE:STRING=
+
+//Enable/Disable color output during build.
+CMAKE_COLOR_MAKEFILE:BOOL=ON
+
+//CXX compiler.
+CMAKE_CXX_COMPILER:FILEPATH=/usr/bin/c++
+
+//Flags used by the compiler during all build types.
+CMAKE_CXX_FLAGS:STRING=
+
+//Flags used by the compiler during debug builds.
+CMAKE_CXX_FLAGS_DEBUG:STRING=-g
+
+//Flags used by the compiler during release minsize builds.
+CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG
+
+//Flags used by the compiler during release builds (/MD /Ob1 /Oi
+// /Ot /Oy /Gs will produce slightly less optimized but smaller
+// files).
+CMAKE_CXX_FLAGS_RELEASE:STRING=-O3 -DNDEBUG
+
+//Flags used by the compiler during Release with Debug Info builds.
+CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG
+
+//C compiler.
+CMAKE_C_COMPILER:FILEPATH=/usr/bin/cc
+
+//Flags used by the compiler during all build types.
+CMAKE_C_FLAGS:STRING=
+
+//Flags used by the compiler during debug builds.
+CMAKE_C_FLAGS_DEBUG:STRING=-g
+
+//Flags used by the compiler during release minsize builds.
+CMAKE_C_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG
+
+//Flags used by the compiler during release builds (/MD /Ob1 /Oi
+// /Ot /Oy /Gs will produce slightly less optimized but smaller
+// files).
+CMAKE_C_FLAGS_RELEASE:STRING=-O3 -DNDEBUG
+
+//Flags used by the compiler during Release with Debug Info builds.
+CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG
+
+//Flags used by the linker.
+CMAKE_EXE_LINKER_FLAGS:STRING=' '
+
+//Flags used by the linker during debug builds.
+CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING=
+
+//Flags used by the linker during release minsize builds.
+CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING=
+
+//Flags used by the linker during release builds.
+CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING=
+
+//Flags used by the linker during Release with Debug Info builds.
+CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING=
+
+//Enable/Disable output of compile commands during generation.
+CMAKE_EXPORT_COMPILE_COMMANDS:BOOL=OFF
+
+//Install path prefix, prepended onto install directories.
+CMAKE_INSTALL_PREFIX:PATH=/usr/local
+
+//Path to a program.
+CMAKE_LINKER:FILEPATH=/usr/bin/ld
+
+//Path to a program.
+CMAKE_MAKE_PROGRAM:FILEPATH=/usr/bin/gmake
+
+//Flags used by the linker during the creation of modules.
+CMAKE_MODULE_LINKER_FLAGS:STRING=' '
+
+//Flags used by the linker during debug builds.
+CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING=
+
+//Flags used by the linker during release minsize builds.
+CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING=
+
+//Flags used by the linker during release builds.
+CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING=
+
+//Flags used by the linker during Release with Debug Info builds.
+CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING=
+
+//Path to a program.
+CMAKE_NM:FILEPATH=/usr/bin/nm
+
+//Path to a program.
+CMAKE_OBJCOPY:FILEPATH=/usr/bin/objcopy
+
+//Path to a program.
+CMAKE_OBJDUMP:FILEPATH=/usr/bin/objdump
+
+//Value Computed by CMake
+CMAKE_PROJECT_NAME:STATIC=Project
+
+//Path to a program.
+CMAKE_RANLIB:FILEPATH=/usr/bin/ranlib
+
+//Flags used by the linker during the creation of dll's.
+CMAKE_SHARED_LINKER_FLAGS:STRING=' '
+
+//Flags used by the linker during debug builds.
+CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING=
+
+//Flags used by the linker during release minsize builds.
+CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING=
+
+//Flags used by the linker during release builds.
+CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING=
+
+//Flags used by the linker during Release with Debug Info builds.
+CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING=
+
+//If set, runtime paths are not added when installing shared libraries,
+// but are added when building.
+CMAKE_SKIP_INSTALL_RPATH:BOOL=NO
+
+//If set, runtime paths are not added when using shared libraries.
+CMAKE_SKIP_RPATH:BOOL=NO
+
+//Flags used by the linker during the creation of static libraries.
+CMAKE_STATIC_LINKER_FLAGS:STRING=
+
+//Flags used by the linker during debug builds.
+CMAKE_STATIC_LINKER_FLAGS_DEBUG:STRING=
+
+//Flags used by the linker during release minsize builds.
+CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL:STRING=
+
+//Flags used by the linker during release builds.
+CMAKE_STATIC_LINKER_FLAGS_RELEASE:STRING=
+
+//Flags used by the linker during Release with Debug Info builds.
+CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO:STRING=
+
+//Path to a program.
+CMAKE_STRIP:FILEPATH=/usr/bin/strip
+
+//If true, cmake will use relative paths in makefiles and projects.
+CMAKE_USE_RELATIVE_PATHS:BOOL=OFF
+
+//If this value is on, makefiles will be generated without the
+// .SILENT directive, and all commands will be echoed to the console
+// during the make.  This is useful for debugging only. With Visual
+// Studio IDE projects all commands are done without /nologo.
+CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE
+
+//Value Computed by CMake
+Project_BINARY_DIR:STATIC=/home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build
+
+//Value Computed by CMake
+Project_SOURCE_DIR:STATIC=/home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build
+
+
+########################
+# INTERNAL cache entries
+########################
+
+//ADVANCED property for variable: CMAKE_AR
+CMAKE_AR-ADVANCED:INTERNAL=1
+//ADVANCED property for variable: CMAKE_BUILD_TOOL
+CMAKE_BUILD_TOOL-ADVANCED:INTERNAL=1
+//What is the target build tool cmake is generating for.
+CMAKE_BUILD_TOOL:INTERNAL=/usr/bin/gmake
+//This is the directory where this CMakeCache.txt was created
+CMAKE_CACHEFILE_DIR:INTERNAL=/home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build
+//Major version of cmake used to create the current loaded cache
+CMAKE_CACHE_MAJOR_VERSION:INTERNAL=2
+//Minor version of cmake used to create the current loaded cache
+CMAKE_CACHE_MINOR_VERSION:INTERNAL=8
+//Patch version of cmake used to create the current loaded cache
+CMAKE_CACHE_PATCH_VERSION:INTERNAL=12
+//ADVANCED property for variable: CMAKE_COLOR_MAKEFILE
+CMAKE_COLOR_MAKEFILE-ADVANCED:INTERNAL=1
+//Path to CMake executable.
+CMAKE_COMMAND:INTERNAL=/usr/bin/cmake
+//Path to cpack program executable.
+CMAKE_CPACK_COMMAND:INTERNAL=/usr/bin/cpack
+//Path to ctest program executable.
+CMAKE_CTEST_COMMAND:INTERNAL=/usr/bin/ctest
+//ADVANCED property for variable: CMAKE_CXX_COMPILER
+CMAKE_CXX_COMPILER-ADVANCED:INTERNAL=1
+//ADVANCED property for variable: CMAKE_CXX_FLAGS
+CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=1
+//ADVANCED property for variable: CMAKE_CXX_FLAGS_DEBUG
+CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=1
+//ADVANCED property for variable: CMAKE_CXX_FLAGS_MINSIZEREL
+CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1
+//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELEASE
+CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=1
+//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELWITHDEBINFO
+CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1
+//ADVANCED property for variable: CMAKE_C_COMPILER
+CMAKE_C_COMPILER-ADVANCED:INTERNAL=1
+//ADVANCED property for variable: CMAKE_C_FLAGS
+CMAKE_C_FLAGS-ADVANCED:INTERNAL=1
+//ADVANCED property for variable: CMAKE_C_FLAGS_DEBUG
+CMAKE_C_FLAGS_DEBUG-ADVANCED:INTERNAL=1
+//ADVANCED property for variable: CMAKE_C_FLAGS_MINSIZEREL
+CMAKE_C_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1
+//ADVANCED property for variable: CMAKE_C_FLAGS_RELEASE
+CMAKE_C_FLAGS_RELEASE-ADVANCED:INTERNAL=1
+//ADVANCED property for variable: CMAKE_C_FLAGS_RELWITHDEBINFO
+CMAKE_C_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1
+//Path to cache edit program executable.
+CMAKE_EDIT_COMMAND:INTERNAL=/usr/bin/ccmake
+//Executable file format
+CMAKE_EXECUTABLE_FORMAT:INTERNAL=ELF
+//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS
+CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1
+//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG
+CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1
+//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL
+CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1
+//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE
+CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1
+//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO
+CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1
+//ADVANCED property for variable: CMAKE_EXPORT_COMPILE_COMMANDS
+CMAKE_EXPORT_COMPILE_COMMANDS-ADVANCED:INTERNAL=1
+//Name of generator.
+CMAKE_GENERATOR:INTERNAL=Unix Makefiles
+//Name of generator toolset.
+CMAKE_GENERATOR_TOOLSET:INTERNAL=
+//Start directory with the top level CMakeLists.txt file for this
+// project
+CMAKE_HOME_DIRECTORY:INTERNAL=/home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build
+//Install .so files without execute permission.
+CMAKE_INSTALL_SO_NO_EXE:INTERNAL=0
+//ADVANCED property for variable: CMAKE_LINKER
+CMAKE_LINKER-ADVANCED:INTERNAL=1
+//ADVANCED property for variable: CMAKE_MAKE_PROGRAM
+CMAKE_MAKE_PROGRAM-ADVANCED:INTERNAL=1
+//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS
+CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1
+//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG
+CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1
+//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL
+CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1
+//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE
+CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1
+//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO
+CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1
+//ADVANCED property for variable: CMAKE_NM
+CMAKE_NM-ADVANCED:INTERNAL=1
+//number of local generators
+CMAKE_NUMBER_OF_LOCAL_GENERATORS:INTERNAL=1
+//ADVANCED property for variable: CMAKE_OBJCOPY
+CMAKE_OBJCOPY-ADVANCED:INTERNAL=1
+//ADVANCED property for variable: CMAKE_OBJDUMP
+CMAKE_OBJDUMP-ADVANCED:INTERNAL=1
+//ADVANCED property for variable: CMAKE_RANLIB
+CMAKE_RANLIB-ADVANCED:INTERNAL=1
+//Path to CMake installation.
+CMAKE_ROOT:INTERNAL=/usr/share/cmake
+//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS
+CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1
+//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG
+CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1
+//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL
+CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1
+//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE
+CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1
+//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO
+CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1
+//ADVANCED property for variable: CMAKE_SKIP_INSTALL_RPATH
+CMAKE_SKIP_INSTALL_RPATH-ADVANCED:INTERNAL=1
+//ADVANCED property for variable: CMAKE_SKIP_RPATH
+CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1
+//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS
+CMAKE_STATIC_LINKER_FLAGS-ADVANCED:INTERNAL=1
+//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_DEBUG
+CMAKE_STATIC_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1
+//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL
+CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1
+//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELEASE
+CMAKE_STATIC_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1
+//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO
+CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1
+//ADVANCED property for variable: CMAKE_STRIP
+CMAKE_STRIP-ADVANCED:INTERNAL=1
+//uname command
+CMAKE_UNAME:INTERNAL=/usr/bin/uname
+//ADVANCED property for variable: CMAKE_USE_RELATIVE_PATHS
+CMAKE_USE_RELATIVE_PATHS-ADVANCED:INTERNAL=1
+//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE
+CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1
+
diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CMakeCCompiler.cmake b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CMakeCCompiler.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..20619f82ead880156a51351cca69ed411e21b57b
--- /dev/null
+++ b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CMakeCCompiler.cmake
@@ -0,0 +1,56 @@
+set(CMAKE_C_COMPILER "/usr/bin/cc")
+set(CMAKE_C_COMPILER_ARG1 "")
+set(CMAKE_C_COMPILER_ID "GNU")
+set(CMAKE_C_COMPILER_VERSION "4.8.5")
+set(CMAKE_C_PLATFORM_ID "Linux")
+
+set(CMAKE_AR "/usr/bin/ar")
+set(CMAKE_RANLIB "/usr/bin/ranlib")
+set(CMAKE_LINKER "/usr/bin/ld")
+set(CMAKE_COMPILER_IS_GNUCC 1)
+set(CMAKE_C_COMPILER_LOADED 1)
+set(CMAKE_C_COMPILER_WORKS TRUE)
+set(CMAKE_C_ABI_COMPILED TRUE)
+set(CMAKE_COMPILER_IS_MINGW )
+set(CMAKE_COMPILER_IS_CYGWIN )
+if(CMAKE_COMPILER_IS_CYGWIN)
+  set(CYGWIN 1)
+  set(UNIX 1)
+endif()
+
+set(CMAKE_C_COMPILER_ENV_VAR "CC")
+
+if(CMAKE_COMPILER_IS_MINGW)
+  set(MINGW 1)
+endif()
+set(CMAKE_C_COMPILER_ID_RUN 1)
+set(CMAKE_C_SOURCE_FILE_EXTENSIONS c)
+set(CMAKE_C_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC)
+set(CMAKE_C_LINKER_PREFERENCE 10)
+
+# Save compiler ABI information.
+set(CMAKE_C_SIZEOF_DATA_PTR "8")
+set(CMAKE_C_COMPILER_ABI "ELF")
+set(CMAKE_C_LIBRARY_ARCHITECTURE "")
+
+if(CMAKE_C_SIZEOF_DATA_PTR)
+  set(CMAKE_SIZEOF_VOID_P "${CMAKE_C_SIZEOF_DATA_PTR}")
+endif()
+
+if(CMAKE_C_COMPILER_ABI)
+  set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_C_COMPILER_ABI}")
+endif()
+
+if(CMAKE_C_LIBRARY_ARCHITECTURE)
+  set(CMAKE_LIBRARY_ARCHITECTURE "")
+endif()
+
+
+
+
+set(CMAKE_C_IMPLICIT_LINK_LIBRARIES "c")
+set(CMAKE_C_IMPLICIT_LINK_DIRECTORIES "/usr/lib/gcc/x86_64-redhat-linux/4.8.5;/usr/lib64;/lib64;/usr/lib")
+set(CMAKE_C_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "")
+
+
+
diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CMakeCXXCompiler.cmake b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CMakeCXXCompiler.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..5ae76367c4046fb5d18baa152cf5b8c29e39f2e2
--- /dev/null
+++ b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CMakeCXXCompiler.cmake
@@ -0,0 +1,57 @@
+set(CMAKE_CXX_COMPILER "/usr/bin/c++")
+set(CMAKE_CXX_COMPILER_ARG1 "")
+set(CMAKE_CXX_COMPILER_ID "GNU")
+set(CMAKE_CXX_COMPILER_VERSION "4.8.5")
+set(CMAKE_CXX_PLATFORM_ID "Linux")
+
+set(CMAKE_AR "/usr/bin/ar")
+set(CMAKE_RANLIB "/usr/bin/ranlib")
+set(CMAKE_LINKER "/usr/bin/ld")
+set(CMAKE_COMPILER_IS_GNUCXX 1)
+set(CMAKE_CXX_COMPILER_LOADED 1)
+set(CMAKE_CXX_COMPILER_WORKS TRUE)
+set(CMAKE_CXX_ABI_COMPILED TRUE)
+set(CMAKE_COMPILER_IS_MINGW )
+set(CMAKE_COMPILER_IS_CYGWIN )
+if(CMAKE_COMPILER_IS_CYGWIN)
+  set(CYGWIN 1)
+  set(UNIX 1)
+endif()
+
+set(CMAKE_CXX_COMPILER_ENV_VAR "CXX")
+
+if(CMAKE_COMPILER_IS_MINGW)
+  set(MINGW 1)
+endif()
+set(CMAKE_CXX_COMPILER_ID_RUN 1)
+set(CMAKE_CXX_IGNORE_EXTENSIONS inl;h;hpp;HPP;H;o;O;obj;OBJ;def;DEF;rc;RC)
+set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;m;mm;CPP)
+set(CMAKE_CXX_LINKER_PREFERENCE 30)
+set(CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES 1)
+
+# Save compiler ABI information.
+set(CMAKE_CXX_SIZEOF_DATA_PTR "8")
+set(CMAKE_CXX_COMPILER_ABI "ELF")
+set(CMAKE_CXX_LIBRARY_ARCHITECTURE "")
+
+if(CMAKE_CXX_SIZEOF_DATA_PTR)
+  set(CMAKE_SIZEOF_VOID_P "${CMAKE_CXX_SIZEOF_DATA_PTR}")
+endif()
+
+if(CMAKE_CXX_COMPILER_ABI)
+  set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_CXX_COMPILER_ABI}")
+endif()
+
+if(CMAKE_CXX_LIBRARY_ARCHITECTURE)
+  set(CMAKE_LIBRARY_ARCHITECTURE "")
+endif()
+
+
+
+
+set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "stdc++;m;c")
+set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "/usr/lib/gcc/x86_64-redhat-linux/4.8.5;/usr/lib64;/lib64;/usr/lib")
+set(CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "")
+
+
+
diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CMakeDetermineCompilerABI_C.bin b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CMakeDetermineCompilerABI_C.bin
new file mode 100755
index 0000000000000000000000000000000000000000..db27e43a893d3972ef50962e2f14ebc0bfcc4215
Binary files /dev/null and b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CMakeDetermineCompilerABI_C.bin differ
diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CMakeDetermineCompilerABI_CXX.bin b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CMakeDetermineCompilerABI_CXX.bin
new file mode 100755
index 0000000000000000000000000000000000000000..edbf852aaf9f3b4dd83d1265da0c8264729e0437
Binary files /dev/null and b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CMakeDetermineCompilerABI_CXX.bin differ
diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CMakeSystem.cmake b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CMakeSystem.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..3980da44fcc0f451de31e72d6465ee5d67d4fdf9
--- /dev/null
+++ b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CMakeSystem.cmake
@@ -0,0 +1,15 @@
+set(CMAKE_HOST_SYSTEM "Linux-3.10.0-957.21.3.rt56.935.el7.x86_64")
+set(CMAKE_HOST_SYSTEM_NAME "Linux")
+set(CMAKE_HOST_SYSTEM_VERSION "3.10.0-957.21.3.rt56.935.el7.x86_64")
+set(CMAKE_HOST_SYSTEM_PROCESSOR "x86_64")
+
+
+
+set(CMAKE_SYSTEM "Linux-3.10.0-957.21.3.rt56.935.el7.x86_64")
+set(CMAKE_SYSTEM_NAME "Linux")
+set(CMAKE_SYSTEM_VERSION "3.10.0-957.21.3.rt56.935.el7.x86_64")
+set(CMAKE_SYSTEM_PROCESSOR "x86_64")
+
+set(CMAKE_CROSSCOMPILING "FALSE")
+
+set(CMAKE_SYSTEM_LOADED 1)
diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CompilerIdC/CMakeCCompilerId.c b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CompilerIdC/CMakeCCompilerId.c
new file mode 100644
index 0000000000000000000000000000000000000000..cba81d4a6b5cc36ccdf8b4548036436087b6da7d
--- /dev/null
+++ b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CompilerIdC/CMakeCCompilerId.c
@@ -0,0 +1,389 @@
+#ifdef __cplusplus
+# error "A C++ compiler has been selected for C."
+#endif
+
+/* Version number components: V=Version, R=Revision, P=Patch
+   Version date components:   YYYY=Year, MM=Month,   DD=Day  */
+
+#if defined(__18CXX)
+# define ID_VOID_MAIN
+#endif
+
+#if defined(__INTEL_COMPILER) || defined(__ICC)
+# define COMPILER_ID "Intel"
+  /* __INTEL_COMPILER = VRP */
+# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100)
+# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10)
+# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER    % 10)
+# if defined(__INTEL_COMPILER_BUILD_DATE)
+  /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */
+#  define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE)
+# endif
+
+#elif defined(__PATHCC__)
+# define COMPILER_ID "PathScale"
+# define COMPILER_VERSION_MAJOR DEC(__PATHCC__)
+# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__)
+# if defined(__PATHCC_PATCHLEVEL__)
+#  define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__)
+# endif
+
+#elif defined(__clang__)
+# define COMPILER_ID "Clang"
+# define COMPILER_VERSION_MAJOR DEC(__clang_major__)
+# define COMPILER_VERSION_MINOR DEC(__clang_minor__)
+# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__)
+
+#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__)
+# define COMPILER_ID "Embarcadero"
+# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF)
+# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF)
+# define COMPILER_VERSION_PATCH HEX(__CODEGEARC_VERSION__     & 0xFFFF)
+
+#elif defined(__BORLANDC__)
+# define COMPILER_ID "Borland"
+  /* __BORLANDC__ = 0xVRR */
+# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8)
+# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF)
+
+#elif defined(__WATCOMC__)
+# define COMPILER_ID "Watcom"
+  /* __WATCOMC__ = VVRR */
+# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100)
+# define COMPILER_VERSION_MINOR DEC(__WATCOMC__ % 100)
+
+#elif defined(__SUNPRO_C)
+# define COMPILER_ID "SunPro"
+# if __SUNPRO_C >= 0x5100
+   /* __SUNPRO_C = 0xVRRP */
+#  define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12)
+#  define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF)
+#  define COMPILER_VERSION_PATCH HEX(__SUNPRO_C    & 0xF)
+# else
+   /* __SUNPRO_C = 0xVRP */
+#  define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8)
+#  define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF)
+#  define COMPILER_VERSION_PATCH HEX(__SUNPRO_C    & 0xF)
+# endif
+
+#elif defined(__HP_cc)
+# define COMPILER_ID "HP"
+  /* __HP_cc = VVRRPP */
+# define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000)
+# define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100)
+# define COMPILER_VERSION_PATCH DEC(__HP_cc     % 100)
+
+#elif defined(__DECC)
+# define COMPILER_ID "Compaq"
+  /* __DECC_VER = VVRRTPPPP */
+# define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000)
+# define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000  % 100)
+# define COMPILER_VERSION_PATCH DEC(__DECC_VER         % 10000)
+
+#elif defined(__IBMC__)
+# if defined(__COMPILER_VER__)
+#  define COMPILER_ID "zOS"
+# else
+#  if __IBMC__ >= 800
+#   define COMPILER_ID "XL"
+#  else
+#   define COMPILER_ID "VisualAge"
+#  endif
+   /* __IBMC__ = VRP */
+#  define COMPILER_VERSION_MAJOR DEC(__IBMC__/100)
+#  define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10)
+#  define COMPILER_VERSION_PATCH DEC(__IBMC__    % 10)
+# endif
+
+#elif defined(__PGI)
+# define COMPILER_ID "PGI"
+# define COMPILER_VERSION_MAJOR DEC(__PGIC__)
+# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__)
+# if defined(__PGIC_PATCHLEVEL__)
+#  define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__)
+# endif
+
+#elif defined(_CRAYC)
+# define COMPILER_ID "Cray"
+# define COMPILER_VERSION_MAJOR DEC(_RELEASE)
+# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR)
+
+#elif defined(__TI_COMPILER_VERSION__)
+# define COMPILER_ID "TI"
+  /* __TI_COMPILER_VERSION__ = VVVRRRPPP */
+# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000)
+# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000   % 1000)
+# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__        % 1000)
+
+#elif defined(__TINYC__)
+# define COMPILER_ID "TinyCC"
+
+#elif defined(__SCO_VERSION__)
+# define COMPILER_ID "SCO"
+
+#elif defined(__GNUC__)
+# define COMPILER_ID "GNU"
+# define COMPILER_VERSION_MAJOR DEC(__GNUC__)
+# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__)
+# if defined(__GNUC_PATCHLEVEL__)
+#  define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__)
+# endif
+
+#elif defined(_MSC_VER)
+# define COMPILER_ID "MSVC"
+  /* _MSC_VER = VVRR */
+# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100)
+# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100)
+# if defined(_MSC_FULL_VER)
+#  if _MSC_VER >= 1400
+    /* _MSC_FULL_VER = VVRRPPPPP */
+#   define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000)
+#  else
+    /* _MSC_FULL_VER = VVRRPPPP */
+#   define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000)
+#  endif
+# endif
+# if defined(_MSC_BUILD)
+#  define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD)
+# endif
+
+/* Analog VisualDSP++ >= 4.5.6 */
+#elif defined(__VISUALDSPVERSION__)
+# define COMPILER_ID "ADSP"
+  /* __VISUALDSPVERSION__ = 0xVVRRPP00 */
+# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24)
+# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF)
+# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8  & 0xFF)
+
+/* Analog VisualDSP++ < 4.5.6 */
+#elif defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__)
+# define COMPILER_ID "ADSP"
+
+/* IAR Systems compiler for embedded systems.
+   http://www.iar.com */
+#elif defined(__IAR_SYSTEMS_ICC__ ) || defined(__IAR_SYSTEMS_ICC)
+# define COMPILER_ID "IAR"
+
+/* sdcc, the small devices C compiler for embedded systems,
+   http://sdcc.sourceforge.net  */
+#elif defined(SDCC)
+# define COMPILER_ID "SDCC"
+  /* SDCC = VRP */
+#  define COMPILER_VERSION_MAJOR DEC(SDCC/100)
+#  define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10)
+#  define COMPILER_VERSION_PATCH DEC(SDCC    % 10)
+
+#elif defined(_SGI_COMPILER_VERSION) || defined(_COMPILER_VERSION)
+# define COMPILER_ID "MIPSpro"
+# if defined(_SGI_COMPILER_VERSION)
+  /* _SGI_COMPILER_VERSION = VRP */
+#  define COMPILER_VERSION_MAJOR DEC(_SGI_COMPILER_VERSION/100)
+#  define COMPILER_VERSION_MINOR DEC(_SGI_COMPILER_VERSION/10 % 10)
+#  define COMPILER_VERSION_PATCH DEC(_SGI_COMPILER_VERSION    % 10)
+# else
+  /* _COMPILER_VERSION = VRP */
+#  define COMPILER_VERSION_MAJOR DEC(_COMPILER_VERSION/100)
+#  define COMPILER_VERSION_MINOR DEC(_COMPILER_VERSION/10 % 10)
+#  define COMPILER_VERSION_PATCH DEC(_COMPILER_VERSION    % 10)
+# endif
+
+/* This compiler is either not known or is too old to define an
+   identification macro.  Try to identify the platform and guess that
+   it is the native compiler.  */
+#elif defined(__sgi)
+# define COMPILER_ID "MIPSpro"
+
+#elif defined(__hpux) || defined(__hpua)
+# define COMPILER_ID "HP"
+
+#else /* unknown compiler */
+# define COMPILER_ID ""
+
+#endif
+
+/* Construct the string literal in pieces to prevent the source from
+   getting matched.  Store it in a pointer rather than an array
+   because some compilers will just produce instructions to fill the
+   array rather than assigning a pointer to a static array.  */
+char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]";
+
+/* Identify known platforms by name.  */
+#if defined(__linux) || defined(__linux__) || defined(linux)
+# define PLATFORM_ID "Linux"
+
+#elif defined(__CYGWIN__)
+# define PLATFORM_ID "Cygwin"
+
+#elif defined(__MINGW32__)
+# define PLATFORM_ID "MinGW"
+
+#elif defined(__APPLE__)
+# define PLATFORM_ID "Darwin"
+
+#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32)
+# define PLATFORM_ID "Windows"
+
+#elif defined(__FreeBSD__) || defined(__FreeBSD)
+# define PLATFORM_ID "FreeBSD"
+
+#elif defined(__NetBSD__) || defined(__NetBSD)
+# define PLATFORM_ID "NetBSD"
+
+#elif defined(__OpenBSD__) || defined(__OPENBSD)
+# define PLATFORM_ID "OpenBSD"
+
+#elif defined(__sun) || defined(sun)
+# define PLATFORM_ID "SunOS"
+
+#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__)
+# define PLATFORM_ID "AIX"
+
+#elif defined(__sgi) || defined(__sgi__) || defined(_SGI)
+# define PLATFORM_ID "IRIX"
+
+#elif defined(__hpux) || defined(__hpux__)
+# define PLATFORM_ID "HP-UX"
+
+#elif defined(__HAIKU__)
+# define PLATFORM_ID "Haiku"
+
+#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS)
+# define PLATFORM_ID "BeOS"
+
+#elif defined(__QNX__) || defined(__QNXNTO__)
+# define PLATFORM_ID "QNX"
+
+#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__)
+# define PLATFORM_ID "Tru64"
+
+#elif defined(__riscos) || defined(__riscos__)
+# define PLATFORM_ID "RISCos"
+
+#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__)
+# define PLATFORM_ID "SINIX"
+
+#elif defined(__UNIX_SV__)
+# define PLATFORM_ID "UNIX_SV"
+
+#elif defined(__bsdos__)
+# define PLATFORM_ID "BSDOS"
+
+#elif defined(_MPRAS) || defined(MPRAS)
+# define PLATFORM_ID "MP-RAS"
+
+#elif defined(__osf) || defined(__osf__)
+# define PLATFORM_ID "OSF1"
+
+#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv)
+# define PLATFORM_ID "SCO_SV"
+
+#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX)
+# define PLATFORM_ID "ULTRIX"
+
+#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX)
+# define PLATFORM_ID "Xenix"
+
+#else /* unknown platform */
+# define PLATFORM_ID ""
+
+#endif
+
+/* For windows compilers MSVC and Intel we can determine
+   the architecture of the compiler being used.  This is because
+   the compilers do not have flags that can change the architecture,
+   but rather depend on which compiler is being used
+*/
+#if defined(_WIN32) && defined(_MSC_VER)
+# if defined(_M_IA64)
+#  define ARCHITECTURE_ID "IA64"
+
+# elif defined(_M_X64) || defined(_M_AMD64)
+#  define ARCHITECTURE_ID "x64"
+
+# elif defined(_M_IX86)
+#  define ARCHITECTURE_ID "X86"
+
+# elif defined(_M_ARM)
+#  define ARCHITECTURE_ID "ARM"
+
+# elif defined(_M_MIPS)
+#  define ARCHITECTURE_ID "MIPS"
+
+# elif defined(_M_SH)
+#  define ARCHITECTURE_ID "SHx"
+
+# else /* unknown architecture */
+#  define ARCHITECTURE_ID ""
+# endif
+
+#else
+#  define ARCHITECTURE_ID ""
+#endif
+
+/* Convert integer to decimal digit literals.  */
+#define DEC(n)                   \
+  ('0' + (((n) / 10000000)%10)), \
+  ('0' + (((n) / 1000000)%10)),  \
+  ('0' + (((n) / 100000)%10)),   \
+  ('0' + (((n) / 10000)%10)),    \
+  ('0' + (((n) / 1000)%10)),     \
+  ('0' + (((n) / 100)%10)),      \
+  ('0' + (((n) / 10)%10)),       \
+  ('0' +  ((n) % 10))
+
+/* Convert integer to hex digit literals.  */
+#define HEX(n)             \
+  ('0' + ((n)>>28 & 0xF)), \
+  ('0' + ((n)>>24 & 0xF)), \
+  ('0' + ((n)>>20 & 0xF)), \
+  ('0' + ((n)>>16 & 0xF)), \
+  ('0' + ((n)>>12 & 0xF)), \
+  ('0' + ((n)>>8  & 0xF)), \
+  ('0' + ((n)>>4  & 0xF)), \
+  ('0' + ((n)     & 0xF))
+
+/* Construct a string literal encoding the version number components. */
+#ifdef COMPILER_VERSION_MAJOR
+char const info_version[] = {
+  'I', 'N', 'F', 'O', ':',
+  'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[',
+  COMPILER_VERSION_MAJOR,
+# ifdef COMPILER_VERSION_MINOR
+  '.', COMPILER_VERSION_MINOR,
+#  ifdef COMPILER_VERSION_PATCH
+   '.', COMPILER_VERSION_PATCH,
+#   ifdef COMPILER_VERSION_TWEAK
+    '.', COMPILER_VERSION_TWEAK,
+#   endif
+#  endif
+# endif
+  ']','\0'};
+#endif
+
+/* Construct the string literal in pieces to prevent the source from
+   getting matched.  Store it in a pointer rather than an array
+   because some compilers will just produce instructions to fill the
+   array rather than assigning a pointer to a static array.  */
+char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]";
+char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]";
+
+
+
+/*--------------------------------------------------------------------------*/
+
+#ifdef ID_VOID_MAIN
+void main() {}
+#else
+int main(int argc, char* argv[])
+{
+  int require = 0;
+  require += info_compiler[argc];
+  require += info_platform[argc];
+  require += info_arch[argc];
+#ifdef COMPILER_VERSION_MAJOR
+  require += info_version[argc];
+#endif
+  (void)argv;
+  return require;
+}
+#endif
diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CompilerIdC/a.out b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CompilerIdC/a.out
new file mode 100755
index 0000000000000000000000000000000000000000..a13b3e1e728a1fd34cf225e49ce4edc30866eab3
Binary files /dev/null and b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CompilerIdC/a.out differ
diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CompilerIdCXX/CMakeCXXCompilerId.cpp b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CompilerIdCXX/CMakeCXXCompilerId.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..e8220b26e508ad8289ae53743d2ffa316c17237f
--- /dev/null
+++ b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CompilerIdCXX/CMakeCXXCompilerId.cpp
@@ -0,0 +1,377 @@
+/* This source file must have a .cpp extension so that all C++ compilers
+   recognize the extension without flags.  Borland does not know .cxx for
+   example.  */
+#ifndef __cplusplus
+# error "A C compiler has been selected for C++."
+#endif
+
+/* Version number components: V=Version, R=Revision, P=Patch
+   Version date components:   YYYY=Year, MM=Month,   DD=Day  */
+
+#if defined(__COMO__)
+# define COMPILER_ID "Comeau"
+  /* __COMO_VERSION__ = VRR */
+# define COMPILER_VERSION_MAJOR DEC(__COMO_VERSION__ / 100)
+# define COMPILER_VERSION_MINOR DEC(__COMO_VERSION__ % 100)
+
+#elif defined(__INTEL_COMPILER) || defined(__ICC)
+# define COMPILER_ID "Intel"
+  /* __INTEL_COMPILER = VRP */
+# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100)
+# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10)
+# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER    % 10)
+# if defined(__INTEL_COMPILER_BUILD_DATE)
+  /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */
+#  define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE)
+# endif
+
+#elif defined(__PATHCC__)
+# define COMPILER_ID "PathScale"
+# define COMPILER_VERSION_MAJOR DEC(__PATHCC__)
+# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__)
+# if defined(__PATHCC_PATCHLEVEL__)
+#  define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__)
+# endif
+
+#elif defined(__clang__)
+# define COMPILER_ID "Clang"
+# define COMPILER_VERSION_MAJOR DEC(__clang_major__)
+# define COMPILER_VERSION_MINOR DEC(__clang_minor__)
+# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__)
+
+#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__)
+# define COMPILER_ID "Embarcadero"
+# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF)
+# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF)
+# define COMPILER_VERSION_PATCH HEX(__CODEGEARC_VERSION__     & 0xFFFF)
+
+#elif defined(__BORLANDC__)
+# define COMPILER_ID "Borland"
+  /* __BORLANDC__ = 0xVRR */
+# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8)
+# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF)
+
+#elif defined(__WATCOMC__)
+# define COMPILER_ID "Watcom"
+  /* __WATCOMC__ = VVRR */
+# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100)
+# define COMPILER_VERSION_MINOR DEC(__WATCOMC__ % 100)
+
+#elif defined(__SUNPRO_CC)
+# define COMPILER_ID "SunPro"
+# if __SUNPRO_CC >= 0x5100
+   /* __SUNPRO_CC = 0xVRRP */
+#  define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12)
+#  define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF)
+#  define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC    & 0xF)
+# else
+   /* __SUNPRO_CC = 0xVRP */
+#  define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8)
+#  define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF)
+#  define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC    & 0xF)
+# endif
+
+#elif defined(__HP_aCC)
+# define COMPILER_ID "HP"
+  /* __HP_aCC = VVRRPP */
+# define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000)
+# define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100)
+# define COMPILER_VERSION_PATCH DEC(__HP_aCC     % 100)
+
+#elif defined(__DECCXX)
+# define COMPILER_ID "Compaq"
+  /* __DECCXX_VER = VVRRTPPPP */
+# define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000)
+# define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000  % 100)
+# define COMPILER_VERSION_PATCH DEC(__DECCXX_VER         % 10000)
+
+#elif defined(__IBMCPP__)
+# if defined(__COMPILER_VER__)
+#  define COMPILER_ID "zOS"
+# else
+#  if __IBMCPP__ >= 800
+#   define COMPILER_ID "XL"
+#  else
+#   define COMPILER_ID "VisualAge"
+#  endif
+   /* __IBMCPP__ = VRP */
+#  define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100)
+#  define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10)
+#  define COMPILER_VERSION_PATCH DEC(__IBMCPP__    % 10)
+# endif
+
+#elif defined(__PGI)
+# define COMPILER_ID "PGI"
+# define COMPILER_VERSION_MAJOR DEC(__PGIC__)
+# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__)
+# if defined(__PGIC_PATCHLEVEL__)
+#  define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__)
+# endif
+
+#elif defined(_CRAYC)
+# define COMPILER_ID "Cray"
+# define COMPILER_VERSION_MAJOR DEC(_RELEASE)
+# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR)
+
+#elif defined(__TI_COMPILER_VERSION__)
+# define COMPILER_ID "TI"
+  /* __TI_COMPILER_VERSION__ = VVVRRRPPP */
+# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000)
+# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000   % 1000)
+# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__        % 1000)
+
+#elif defined(__SCO_VERSION__)
+# define COMPILER_ID "SCO"
+
+#elif defined(__GNUC__)
+# define COMPILER_ID "GNU"
+# define COMPILER_VERSION_MAJOR DEC(__GNUC__)
+# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__)
+# if defined(__GNUC_PATCHLEVEL__)
+#  define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__)
+# endif
+
+#elif defined(_MSC_VER)
+# define COMPILER_ID "MSVC"
+  /* _MSC_VER = VVRR */
+# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100)
+# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100)
+# if defined(_MSC_FULL_VER)
+#  if _MSC_VER >= 1400
+    /* _MSC_FULL_VER = VVRRPPPPP */
+#   define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000)
+#  else
+    /* _MSC_FULL_VER = VVRRPPPP */
+#   define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000)
+#  endif
+# endif
+# if defined(_MSC_BUILD)
+#  define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD)
+# endif
+
+/* Analog VisualDSP++ >= 4.5.6 */
+#elif defined(__VISUALDSPVERSION__)
+# define COMPILER_ID "ADSP"
+  /* __VISUALDSPVERSION__ = 0xVVRRPP00 */
+# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24)
+# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF)
+# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8  & 0xFF)
+
+/* Analog VisualDSP++ < 4.5.6 */
+#elif defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__)
+# define COMPILER_ID "ADSP"
+
+/* IAR Systems compiler for embedded systems.
+   http://www.iar.com */
+#elif defined(__IAR_SYSTEMS_ICC__ ) || defined(__IAR_SYSTEMS_ICC)
+# define COMPILER_ID "IAR"
+
+#elif defined(_SGI_COMPILER_VERSION) || defined(_COMPILER_VERSION)
+# define COMPILER_ID "MIPSpro"
+# if defined(_SGI_COMPILER_VERSION)
+  /* _SGI_COMPILER_VERSION = VRP */
+#  define COMPILER_VERSION_MAJOR DEC(_SGI_COMPILER_VERSION/100)
+#  define COMPILER_VERSION_MINOR DEC(_SGI_COMPILER_VERSION/10 % 10)
+#  define COMPILER_VERSION_PATCH DEC(_SGI_COMPILER_VERSION    % 10)
+# else
+  /* _COMPILER_VERSION = VRP */
+#  define COMPILER_VERSION_MAJOR DEC(_COMPILER_VERSION/100)
+#  define COMPILER_VERSION_MINOR DEC(_COMPILER_VERSION/10 % 10)
+#  define COMPILER_VERSION_PATCH DEC(_COMPILER_VERSION    % 10)
+# endif
+
+/* This compiler is either not known or is too old to define an
+   identification macro.  Try to identify the platform and guess that
+   it is the native compiler.  */
+#elif defined(__sgi)
+# define COMPILER_ID "MIPSpro"
+
+#elif defined(__hpux) || defined(__hpua)
+# define COMPILER_ID "HP"
+
+#else /* unknown compiler */
+# define COMPILER_ID ""
+
+#endif
+
+/* Construct the string literal in pieces to prevent the source from
+   getting matched.  Store it in a pointer rather than an array
+   because some compilers will just produce instructions to fill the
+   array rather than assigning a pointer to a static array.  */
+char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]";
+
+/* Identify known platforms by name.  */
+#if defined(__linux) || defined(__linux__) || defined(linux)
+# define PLATFORM_ID "Linux"
+
+#elif defined(__CYGWIN__)
+# define PLATFORM_ID "Cygwin"
+
+#elif defined(__MINGW32__)
+# define PLATFORM_ID "MinGW"
+
+#elif defined(__APPLE__)
+# define PLATFORM_ID "Darwin"
+
+#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32)
+# define PLATFORM_ID "Windows"
+
+#elif defined(__FreeBSD__) || defined(__FreeBSD)
+# define PLATFORM_ID "FreeBSD"
+
+#elif defined(__NetBSD__) || defined(__NetBSD)
+# define PLATFORM_ID "NetBSD"
+
+#elif defined(__OpenBSD__) || defined(__OPENBSD)
+# define PLATFORM_ID "OpenBSD"
+
+#elif defined(__sun) || defined(sun)
+# define PLATFORM_ID "SunOS"
+
+#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__)
+# define PLATFORM_ID "AIX"
+
+#elif defined(__sgi) || defined(__sgi__) || defined(_SGI)
+# define PLATFORM_ID "IRIX"
+
+#elif defined(__hpux) || defined(__hpux__)
+# define PLATFORM_ID "HP-UX"
+
+#elif defined(__HAIKU__)
+# define PLATFORM_ID "Haiku"
+
+#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS)
+# define PLATFORM_ID "BeOS"
+
+#elif defined(__QNX__) || defined(__QNXNTO__)
+# define PLATFORM_ID "QNX"
+
+#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__)
+# define PLATFORM_ID "Tru64"
+
+#elif defined(__riscos) || defined(__riscos__)
+# define PLATFORM_ID "RISCos"
+
+#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__)
+# define PLATFORM_ID "SINIX"
+
+#elif defined(__UNIX_SV__)
+# define PLATFORM_ID "UNIX_SV"
+
+#elif defined(__bsdos__)
+# define PLATFORM_ID "BSDOS"
+
+#elif defined(_MPRAS) || defined(MPRAS)
+# define PLATFORM_ID "MP-RAS"
+
+#elif defined(__osf) || defined(__osf__)
+# define PLATFORM_ID "OSF1"
+
+#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv)
+# define PLATFORM_ID "SCO_SV"
+
+#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX)
+# define PLATFORM_ID "ULTRIX"
+
+#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX)
+# define PLATFORM_ID "Xenix"
+
+#else /* unknown platform */
+# define PLATFORM_ID ""
+
+#endif
+
+/* For windows compilers MSVC and Intel we can determine
+   the architecture of the compiler being used.  This is because
+   the compilers do not have flags that can change the architecture,
+   but rather depend on which compiler is being used
+*/
+#if defined(_WIN32) && defined(_MSC_VER)
+# if defined(_M_IA64)
+#  define ARCHITECTURE_ID "IA64"
+
+# elif defined(_M_X64) || defined(_M_AMD64)
+#  define ARCHITECTURE_ID "x64"
+
+# elif defined(_M_IX86)
+#  define ARCHITECTURE_ID "X86"
+
+# elif defined(_M_ARM)
+#  define ARCHITECTURE_ID "ARM"
+
+# elif defined(_M_MIPS)
+#  define ARCHITECTURE_ID "MIPS"
+
+# elif defined(_M_SH)
+#  define ARCHITECTURE_ID "SHx"
+
+# else /* unknown architecture */
+#  define ARCHITECTURE_ID ""
+# endif
+
+#else
+#  define ARCHITECTURE_ID ""
+#endif
+
+/* Convert integer to decimal digit literals.  */
+#define DEC(n)                   \
+  ('0' + (((n) / 10000000)%10)), \
+  ('0' + (((n) / 1000000)%10)),  \
+  ('0' + (((n) / 100000)%10)),   \
+  ('0' + (((n) / 10000)%10)),    \
+  ('0' + (((n) / 1000)%10)),     \
+  ('0' + (((n) / 100)%10)),      \
+  ('0' + (((n) / 10)%10)),       \
+  ('0' +  ((n) % 10))
+
+/* Convert integer to hex digit literals.  */
+#define HEX(n)             \
+  ('0' + ((n)>>28 & 0xF)), \
+  ('0' + ((n)>>24 & 0xF)), \
+  ('0' + ((n)>>20 & 0xF)), \
+  ('0' + ((n)>>16 & 0xF)), \
+  ('0' + ((n)>>12 & 0xF)), \
+  ('0' + ((n)>>8  & 0xF)), \
+  ('0' + ((n)>>4  & 0xF)), \
+  ('0' + ((n)     & 0xF))
+
+/* Construct a string literal encoding the version number components. */
+#ifdef COMPILER_VERSION_MAJOR
+char const info_version[] = {
+  'I', 'N', 'F', 'O', ':',
+  'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[',
+  COMPILER_VERSION_MAJOR,
+# ifdef COMPILER_VERSION_MINOR
+  '.', COMPILER_VERSION_MINOR,
+#  ifdef COMPILER_VERSION_PATCH
+   '.', COMPILER_VERSION_PATCH,
+#   ifdef COMPILER_VERSION_TWEAK
+    '.', COMPILER_VERSION_TWEAK,
+#   endif
+#  endif
+# endif
+  ']','\0'};
+#endif
+
+/* Construct the string literal in pieces to prevent the source from
+   getting matched.  Store it in a pointer rather than an array
+   because some compilers will just produce instructions to fill the
+   array rather than assigning a pointer to a static array.  */
+char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]";
+char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]";
+
+
+
+/*--------------------------------------------------------------------------*/
+
+int main(int argc, char* argv[])
+{
+  int require = 0;
+  require += info_compiler[argc];
+  require += info_platform[argc];
+#ifdef COMPILER_VERSION_MAJOR
+  require += info_version[argc];
+#endif
+  (void)argv;
+  return require;
+}
diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CompilerIdCXX/a.out b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CompilerIdCXX/a.out
new file mode 100755
index 0000000000000000000000000000000000000000..7634d1e447d96093b8e2714fbd8fb1b7baa34ed5
Binary files /dev/null and b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CompilerIdCXX/a.out differ
diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/CMakeOutput.log b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/CMakeOutput.log
new file mode 100644
index 0000000000000000000000000000000000000000..c922ff62300d2fc9dc097188799c0351b531e3eb
--- /dev/null
+++ b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/CMakeOutput.log
@@ -0,0 +1,247 @@
+The system is: Linux - 3.10.0-957.21.3.rt56.935.el7.x86_64 - x86_64
+Compiling the C compiler identification source file "CMakeCCompilerId.c" succeeded.
+Compiler: /usr/bin/cc 
+Build flags: 
+Id flags: 
+
+The output was:
+0
+
+
+Compilation of the C compiler identification source "CMakeCCompilerId.c" produced "a.out"
+
+The C compiler identification is GNU, found in "/home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CompilerIdC/a.out"
+
+Compiling the CXX compiler identification source file "CMakeCXXCompilerId.cpp" succeeded.
+Compiler: /usr/bin/c++ 
+Build flags: 
+Id flags: 
+
+The output was:
+0
+
+
+Compilation of the CXX compiler identification source "CMakeCXXCompilerId.cpp" produced "a.out"
+
+The CXX compiler identification is GNU, found in "/home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CompilerIdCXX/a.out"
+
+Determining if the C compiler works passed with the following output:
+Change Dir: /home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/CMakeTmp
+
+Run Build Command:/usr/bin/gmake "cmTryCompileExec2388936454/fast"
+/usr/bin/gmake -f CMakeFiles/cmTryCompileExec2388936454.dir/build.make CMakeFiles/cmTryCompileExec2388936454.dir/build
+gmake[1]: Entering directory `/home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/CMakeTmp'
+/usr/bin/cmake -E cmake_progress_report /home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/CMakeTmp/CMakeFiles 1
+Building C object CMakeFiles/cmTryCompileExec2388936454.dir/testCCompiler.c.o
+/usr/bin/cc    -o CMakeFiles/cmTryCompileExec2388936454.dir/testCCompiler.c.o   -c /home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/CMakeTmp/testCCompiler.c
+Linking C executable cmTryCompileExec2388936454
+/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec2388936454.dir/link.txt --verbose=1
+/usr/bin/cc       CMakeFiles/cmTryCompileExec2388936454.dir/testCCompiler.c.o  -o cmTryCompileExec2388936454 -rdynamic 
+gmake[1]: Leaving directory `/home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/CMakeTmp'
+
+
+Detecting C compiler ABI info compiled with the following output:
+Change Dir: /home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/CMakeTmp
+
+Run Build Command:/usr/bin/gmake "cmTryCompileExec602265197/fast"
+/usr/bin/gmake -f CMakeFiles/cmTryCompileExec602265197.dir/build.make CMakeFiles/cmTryCompileExec602265197.dir/build
+gmake[1]: Entering directory `/home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/CMakeTmp'
+/usr/bin/cmake -E cmake_progress_report /home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/CMakeTmp/CMakeFiles 1
+Building C object CMakeFiles/cmTryCompileExec602265197.dir/CMakeCCompilerABI.c.o
+/usr/bin/cc    -o CMakeFiles/cmTryCompileExec602265197.dir/CMakeCCompilerABI.c.o   -c /usr/share/cmake/Modules/CMakeCCompilerABI.c
+Linking C executable cmTryCompileExec602265197
+/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec602265197.dir/link.txt --verbose=1
+/usr/bin/cc     -v CMakeFiles/cmTryCompileExec602265197.dir/CMakeCCompilerABI.c.o  -o cmTryCompileExec602265197 -rdynamic  
+Using built-in specs.
+COLLECT_GCC=/usr/bin/cc
+COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/lto-wrapper
+Target: x86_64-redhat-linux
+Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,go,lto --enable-plugin --enable-initfini-array --disable-libgcj --with-isl=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/cloog-install --enable-gnu-indirect-function --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux
+Thread model: posix
+gcc version 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) 
+COMPILER_PATH=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/:/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/:/usr/libexec/gcc/x86_64-redhat-linux/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/:/usr/lib/gcc/x86_64-redhat-linux/
+LIBRARY_PATH=/usr/lib/gcc/x86_64-redhat-linux/4.8.5/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/:/lib/../lib64/:/usr/lib/../lib64/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../:/lib/:/usr/lib/
+COLLECT_GCC_OPTIONS='-v' '-o' 'cmTryCompileExec602265197' '-rdynamic' '-mtune=generic' '-march=x86-64'
+ /usr/libexec/gcc/x86_64-redhat-linux/4.8.5/collect2 --build-id --no-add-needed --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -export-dynamic -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o cmTryCompileExec602265197 /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crt1.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crti.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtbegin.o -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5 -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../.. CMakeFiles/cmTryCompileExec602265197.dir/CMakeCCompilerABI.c.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtend.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crtn.o
+gmake[1]: Leaving directory `/home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/CMakeTmp'
+
+
+Parsed C implicit link information from above output:
+  link line regex: [^( *|.*[/\])(ld|([^/\]+-)?ld|collect2)[^/\]*( |$)]
+  ignore line: [Change Dir: /home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/CMakeTmp]
+  ignore line: []
+  ignore line: [Run Build Command:/usr/bin/gmake "cmTryCompileExec602265197/fast"]
+  ignore line: [/usr/bin/gmake -f CMakeFiles/cmTryCompileExec602265197.dir/build.make CMakeFiles/cmTryCompileExec602265197.dir/build]
+  ignore line: [gmake[1]: Entering directory `/home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/CMakeTmp']
+  ignore line: [/usr/bin/cmake -E cmake_progress_report /home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/CMakeTmp/CMakeFiles 1]
+  ignore line: [Building C object CMakeFiles/cmTryCompileExec602265197.dir/CMakeCCompilerABI.c.o]
+  ignore line: [/usr/bin/cc    -o CMakeFiles/cmTryCompileExec602265197.dir/CMakeCCompilerABI.c.o   -c /usr/share/cmake/Modules/CMakeCCompilerABI.c]
+  ignore line: [Linking C executable cmTryCompileExec602265197]
+  ignore line: [/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec602265197.dir/link.txt --verbose=1]
+  ignore line: [/usr/bin/cc     -v CMakeFiles/cmTryCompileExec602265197.dir/CMakeCCompilerABI.c.o  -o cmTryCompileExec602265197 -rdynamic  ]
+  ignore line: [Using built-in specs.]
+  ignore line: [COLLECT_GCC=/usr/bin/cc]
+  ignore line: [COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/lto-wrapper]
+  ignore line: [Target: x86_64-redhat-linux]
+  ignore line: [Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,go,lto --enable-plugin --enable-initfini-array --disable-libgcj --with-isl=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/cloog-install --enable-gnu-indirect-function --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux]
+  ignore line: [Thread model: posix]
+  ignore line: [gcc version 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) ]
+  ignore line: [COMPILER_PATH=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/:/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/:/usr/libexec/gcc/x86_64-redhat-linux/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/:/usr/lib/gcc/x86_64-redhat-linux/]
+  ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-redhat-linux/4.8.5/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/:/lib/../lib64/:/usr/lib/../lib64/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../:/lib/:/usr/lib/]
+  ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'cmTryCompileExec602265197' '-rdynamic' '-mtune=generic' '-march=x86-64']
+  link line: [ /usr/libexec/gcc/x86_64-redhat-linux/4.8.5/collect2 --build-id --no-add-needed --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -export-dynamic -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o cmTryCompileExec602265197 /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crt1.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crti.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtbegin.o -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5 -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../.. CMakeFiles/cmTryCompileExec602265197.dir/CMakeCCompilerABI.c.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtend.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crtn.o]
+    arg [/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/collect2] ==> ignore
+    arg [--build-id] ==> ignore
+    arg [--no-add-needed] ==> ignore
+    arg [--eh-frame-hdr] ==> ignore
+    arg [--hash-style=gnu] ==> ignore
+    arg [-m] ==> ignore
+    arg [elf_x86_64] ==> ignore
+    arg [-export-dynamic] ==> ignore
+    arg [-dynamic-linker] ==> ignore
+    arg [/lib64/ld-linux-x86-64.so.2] ==> ignore
+    arg [-o] ==> ignore
+    arg [cmTryCompileExec602265197] ==> ignore
+    arg [/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crt1.o] ==> ignore
+    arg [/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crti.o] ==> ignore
+    arg [/usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtbegin.o] ==> ignore
+    arg [-L/usr/lib/gcc/x86_64-redhat-linux/4.8.5] ==> dir [/usr/lib/gcc/x86_64-redhat-linux/4.8.5]
+    arg [-L/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64] ==> dir [/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64]
+    arg [-L/lib/../lib64] ==> dir [/lib/../lib64]
+    arg [-L/usr/lib/../lib64] ==> dir [/usr/lib/../lib64]
+    arg [-L/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../..] ==> dir [/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../..]
+    arg [CMakeFiles/cmTryCompileExec602265197.dir/CMakeCCompilerABI.c.o] ==> ignore
+    arg [-lgcc] ==> lib [gcc]
+    arg [--as-needed] ==> ignore
+    arg [-lgcc_s] ==> lib [gcc_s]
+    arg [--no-as-needed] ==> ignore
+    arg [-lc] ==> lib [c]
+    arg [-lgcc] ==> lib [gcc]
+    arg [--as-needed] ==> ignore
+    arg [-lgcc_s] ==> lib [gcc_s]
+    arg [--no-as-needed] ==> ignore
+    arg [/usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtend.o] ==> ignore
+    arg [/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crtn.o] ==> ignore
+  remove lib [gcc]
+  remove lib [gcc_s]
+  remove lib [gcc]
+  remove lib [gcc_s]
+  collapse library dir [/usr/lib/gcc/x86_64-redhat-linux/4.8.5] ==> [/usr/lib/gcc/x86_64-redhat-linux/4.8.5]
+  collapse library dir [/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64] ==> [/usr/lib64]
+  collapse library dir [/lib/../lib64] ==> [/lib64]
+  collapse library dir [/usr/lib/../lib64] ==> [/usr/lib64]
+  collapse library dir [/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../..] ==> [/usr/lib]
+  implicit libs: [c]
+  implicit dirs: [/usr/lib/gcc/x86_64-redhat-linux/4.8.5;/usr/lib64;/lib64;/usr/lib]
+  implicit fwks: []
+
+
+Determining if the CXX compiler works passed with the following output:
+Change Dir: /home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/CMakeTmp
+
+Run Build Command:/usr/bin/gmake "cmTryCompileExec3828041398/fast"
+/usr/bin/gmake -f CMakeFiles/cmTryCompileExec3828041398.dir/build.make CMakeFiles/cmTryCompileExec3828041398.dir/build
+gmake[1]: Entering directory `/home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/CMakeTmp'
+/usr/bin/cmake -E cmake_progress_report /home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/CMakeTmp/CMakeFiles 1
+Building CXX object CMakeFiles/cmTryCompileExec3828041398.dir/testCXXCompiler.cxx.o
+/usr/bin/c++     -o CMakeFiles/cmTryCompileExec3828041398.dir/testCXXCompiler.cxx.o -c /home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/CMakeTmp/testCXXCompiler.cxx
+Linking CXX executable cmTryCompileExec3828041398
+/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec3828041398.dir/link.txt --verbose=1
+/usr/bin/c++        CMakeFiles/cmTryCompileExec3828041398.dir/testCXXCompiler.cxx.o  -o cmTryCompileExec3828041398 -rdynamic 
+gmake[1]: Leaving directory `/home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/CMakeTmp'
+
+
+Detecting CXX compiler ABI info compiled with the following output:
+Change Dir: /home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/CMakeTmp
+
+Run Build Command:/usr/bin/gmake "cmTryCompileExec1700914889/fast"
+/usr/bin/gmake -f CMakeFiles/cmTryCompileExec1700914889.dir/build.make CMakeFiles/cmTryCompileExec1700914889.dir/build
+gmake[1]: Entering directory `/home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/CMakeTmp'
+/usr/bin/cmake -E cmake_progress_report /home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/CMakeTmp/CMakeFiles 1
+Building CXX object CMakeFiles/cmTryCompileExec1700914889.dir/CMakeCXXCompilerABI.cpp.o
+/usr/bin/c++     -o CMakeFiles/cmTryCompileExec1700914889.dir/CMakeCXXCompilerABI.cpp.o -c /usr/share/cmake/Modules/CMakeCXXCompilerABI.cpp
+Linking CXX executable cmTryCompileExec1700914889
+/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec1700914889.dir/link.txt --verbose=1
+/usr/bin/c++      -v CMakeFiles/cmTryCompileExec1700914889.dir/CMakeCXXCompilerABI.cpp.o  -o cmTryCompileExec1700914889 -rdynamic  
+Using built-in specs.
+COLLECT_GCC=/usr/bin/c++
+COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/lto-wrapper
+Target: x86_64-redhat-linux
+Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,go,lto --enable-plugin --enable-initfini-array --disable-libgcj --with-isl=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/cloog-install --enable-gnu-indirect-function --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux
+Thread model: posix
+gcc version 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) 
+COMPILER_PATH=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/:/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/:/usr/libexec/gcc/x86_64-redhat-linux/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/:/usr/lib/gcc/x86_64-redhat-linux/
+LIBRARY_PATH=/usr/lib/gcc/x86_64-redhat-linux/4.8.5/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/:/lib/../lib64/:/usr/lib/../lib64/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../:/lib/:/usr/lib/
+COLLECT_GCC_OPTIONS='-v' '-o' 'cmTryCompileExec1700914889' '-rdynamic' '-shared-libgcc' '-mtune=generic' '-march=x86-64'
+ /usr/libexec/gcc/x86_64-redhat-linux/4.8.5/collect2 --build-id --no-add-needed --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -export-dynamic -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o cmTryCompileExec1700914889 /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crt1.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crti.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtbegin.o -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5 -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../.. CMakeFiles/cmTryCompileExec1700914889.dir/CMakeCXXCompilerABI.cpp.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtend.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crtn.o
+gmake[1]: Leaving directory `/home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/CMakeTmp'
+
+
+Parsed CXX implicit link information from above output:
+  link line regex: [^( *|.*[/\])(ld|([^/\]+-)?ld|collect2)[^/\]*( |$)]
+  ignore line: [Change Dir: /home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/CMakeTmp]
+  ignore line: []
+  ignore line: [Run Build Command:/usr/bin/gmake "cmTryCompileExec1700914889/fast"]
+  ignore line: [/usr/bin/gmake -f CMakeFiles/cmTryCompileExec1700914889.dir/build.make CMakeFiles/cmTryCompileExec1700914889.dir/build]
+  ignore line: [gmake[1]: Entering directory `/home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/CMakeTmp']
+  ignore line: [/usr/bin/cmake -E cmake_progress_report /home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/CMakeTmp/CMakeFiles 1]
+  ignore line: [Building CXX object CMakeFiles/cmTryCompileExec1700914889.dir/CMakeCXXCompilerABI.cpp.o]
+  ignore line: [/usr/bin/c++     -o CMakeFiles/cmTryCompileExec1700914889.dir/CMakeCXXCompilerABI.cpp.o -c /usr/share/cmake/Modules/CMakeCXXCompilerABI.cpp]
+  ignore line: [Linking CXX executable cmTryCompileExec1700914889]
+  ignore line: [/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec1700914889.dir/link.txt --verbose=1]
+  ignore line: [/usr/bin/c++      -v CMakeFiles/cmTryCompileExec1700914889.dir/CMakeCXXCompilerABI.cpp.o  -o cmTryCompileExec1700914889 -rdynamic  ]
+  ignore line: [Using built-in specs.]
+  ignore line: [COLLECT_GCC=/usr/bin/c++]
+  ignore line: [COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/lto-wrapper]
+  ignore line: [Target: x86_64-redhat-linux]
+  ignore line: [Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,go,lto --enable-plugin --enable-initfini-array --disable-libgcj --with-isl=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/cloog-install --enable-gnu-indirect-function --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux]
+  ignore line: [Thread model: posix]
+  ignore line: [gcc version 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) ]
+  ignore line: [COMPILER_PATH=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/:/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/:/usr/libexec/gcc/x86_64-redhat-linux/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/:/usr/lib/gcc/x86_64-redhat-linux/]
+  ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-redhat-linux/4.8.5/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/:/lib/../lib64/:/usr/lib/../lib64/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../:/lib/:/usr/lib/]
+  ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'cmTryCompileExec1700914889' '-rdynamic' '-shared-libgcc' '-mtune=generic' '-march=x86-64']
+  link line: [ /usr/libexec/gcc/x86_64-redhat-linux/4.8.5/collect2 --build-id --no-add-needed --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -export-dynamic -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o cmTryCompileExec1700914889 /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crt1.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crti.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtbegin.o -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5 -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../.. CMakeFiles/cmTryCompileExec1700914889.dir/CMakeCXXCompilerABI.cpp.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtend.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crtn.o]
+    arg [/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/collect2] ==> ignore
+    arg [--build-id] ==> ignore
+    arg [--no-add-needed] ==> ignore
+    arg [--eh-frame-hdr] ==> ignore
+    arg [--hash-style=gnu] ==> ignore
+    arg [-m] ==> ignore
+    arg [elf_x86_64] ==> ignore
+    arg [-export-dynamic] ==> ignore
+    arg [-dynamic-linker] ==> ignore
+    arg [/lib64/ld-linux-x86-64.so.2] ==> ignore
+    arg [-o] ==> ignore
+    arg [cmTryCompileExec1700914889] ==> ignore
+    arg [/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crt1.o] ==> ignore
+    arg [/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crti.o] ==> ignore
+    arg [/usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtbegin.o] ==> ignore
+    arg [-L/usr/lib/gcc/x86_64-redhat-linux/4.8.5] ==> dir [/usr/lib/gcc/x86_64-redhat-linux/4.8.5]
+    arg [-L/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64] ==> dir [/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64]
+    arg [-L/lib/../lib64] ==> dir [/lib/../lib64]
+    arg [-L/usr/lib/../lib64] ==> dir [/usr/lib/../lib64]
+    arg [-L/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../..] ==> dir [/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../..]
+    arg [CMakeFiles/cmTryCompileExec1700914889.dir/CMakeCXXCompilerABI.cpp.o] ==> ignore
+    arg [-lstdc++] ==> lib [stdc++]
+    arg [-lm] ==> lib [m]
+    arg [-lgcc_s] ==> lib [gcc_s]
+    arg [-lgcc] ==> lib [gcc]
+    arg [-lc] ==> lib [c]
+    arg [-lgcc_s] ==> lib [gcc_s]
+    arg [-lgcc] ==> lib [gcc]
+    arg [/usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtend.o] ==> ignore
+    arg [/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crtn.o] ==> ignore
+  remove lib [gcc_s]
+  remove lib [gcc]
+  remove lib [gcc_s]
+  remove lib [gcc]
+  collapse library dir [/usr/lib/gcc/x86_64-redhat-linux/4.8.5] ==> [/usr/lib/gcc/x86_64-redhat-linux/4.8.5]
+  collapse library dir [/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64] ==> [/usr/lib64]
+  collapse library dir [/lib/../lib64] ==> [/lib64]
+  collapse library dir [/usr/lib/../lib64] ==> [/usr/lib64]
+  collapse library dir [/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../..] ==> [/usr/lib]
+  implicit libs: [stdc++;m;c]
+  implicit dirs: [/usr/lib/gcc/x86_64-redhat-linux/4.8.5;/usr/lib64;/lib64;/usr/lib]
+  implicit fwks: []
+
+
diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/cmake.check_cache b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/cmake.check_cache
new file mode 100644
index 0000000000000000000000000000000000000000..3dccd731726d7faa8b29d8d7dba3b981a53ca497
--- /dev/null
+++ b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/cmake.check_cache
@@ -0,0 +1 @@
+# This file is generated by cmake for dependency checking of the CMakeCache.txt file
diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/testlogs/frame_config_test.txt b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/testlogs/frame_config_test.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/testlogs/harq_test.txt b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/testlogs/harq_test.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/testlogs/pbch_test.txt b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/testlogs/pbch_test.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/testlogs/pss_test.txt b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/testlogs/pss_test.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/testlogs/pucch_uci_test.txt b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/testlogs/pucch_uci_test.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/testlogs/srs_test.txt b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/testlogs/srs_test.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/testlogs/sss_test.txt b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/testlogs/sss_test.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/pucch_uci_test.c b/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/pucch_uci_test.c
index 31fe15a6de8ed377a4da95aaa50b82d7d8fa2f8a..12d50065fa83a4e2bc04d522ccbaa6612c31d720 100644
--- a/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/pucch_uci_test.c
+++ b/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/pucch_uci_test.c
@@ -165,7 +165,7 @@ void common_pucch_configuration(PHY_VARS_NR_UE *ue, uint8_t gNB_id, int pucch_in
 int test_pucch_basic_error(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *proc)
 {
   int v_return = 0;
-  bool reset_harq = FALSE;
+  bool reset_harq = false;
 
   printf("%s", tst_separator);
 
@@ -175,7 +175,7 @@ int test_pucch_basic_error(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *pr
 
   common_pucch_configuration(ue, gNB_id, TST_PUCCH_COMMON_CONFIG_INDEX_KO);
 
-  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != FALSE) {
+  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != false) {
     v_return = -1;
   }
 
@@ -186,7 +186,7 @@ int test_pucch_basic_error(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *pr
 
   printf("\n  => Test : Error due to acknownlegment not set \n");
 
-  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != FALSE) {
+  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != false) {
     v_return = -1;
   }
 
@@ -194,7 +194,7 @@ int test_pucch_basic_error(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *pr
 
   printf("\n  => Test : Error due to DAI not set \n");
 
-  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != FALSE) {
+  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != false) {
     v_return = -1;
   }
 
@@ -202,7 +202,7 @@ int test_pucch_basic_error(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *pr
 
   harq_status->vDAI_DL = NR_DL_MAX_DAI + 1;
 
-  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != FALSE) {
+  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != false) {
     v_return = -1;
   }
 
@@ -210,7 +210,7 @@ int test_pucch_basic_error(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *pr
 
   harq_status->vDAI_DL = 0;
 
-  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != FALSE) {
+  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != false) {
     v_return = -1;
   }
 
@@ -218,7 +218,7 @@ int test_pucch_basic_error(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *pr
 
   harq_status->send_harq_status = 1;  /* ack ready to be send */
 
-  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != FALSE) {
+  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != false) {
     v_return = -1;
   }
 
@@ -228,7 +228,7 @@ int test_pucch_basic_error(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *pr
 
   harq_status->vDAI_DL = 1;
 
-  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != FALSE) {
+  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != false) {
     v_return = -1;
   }
 
@@ -236,7 +236,7 @@ int test_pucch_basic_error(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *pr
 
   printf("\n  => Test : Error due to PUCCH format with multiple cells not already implemented \n");
 
-  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != FALSE) {
+  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != false) {
     v_return = -1;
   }
 
@@ -260,7 +260,7 @@ int test_pucch_basic_error(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *pr
 int test_pucch_common_config_single_transport_block(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *proc)
 {
   int v_return = 0;
-  bool reset_harq = FALSE;
+  bool reset_harq = false;
 
   printf("%s", tst_separator);
 
@@ -273,7 +273,7 @@ int test_pucch_common_config_single_transport_block(PHY_VARS_NR_UE *ue, int gNB_
 
   printf("\n  => Test : PUCCH format from common config in prach mode: one positive downlink ACKnowledgment \n");
 
-  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != TRUE) {
+  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != true) {
    v_return = -1;
   }
 
@@ -281,7 +281,7 @@ int test_pucch_common_config_single_transport_block(PHY_VARS_NR_UE *ue, int gNB_
 
   printf("\n  => Test : PUCCH format from common config in prach mode: one negative downlink ACKnowledgment \n");
 
-  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != TRUE) {
+  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != true) {
    v_return = -1;
   }
 
@@ -304,7 +304,7 @@ int test_pucch_common_config_single_transport_block(PHY_VARS_NR_UE *ue, int gNB_
 
   printf("\n  => Test : PUCCH format from common config in dedicated mode: two positive downlink ACKnowledgments \n");
 
-  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != TRUE) {
+  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != true) {
     v_return = -1;
   }
 
@@ -312,7 +312,7 @@ int test_pucch_common_config_single_transport_block(PHY_VARS_NR_UE *ue, int gNB_
 
   printf("\n  => Test : PUCCH format from common config in dedicated mode: one positive and one negative downlink ACKnowledgments \n");
 
-  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != TRUE) {
+  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != true) {
     v_return = -1;
   }
 
@@ -320,22 +320,22 @@ int test_pucch_common_config_single_transport_block(PHY_VARS_NR_UE *ue, int gNB_
 
   printf("\n  => Test : PUCCH format from common config in dedicated mode: two negative downlink ACKnowledgments \n");
 
-  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != TRUE) {
+  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != true) {
     v_return = -1;
   }
 
   harq_status->ack = DL_ACK;
-  reset_harq = TRUE;
+  reset_harq = true;
 
   printf("\n  => Test : PUCCH format from common config in dedicated mode: no resource is found \n");
 
-  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != FALSE) {
+  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != false) {
     v_return = -1;
   }
 
   printf("\n  => Test : PUCCH format from common config in dedicated mode: no PUCCH after reset of pending harq ACKnowledgments \n");
 
-  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != FALSE) {
+  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != false) {
     v_return = -1;
   }
 
@@ -362,7 +362,7 @@ void init_pucch_dedicated_configuration(PHY_VARS_NR_UE *ue, uint8_t gNB_id)
   int i,j;
 
   /* set cell group parameters which are supported */
-  ue->cell_group_config.physicalCellGroupConfig.harq_ACK_SpatialBundlingPUCCH = FALSE;
+  ue->cell_group_config.physicalCellGroupConfig.harq_ACK_SpatialBundlingPUCCH = false;
   ue->cell_group_config.physicalCellGroupConfig.pdsch_HARQ_ACK_Codebook = dynamic;
 
   ue->PDSCH_ServingCellConfig.codeBlockGroupTransmission = NULL;
@@ -554,7 +554,7 @@ int test_pucch_dedicated_single_transport_block(PHY_VARS_NR_UE *ue, int gNB_id,
 #define   TST_NB_STEP_SINGLE_TRANSPORT_BLOCK      (4)
 
   int v_return = 0;
-  int reset_harq = FALSE;
+  int reset_harq = false;
   int dl_harq_pid[TST_NB_STEP_SINGLE_TRANSPORT_BLOCK] = {TST_DL_HARQ_PID_FIRST, TST_DL_HARQ_PID_SECOND, TST_DL_HARQ_PID_THIRD, TST_DL_HARQ_PID_FOURTH };
   int pucch_resource_indicator[TST_NB_STEP_SINGLE_TRANSPORT_BLOCK][2] = { { 0, 4 }, { 1, 0 } , { 1, 3 } , { 5, 7 } };
   NR_UE_HARQ_STATUS_t *harq_status;
@@ -575,7 +575,7 @@ int test_pucch_dedicated_single_transport_block(PHY_VARS_NR_UE *ue, int gNB_id,
 
   printf("\n  => Test : PUCCH format from dedicated config : pucch resource indicator is invalid \n");
 
-  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != FALSE) {
+  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != false) {
     v_return = -1;
   }
 
@@ -595,14 +595,14 @@ int test_pucch_dedicated_single_transport_block(PHY_VARS_NR_UE *ue, int gNB_id,
 
       /* reset ack context on last test */
       if ((i == (TST_NB_STEP_SINGLE_TRANSPORT_BLOCK-1)) && (j == 1)) {
-        reset_harq = TRUE;
+        reset_harq = true;
       }
 
       harq_status->pucch_resource_indicator = pucch_resource_indicator[i][j];
 
       printf("\n  => Test : PUCCH format from dedicated config with 1 transport block : with %d downlink ACKnowledgments and pucch resource indicator %d \n", i+1, pucch_resource_indicator[i][j]);
 
-      if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != TRUE) {
+      if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != true) {
         v_return = -1;
       }
     }
@@ -627,11 +627,11 @@ int test_pucch_dedicated_single_transport_block(PHY_VARS_NR_UE *ue, int gNB_id,
     harq_status->pucch_resource_indicator = pucch_resource_indicator[i][0];
   }
 
-  reset_harq = TRUE;
+  reset_harq = true;
 
   printf("\n  => Test : PUCCH format from dedicated config with 1 transport block and missed PDSCH : with %d downlink ACKnowledgments and pucch resource indicator %d \n", i+1, pucch_resource_indicator[3][0]);
 
-  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != TRUE) {
+  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != true) {
     v_return = -1;
   }
 
@@ -659,7 +659,7 @@ int test_pucch_dedicated_two_transport_blocks(PHY_VARS_NR_UE *ue, int gNB_id, UE
 #define   TST_NB_STEP_TWO_TRANSPORT_BLOCKS      (4)
 
   int v_return = 0;
-  int reset_harq = FALSE;
+  int reset_harq = false;
   int dl_harq_pid[TST_NB_STEP_TWO_TRANSPORT_BLOCKS] = {TST_DL_HARQ_PID_FIRST, TST_DL_HARQ_PID_SECOND, TST_DL_HARQ_PID_THIRD, TST_DL_HARQ_PID_FOURTH };
   int pucch_resource_indicator[TST_NB_STEP_TWO_TRANSPORT_BLOCKS][2] = { { 0, 1 }, { 3, 7 } , { 2 , 4 } , { 4 , 6 } };
   NR_UE_HARQ_STATUS_t *harq_status;
@@ -694,7 +694,7 @@ int test_pucch_dedicated_two_transport_blocks(PHY_VARS_NR_UE *ue, int gNB_id, UE
 
       /* reset ack context on last test */
       if ((i == (TST_NB_STEP_TWO_TRANSPORT_BLOCKS-1)) && (j == 1)) {
-        reset_harq = TRUE;
+        reset_harq = true;
       }
 
       harq_status = &ue->dlsch[proc->thread_id][gNB_id][0]->harq_processes[dl_harq_pid[i]].harq_ack;
@@ -703,7 +703,7 @@ int test_pucch_dedicated_two_transport_blocks(PHY_VARS_NR_UE *ue, int gNB_id, UE
 
       printf("\n  => Test : PUCCH format from dedicated config with 2 transport blocks : with %d downlink ACKnowledgments and pucch resource indicator %d \n", i+1, pucch_resource_indicator[i][j]);
 
-      if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != TRUE) {
+      if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != true) {
         printf("Test fail \n");
         v_return = -1;
       }
@@ -714,7 +714,7 @@ int test_pucch_dedicated_two_transport_blocks(PHY_VARS_NR_UE *ue, int gNB_id, UE
   /* some transport blocks have been missed and they need to be nack by UE in order to be retransmitted by the network */
   /* here first and third block receptions have been missed */
 
-  reset_harq = TRUE;
+  reset_harq = true;
 
   for (int i = 1; i < TST_NB_STEP_TWO_TRANSPORT_BLOCKS; i = i + 1) {
 
@@ -743,7 +743,7 @@ int test_pucch_dedicated_two_transport_blocks(PHY_VARS_NR_UE *ue, int gNB_id, UE
 
   printf("\n  => Test : PUCCH format from dedicated config with 2 transport blocks and 1 missed PDSCH : with %d downlink ACKnowledgments and pucch resource indicator %d \n", 4, pucch_resource_indicator[3][0]);
 
-  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != TRUE) {
+  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != true) {
     printf("Test fail \n");
     v_return = -1;
   }
@@ -775,7 +775,7 @@ int test_pucch_dedicated_two_transport_blocks(PHY_VARS_NR_UE *ue, int gNB_id, UE
     }
   }
 
-  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != TRUE) {
+  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != true) {
    printf("Test fail \n");
    v_return = -1;
   }
@@ -907,7 +907,7 @@ int test_sr_alone_dedicated(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *p
 
   tst_scheduling_request_payload = 0;
 
-  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != FALSE) {
+  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != false) {
    printf("Test fail \n");
    v_return = -1;
   }
@@ -916,7 +916,7 @@ int test_sr_alone_dedicated(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *p
 
   tst_scheduling_request_payload = 1;
 
-  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != TRUE) {
+  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != true) {
     printf("Test fail \n");
     v_return = -1;
   }
@@ -929,7 +929,7 @@ int test_sr_alone_dedicated(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *p
 
   tst_scheduling_request_payload = 1;
 
-  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != TRUE) {
+  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != true) {
     printf("Test fail \n");
     v_return = -1;
   }
@@ -958,7 +958,7 @@ int test_sr_alone_dedicated(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *p
 int test_sr_ack_dedicated(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *proc)
 {
   int v_return = 0;
-  int reset_harq = 0;
+  bool reset_harq = false;
   int sr_config_id = 0;
   int sr_resource_id = 0;
   int sr_offset = 0;
@@ -988,7 +988,7 @@ int test_sr_ack_dedicated(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *pro
 
   tst_scheduling_request_payload = 0;  /* set sr payload */
 
-  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != TRUE) {
+  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != true) {
     printf("Test fail \n");
     v_return = -1;
   }
@@ -997,7 +997,7 @@ int test_sr_ack_dedicated(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *pro
 
   tst_scheduling_request_payload = 1;  /* set sr payload */
 
-  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != TRUE) {
+  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != true) {
    printf("Test fail \n");
    v_return = -1;
   }
@@ -1006,7 +1006,7 @@ int test_sr_ack_dedicated(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *pro
 
   harq_status->pucch_resource_indicator = pucch_resource_indicator[1];
 
-  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != TRUE) {
+  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != true) {
     printf("Test fail \n");
     v_return = -1;
   }
@@ -1027,7 +1027,7 @@ int test_sr_ack_dedicated(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *pro
 
   tst_scheduling_request_payload = 1;  /* set sr payload */
 
-  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != TRUE) {
+  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != true) {
     printf("Test fail \n");
     v_return = -1;
   }
@@ -1035,9 +1035,9 @@ int test_sr_ack_dedicated(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *pro
   printf("\n  => Test : PUCCH format from dedicated config with a positive scheduling request and two positive acks \n");
 
   harq_status->pucch_resource_indicator = pucch_resource_indicator[1];
-  reset_harq = TRUE;
+  reset_harq = true;
 
-  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != TRUE) {
+  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != true) {
    printf("Test fail \n");
    v_return = -1;
   }
@@ -1065,7 +1065,7 @@ int test_sr_ack_dedicated(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *pro
 int test_csi_dedicated(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *proc)
 {
   int v_return = 0;
-  int reset_harq = FALSE;
+  int reset_harq = false;
   int sr_config_id = 0;
   int sr_resource_id = 0;
   int sr_offset = 0;
@@ -1079,7 +1079,7 @@ int test_csi_dedicated(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *proc)
 
   printf("\n  => Test : PUCCH format from dedicated config with CSI alone \n");
 
-  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != TRUE) {
+  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != true) {
     printf("Test fail \n");
     v_return = -1;
   }
@@ -1102,7 +1102,7 @@ int test_csi_dedicated(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *proc)
 
   ue->pucch_config_dedicated_nr[gNB_id].formatConfig[2-1]->simultaneousHARQ_ACK_CSI = enable_feature; /* format 2 */
 
-  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != TRUE) {
+  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != true) {
     printf("Test fail \n");
     v_return = -1;
   }
@@ -1115,9 +1115,9 @@ int test_csi_dedicated(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *proc)
 
   tst_scheduling_request_payload = 0;  /* set sr payload */
 
-  reset_harq = TRUE;
+  reset_harq = true;
 
-  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != TRUE) {
+  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != true) {
     printf("Test fail \n");
     v_return = -1;
   }
@@ -1126,7 +1126,7 @@ int test_csi_dedicated(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *proc)
 
   harq_status->pucch_resource_indicator = pucch_resource_indicator[4];
 
-  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != TRUE) {
+  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != true) {
     printf("Test fail \n");
     v_return = -1;
   }
@@ -1135,7 +1135,7 @@ int test_csi_dedicated(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *proc)
 
   printf("\n  => Test : PUCCH format from dedicated config with positive SR and CSI \n");
 
-  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != TRUE) {
+  if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != true) {
     printf("Test fail \n");
     v_return = -1;
   }
diff --git a/openair1/SIMULATION/TOOLS/rangen_double.c b/openair1/SIMULATION/TOOLS/rangen_double.c
index 82b1557a5bf73a86fdf3f2b9ceb8f1ac5ee42623..0ba9e196b1349100f990ac4620a509cfaa246580 100644
--- a/openair1/SIMULATION/TOOLS/rangen_double.c
+++ b/openair1/SIMULATION/TOOLS/rangen_double.c
@@ -42,7 +42,6 @@ void randominit(unsigned seed_init)
 {
   int i;
   // this need to be integrated with the existing rng, like taus: navid
-  printf("Initializing random number generator, seed %x\n",seed_init);
 
   if (seed_init == 0) {
     srand((unsigned)time(NULL));
@@ -51,6 +50,7 @@ void randominit(unsigned seed_init)
   } else {
     seed = seed_init;
   }
+  printf("Initializing random number generator, seed %x\n",seed);
 
   if (seed % 2 == 0) seed += 1; /* seed and mod are relative prime */
 
diff --git a/openair2/COMMON/commonDef.h b/openair2/COMMON/commonDef.h
index b37230cdd45ffbd9154556bb4ed5aa46d7185af6..e18db881f04940f74e4bfeb6a4e9ac7e1b8cfc6a 100644
--- a/openair2/COMMON/commonDef.h
+++ b/openair2/COMMON/commonDef.h
@@ -43,27 +43,6 @@ Description Contains global common definitions
 #include <stddef.h>
 #include <stdbool.h>
 
-/* boolean_t is also defined in openair2/COMMON/platform_types.h
- * let's protect potential redefinition
- */
-
-#ifndef _BOOLEAN_T_DEFINED_
-#define _BOOLEAN_T_DEFINED_
-
-typedef signed char        boolean_t;
-
-#if !defined(TRUE)
-#define TRUE               (boolean_t)0x01
-#endif
-
-#if !defined(FALSE)
-#define FALSE              (boolean_t)0x00
-#endif
-
-#define BOOL_NOT(b) (b^TRUE)
-
-#endif /* _BOOLEAN_T_DEFINED_ */
-
 #define NAS_UE_ID_FMT "0x%06x"
 
 /****************************************************************************/
diff --git a/openair2/COMMON/f1ap_messages_def.h b/openair2/COMMON/f1ap_messages_def.h
index 0e857f3a83cb5cb6fd9843728359e6748117ee6c..f28e0e5ddfc1989db3329a74feef9e487e94f279 100644
--- a/openair2/COMMON/f1ap_messages_def.h
+++ b/openair2/COMMON/f1ap_messages_def.h
@@ -46,6 +46,8 @@ MESSAGE_DEF(F1AP_DL_RRC_MESSAGE              , MESSAGE_PRIORITY_MED, f1ap_dl_rrc
 //MESSAGE_DEF(F1AP_INITIAL_CONTEXT_SETUP_REQ , MESSAGE_PRIORITY_MED, f1ap_initial_context_setup_req_t , f1ap_initial_context_setup_req )
 MESSAGE_DEF(F1AP_UE_CONTEXT_SETUP_REQ,  MESSAGE_PRIORITY_MED, f1ap_ue_context_setup_t, f1ap_ue_context_setup_req)
 MESSAGE_DEF(F1AP_UE_CONTEXT_SETUP_RESP, MESSAGE_PRIORITY_MED, f1ap_ue_context_setup_t, f1ap_ue_context_setup_resp)
+MESSAGE_DEF(F1AP_UE_CONTEXT_MODIFICATION_REQ,  MESSAGE_PRIORITY_MED, f1ap_ue_context_setup_t, f1ap_ue_context_modification_req)
+MESSAGE_DEF(F1AP_UE_CONTEXT_MODIFICATION_RESP, MESSAGE_PRIORITY_MED, f1ap_ue_context_setup_t, f1ap_ue_context_modification_resp)
 
 
 
diff --git a/openair2/COMMON/f1ap_messages_types.h b/openair2/COMMON/f1ap_messages_types.h
index cb1a8c9577704b29d6da8ab86401c0d500e80e2b..ae050e2bc2b8d07ed4ccb8e175dcdaa9550afb34 100644
--- a/openair2/COMMON/f1ap_messages_types.h
+++ b/openair2/COMMON/f1ap_messages_types.h
@@ -39,15 +39,15 @@
 #define F1AP_INITIAL_UL_RRC_MESSAGE(mSGpTR)        (mSGpTR)->ittiMsg.f1ap_initial_ul_rrc_message
 #define F1AP_UL_RRC_MESSAGE(mSGpTR)                (mSGpTR)->ittiMsg.f1ap_ul_rrc_message
 #define F1AP_UE_CONTEXT_SETUP_REQ(mSGpTR)          (mSGpTR)->ittiMsg.f1ap_ue_context_setup_req
-#define F1AP_UE_CONTEXT_SETUP_RESP(mSGpTR)          (mSGpTR)->ittiMsg.f1ap_ue_context_setup_resp
+#define F1AP_UE_CONTEXT_SETUP_RESP(mSGpTR)         (mSGpTR)->ittiMsg.f1ap_ue_context_setup_resp
 #define F1AP_UE_CONTEXT_RELEASE_RESP(mSGpTR)       (mSGpTR)->ittiMsg.f1ap_ue_context_release_resp
+#define F1AP_UE_CONTEXT_MODIFICATION_REQ(mSGpTR)   (mSGpTR)->ittiMsg.f1ap_ue_context_modification_req
 #define F1AP_UE_CONTEXT_MODIFICATION_RESP(mSGpTR)  (mSGpTR)->ittiMsg.f1ap_ue_context_modification_resp
 #define F1AP_UE_CONTEXT_MODIFICATION_FAIL(mSGpTR)  (mSGpTR)->ittiMsg.f1ap_ue_context_modification_fail
 
 #define F1AP_DL_RRC_MESSAGE(mSGpTR)                (mSGpTR)->ittiMsg.f1ap_dl_rrc_message
 #define F1AP_UE_CONTEXT_RELEASE_REQ(mSGpTR)        (mSGpTR)->ittiMsg.f1ap_ue_context_release_req
 #define F1AP_UE_CONTEXT_RELEASE_CMD(mSGpTR)        (mSGpTR)->ittiMsg.f1ap_ue_context_release_req
-#define F1AP_UE_CONTEXT_MODIFICATION_REQ(mSGpTR)   (mSGpTR)->ittiMsg.f1ap_ue_context_modification_req
 
 /* Length of the transport layer address string
  * 160 bits / 8 bits by char.
@@ -60,7 +60,9 @@
 #define F1AP_MAX_NB_CELLS 2
 
 #define F1AP_MAX_NO_OF_TNL_ASSOCIATIONS 32
-#define F1AP_MAX_NO_UE_ID 1024 
+#define F1AP_MAX_NO_UE_ID 1024
+#define F1AP_MAX_DU2CU_RRC_LENGTH 1024
+
 typedef struct f1ap_net_ip_address_s {
   unsigned ipv4:1;
   unsigned ipv6:1;
@@ -307,7 +309,7 @@ typedef struct f1ap_initial_ul_rrc_message_s {
   uint16_t crnti;
   uint8_t *rrc_container;
   int      rrc_container_length;
-  char du2cu_rrc_container[200];
+  char     du2cu_rrc_container[F1AP_MAX_DU2CU_RRC_LENGTH];
   int      du2cu_rrc_container_length;
 } f1ap_initial_ul_rrc_message_t;
 
@@ -343,6 +345,35 @@ typedef struct f1ap_rb_failed_to_be_setup_s {
   long           rb_id;
 } f1ap_rb_failed_to_be_setup_t;
 
+typedef struct cu_to_du_rrc_information_s {
+  uint8_t * cG_ConfigInfo;
+  uint32_t   cG_ConfigInfo_length;
+  uint8_t * uE_CapabilityRAT_ContainerList;
+  uint32_t   uE_CapabilityRAT_ContainerList_length;
+  uint8_t * measConfig;
+  uint32_t   measConfig_length;
+}cu_to_du_rrc_information_t;
+
+typedef struct du_to_du_rrc_information_s {
+  uint8_t * cellGroupConfig;
+  uint8_t   cellGroupConfig_length;
+  uint8_t * measGapConfig;
+  uint8_t   measGapConfig_length;
+  uint8_t * requestedP_MaxFR1;
+  uint8_t   requestedP_MaxFR1_length;
+}du_to_cu_rrc_information_t;
+
+typedef enum QoS_information_e {
+  NG_RAN_QoS    = 0,
+  EUTRAN_QoS    = 1,
+} QoS_information_t;
+
+typedef enum ReconfigurationCompl_e {
+  RRCreconf_info_not_present = 0,
+  RRCreconf_failure          = 1,
+  RRCreconf_success          = 2,
+} ReconfigurationCompl_t;
+
 typedef struct f1ap_ue_context_setup_s {
   uint32_t gNB_CU_ue_id;    // BK: need to replace by use from rnti
   uint32_t gNB_DU_ue_id;
@@ -355,40 +386,27 @@ typedef struct f1ap_ue_context_setup_s {
   uint8_t servCellIndex;
   uint8_t *cellULConfigured;
   uint32_t servCellId;
-  uint8_t *cu_to_du_rrc_information;
+  cu_to_du_rrc_information_t *cu_to_du_rrc_information;
   uint8_t  cu_to_du_rrc_information_length;
-  uint8_t *du_to_cu_rrc_information;
-  uint8_t  du_to_cu_rrc_information_length;
-  f1ap_drb_to_be_setup_t *drbs_to_be_setup; // BK: need to replace by s1ap_initial_context_setup_req
-  uint8_t  drbs_to_be_setup_length;       // BK: need to replace by s1ap_initial_context_setup_req
+  //uint8_t *du_to_cu_rrc_information;
+  du_to_cu_rrc_information_t *du_to_cu_rrc_information;
+  uint32_t  du_to_cu_rrc_information_length;
+  f1ap_drb_to_be_setup_t *drbs_to_be_setup;
+  uint8_t  drbs_to_be_setup_length;
+  f1ap_drb_to_be_setup_t *drbs_to_be_modified;
+    uint8_t  drbs_to_be_modified_length;
+  QoS_information_t QoS_information_type;
   uint8_t  drbs_failed_to_be_setup_length;
   f1ap_rb_failed_to_be_setup_t *drbs_failed_to_be_setup;
   f1ap_srb_to_be_setup_t *srbs_to_be_setup;
   uint8_t  srbs_to_be_setup_length;
   uint8_t  srbs_failed_to_be_setup_length;
   f1ap_rb_failed_to_be_setup_t *srbs_failed_to_be_setup;
-  s1ap_initial_context_setup_req_t *s1ap_initial_context_setup_req;
-   // coniatner for the rrc_eNB_generate_SecurityModeCommand message
+  ReconfigurationCompl_t ReconfigComplOutcome;
   uint8_t *rrc_container;
   int      rrc_container_length;
 } f1ap_ue_context_setup_t;
 
-typedef struct f1ap_ue_context_setup_resp_s {
-  uint32_t gNB_CU_ue_id;    // BK: need to replace by use from rnti
-  uint32_t gNB_DU_ue_id;
-  uint16_t rnti;
-  uint8_t  du_to_cu_rrc_information[1024 /*Arbitrarily big enough*/];
-  uint32_t  du_to_cu_rrc_information_length;
-  f1ap_drb_to_be_setup_t *drbs_setup; // BK: need to replace by s1ap_initial_context_setup_req
-  uint8_t  drbs_setup_length;       // BK: need to replace by s1ap_initial_context_setup_req
-  f1ap_srb_to_be_setup_t *srbs_setup;
-  uint8_t  srbs_setup_length;
-  uint8_t  srbs_failed_to_be_setup_length;
-  f1ap_rb_failed_to_be_setup_t *srbs_failed_to_be_setup;
-  uint8_t  drbs_failed_to_be_setup_length;
-  f1ap_rb_failed_to_be_setup_t *drbs_failed_to_be_setup;
-} f1ap_ue_context_setup_resp_t;
-
 typedef enum F1ap_Cause_e {
   F1AP_CAUSE_NOTHING,  /* No components present */
   F1AP_CAUSE_RADIO_NETWORK,
diff --git a/openair2/COMMON/gtpv1_u_messages_def.h b/openair2/COMMON/gtpv1_u_messages_def.h
index 44e9d4fbdf2b2243e48c87b7c52dabaf2a13f72d..e0e5db5b7f72bd0adf45c9175b1fe9f376c4664d 100644
--- a/openair2/COMMON/gtpv1_u_messages_def.h
+++ b/openair2/COMMON/gtpv1_u_messages_def.h
@@ -27,4 +27,5 @@ MESSAGE_DEF(GTPV1U_ENB_END_MARKER_REQ,      MESSAGE_PRIORITY_MED, gtpv1u_enb_end
 MESSAGE_DEF(GTPV1U_ENB_END_MARKER_IND,      MESSAGE_PRIORITY_MED, gtpv1u_enb_end_marker_ind_t,    Gtpv1uEndMarkerInd)
 MESSAGE_DEF(GTPV1U_REQ,                     MESSAGE_PRIORITY_MED, Gtpv1uReq,    gtpv1uReq)
 
-MESSAGE_DEF(GTPV1U_GNB_TUNNEL_DATA_REQ,     MESSAGE_PRIORITY_MED, gtpv1u_gnb_tunnel_data_req_t,    NRGtpv1uTunnelDataReq)
+MESSAGE_DEF(GTPV1U_GNB_TUNNEL_DATA_REQ,          MESSAGE_PRIORITY_MED, gtpv1u_gnb_tunnel_data_req_t,    NRGtpv1uTunnelDataReq)
+MESSAGE_DEF(GTPV1U_DU_BUFFER_REPORT_REQ,     MESSAGE_PRIORITY_MED, gtpv1u_DU_buffer_report_req_t,    NRGtpv1uBufferReportReq)
diff --git a/openair2/COMMON/gtpv1_u_messages_types.h b/openair2/COMMON/gtpv1_u_messages_types.h
index 096f0f4697276ac094d21f861785ffa0e07b5620..7758395ee43fd2274cfbefdf998348c518c4e9f8 100644
--- a/openair2/COMMON/gtpv1_u_messages_types.h
+++ b/openair2/COMMON/gtpv1_u_messages_types.h
@@ -39,6 +39,8 @@
 
 #define GTPV1U_GNB_TUNNEL_DATA_REQ(mSGpTR)    (mSGpTR)->ittiMsg.NRGtpv1uTunnelDataReq
 
+#define GTPV1U_DU_BUFFER_REPORT_REQ(mSGpTR)    (mSGpTR)->ittiMsg.NRGtpv1uBufferReportReq
+
 #define GTPV1U_ALL_TUNNELS_TEID (teid_t)0xFFFFFFFF
 
 typedef struct gtpv1u_enb_create_x2u_tunnel_req_s {
@@ -179,6 +181,7 @@ typedef struct gtpv1u_gnb_create_tunnel_req_s {
   int                    num_tunnels;
   //teid_t                 upf_NGu_teid[NR_GTPV1U_MAX_BEARERS_PER_UE];  ///< Tunnel Endpoint Identifier
   teid_t                 outgoing_teid[NR_GTPV1U_MAX_BEARERS_PER_UE];
+  int outgoing_qfi[NR_GTPV1U_MAX_BEARERS_PER_UE];
   pdusessionid_t         pdusession_id[NR_GTPV1U_MAX_BEARERS_PER_UE];
   ebi_t                  incoming_rb_id[NR_GTPV1U_MAX_BEARERS_PER_UE];
   //ebi_t                  outgoing_rb_id[NR_GTPV1U_MAX_BEARERS_PER_UE];
@@ -213,4 +216,10 @@ typedef struct gtpv1u_gnb_tunnel_data_req_s {
   pdusessionid_t         pdusession_id;
 } gtpv1u_gnb_tunnel_data_req_t;
 
+typedef struct gtpv1u_DU_buffer_report_req_s {
+  uint32_t               buffer_availability;
+  rnti_t                 rnti;
+  pdusessionid_t         pdusession_id;
+} gtpv1u_DU_buffer_report_req_t;
+
 #endif /* GTPV1_U_MESSAGES_TYPES_H_ */
diff --git a/openair2/COMMON/mac_messages_types.h b/openair2/COMMON/mac_messages_types.h
index cad7b9f172b645d0e182f78fc8899fcae3ca6c10..e43d0007e739025e7a104dac9004829e4704b74e 100644
--- a/openair2/COMMON/mac_messages_types.h
+++ b/openair2/COMMON/mac_messages_types.h
@@ -58,7 +58,7 @@
 // Some constants from "LAYER2/MAC/defs.h"
 #define BCCH_SDU_SIZE                           (512)
 #define BCCH_SDU_MBMS_SIZE                      (512)
-#define CCCH_SDU_SIZE                           (512)
+#define CCCH_SDU_SIZE                           (1024)
 #define MCCH_SDU_SIZE                           (512)
 #define PCCH_SDU_SIZE                           (512)
 
diff --git a/openair2/COMMON/mac_rlc_primitives.h b/openair2/COMMON/mac_rlc_primitives.h
index 4e3e22781c5fbb9494c23f271ddfe543bae2be2f..3d6dcc810035471bfc87fb8d97763ce1e427abb8 100644
--- a/openair2/COMMON/mac_rlc_primitives.h
+++ b/openair2/COMMON/mac_rlc_primitives.h
@@ -145,7 +145,7 @@ struct mac_tx_tb_management {
 struct mac_rx_tb_management {
   unsigned char             *data_ptr;
   tb_size_t                  tb_size;      // in bits
-  boolean_t                  valid_checksum;
+  bool                       valid_checksum;
   unsigned char              first_bit;    // 0 if data starts on byte boundary(b7), 1 if b6, 2 if b5, etc
 };
 
diff --git a/openair2/COMMON/platform_types.h b/openair2/COMMON/platform_types.h
index 67300da308b92ed05e7f901ae15436794f675826..f2297219936779186ef88ea245bc0016e6871221 100644
--- a/openair2/COMMON/platform_types.h
+++ b/openair2/COMMON/platform_types.h
@@ -32,35 +32,12 @@
 
 #if !defined(NAS_NETLINK)
 #include <stdint.h>
+#include <stdbool.h>
 #else
 #include <linux/types.h>
 typedef void * intptr_t;
 #endif
 
-//-----------------------------------------------------------------------------
-// GENERIC TYPES
-//-----------------------------------------------------------------------------
-
-/* boolean_t is also defined in openair2/COMMON/commonDef.h,
- * let's protect potential redefinition
- */
-#ifndef _BOOLEAN_T_DEFINED_
-  #define _BOOLEAN_T_DEFINED_
-
-  typedef signed char        boolean_t;
-
-  #if !defined(TRUE)
-    #define TRUE               (boolean_t)0x01
-  #endif
-
-  #if !defined(FALSE)
-    #define FALSE              (boolean_t)0x00
-  #endif
-
-  #define BOOL_NOT(b) (b^TRUE)
-
-#endif /* _BOOLEAN_T_DEFINED_ */
-
 //-----------------------------------------------------------------------------
 // GENERIC ACCESS STRATUM TYPES
 //-----------------------------------------------------------------------------
@@ -77,25 +54,25 @@ typedef int16_t               smodule_id_t;
 typedef long              rb_id_t;
 typedef long              srb_id_t;
 
-typedef boolean_t             MBMS_flag_t;
-#define  MBMS_FLAG_NO         FALSE
-#define  MBMS_FLAG_YES        TRUE
+typedef bool MBMS_flag_t;
+#define MBMS_FLAG_NO  false
+#define MBMS_FLAG_YES true
 
-typedef boolean_t             eNB_flag_t;
-#define  ENB_FLAG_NO          FALSE
-#define  ENB_FLAG_YES         TRUE
+typedef bool eNB_flag_t;
+#define ENB_FLAG_NO  false
+#define ENB_FLAG_YES true
 
-typedef boolean_t             gNB_flag_t;
-#define  GNB_FLAG_NO          FALSE
-#define  GNB_FLAG_YES         TRUE
+typedef bool gNB_flag_t;
+#define GNB_FLAG_NO  false
+#define GNB_FLAG_YES true
 
-typedef boolean_t             srb_flag_t;
-#define  SRB_FLAG_NO          FALSE
-#define  SRB_FLAG_YES         TRUE
+typedef bool srb_flag_t;
+#define SRB_FLAG_NO  false
+#define SRB_FLAG_YES true
 
-typedef boolean_t             sl_discovery_flag_t;
-#define  SL_DISCOVERY_FLAG_NO          FALSE
-#define  SL_DISCOVERY_FLAG_YES         TRUE
+typedef bool sl_discovery_flag_t;
+#define SL_DISCOVERY_FLAG_NO  false
+#define SL_DISCOVERY_FLAG_YES true
 
 typedef enum link_direction_e {
   UNKNOWN_DIR          = 0,
@@ -152,8 +129,8 @@ typedef uint16_t           rlc_usn_t;
 typedef int32_t            rlc_buffer_occupancy_t;
 typedef signed int         rlc_op_status_t;
 
-#define  SDU_CONFIRM_NO          FALSE
-#define  SDU_CONFIRM_YES         TRUE
+#define  SDU_CONFIRM_NO          false
+#define  SDU_CONFIRM_YES         true
 //-----------------------------------------------------------------------------
 // PDCP TYPES
 //-----------------------------------------------------------------------------
@@ -242,7 +219,7 @@ typedef struct protocol_ctxt_s {
   frame_t     frame;         /*!< \brief  LTE frame number.*/
   sub_frame_t subframe;      /*!< \brief  LTE sub frame number.*/
   eNB_index_t eNB_index;     /*!< \brief  valid for UE indicating the index of connected eNB(s)      */
-  boolean_t		brOption;
+  bool        brOption;
 } protocol_ctxt_t;
 // warning time hardcoded
 #define PROTOCOL_CTXT_TIME_MILLI_SECONDS(CtXt_h) ((CtXt_h)->frame*10+(CtXt_h)->subframe)
diff --git a/openair2/COMMON/rrc_messages_types.h b/openair2/COMMON/rrc_messages_types.h
index 5b214cf95a9ce515f04da6ec91e235be43b3711a..18e7c4bd18b08296e2d567eb214e03f3b0d81374 100644
--- a/openair2/COMMON/rrc_messages_types.h
+++ b/openair2/COMMON/rrc_messages_types.h
@@ -167,7 +167,7 @@ typedef struct RadioResourceConfig_s {
   long                    ue_TransmissionMode;
   long                    ue_multiple_max;
   //SIB2 BR Options
-  long       *preambleTransMax_CE_r13;
+  long       preambleTransMax_CE_r13;
   BOOLEAN_t     prach_ConfigCommon_v1310;
   BOOLEAN_t            *mpdcch_startSF_CSS_RA_r13;
   long        mpdcch_startSF_CSS_RA_r13_val;
@@ -417,7 +417,6 @@ typedef struct NRRrcConfigurationReq_s {
   uint8_t                 num_plmn;
   NR_ServingCellConfigCommon_t *scc;
   NR_ServingCellConfig_t  *scd;
-  int                     ssb_SubcarrierOffset;
   int                     sib1_tda;
   rrc_pdsch_AntennaPorts_t pdsch_AntennaPorts;
   int                     pusch_AntennaPorts;
diff --git a/openair2/ENB_APP/enb_config.c b/openair2/ENB_APP/enb_config.c
index f4550f63a15b3e067da94975db420b3c57d221af..00ffd4cc1342776915c8608a364476345c7212f9 100644
--- a/openair2/ENB_APP/enb_config.c
+++ b/openair2/ENB_APP/enb_config.c
@@ -583,9 +583,9 @@ int RCconfig_RRC(uint32_t i, eNB_RRC_INST *rrc, int macrlc_has_f1) {
                              "Failed to parse eNB configuration file %s, enb %u define %s: ENABLE,DISABLE!\n",
                              RC.config_file_name, i, ENB_CONFIG_STRING_PRACH_HIGH_SPEED);
               else if (strcmp(ccparams_lte.prach_high_speed, "ENABLE") == 0) {
-                RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].prach_high_speed = TRUE;
+                RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].prach_high_speed = true;
               } else if (strcmp(ccparams_lte.prach_high_speed, "DISABLE") == 0) {
-                RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].prach_high_speed = FALSE;
+                RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].prach_high_speed = false;
               } else
                 AssertFatal (0,
                              "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for prach_config choice: ENABLE,DISABLE !\n",
@@ -689,9 +689,9 @@ int RCconfig_RRC(uint32_t i, eNB_RRC_INST *rrc, int macrlc_has_f1) {
                              "Failed to parse eNB configuration file %s, enb %u define %s: ENABLE,DISABLE!\n",
                              RC.config_file_name, i, ENB_CONFIG_STRING_PUSCH_ENABLE64QAM);
               else if (strcmp(ccparams_lte.pusch_enable64QAM, "ENABLE") == 0) {
-                RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].pusch_enable64QAM = TRUE;
+                RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].pusch_enable64QAM = true;
               } else if (strcmp(ccparams_lte.pusch_enable64QAM, "DISABLE") == 0) {
-                RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].pusch_enable64QAM = FALSE;
+                RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].pusch_enable64QAM = false;
               } else
                 AssertFatal (0,
                              "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for pusch_enable64QAM choice: ENABLE,DISABLE!\n",
@@ -702,9 +702,9 @@ int RCconfig_RRC(uint32_t i, eNB_RRC_INST *rrc, int macrlc_has_f1) {
                              "Failed to parse eNB configuration file %s, enb %u define %s: ENABLE,DISABLE!\n",
                              RC.config_file_name, i, ENB_CONFIG_STRING_PUSCH_GROUP_HOPPING_EN);
               else if (strcmp(ccparams_lte.pusch_groupHoppingEnabled, "ENABLE") == 0) {
-                RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].pusch_groupHoppingEnabled = TRUE;
+                RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].pusch_groupHoppingEnabled = true;
               } else if (strcmp(ccparams_lte.pusch_groupHoppingEnabled, "DISABLE") == 0) {
-                RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].pusch_groupHoppingEnabled= FALSE;
+                RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].pusch_groupHoppingEnabled= false;
               } else
                 AssertFatal (0,
                              "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for pusch_groupHoppingEnabled choice: ENABLE,DISABLE!\n",
@@ -723,9 +723,9 @@ int RCconfig_RRC(uint32_t i, eNB_RRC_INST *rrc, int macrlc_has_f1) {
                              "Failed to parse eNB configuration file %s, enb %u define %s: ENABLE,DISABLE!\n",
                              RC.config_file_name, i, ENB_CONFIG_STRING_PUSCH_SEQUENCE_HOPPING_EN);
               else if (strcmp(ccparams_lte.pusch_sequenceHoppingEnabled, "ENABLE") == 0) {
-                RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].pusch_sequenceHoppingEnabled = TRUE;
+                RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].pusch_sequenceHoppingEnabled = true;
               } else if (strcmp(ccparams_lte.pusch_sequenceHoppingEnabled, "DISABLE") == 0) {
-                RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].pusch_sequenceHoppingEnabled = FALSE;
+                RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].pusch_sequenceHoppingEnabled = false;
               } else
                 AssertFatal (0,
                              "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for pusch_sequenceHoppingEnabled choice: ENABLE,DISABLE!\n",
@@ -766,15 +766,15 @@ int RCconfig_RRC(uint32_t i, eNB_RRC_INST *rrc, int macrlc_has_f1) {
                      RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].phich_duration,ccparams_lte.phich_duration);
 
               if (strcmp(ccparams_lte.srs_enable, "ENABLE") == 0) {
-                RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].srs_enable= TRUE;
+                RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].srs_enable= true;
               } else if (strcmp(ccparams_lte.srs_enable, "DISABLE") == 0) {
-                RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].srs_enable= FALSE;
+                RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].srs_enable= false;
               } else
                 AssertFatal (0,
                              "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for srs_BandwidthConfig choice: ENABLE,DISABLE !\n",
                              RC.config_file_name, i, ccparams_lte.srs_enable);
 
-              if (RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].srs_enable== TRUE) {
+              if (RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].srs_enable== true) {
                 RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].srs_BandwidthConfig= ccparams_lte.srs_BandwidthConfig;
 
                 if ((ccparams_lte.srs_BandwidthConfig < 0) ||
@@ -791,18 +791,18 @@ int RCconfig_RRC(uint32_t i, eNB_RRC_INST *rrc, int macrlc_has_f1) {
                                RC.config_file_name, i, ccparams_lte.srs_SubframeConfig);
 
                 if (strcmp(ccparams_lte.srs_ackNackST, "ENABLE") == 0) {
-                  RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].srs_ackNackST= TRUE;
+                  RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].srs_ackNackST= true;
                 } else if (strcmp(ccparams_lte.srs_ackNackST, "DISABLE") == 0) {
-                  RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].srs_ackNackST= FALSE;
+                  RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].srs_ackNackST= false;
                 } else
                   AssertFatal (0,
                                "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for srs_BandwidthConfig choice: ENABLE,DISABLE !\n",
                                RC.config_file_name, i, ccparams_lte.srs_ackNackST);
 
                 if (strcmp(ccparams_lte.srs_MaxUpPts, "ENABLE") == 0) {
-                  RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].srs_MaxUpPts= TRUE;
+                  RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].srs_MaxUpPts= true;
                 } else if (strcmp(ccparams_lte.srs_MaxUpPts, "DISABLE") == 0) {
-                  RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].srs_MaxUpPts= FALSE;
+                  RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].srs_MaxUpPts= false;
                 } else
                   AssertFatal (0,
                                "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for srs_MaxUpPts choice: ENABLE,DISABLE !\n",
@@ -921,7 +921,7 @@ int RCconfig_RRC(uint32_t i, eNB_RRC_INST *rrc, int macrlc_has_f1) {
                              RC.config_file_name, i, ccparams_lte.rach_numberOfRA_Preambles);
 
               if (strcmp(ccparams_lte.rach_preamblesGroupAConfig, "ENABLE") == 0) {
-                RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].rach_preamblesGroupAConfig= TRUE;
+                RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].rach_preamblesGroupAConfig= true;
                 RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].rach_sizeOfRA_PreamblesGroupA= (ccparams_lte.rach_sizeOfRA_PreamblesGroupA/4)-1;
 
                 if ((ccparams_lte.rach_numberOfRA_Preambles <4) ||
@@ -976,7 +976,7 @@ int RCconfig_RRC(uint32_t i, eNB_RRC_INST *rrc, int macrlc_has_f1) {
                                "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for rach_messagePowerOffsetGroupB choice: minusinfinity,dB0,dB5,dB8,dB10,dB12,dB15,dB18!\n",
                                RC.config_file_name, i, ccparams_lte.rach_messagePowerOffsetGroupB);
               } else if (strcmp(ccparams_lte.rach_preamblesGroupAConfig, "DISABLE") == 0) {
-                RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].rach_preamblesGroupAConfig= FALSE;
+                RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].rach_preamblesGroupAConfig= false;
               } else
                 AssertFatal (0,
                              "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for rach_preamblesGroupAConfig choice: ENABLE,DISABLE !\n",
@@ -1254,9 +1254,9 @@ int RCconfig_RRC(uint32_t i, eNB_RRC_INST *rrc, int macrlc_has_f1) {
                              "Failed to parse eNB configuration file %s, enb %u define %s: TRUE,FALSE!\n",
                              RC.config_file_name, i, ENB_CONFIG_STRING_MBMS_DEDICATED_SERVING_CELL);
               else if (strcmp(ccparams_lte.mbms_dedicated_serving_cell, "ENABLE") == 0) {
-                RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].mbms_dedicated_serving_cell = TRUE;
+                RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].mbms_dedicated_serving_cell = true;
               } else  if (strcmp(ccparams_lte.mbms_dedicated_serving_cell, "DISABLE") == 0) {
-                RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].mbms_dedicated_serving_cell  = FALSE;
+                RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].mbms_dedicated_serving_cell  = false;
               } else {
                 AssertFatal (0,
                              "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for mbms_dedicated_serving_cell choice: TRUE or FALSE !\n",
diff --git a/openair2/ENB_APP/enb_config_eMTC.c b/openair2/ENB_APP/enb_config_eMTC.c
index cfd057bad8d9abc3755b4dea18e4530d55adece0..e4ff458886b06fe99437de821d834c7a33e090dd 100644
--- a/openair2/ENB_APP/enb_config_eMTC.c
+++ b/openair2/ENB_APP/enb_config_eMTC.c
@@ -61,18 +61,18 @@ void fill_eMTC_configuration(MessageDef *msg_p,  ccparams_eMTC_t *eMTCconfig, in
 
 
   if (!strcmp(eMTCconfig->cellSelectionInfoCE_r13, "ENABLE")) {
-    RRC_CONFIGURATION_REQ(msg_p).cellSelectionInfoCE_r13[cc_idx] = TRUE;
+    RRC_CONFIGURATION_REQ(msg_p).cellSelectionInfoCE_r13[cc_idx] = true;
     RRC_CONFIGURATION_REQ(msg_p).q_RxLevMinCE_r13[cc_idx]= eMTCconfig->q_RxLevMinCE_r13;
     //                            RRC_CONFIGURATION_REQ(msg_p).q_QualMinRSRQ_CE_r13[cc_idx]= calloc(1, sizeof(long));
     //                            *RRC_CONFIGURATION_REQ(msg_p).q_QualMinRSRQ_CE_r13[cc_idx]= q_QualMinRSRQ_CE_r13;
   } else {
-    RRC_CONFIGURATION_REQ(msg_p).cellSelectionInfoCE_r13[cc_idx] = FALSE;
+    RRC_CONFIGURATION_REQ(msg_p).cellSelectionInfoCE_r13[cc_idx] = false;
   }
 
 
 
   if (!strcmp(eMTCconfig->bandwidthReducedAccessRelatedInfo_r13, "ENABLE")) {
-    RRC_CONFIGURATION_REQ(msg_p).bandwidthReducedAccessRelatedInfo_r13[cc_idx] = TRUE;
+    RRC_CONFIGURATION_REQ(msg_p).bandwidthReducedAccessRelatedInfo_r13[cc_idx] = true;
 
 
 
@@ -106,7 +106,7 @@ void fill_eMTC_configuration(MessageDef *msg_p,  ccparams_eMTC_t *eMTCconfig, in
     }
 
   } else {
-    RRC_CONFIGURATION_REQ(msg_p).bandwidthReducedAccessRelatedInfo_r13[cc_idx] = FALSE;
+    RRC_CONFIGURATION_REQ(msg_p).bandwidthReducedAccessRelatedInfo_r13[cc_idx] = false;
   }
 
   char schedulingInfoBrPath[MAX_OPTNAME_SIZE * 2];
@@ -127,10 +127,10 @@ void fill_eMTC_configuration(MessageDef *msg_p,  ccparams_eMTC_t *eMTCconfig, in
 
   RRC_CONFIGURATION_REQ(msg_p).fdd_DownlinkOrTddSubframeBitmapBR_r13[cc_idx] = CALLOC(1, sizeof(BOOLEAN_t));
   if (!strcmp(eMTCconfig->fdd_DownlinkOrTddSubframeBitmapBR_r13, "subframePattern40-r13")) {
-    *RRC_CONFIGURATION_REQ(msg_p).fdd_DownlinkOrTddSubframeBitmapBR_r13[cc_idx] = FALSE;
+    *RRC_CONFIGURATION_REQ(msg_p).fdd_DownlinkOrTddSubframeBitmapBR_r13[cc_idx] = false;
     RRC_CONFIGURATION_REQ(msg_p).fdd_DownlinkOrTddSubframeBitmapBR_val_r13[cc_idx] = eMTCconfig->fdd_DownlinkOrTddSubframeBitmapBR_val_r13;
   } else {
-    *RRC_CONFIGURATION_REQ(msg_p).fdd_DownlinkOrTddSubframeBitmapBR_r13[cc_idx] = TRUE;
+    *RRC_CONFIGURATION_REQ(msg_p).fdd_DownlinkOrTddSubframeBitmapBR_r13[cc_idx] = true;
     RRC_CONFIGURATION_REQ(msg_p).fdd_DownlinkOrTddSubframeBitmapBR_val_r13[cc_idx] = eMTCconfig->fdd_DownlinkOrTddSubframeBitmapBR_val_r13;
   }
 
@@ -156,18 +156,18 @@ void fill_eMTC_configuration(MessageDef *msg_p,  ccparams_eMTC_t *eMTCconfig, in
 
   if (!strcmp(eMTCconfig->freqHoppingParametersDL_r13, "ENABLE"))
     {
-      RRC_CONFIGURATION_REQ(msg_p).freqHoppingParametersDL_r13[cc_idx] = TRUE;
+      RRC_CONFIGURATION_REQ(msg_p).freqHoppingParametersDL_r13[cc_idx] = true;
 
       if (!strcmp(eMTCconfig->interval_DLHoppingConfigCommonModeA_r13, "interval-TDD-r13"))
-	RRC_CONFIGURATION_REQ(msg_p).interval_DLHoppingConfigCommonModeA_r13[cc_idx] = FALSE;
+	RRC_CONFIGURATION_REQ(msg_p).interval_DLHoppingConfigCommonModeA_r13[cc_idx] = false;
       else
-	RRC_CONFIGURATION_REQ(msg_p).interval_DLHoppingConfigCommonModeA_r13[cc_idx] = TRUE;
+	RRC_CONFIGURATION_REQ(msg_p).interval_DLHoppingConfigCommonModeA_r13[cc_idx] = true;
       RRC_CONFIGURATION_REQ(msg_p).interval_DLHoppingConfigCommonModeA_r13_val[cc_idx] = eMTCconfig->interval_DLHoppingConfigCommonModeA_r13_val;
 
       if (!strcmp(eMTCconfig->interval_DLHoppingConfigCommonModeB_r13, "interval-TDD-r13"))
-	RRC_CONFIGURATION_REQ(msg_p).interval_DLHoppingConfigCommonModeB_r13[cc_idx] = FALSE;
+	RRC_CONFIGURATION_REQ(msg_p).interval_DLHoppingConfigCommonModeB_r13[cc_idx] = false;
       else
-	RRC_CONFIGURATION_REQ(msg_p).interval_DLHoppingConfigCommonModeB_r13[cc_idx] = TRUE;
+	RRC_CONFIGURATION_REQ(msg_p).interval_DLHoppingConfigCommonModeB_r13[cc_idx] = true;
       RRC_CONFIGURATION_REQ(msg_p).interval_DLHoppingConfigCommonModeB_r13_val[cc_idx] = eMTCconfig->interval_DLHoppingConfigCommonModeB_r13_val;
 
       RRC_CONFIGURATION_REQ(msg_p).mpdcch_pdsch_HoppingNB_r13[cc_idx] = calloc(1, sizeof(long));
@@ -188,7 +188,7 @@ void fill_eMTC_configuration(MessageDef *msg_p,  ccparams_eMTC_t *eMTCconfig, in
     }
   else
     {
-      RRC_CONFIGURATION_REQ(msg_p).freqHoppingParametersDL_r13[cc_idx] = FALSE;
+      RRC_CONFIGURATION_REQ(msg_p).freqHoppingParametersDL_r13[cc_idx] = false;
     }
 
   /** ------------------------------SIB2/3 BR------------------------------------------ */
@@ -213,9 +213,9 @@ void fill_eMTC_configuration(MessageDef *msg_p,  ccparams_eMTC_t *eMTCconfig, in
 		 "Failed to parse eNB configuration file %s, enb %d define %s: ENABLE,DISABLE!\n",
 		 config_fname, cell_idx,ENB_CONFIG_STRING_PRACH_HIGH_SPEED);
   else if (strcmp(eMTCconfig->ccparams.prach_high_speed, "ENABLE") == 0) {
-    RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].prach_high_speed = TRUE;
+    RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].prach_high_speed = true;
   } else if (strcmp(eMTCconfig->ccparams.prach_high_speed, "DISABLE") == 0) {
-    RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].prach_high_speed = FALSE;
+    RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].prach_high_speed = false;
   } else
     AssertFatal (0,
 		 "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for prach_config choice: ENABLE,DISABLE !\n",
@@ -310,9 +310,9 @@ void fill_eMTC_configuration(MessageDef *msg_p,  ccparams_eMTC_t *eMTCconfig, in
 		 "Failed to parse eNB configuration file %s, enb %d define %s: ENABLE,DISABLE!\n",
 		 config_fname, cell_idx,ENB_CONFIG_STRING_PUSCH_ENABLE64QAM);
   else if (strcmp(eMTCconfig->ccparams.pusch_enable64QAM, "ENABLE") == 0) {
-    RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].pusch_enable64QAM = TRUE;
+    RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].pusch_enable64QAM = true;
   }  else if (strcmp(eMTCconfig->ccparams.pusch_enable64QAM, "DISABLE") == 0) {
-    RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].pusch_enable64QAM = FALSE;
+    RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].pusch_enable64QAM = false;
   } else
     AssertFatal (0,
 		 "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pusch_enable64QAM choice: ENABLE,DISABLE!\n",
@@ -323,9 +323,9 @@ void fill_eMTC_configuration(MessageDef *msg_p,  ccparams_eMTC_t *eMTCconfig, in
 		 "Failed to parse eNB configuration file %s, enb %d define %s: ENABLE,DISABLE!\n",
 		 config_fname, cell_idx,ENB_CONFIG_STRING_PUSCH_GROUP_HOPPING_EN);
   else if (strcmp(eMTCconfig->ccparams.pusch_groupHoppingEnabled, "ENABLE") == 0) {
-    RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].pusch_groupHoppingEnabled = TRUE;
+    RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].pusch_groupHoppingEnabled = true;
   }  else if (strcmp(eMTCconfig->ccparams.pusch_groupHoppingEnabled, "DISABLE") == 0) {
-    RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].pusch_groupHoppingEnabled= FALSE;
+    RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].pusch_groupHoppingEnabled= false;
   } else
     AssertFatal (0,
 		 "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pusch_groupHoppingEnabled choice: ENABLE,DISABLE!\n",
@@ -343,9 +343,9 @@ void fill_eMTC_configuration(MessageDef *msg_p,  ccparams_eMTC_t *eMTCconfig, in
 		 "Failed to parse eNB configuration file %s, enb %d define %s: ENABLE,DISABLE!\n",
 		 config_fname, cell_idx,ENB_CONFIG_STRING_PUSCH_SEQUENCE_HOPPING_EN);
   else if (strcmp(eMTCconfig->ccparams.pusch_sequenceHoppingEnabled, "ENABLE") == 0) {
-    RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].pusch_sequenceHoppingEnabled = TRUE;
+    RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].pusch_sequenceHoppingEnabled = true;
   }  else if (strcmp(eMTCconfig->ccparams.pusch_sequenceHoppingEnabled, "DISABLE") == 0) {
-    RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].pusch_sequenceHoppingEnabled = FALSE;
+    RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].pusch_sequenceHoppingEnabled = false;
   } else
     AssertFatal (0,
 		 "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pusch_sequenceHoppingEnabled choice: ENABLE,DISABLE!\n",
@@ -385,15 +385,15 @@ void fill_eMTC_configuration(MessageDef *msg_p,  ccparams_eMTC_t *eMTCconfig, in
 	 RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].phich_duration,eMTCconfig->ccparams.phich_duration);
 
   if (strcmp(eMTCconfig->ccparams.srs_enable, "ENABLE") == 0) {
-    RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].srs_enable= TRUE;
+    RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].srs_enable= true;
   } else if (strcmp(eMTCconfig->ccparams.srs_enable, "DISABLE") == 0) {
-    RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].srs_enable= FALSE;
+    RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].srs_enable= false;
   } else
     AssertFatal (0,
 		 "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for srs_BandwidthConfig choice: ENABLE,DISABLE !\n",
 		 config_fname, cell_idx,eMTCconfig->ccparams.srs_enable);
 
-  if (RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].srs_enable== TRUE) {
+  if (RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].srs_enable== true) {
     RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].srs_BandwidthConfig= eMTCconfig->ccparams.srs_BandwidthConfig;
 
     if ((eMTCconfig->ccparams.srs_BandwidthConfig < 0) || (eMTCconfig->ccparams.srs_BandwidthConfig >7))
@@ -408,18 +408,18 @@ void fill_eMTC_configuration(MessageDef *msg_p,  ccparams_eMTC_t *eMTCconfig, in
 		   config_fname, cell_idx,eMTCconfig->ccparams.srs_SubframeConfig);
 
     if (strcmp(eMTCconfig->ccparams.srs_ackNackST, "ENABLE") == 0) {
-      RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].srs_ackNackST= TRUE;
+      RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].srs_ackNackST= true;
     } else if (strcmp(eMTCconfig->ccparams.srs_ackNackST, "DISABLE") == 0) {
-      RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].srs_ackNackST= FALSE;
+      RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].srs_ackNackST= false;
     } else
       AssertFatal (0,
 		   "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for srs_BandwidthConfig choice: ENABLE,DISABLE !\n",
 		   config_fname, cell_idx,eMTCconfig->ccparams.srs_ackNackST);
 
     if (strcmp(eMTCconfig->ccparams.srs_MaxUpPts, "ENABLE") == 0) {
-      RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].srs_MaxUpPts= TRUE;
+      RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].srs_MaxUpPts= true;
     } else if (strcmp(eMTCconfig->ccparams.srs_MaxUpPts, "DISABLE") == 0) {
-      RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].srs_MaxUpPts= FALSE;
+      RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].srs_MaxUpPts= false;
     } else
       AssertFatal (0,
 		   "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for srs_MaxUpPts choice: ENABLE,DISABLE !\n",
@@ -535,7 +535,7 @@ void fill_eMTC_configuration(MessageDef *msg_p,  ccparams_eMTC_t *eMTCconfig, in
 		 config_fname, cell_idx,eMTCconfig->ccparams.rach_numberOfRA_Preambles);
 
   if (strcmp(eMTCconfig->ccparams.rach_preamblesGroupAConfig, "ENABLE") == 0) {
-    RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].rach_preamblesGroupAConfig= TRUE;
+    RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].rach_preamblesGroupAConfig= true;
     RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].rach_sizeOfRA_PreamblesGroupA= (eMTCconfig->ccparams.rach_sizeOfRA_PreamblesGroupA/4)-1;
 
     if ((eMTCconfig->ccparams.rach_numberOfRA_Preambles <4) || (eMTCconfig->ccparams.rach_numberOfRA_Preambles>60) || ((eMTCconfig->ccparams.rach_numberOfRA_Preambles&3)!=0))
@@ -588,7 +588,7 @@ void fill_eMTC_configuration(MessageDef *msg_p,  ccparams_eMTC_t *eMTCconfig, in
 		   "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for rach_messagePowerOffsetGroupB choice: minusinfinity,dB0,dB5,dB8,dB10,dB12,dB15,dB18!\n",
 		   config_fname, cell_idx,eMTCconfig->ccparams.rach_messagePowerOffsetGroupB);
   } else if (strcmp(eMTCconfig->ccparams.rach_preamblesGroupAConfig, "DISABLE") == 0) {
-    RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].rach_preamblesGroupAConfig= FALSE;
+    RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].rach_preamblesGroupAConfig= false;
   } else
     AssertFatal (0,
 		 "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for rach_preamblesGroupAConfig choice: ENABLE,DISABLE !\n",
@@ -681,6 +681,58 @@ void fill_eMTC_configuration(MessageDef *msg_p,  ccparams_eMTC_t *eMTCconfig, in
 		 "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_maxHARQ_Msg3Tx choice: 1..8!\n",
 		 config_fname, cell_idx,eMTCconfig->ccparams.rach_maxHARQ_Msg3Tx);
 
+  switch (eMTCconfig->preambleTransMax_CE_r13) {
+  case 3:
+    RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].preambleTransMax_CE_r13=  LTE_PreambleTransMax_n3;
+    break;
+
+  case 4:
+    RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].preambleTransMax_CE_r13=  LTE_PreambleTransMax_n4;
+    break;
+
+  case 5:
+    RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].preambleTransMax_CE_r13=  LTE_PreambleTransMax_n5;
+    break;
+
+  case 6:
+    RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].preambleTransMax_CE_r13=  LTE_PreambleTransMax_n6;
+    break;
+
+  case 7:
+    RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].preambleTransMax_CE_r13=  LTE_PreambleTransMax_n7;
+    break;
+
+  case 8:
+    RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].preambleTransMax_CE_r13=  LTE_PreambleTransMax_n8;
+    break;
+
+  case 10:
+    RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].preambleTransMax_CE_r13=  LTE_PreambleTransMax_n10;
+    break;
+
+  case 20:
+    RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].preambleTransMax_CE_r13=  LTE_PreambleTransMax_n20;
+    break;
+
+  case 50:
+    RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].preambleTransMax_CE_r13=  LTE_PreambleTransMax_n50;
+    break;
+
+  case 100:
+    RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].preambleTransMax_CE_r13=  LTE_PreambleTransMax_n100;
+    break;
+
+  case 200:
+    RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].preambleTransMax_CE_r13=  LTE_PreambleTransMax_n200;
+    break;
+
+  default:
+    AssertFatal (0,
+		 "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_preambleTransMax_CE_r13 choice: 3,4,5,6,7,8,10,20,50,100,200!\n",
+		 config_fname, cell_idx,eMTCconfig->preambleTransMax_CE_r13);
+    break;
+  }
+
   switch (eMTCconfig->ccparams.pcch_defaultPagingCycle) {
   case 32:
     RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].pcch_defaultPagingCycle= LTE_PCCH_Config__defaultPagingCycle_rf32;
@@ -795,14 +847,14 @@ void fill_eMTC_configuration(MessageDef *msg_p,  ccparams_eMTC_t *eMTCconfig, in
 
 
   if (!strcmp(eMTCconfig->prach_ConfigCommon_v1310, "ENABLE")) {
-    RRC_CONFIGURATION_REQ(msg_p).radioresourceconfig_BR[cc_idx].prach_ConfigCommon_v1310 = TRUE;
+    RRC_CONFIGURATION_REQ(msg_p).radioresourceconfig_BR[cc_idx].prach_ConfigCommon_v1310 = true;
 
     RRC_CONFIGURATION_REQ(msg_p).radioresourceconfig_BR[cc_idx].mpdcch_startSF_CSS_RA_r13 = calloc(1, sizeof(BOOLEAN_t));
 
     if (!strcmp(eMTCconfig->mpdcch_startSF_CSS_RA_r13, "tdd-r13")) {
-      *RRC_CONFIGURATION_REQ(msg_p).radioresourceconfig_BR[cc_idx].mpdcch_startSF_CSS_RA_r13 = FALSE;
+      *RRC_CONFIGURATION_REQ(msg_p).radioresourceconfig_BR[cc_idx].mpdcch_startSF_CSS_RA_r13 = false;
     } else {
-      *RRC_CONFIGURATION_REQ(msg_p).radioresourceconfig_BR[cc_idx].mpdcch_startSF_CSS_RA_r13 = TRUE;
+      *RRC_CONFIGURATION_REQ(msg_p).radioresourceconfig_BR[cc_idx].mpdcch_startSF_CSS_RA_r13 = true;
     }
 
     if (!strcmp(eMTCconfig->mpdcch_startSF_CSS_RA_r13_val, "v1")) {
@@ -830,7 +882,7 @@ void fill_eMTC_configuration(MessageDef *msg_p,  ccparams_eMTC_t *eMTCconfig, in
     RRC_CONFIGURATION_REQ(msg_p).radioresourceconfig_BR[cc_idx].prach_HoppingOffset_r13 = calloc(1, sizeof(long));
     *RRC_CONFIGURATION_REQ(msg_p).radioresourceconfig_BR[cc_idx].prach_HoppingOffset_r13 = eMTCconfig->prach_HoppingOffset_r13;
   } else {
-    RRC_CONFIGURATION_REQ(msg_p).radioresourceconfig_BR[cc_idx].prach_ConfigCommon_v1310 = FALSE;
+    RRC_CONFIGURATION_REQ(msg_p).radioresourceconfig_BR[cc_idx].prach_ConfigCommon_v1310 = false;
   }
 
 
@@ -1117,7 +1169,7 @@ void fill_eMTC_configuration(MessageDef *msg_p,  ccparams_eMTC_t *eMTCconfig, in
 
 
   /** PCCH CONFIG V1310 */
-  RRC_CONFIGURATION_REQ(msg_p).pcch_config_v1310[cc_idx] = TRUE;
+  RRC_CONFIGURATION_REQ(msg_p).pcch_config_v1310[cc_idx] = true;
   RRC_CONFIGURATION_REQ(msg_p).paging_narrowbands_r13[cc_idx] = eMTCconfig->paging_narrowbands_r13;
   RRC_CONFIGURATION_REQ(msg_p).mpdcch_numrepetition_paging_r13[cc_idx] = eMTCconfig->mpdcch_numrepetition_paging_r13;
 
@@ -1168,7 +1220,7 @@ void fill_eMTC_configuration(MessageDef *msg_p,  ccparams_eMTC_t *eMTCconfig, in
 
 
   /** SIB2 FREQ HOPPING PARAMETERS R13 */
-  RRC_CONFIGURATION_REQ(msg_p).sib2_freq_hoppingParameters_r13_exists[cc_idx] = TRUE;
+  RRC_CONFIGURATION_REQ(msg_p).sib2_freq_hoppingParameters_r13_exists[cc_idx] = true;
 
   char sib2FreqHoppingParametersR13Path[MAX_OPTNAME_SIZE*2 + 16];
   sprintf(sib2FreqHoppingParametersR13Path, "%s.%s", brparamspath, ENB_CONFIG_STRING_SIB2_FREQ_HOPPINGPARAMETERS_R13);
diff --git a/openair2/ENB_APP/enb_paramdef_emtc.h b/openair2/ENB_APP/enb_paramdef_emtc.h
index de774c4ea694d13c5bc75173072606e95f157594..928c9d22e303c011e41a707dc26499b4ee583cc3 100644
--- a/openair2/ENB_APP/enb_paramdef_emtc.h
+++ b/openair2/ENB_APP/enb_paramdef_emtc.h
@@ -147,7 +147,7 @@ typedef struct ccparams_eMTC_s {
   int            interval_DLHoppingConfigCommonModeA_r13_val;
   int            interval_DLHoppingConfigCommonModeB_r13_val;
   int            mpdcch_pdsch_HoppingOffset_r13;
-  char          *preambleTransMax_CE_r13;
+  int            preambleTransMax_CE_r13;
   int            prach_HoppingOffset_r13;
   int            schedulingInfoSIB1_BR_r13;
   int64_t        fdd_DownlinkOrTddSubframeBitmapBR_val_r13;
@@ -253,7 +253,7 @@ typedef struct ccparams_eMTC_s {
 {ENB_CONFIG_STRING_INTERVAL_DL_HOPPING_CONFIG_COMMON_MODE_B_R13,         NULL,   0,           strptr:&eMTCconfig->interval_DLHoppingConfigCommonModeB_r13,   defstrval:"interval-FDD-r13",      TYPE_STRING,       0}, \
 {ENB_CONFIG_STRING_INTERVAL_DL_HOPPING_CONFIG_COMMON_MODE_B_R13_VAL,     NULL,   0,           iptr:&eMTCconfig->interval_DLHoppingConfigCommonModeB_r13_val, defintval:0,                       TYPE_UINT,         0}, \
 {ENB_CONFIG_STRING_MPDCCH_PDSCH_HOPPING_OFFSET_R13,                      NULL,   0,           iptr:&eMTCconfig->mpdcch_pdsch_HoppingOffset_r13,              defintval:1,                       TYPE_UINT,         0}, \
-{ENB_CONFIG_STRING_PREAMBLE_TRANSMAX_CE_R13,                             NULL,   0,           strptr:&eMTCconfig->preambleTransMax_CE_r13,                   defstrval:"n10",                   TYPE_STRING,       0},  \
+{ENB_CONFIG_STRING_PREAMBLE_TRANSMAX_CE_R13,                             NULL,   0,           iptr:&eMTCconfig->preambleTransMax_CE_r13,                   defintval:10,                   TYPE_UINT,       0},  \
 {ENB_CONFIG_STRING_PUCCH_NUM_REPETITION_CE_MSG4_LEVEL0,                  NULL,   0,           strptr:&eMTCconfig->pucch_NumRepetitionCE_Msg4_Level0_r13,     defstrval:"n1",                    TYPE_STRING,     0}, \
 {ENB_CONFIG_STRING_PUCCH_NUM_REPETITION_CE_MSG4_LEVEL1,                  NULL,   0,           strptr:&eMTCconfig->pucch_NumRepetitionCE_Msg4_Level1_r13,     defstrval:"",                      TYPE_STRING,     0}, \
 {ENB_CONFIG_STRING_PUCCH_NUM_REPETITION_CE_MSG4_LEVEL2,                  NULL,   0,           strptr:&eMTCconfig->pucch_NumRepetitionCE_Msg4_Level2_r13,     defstrval:"",                      TYPE_STRING,     0}, \
diff --git a/openair2/ENB_APP/flexran_agent_ran_api.c b/openair2/ENB_APP/flexran_agent_ran_api.c
index 9926ec9e20639d356b5e1ccdc6cf13b0a5cf83a4..3113c07798168a9aecb1f44218fd9162f39f9362 100644
--- a/openair2/ENB_APP/flexran_agent_ran_api.c
+++ b/openair2/ENB_APP/flexran_agent_ran_api.c
@@ -127,7 +127,7 @@ int flexran_get_mac_ue_id_rnti(mid_t mod_id, rnti_t rnti) {
 
   /* get the (active) UE with RNTI i */
   for (n = 0; n < MAX_MOBILES_PER_ENB; ++n) {
-    if (RC.mac[mod_id]->UE_info.active[n] == TRUE
+    if (RC.mac[mod_id]->UE_info.active[n] == true
         && rnti == UE_RNTI(mod_id, n)) {
       return n;
     }
@@ -143,7 +143,7 @@ int flexran_get_mac_ue_id(mid_t mod_id, int i) {
 
   /* get the (i+1)'th active UE */
   for (n = 0; n < MAX_MOBILES_PER_ENB; ++n) {
-    if (RC.mac[mod_id]->UE_info.active[n] == TRUE) {
+    if (RC.mac[mod_id]->UE_info.active[n] == true) {
       if (i == 0)
         return n;
 
@@ -580,7 +580,7 @@ uint8_t flexran_get_n_SB(mid_t mod_id, uint8_t cc_id) {
 Protocol__FlexQam flexran_get_enable64QAM(mid_t mod_id, uint8_t cc_id) {
   if (!phy_is_present(mod_id, cc_id)) return 0;
 
-  if (RC.eNB[mod_id][cc_id]->frame_parms.pusch_config_common.enable64QAM == TRUE)
+  if (RC.eNB[mod_id][cc_id]->frame_parms.pusch_config_common.enable64QAM == true)
     return PROTOCOL__FLEX_QAM__FLEQ_MOD_64QAM;
   else
     return PROTOCOL__FLEX_QAM__FLEQ_MOD_16QAM;
@@ -3585,7 +3585,7 @@ int flexran_set_new_plmn_id(mid_t mod_id, int CC_id, size_t n_plmn, Protocol__Fl
                          int CC_id,
                          BOOLEAN_t brOption,
                          RrcConfigurationReq *configuration);
-  carrier->sizeof_SIB1 = do_SIB1(carrier, mod_id, CC_id, FALSE, conf);
+  carrier->sizeof_SIB1 = do_SIB1(carrier, mod_id, CC_id, false, conf);
   if (carrier->sizeof_SIB1 < 0)
     return -1337; /* SIB1 encoding failed, hell will probably break loose */
 
diff --git a/openair2/F1AP/dummy_enb.c b/openair2/F1AP/dummy_enb.c
index 9085fdb57cd772eb39319199540f2a22817a94da..8e185c951dffb59b1c88df35a0c0c3975184e43b 100644
--- a/openair2/F1AP/dummy_enb.c
+++ b/openair2/F1AP/dummy_enb.c
@@ -32,18 +32,18 @@ void apply_macrlc_config(gNB_RRC_INST *rrc,
   abort();
 }
 
-boolean_t sdap_data_req(protocol_ctxt_t *ctxt_p,
-                        const srb_flag_t srb_flag,
-                        const rb_id_t rb_id,
-                        const mui_t mui,
-                        const confirm_t confirm,
-                        const sdu_size_t sdu_buffer_size,
-                        unsigned char *const sdu_buffer,
-                        const pdcp_transmission_mode_t pt_mode,
-                        const uint32_t *sourceL2Id,
-                        const uint32_t *destinationL2Id,
-                        const uint8_t qfi,
-                        const boolean_t rqi,
-                        const int pdusession_id) {
+bool sdap_data_req(protocol_ctxt_t *ctxt_p,
+                   const srb_flag_t srb_flag,
+                   const rb_id_t rb_id,
+                   const mui_t mui,
+                   const confirm_t confirm,
+                   const sdu_size_t sdu_buffer_size,
+                   unsigned char *const sdu_buffer,
+                   const pdcp_transmission_mode_t pt_mode,
+                   const uint32_t *sourceL2Id,
+                   const uint32_t *destinationL2Id,
+                   const uint8_t qfi,
+                   const bool rqi,
+                   const int pdusession_id) {
 abort();
 }
diff --git a/openair2/F1AP/f1ap_common.h b/openair2/F1AP/f1ap_common.h
index 66451530a61194479ac98e5f23fb17e78c5cdb60..6b64e1b59e74bbf3c3ac9016d4c3744efba75861 100644
--- a/openair2/F1AP/f1ap_common.h
+++ b/openair2/F1AP/f1ap_common.h
@@ -363,13 +363,6 @@
   # error "You are compiling f1ap with the wrong version of ASN1C"
 #endif
 
-#ifndef FALSE
-  #define FALSE (0)
-#endif
-#ifndef TRUE
-  #define TRUE  (!FALSE)
-#endif
-
 #define F1AP_UE_ID_FMT  "0x%06"PRIX32
 
 #include "assertions.h"
diff --git a/openair2/F1AP/f1ap_cu_task.c b/openair2/F1AP/f1ap_cu_task.c
index b3c7363ca4ac0391e7f5b4f9b52eb96162ff863d..efbc9f2c8b95fbed341505b421174db936069b9b 100644
--- a/openair2/F1AP/f1ap_cu_task.c
+++ b/openair2/F1AP/f1ap_cu_task.c
@@ -180,6 +180,12 @@ void *F1AP_CU_task(void *arg) {
                                          &F1AP_UE_CONTEXT_SETUP_REQ(received_msg));
         break;
 
+      case F1AP_UE_CONTEXT_MODIFICATION_REQ:
+        LOG_I(F1AP, "CU Task received F1AP_UE_CONTEXT_MODIFICATION_REQ\n");
+        CU_send_UE_CONTEXT_MODIFICATION_REQUEST(ITTI_MSG_DESTINATION_INSTANCE(received_msg),
+                                                &F1AP_UE_CONTEXT_MODIFICATION_REQ(received_msg));
+        break;
+
       case F1AP_UE_CONTEXT_RELEASE_CMD: // from rrc
         LOG_I(F1AP, "CU Task Received F1AP_UE_CONTEXT_RELEASE_CMD\n");
         CU_send_UE_CONTEXT_RELEASE_COMMAND(ITTI_MSG_DESTINATION_INSTANCE(received_msg),
diff --git a/openair2/F1AP/f1ap_cu_ue_context_management.c b/openair2/F1AP/f1ap_cu_ue_context_management.c
index c68bfb3852f1119e445a47197c2452f666625be4..0f3959d4ad527c20cde7e999eca9da62f5903a59 100644
--- a/openair2/F1AP/f1ap_cu_ue_context_management.c
+++ b/openair2/F1AP/f1ap_cu_ue_context_management.c
@@ -131,21 +131,30 @@ int CU_send_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
   ie6->criticality                    = F1AP_Criticality_reject;
   ie6->value.present                  = F1AP_UEContextSetupRequestIEs__value_PR_CUtoDURRCInformation;
 
-  /* optional */
-  /* 6.1 cG_ConfigInfo */
-  if (0) {
-    const char cG_ConfigInfoStr[]="asdsa1d32sa1d31asd31as";
-    asn1cCalloc(ie6->value.choice.CUtoDURRCInformation.cG_ConfigInfo, cG_ConfigInfo);
-    OCTET_STRING_fromBuf(cG_ConfigInfo, cG_ConfigInfoStr, strlen( cG_ConfigInfoStr )) ;
+  if (f1ap_ue_context_setup_req->cu_to_du_rrc_information!=NULL) {
+    /* optional */
+    /* 6.1 cG_ConfigInfo */
+    if(f1ap_ue_context_setup_req->cu_to_du_rrc_information->cG_ConfigInfo!=NULL){
+      asn1cCalloc(ie6->value.choice.CUtoDURRCInformation.cG_ConfigInfo, cG_ConfigInfo);
+      OCTET_STRING_fromBuf(cG_ConfigInfo, (const char *)f1ap_ue_context_setup_req->cu_to_du_rrc_information->cG_ConfigInfo,
+        f1ap_ue_context_setup_req->cu_to_du_rrc_information->cG_ConfigInfo_length);
+    }
     /* optional */
     /* 6.2 uE_CapabilityRAT_ContainerList */
-    asn1cCalloc(ie6->value.choice.CUtoDURRCInformation.uE_CapabilityRAT_ContainerList, uE_CapabilityRAT_ContainerList );
-    OCTET_STRING_fromBuf(uE_CapabilityRAT_ContainerList, cG_ConfigInfoStr, strlen( cG_ConfigInfoStr )) ;
+    if(f1ap_ue_context_setup_req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList!=NULL){
+      asn1cCalloc(ie6->value.choice.CUtoDURRCInformation.uE_CapabilityRAT_ContainerList, uE_CapabilityRAT_ContainerList );
+      OCTET_STRING_fromBuf(uE_CapabilityRAT_ContainerList, (const char *)f1ap_ue_context_setup_req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList,
+        f1ap_ue_context_setup_req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList_length);
+    }
     /* optional */
     /* 6.3 measConfig */
-    asn1cCalloc(ie6->value.choice.CUtoDURRCInformation.measConfig,  measConfig);
-    OCTET_STRING_fromBuf(measConfig, cG_ConfigInfoStr, strlen( cG_ConfigInfoStr )) ;
+    if(f1ap_ue_context_setup_req->cu_to_du_rrc_information->measConfig!=NULL){
+      asn1cCalloc(ie6->value.choice.CUtoDURRCInformation.measConfig,  measConfig);
+      OCTET_STRING_fromBuf(measConfig, (const char*)f1ap_ue_context_setup_req->cu_to_du_rrc_information->measConfig,
+        f1ap_ue_context_setup_req->cu_to_du_rrc_information->measConfig_length);
+    }
   }
+  
 
   /* mandatory */
   /* c7. Candidate_SpCell_List */
@@ -238,199 +247,96 @@ int CU_send_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
 
   /* mandatory */
   /* c11. SRBs_ToBeSetup_List */
-  asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupRequestIEs_t, ie11);
-  ie11->id                             = F1AP_ProtocolIE_ID_id_SRBs_ToBeSetup_List;
-  ie11->criticality                    = F1AP_Criticality_reject;  // ?
-  ie11->value.present                  = F1AP_UEContextSetupRequestIEs__value_PR_SRBs_ToBeSetup_List;
-
-  for (int i=0; i<f1ap_ue_context_setup_req->srbs_to_be_setup_length; i++) {
-    //
-    asn1cSequenceAdd(ie11->value.choice.SRBs_ToBeSetup_List.list, F1AP_SRBs_ToBeSetup_ItemIEs_t, srbs_toBeSetup_item_ies);
-    srbs_toBeSetup_item_ies->id            = F1AP_ProtocolIE_ID_id_SRBs_ToBeSetup_Item; // 73
-    srbs_toBeSetup_item_ies->criticality   = F1AP_Criticality_ignore;
-    srbs_toBeSetup_item_ies->value.present = F1AP_SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
-    /* 11.1 SRBs_ToBeSetup_Item */
-    F1AP_SRBs_ToBeSetup_Item_t *srbs_toBeSetup_item=&srbs_toBeSetup_item_ies->value.choice.SRBs_ToBeSetup_Item;
-    /* 11.1.1 sRBID */
-    srbs_toBeSetup_item->sRBID = f1ap_ue_context_setup_req->srbs_to_be_setup[i].srb_id;
-    /* OPTIONAL */
-    /* 11.1.2 duplicationIndication */
-    //if (0) {
-    asn1cCallocOne(srbs_toBeSetup_item->duplicationIndication,
+  if(f1ap_ue_context_setup_req->srbs_to_be_setup_length > 0){
+    asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupRequestIEs_t, ie11);
+    ie11->id                             = F1AP_ProtocolIE_ID_id_SRBs_ToBeSetup_List;
+    ie11->criticality                    = F1AP_Criticality_reject;  // ?
+    ie11->value.present                  = F1AP_UEContextSetupRequestIEs__value_PR_SRBs_ToBeSetup_List;
+
+    for (int i=0; i<f1ap_ue_context_setup_req->srbs_to_be_setup_length; i++) {
+      asn1cSequenceAdd(ie11->value.choice.SRBs_ToBeSetup_List.list, F1AP_SRBs_ToBeSetup_ItemIEs_t, srbs_toBeSetup_item_ies);
+      srbs_toBeSetup_item_ies->id            = F1AP_ProtocolIE_ID_id_SRBs_ToBeSetup_Item; // 73
+      srbs_toBeSetup_item_ies->criticality   = F1AP_Criticality_ignore;
+      srbs_toBeSetup_item_ies->value.present = F1AP_SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
+      /* 11.1 SRBs_ToBeSetup_Item */
+      F1AP_SRBs_ToBeSetup_Item_t *srbs_toBeSetup_item=&srbs_toBeSetup_item_ies->value.choice.SRBs_ToBeSetup_Item;
+      /* 11.1.1 sRBID */
+      srbs_toBeSetup_item->sRBID = f1ap_ue_context_setup_req->srbs_to_be_setup[i].srb_id;
+      /* OPTIONAL */
+      /* 11.1.2 duplicationIndication */
+      asn1cCallocOne(srbs_toBeSetup_item->duplicationIndication,
                    F1AP_DuplicationIndication_true); // enum
-    //}
+    }
   }
 
   /* mandatory */
   /* c12. DRBs_ToBeSetup_List */
-  asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupRequestIEs_t, ie12);
-  ie12->id                             = F1AP_ProtocolIE_ID_id_DRBs_ToBeSetup_List;
-  ie12->criticality                    = F1AP_Criticality_reject;
-  ie12->value.present                  = F1AP_UEContextSetupRequestIEs__value_PR_DRBs_ToBeSetup_List;
-  LOG_I(F1AP, "Length of drbs_to_be_setup: %d \n", f1ap_ue_context_setup_req->drbs_to_be_setup_length);
-
-  for (int i = 0; i < f1ap_ue_context_setup_req->drbs_to_be_setup_length; i++) {
-    //
-    asn1cSequenceAdd(ie12->value.choice.DRBs_ToBeSetup_List.list, F1AP_DRBs_ToBeSetup_ItemIEs_t, drbs_toBeSetup_item_ies);
-    drbs_toBeSetup_item_ies->id            = F1AP_ProtocolIE_ID_id_DRBs_ToBeSetup_Item;
-    drbs_toBeSetup_item_ies->criticality   = F1AP_Criticality_reject;
-    drbs_toBeSetup_item_ies->value.present = F1AP_DRBs_ToBeSetup_ItemIEs__value_PR_DRBs_ToBeSetup_Item;
-    /* 12.1 DRBs_ToBeSetup_Item */
-    F1AP_DRBs_ToBeSetup_Item_t *drbs_toBeSetup_item=&drbs_toBeSetup_item_ies->value.choice.DRBs_ToBeSetup_Item;
-    /* 12.1.1 dRBID */
-    drbs_toBeSetup_item->dRBID = f1ap_ue_context_setup_req->drbs_to_be_setup[i].drb_id; // 9
-    /* 12.1.2 qoSInformation */
-    int some_decide_qos = 0; // BK: Need Check
-
-    if (some_decide_qos) {
-      drbs_toBeSetup_item->qoSInformation.present = F1AP_QoSInformation_PR_eUTRANQoS;
-      /*  12.1.2.1 eUTRANQoS */
-      asn1cCalloc(drbs_toBeSetup_item->qoSInformation.choice.eUTRANQoS, eUTRANQoS);
-      /*  12.1.2.1.1 qCI */
-      eUTRANQoS->qCI = 254L;
-      /*  12.1.2.1.2 allocationAndRetentionPriority */
-      {
-        /*  12.1.2.1.2.1 priorityLevel */
-        eUTRANQoS->allocationAndRetentionPriority.priorityLevel = F1AP_PriorityLevel_highest; // enum
-        /*  12.1.2.1.2.2 pre_emptionCapability */
-        eUTRANQoS->allocationAndRetentionPriority.pre_emptionCapability = F1AP_Pre_emptionCapability_may_trigger_pre_emption; // enum
-        /*  12.1.2.1.2.2 pre_emptionVulnerability */
-        eUTRANQoS->allocationAndRetentionPriority.pre_emptionVulnerability = F1AP_Pre_emptionVulnerability_not_pre_emptable; // enum
-      }
-
-      /* OPTIONAL */
-      /*  12.1.2.1.3 gbrQosInformation */
-      if (0) {
-        eUTRANQoS->gbrQosInformation = (F1AP_GBR_QosInformation_t *)calloc(1, sizeof(F1AP_GBR_QosInformation_t));
-        asn_long2INTEGER(&eUTRANQoS->gbrQosInformation->e_RAB_MaximumBitrateDL, 1L);
-        asn_long2INTEGER(&eUTRANQoS->gbrQosInformation->e_RAB_MaximumBitrateUL, 1L);
-        asn_long2INTEGER(&eUTRANQoS->gbrQosInformation->e_RAB_GuaranteedBitrateDL, 1L);
-        asn_long2INTEGER(&eUTRANQoS->gbrQosInformation->e_RAB_GuaranteedBitrateUL, 1L);
-      }
-    } else {
-      /* 12.1.2 DRB_Information */
-      drbs_toBeSetup_item->qoSInformation.present = F1AP_QoSInformation_PR_choice_extension;
-      F1AP_QoSInformation_ExtIEs_t *ie = (F1AP_QoSInformation_ExtIEs_t *)calloc(1, sizeof(*ie));
-      ie->id                             = F1AP_ProtocolIE_ID_id_DRB_Information;
-      ie->criticality                    = F1AP_Criticality_reject;
-      ie->value.present                  = F1AP_QoSInformation_ExtIEs__value_PR_DRB_Information;
-      F1AP_DRB_Information_t   *DRB_Information = &ie->value.choice.DRB_Information;
-      drbs_toBeSetup_item->qoSInformation.choice.choice_extension = (struct F1AP_ProtocolIE_SingleContainer *)ie;
-      /* 12.1.2.1 dRB_QoS */
-      {
-        /* qoS_Characteristics */
-        {
-          int some_decide_qoS_characteristics = 0; // BK: Need Check
-
-          if (some_decide_qoS_characteristics) {
-            DRB_Information->dRB_QoS.qoS_Characteristics.present = F1AP_QoS_Characteristics_PR_non_Dynamic_5QI;
-            setQos(DRB_Information->dRB_QoS.qoS_Characteristics.choice.non_Dynamic_5QI);
-          } else {
-            DRB_Information->dRB_QoS.qoS_Characteristics.present = F1AP_QoS_Characteristics_PR_dynamic_5QI;
-            asn1cCalloc(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI, tmp);
-            /* qoSPriorityLevel */
-            tmp->qoSPriorityLevel = 1L;
-            /* packetDelayBudget */
-            tmp->packetDelayBudget = 1L;
-            /* packetErrorRate */
-            tmp->packetErrorRate.pER_Scalar = 1L;
-            tmp->packetErrorRate.pER_Exponent = 6L;
-
-            /* OPTIONAL */
-            /* delayCritical */
-            if (0) {
-              asn1cCallocOne(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI->delayCritical, 1L);
-            }
-
-            /* OPTIONAL */
-            /* averagingWindow */
-            if (0) {
-              asn1cCallocOne(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI->averagingWindow, 1L);
-            }
-
-            /* OPTIONAL */
-            /* maxDataBurstVolume */
-            if (0) {
-              asn1cCallocOne(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI->maxDataBurstVolume, 1L);
-            }
-          } // if some_decide_qoS_characteristics
-        } // qoS_Characteristics
-        /* nGRANallocationRetentionPriority */
+  if(f1ap_ue_context_setup_req->drbs_to_be_setup_length){
+    asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupRequestIEs_t, ie12);
+    ie12->id                             = F1AP_ProtocolIE_ID_id_DRBs_ToBeSetup_List;
+    ie12->criticality                    = F1AP_Criticality_reject;
+    ie12->value.present                  = F1AP_UEContextSetupRequestIEs__value_PR_DRBs_ToBeSetup_List;
+    LOG_I(F1AP, "Length of drbs_to_be_setup: %d \n", f1ap_ue_context_setup_req->drbs_to_be_setup_length);
+
+    for (int i = 0; i < f1ap_ue_context_setup_req->drbs_to_be_setup_length; i++) {
+      //
+      asn1cSequenceAdd(ie12->value.choice.DRBs_ToBeSetup_List.list, F1AP_DRBs_ToBeSetup_ItemIEs_t, drbs_toBeSetup_item_ies);
+      drbs_toBeSetup_item_ies->id            = F1AP_ProtocolIE_ID_id_DRBs_ToBeSetup_Item;
+      drbs_toBeSetup_item_ies->criticality   = F1AP_Criticality_reject;
+      drbs_toBeSetup_item_ies->value.present = F1AP_DRBs_ToBeSetup_ItemIEs__value_PR_DRBs_ToBeSetup_Item;
+      /* 12.1 DRBs_ToBeSetup_Item */
+      F1AP_DRBs_ToBeSetup_Item_t *drbs_toBeSetup_item=&drbs_toBeSetup_item_ies->value.choice.DRBs_ToBeSetup_Item;
+      /* 12.1.1 dRBID */
+      drbs_toBeSetup_item->dRBID = f1ap_ue_context_setup_req->drbs_to_be_setup[i].drb_id; // 9
+      /* 12.1.2 qoSInformation */
+      int some_decide_qos = 0; // BK: Need Check
+
+      if (some_decide_qos) {
+        drbs_toBeSetup_item->qoSInformation.present = F1AP_QoSInformation_PR_eUTRANQoS;
+        /*  12.1.2.1 eUTRANQoS */
+        asn1cCalloc(drbs_toBeSetup_item->qoSInformation.choice.eUTRANQoS, eUTRANQoS);
+        /*  12.1.2.1.1 qCI */
+        eUTRANQoS->qCI = 254L;
+        /*  12.1.2.1.2 allocationAndRetentionPriority */
         {
-          DRB_Information->dRB_QoS.nGRANallocationRetentionPriority.priorityLevel = F1AP_PriorityLevel_highest; // enum
-          DRB_Information->dRB_QoS.nGRANallocationRetentionPriority.pre_emptionCapability = F1AP_Pre_emptionCapability_shall_not_trigger_pre_emption; // enum
-          DRB_Information->dRB_QoS.nGRANallocationRetentionPriority.pre_emptionVulnerability = F1AP_Pre_emptionVulnerability_not_pre_emptable; // enum
-        } // nGRANallocationRetentionPriority
-
-        /* OPTIONAL */
-        /* gBR_QoS_Flow_Information */
-        if (0) {
-          asn1cCalloc(DRB_Information->dRB_QoS.gBR_QoS_Flow_Information, tmp);
-          asn_long2INTEGER(&tmp->maxFlowBitRateDownlink, 1L);
-          asn_long2INTEGER(&tmp->maxFlowBitRateUplink, 1L);
-          asn_long2INTEGER(&tmp->guaranteedFlowBitRateDownlink, 1L);
-          asn_long2INTEGER(&tmp->guaranteedFlowBitRateUplink, 1L);
-
-          /* OPTIONAL */
-          /* maxPacketLossRateDownlink */
-          if (0) {
-            asn1cCallocOne(DRB_Information->dRB_QoS.gBR_QoS_Flow_Information->maxPacketLossRateDownlink, 1L);
-          }
-
-          /* OPTIONAL */
-          /* maxPacketLossRateUplink */
-          if (0) {
-            asn1cCallocOne(DRB_Information->dRB_QoS.gBR_QoS_Flow_Information->maxPacketLossRateUplink, 1L);
-          }
+          /*  12.1.2.1.2.1 priorityLevel */
+          eUTRANQoS->allocationAndRetentionPriority.priorityLevel = F1AP_PriorityLevel_highest; // enum
+          /*  12.1.2.1.2.2 pre_emptionCapability */
+          eUTRANQoS->allocationAndRetentionPriority.pre_emptionCapability = F1AP_Pre_emptionCapability_may_trigger_pre_emption; // enum
+          /*  12.1.2.1.2.2 pre_emptionVulnerability */
+          eUTRANQoS->allocationAndRetentionPriority.pre_emptionVulnerability = F1AP_Pre_emptionVulnerability_not_pre_emptable; // enum
         }
 
         /* OPTIONAL */
-        /* reflective_QoS_Attribute */
+        /*  12.1.2.1.3 gbrQosInformation */
         if (0) {
-          asn1cCallocOne(DRB_Information->dRB_QoS.reflective_QoS_Attribute, 1L);
+          eUTRANQoS->gbrQosInformation = (F1AP_GBR_QosInformation_t *)calloc(1, sizeof(F1AP_GBR_QosInformation_t));
+          asn_long2INTEGER(&eUTRANQoS->gbrQosInformation->e_RAB_MaximumBitrateDL, 1L);
+          asn_long2INTEGER(&eUTRANQoS->gbrQosInformation->e_RAB_MaximumBitrateUL, 1L);
+          asn_long2INTEGER(&eUTRANQoS->gbrQosInformation->e_RAB_GuaranteedBitrateDL, 1L);
+          asn_long2INTEGER(&eUTRANQoS->gbrQosInformation->e_RAB_GuaranteedBitrateUL, 1L);
         }
-      } // dRB_QoS
-      /* 12.1.2.2 sNSSAI */
-      {
-        /* sST */
-        OCTET_STRING_fromBuf(&DRB_Information->sNSSAI.sST, "1", 1);
-
-        /* OPTIONAL */
-        /* sD */
-        if (0) {
-          asn1cCalloc(DRB_Information->sNSSAI.sD, tmp);
-          OCTET_STRING_fromBuf(tmp, "asdsa1d32sa1d31asd31as",
-                               strlen("asdsa1d32sa1d31asd31as"));
-        }
-      }
-
-      /* OPTIONAL */
-      /* 12.1.2.3 notificationControl */
-      if (0) {
-        asn1cCallocOne(DRB_Information->notificationControl,
-                       F1AP_NotificationControl_active); // enum
-      }
-
-      /* 12.1.2.4 flows_Mapped_To_DRB_List */  // BK: need verifiy
-
-      for (int k = 0; k < 1; k ++) {
-        asn1cSequenceAdd(DRB_Information->flows_Mapped_To_DRB_List.list,
-                         F1AP_Flows_Mapped_To_DRB_Item_t, flows_mapped_to_drb_item);
-        /* qoSFlowIndicator */
-        flows_mapped_to_drb_item->qoSFlowIdentifier = 1L;
-        /* qoSFlowLevelQoSParameters */
+      } else {
+        /* 12.1.2 DRB_Information */
+        drbs_toBeSetup_item->qoSInformation.present = F1AP_QoSInformation_PR_choice_extension;
+        F1AP_QoSInformation_ExtIEs_t *ie = (F1AP_QoSInformation_ExtIEs_t *)calloc(1, sizeof(*ie));
+        ie->id                             = F1AP_ProtocolIE_ID_id_DRB_Information;
+        ie->criticality                    = F1AP_Criticality_reject;
+        ie->value.present                  = F1AP_QoSInformation_ExtIEs__value_PR_DRB_Information;
+        F1AP_DRB_Information_t   *DRB_Information = &ie->value.choice.DRB_Information;
+        drbs_toBeSetup_item->qoSInformation.choice.choice_extension = (struct F1AP_ProtocolIE_SingleContainer *)ie;
+        /* 12.1.2.1 dRB_QoS */
         {
           /* qoS_Characteristics */
           {
             int some_decide_qoS_characteristics = 0; // BK: Need Check
-            F1AP_QoS_Characteristics_t *QosParams=&flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.qoS_Characteristics;
 
             if (some_decide_qoS_characteristics) {
-              QosParams->present = F1AP_QoS_Characteristics_PR_non_Dynamic_5QI;
-              setQos(QosParams->choice.non_Dynamic_5QI);
+              DRB_Information->dRB_QoS.qoS_Characteristics.present = F1AP_QoS_Characteristics_PR_non_Dynamic_5QI;
+              setQos(DRB_Information->dRB_QoS.qoS_Characteristics.choice.non_Dynamic_5QI);
             } else {
-              QosParams->present = F1AP_QoS_Characteristics_PR_dynamic_5QI;
-              asn1cCalloc(QosParams->choice.dynamic_5QI, tmp);
+              DRB_Information->dRB_QoS.qoS_Characteristics.present = F1AP_QoS_Characteristics_PR_dynamic_5QI;
+              asn1cCalloc(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI, tmp);
               /* qoSPriorityLevel */
               tmp->qoSPriorityLevel = 1L;
               /* packetDelayBudget */
@@ -442,36 +348,33 @@ int CU_send_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
               /* OPTIONAL */
               /* delayCritical */
               if (0) {
-                asn1cCalloc(QosParams->choice.dynamic_5QI->delayCritical, tmp);
-                *tmp = 1L;
+                asn1cCallocOne(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI->delayCritical, 1L);
               }
 
               /* OPTIONAL */
               /* averagingWindow */
               if (0) {
-                asn1cCalloc(QosParams->choice.dynamic_5QI->averagingWindow, tmp);
-                *tmp = 1L;
+                asn1cCallocOne(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI->averagingWindow, 1L);
               }
 
               /* OPTIONAL */
               /* maxDataBurstVolume */
               if (0) {
-                asn1cCalloc(QosParams->choice.dynamic_5QI->maxDataBurstVolume, tmp);
-                *tmp= 1L;
+                asn1cCallocOne(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI->maxDataBurstVolume, 1L);
               }
             } // if some_decide_qoS_characteristics
           } // qoS_Characteristics
           /* nGRANallocationRetentionPriority */
           {
-            flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.nGRANallocationRetentionPriority.priorityLevel = F1AP_PriorityLevel_highest; // enum
-            flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.nGRANallocationRetentionPriority.pre_emptionCapability = F1AP_Pre_emptionCapability_shall_not_trigger_pre_emption; // enum
-            flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.nGRANallocationRetentionPriority.pre_emptionVulnerability = F1AP_Pre_emptionVulnerability_not_pre_emptable; // enum
+            DRB_Information->dRB_QoS.nGRANallocationRetentionPriority.priorityLevel = F1AP_PriorityLevel_highest; // enum
+            DRB_Information->dRB_QoS.nGRANallocationRetentionPriority.pre_emptionCapability = F1AP_Pre_emptionCapability_shall_not_trigger_pre_emption; // enum
+            DRB_Information->dRB_QoS.nGRANallocationRetentionPriority.pre_emptionVulnerability = F1AP_Pre_emptionVulnerability_not_pre_emptable; // enum
           } // nGRANallocationRetentionPriority
 
           /* OPTIONAL */
           /* gBR_QoS_Flow_Information */
           if (0) {
-            asn1cCalloc(flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.gBR_QoS_Flow_Information, tmp);
+            asn1cCalloc(DRB_Information->dRB_QoS.gBR_QoS_Flow_Information, tmp);
             asn_long2INTEGER(&tmp->maxFlowBitRateDownlink, 1L);
             asn_long2INTEGER(&tmp->maxFlowBitRateUplink, 1L);
             asn_long2INTEGER(&tmp->guaranteedFlowBitRateDownlink, 1L);
@@ -480,80 +383,186 @@ int CU_send_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
             /* OPTIONAL */
             /* maxPacketLossRateDownlink */
             if (0) {
-              asn1cCallocOne(flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.gBR_QoS_Flow_Information->maxPacketLossRateDownlink, 1L);
+              asn1cCallocOne(DRB_Information->dRB_QoS.gBR_QoS_Flow_Information->maxPacketLossRateDownlink, 1L);
             }
 
             /* OPTIONAL */
             /* maxPacketLossRateUplink */
             if (0) {
-              asn1cCallocOne(flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.gBR_QoS_Flow_Information->maxPacketLossRateUplink, 1L);
+              asn1cCallocOne(DRB_Information->dRB_QoS.gBR_QoS_Flow_Information->maxPacketLossRateUplink, 1L);
             }
           }
 
           /* OPTIONAL */
           /* reflective_QoS_Attribute */
           if (0) {
-            asn1cCallocOne(flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.reflective_QoS_Attribute, 1L);
+            asn1cCallocOne(DRB_Information->dRB_QoS.reflective_QoS_Attribute, 1L);
           }
-        } // qoSFlowLevelQoSParameters
-      }
-    } // if some_decide_qos
-
-    /* 12.1.3 uLUPTNLInformation_ToBeSetup_List */
-    for (int j = 0; j < f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_ul_tnl_length; j++) {
-      /* Here the callback function used as input is not the right one. Need to create a new one probably for F1-U, not sure
-       * if the kind of input parameters to the callback function are convenient though for gtp-u over F1-U.*/
-      //Use a dummy teid for the outgoing GTP-U tunnel (DU) which will be updated once we get the UE context setup response from the DU
-      transport_layer_addr_t addr;
-      int sz=sizeof(f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_dl_tnl[0].tl_address);
-      memcpy(addr.buffer,&f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_dl_tnl[0].tl_address, sz);
-      addr.length = sz*8;
-      f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_ul_tnl[j].teid=
-        newGtpuCreateTunnel(getCxt(CUtype, instance)->gtpInst,
-                            f1ap_ue_context_setup_req->rnti,
-                            f1ap_ue_context_setup_req->drbs_to_be_setup[i].drb_id,
-                            f1ap_ue_context_setup_req->drbs_to_be_setup[i].drb_id,
-                            0xFFFF, // We will set the right value from DU answer
-                            addr,
-                            f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_dl_tnl[0].port,
-                            cu_f1u_data_req);
-      /*  12.3.1 ULTunnels_ToBeSetup_Item */
-      asn1cSequenceAdd(drbs_toBeSetup_item->uLUPTNLInformation_ToBeSetup_List.list,
-                       F1AP_ULUPTNLInformation_ToBeSetup_Item_t, uLUPTNLInformation_ToBeSetup_Item);
-      uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.present = F1AP_UPTransportLayerInformation_PR_gTPTunnel;
-      asn1cCalloc( uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.choice.gTPTunnel,
-                   gTPTunnel);
-      /* 12.3.1.1.1 transportLayerAddress */
-      TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_ul_tnl[j].tl_address,
+        } // dRB_QoS
+        /* 12.1.2.2 sNSSAI */
+        {
+          /* sST */
+          OCTET_STRING_fromBuf(&DRB_Information->sNSSAI.sST, "1", 1);
+
+          /* OPTIONAL */
+          /* sD */
+          if (0) {
+            asn1cCalloc(DRB_Information->sNSSAI.sD, tmp);
+            OCTET_STRING_fromBuf(tmp, "asdsa1d32sa1d31asd31as",
+                               strlen("asdsa1d32sa1d31asd31as"));
+          }
+        }
+
+        /* OPTIONAL */
+        /* 12.1.2.3 notificationControl */
+        if (0) {
+          asn1cCallocOne(DRB_Information->notificationControl,
+            F1AP_NotificationControl_active); // enum
+        }
+
+        /* 12.1.2.4 flows_Mapped_To_DRB_List */  // BK: need verifiy
+
+        for (int k = 0; k < 1; k ++) {
+          asn1cSequenceAdd(DRB_Information->flows_Mapped_To_DRB_List.list,
+            F1AP_Flows_Mapped_To_DRB_Item_t, flows_mapped_to_drb_item);
+          /* qoSFlowIndicator */
+          flows_mapped_to_drb_item->qoSFlowIdentifier = 1L;
+          /* qoSFlowLevelQoSParameters */
+          {
+            /* qoS_Characteristics */
+            {
+              int some_decide_qoS_characteristics = 0; // BK: Need Check
+              F1AP_QoS_Characteristics_t *QosParams=&flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.qoS_Characteristics;
+
+              if (some_decide_qoS_characteristics) {
+                QosParams->present = F1AP_QoS_Characteristics_PR_non_Dynamic_5QI;
+                setQos(QosParams->choice.non_Dynamic_5QI);
+              } else {
+                QosParams->present = F1AP_QoS_Characteristics_PR_dynamic_5QI;
+                asn1cCalloc(QosParams->choice.dynamic_5QI, tmp);
+                /* qoSPriorityLevel */
+                tmp->qoSPriorityLevel = 1L;
+                /* packetDelayBudget */
+                tmp->packetDelayBudget = 1L;
+                /* packetErrorRate */
+                tmp->packetErrorRate.pER_Scalar = 1L;
+                tmp->packetErrorRate.pER_Exponent = 6L;
+
+                /* OPTIONAL */
+                /* delayCritical */
+                if (0) {
+                  asn1cCalloc(QosParams->choice.dynamic_5QI->delayCritical, tmp);
+                  *tmp = 1L;
+                }
+
+                /* OPTIONAL */
+                /* averagingWindow */
+                if (0) {
+                  asn1cCalloc(QosParams->choice.dynamic_5QI->averagingWindow, tmp);
+                  *tmp = 1L;
+                }
+
+                /* OPTIONAL */
+                /* maxDataBurstVolume */
+                if (0) {
+                  asn1cCalloc(QosParams->choice.dynamic_5QI->maxDataBurstVolume, tmp);
+                  *tmp= 1L;
+                }
+              } // if some_decide_qoS_characteristics
+            } // qoS_Characteristics
+            /* nGRANallocationRetentionPriority */
+            {
+              flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.nGRANallocationRetentionPriority.priorityLevel = F1AP_PriorityLevel_highest; // enum
+              flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.nGRANallocationRetentionPriority.pre_emptionCapability = F1AP_Pre_emptionCapability_shall_not_trigger_pre_emption; // enum
+              flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.nGRANallocationRetentionPriority.pre_emptionVulnerability = F1AP_Pre_emptionVulnerability_not_pre_emptable; // enum
+            } // nGRANallocationRetentionPriority
+
+            /* OPTIONAL */
+            /* gBR_QoS_Flow_Information */
+            if (0) {
+              asn1cCalloc(flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.gBR_QoS_Flow_Information, tmp);
+              asn_long2INTEGER(&tmp->maxFlowBitRateDownlink, 1L);
+              asn_long2INTEGER(&tmp->maxFlowBitRateUplink, 1L);
+              asn_long2INTEGER(&tmp->guaranteedFlowBitRateDownlink, 1L);
+              asn_long2INTEGER(&tmp->guaranteedFlowBitRateUplink, 1L);
+
+              /* OPTIONAL */
+              /* maxPacketLossRateDownlink */
+              if (0) {
+                asn1cCallocOne(flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.gBR_QoS_Flow_Information->maxPacketLossRateDownlink, 1L);
+              }
+
+              /* OPTIONAL */
+              /* maxPacketLossRateUplink */
+              if (0) {
+                asn1cCallocOne(flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.gBR_QoS_Flow_Information->maxPacketLossRateUplink, 1L);
+              }
+            }
+
+            /* OPTIONAL */
+            /* reflective_QoS_Attribute */
+            if (0) {
+              asn1cCallocOne(flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.reflective_QoS_Attribute, 1L);
+            }
+          } // qoSFlowLevelQoSParameters
+        }
+      } // if some_decide_qos
+
+      /* 12.1.3 uLUPTNLInformation_ToBeSetup_List */
+      for (int j = 0; j < f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_ul_tnl_length; j++) {
+        /*Use a dummy teid for the outgoing GTP-U tunnel (DU) which will be updated once we get the UE context setup response from the DU*/
+        transport_layer_addr_t addr;
+        int sz=sizeof(f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_dl_tnl[0].tl_address);
+        memcpy(addr.buffer,&f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_dl_tnl[0].tl_address, sz);
+        addr.length = sz*8;
+        f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_ul_tnl[j].teid = newGtpuCreateTunnel(getCxt(CUtype, instance)->gtpInst,
+                                                                                               f1ap_ue_context_setup_req->rnti,
+                                                                                               f1ap_ue_context_setup_req->drbs_to_be_setup[i].drb_id,
+                                                                                               f1ap_ue_context_setup_req->drbs_to_be_setup[i].drb_id,
+                                                                                               0xFFFF, // We will set the right value from DU answer
+                                                                                               -1, // no qfi
+                                                                                               addr,
+                                                                                               f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_dl_tnl[0].port,
+                                                                                               cu_f1u_data_req,
+                                                                                               NULL);
+        /*  12.3.1 ULTunnels_ToBeSetup_Item */
+        asn1cSequenceAdd(drbs_toBeSetup_item->uLUPTNLInformation_ToBeSetup_List.list,
+          F1AP_ULUPTNLInformation_ToBeSetup_Item_t, uLUPTNLInformation_ToBeSetup_Item);
+        uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.present = F1AP_UPTransportLayerInformation_PR_gTPTunnel;
+        asn1cCalloc( uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.choice.gTPTunnel,
+          gTPTunnel);
+        /* 12.3.1.1.1 transportLayerAddress */
+        TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_ul_tnl[j].tl_address,
           &gTPTunnel->transportLayerAddress);
-      /* 12.3.1.1.2 gTP_TEID */
-      INT32_TO_OCTET_STRING(f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_ul_tnl[j].teid,
-                            &gTPTunnel->gTP_TEID);
-    }
+        /* 12.3.1.1.2 gTP_TEID */
+        INT32_TO_OCTET_STRING(f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_ul_tnl[j].teid,
+          &gTPTunnel->gTP_TEID);
+      }
 
-    /* 12.1.4 rLCMode */
-    /* TODO use rlc_mode from f1ap_drb_to_be_setup */
-    switch (f1ap_ue_context_setup_req->drbs_to_be_setup[i].rlc_mode) {
-      case RLC_MODE_AM:
-        drbs_toBeSetup_item->rLCMode = F1AP_RLCMode_rlc_am;
-        break;
+      /* 12.1.4 rLCMode */
+      /* TODO use rlc_mode from f1ap_drb_to_be_setup */
+      switch (f1ap_ue_context_setup_req->drbs_to_be_setup[i].rlc_mode) {
+        case RLC_MODE_AM:
+          drbs_toBeSetup_item->rLCMode = F1AP_RLCMode_rlc_am;
+          break;
 
-      default:
-        drbs_toBeSetup_item->rLCMode = F1AP_RLCMode_rlc_um_bidirectional;
-    }
+        default:
+          drbs_toBeSetup_item->rLCMode = F1AP_RLCMode_rlc_um_bidirectional;
+      }
 
-    /* OPTIONAL */
-    /* 12.1.5 ULConfiguration */
-    if (0) {
-      asn1cCalloc(drbs_toBeSetup_item->uLConfiguration, tmp);
-      tmp->uLUEConfiguration = F1AP_ULUEConfiguration_no_data;
-    }
+      /* OPTIONAL */
+      /* 12.1.5 ULConfiguration */
+      if (0) {
+        asn1cCalloc(drbs_toBeSetup_item->uLConfiguration, tmp);
+        tmp->uLUEConfiguration = F1AP_ULUEConfiguration_no_data;
+      }
 
-    /* OPTIONAL */
-    /* 12.1.6 duplicationActivation */
-    if (0) {
-      asn1cCalloc(drbs_toBeSetup_item->duplicationActivation, tmp);
-      *tmp = F1AP_DuplicationActivation_active;  // enum
+      /* OPTIONAL */
+      /* 12.1.6 duplicationActivation */
+      if (0) {
+        asn1cCalloc(drbs_toBeSetup_item->duplicationActivation, tmp);
+        *tmp = F1AP_DuplicationActivation_active;  // enum
+      }
     }
   }
 
@@ -662,9 +671,10 @@ int CU_handle_UE_CONTEXT_SETUP_RESPONSE(instance_t       instance,
     return -1;
   }
 
-  f1ap_ue_context_setup_resp->du_to_cu_rrc_information = (uint8_t *)calloc(1,ie->value.choice.DUtoCURRCInformation.cellGroupConfig.size);
-  memcpy(f1ap_ue_context_setup_resp->du_to_cu_rrc_information, ie->value.choice.DUtoCURRCInformation.cellGroupConfig.buf, ie->value.choice.DUtoCURRCInformation.cellGroupConfig.size);
-  f1ap_ue_context_setup_resp->du_to_cu_rrc_information_length = ie->value.choice.DUtoCURRCInformation.cellGroupConfig.size;
+  f1ap_ue_context_setup_resp->du_to_cu_rrc_information = (du_to_cu_rrc_information_t *)calloc(1,sizeof(du_to_cu_rrc_information_t));
+  f1ap_ue_context_setup_resp->du_to_cu_rrc_information->cellGroupConfig = (uint8_t *)calloc(1,ie->value.choice.DUtoCURRCInformation.cellGroupConfig.size);
+  memcpy(f1ap_ue_context_setup_resp->du_to_cu_rrc_information->cellGroupConfig, ie->value.choice.DUtoCURRCInformation.cellGroupConfig.buf, ie->value.choice.DUtoCURRCInformation.cellGroupConfig.size);
+  f1ap_ue_context_setup_resp->du_to_cu_rrc_information->cellGroupConfig_length = ie->value.choice.DUtoCURRCInformation.cellGroupConfig.size;
   // DRBs_Setup_List
   F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextSetupResponseIEs_t, ie, container,
                              F1AP_ProtocolIE_ID_id_DRBs_Setup_List, false);
@@ -896,12 +906,14 @@ int CU_send_UE_CONTEXT_RELEASE_COMMAND(instance_t instance,
 
   /* optional */
   /* c4. RRCContainer */
-  asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextReleaseCommandIEs_t, ie4);
-  ie4->id                             = F1AP_ProtocolIE_ID_id_RRCContainer;
-  ie4->criticality                    = F1AP_Criticality_ignore;
-  ie4->value.present                  = F1AP_UEContextReleaseCommandIEs__value_PR_RRCContainer;
-  OCTET_STRING_fromBuf(&ie4->value.choice.RRCContainer, (const char *)cmd->rrc_container,
+  if(cmd->rrc_container!=NULL){
+    asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextReleaseCommandIEs_t, ie4);
+    ie4->id                             = F1AP_ProtocolIE_ID_id_RRCContainer;
+    ie4->criticality                    = F1AP_Criticality_ignore;
+    ie4->value.present                  = F1AP_UEContextReleaseCommandIEs__value_PR_RRCContainer;
+    OCTET_STRING_fromBuf(&ie4->value.choice.RRCContainer, (const char *)cmd->rrc_container,
                        cmd->rrc_container_length);
+  }
 
   /* encode */
   if (f1ap_encode_pdu(&pdu, &buffer, &len) < 0) {
@@ -1008,7 +1020,7 @@ int CU_handle_UE_CONTEXT_RELEASE_COMPLETE(instance_t       instance,
   return 0;
 }
 //void CU_send_UE_CONTEXT_MODIFICATION_REQUEST(F1AP_UEContextModificationRequest_t *UEContextModificationRequest) {
-int CU_send_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance) {
+int CU_send_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance, f1ap_ue_context_setup_t *f1ap_ue_context_modification_req) {
   F1AP_F1AP_PDU_t                        pdu= {0};
   F1AP_UEContextModificationRequest_t    *out;
   uint8_t  *buffer=NULL;
@@ -1029,14 +1041,14 @@ int CU_send_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance) {
   ie1->id                             = F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
   ie1->criticality                    = F1AP_Criticality_reject;
   ie1->value.present                  = F1AP_UEContextModificationRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
-  ie1->value.choice.GNB_CU_UE_F1AP_ID = 126L;
+  ie1->value.choice.GNB_CU_UE_F1AP_ID = f1ap_get_cu_ue_f1ap_id(CUtype, instance, f1ap_ue_context_modification_req->rnti);;
   /* mandatory */
   /* c2. GNB_DU_UE_F1AP_ID */
   asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie2);
   ie2->id                             = F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
   ie2->criticality                    = F1AP_Criticality_reject;
   ie2->value.present                  = F1AP_UEContextModificationRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
-  ie2->value.choice.GNB_DU_UE_F1AP_ID = 651L;
+  ie2->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(CUtype, instance, f1ap_ue_context_modification_req->rnti);;
 
   /* optional */
   /* c3. NRCGI */
@@ -1049,13 +1061,15 @@ int CU_send_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance) {
     addnRCGI(ie3->value.choice.NRCGI, &hardCoded);
   }
 
-  /* mandatory */
+  /* optional */
   /* c4. ServCellIndex */
-  asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie4);
-  ie4->id                             = F1AP_ProtocolIE_ID_id_ServCellIndex;
-  ie4->criticality                    = F1AP_Criticality_reject;
-  ie4->value.present                  = F1AP_UEContextModificationRequestIEs__value_PR_ServCellIndex;
-  ie4->value.choice.ServCellIndex     = 5L;
+  if(0){
+    asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie4);
+    ie4->id                             = F1AP_ProtocolIE_ID_id_ServCellIndex;
+    ie4->criticality                    = F1AP_Criticality_reject;
+    ie4->value.present                  = F1AP_UEContextModificationRequestIEs__value_PR_ServCellIndex;
+    ie4->value.choice.ServCellIndex     = 5L;
+  }
 
   /* optional */
   /* c5. DRXCycle */
@@ -1077,47 +1091,58 @@ int CU_send_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance) {
   }
 
   /* optional */
-  /* c5. CUtoDURRCInformation */
-  if (1) {
-    asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie5);
-    ie5->id                             = F1AP_ProtocolIE_ID_id_CUtoDURRCInformation;
-    ie5->criticality                    = F1AP_Criticality_reject;
-    ie5->value.present                  = F1AP_UEContextModificationRequestIEs__value_PR_CUtoDURRCInformation;
-    asn1cCalloc(ie5->value.choice.CUtoDURRCInformation.cG_ConfigInfo, tmp);
+  /* c6. CUtoDURRCInformation */
+  if (f1ap_ue_context_modification_req->cu_to_du_rrc_information!=NULL) {
+    asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie6);
+    ie6->id                             = F1AP_ProtocolIE_ID_id_CUtoDURRCInformation;
+    ie6->criticality                    = F1AP_Criticality_reject;
+    ie6->value.present                  = F1AP_UEContextModificationRequestIEs__value_PR_CUtoDURRCInformation;
+    /* 6.1 cG_ConfigInfo */
+    if(f1ap_ue_context_modification_req->cu_to_du_rrc_information->cG_ConfigInfo!=NULL){
+      asn1cCalloc(ie6->value.choice.CUtoDURRCInformation.cG_ConfigInfo, cG_ConfigInfo);
+      OCTET_STRING_fromBuf(cG_ConfigInfo, (const char *)f1ap_ue_context_modification_req->cu_to_du_rrc_information->cG_ConfigInfo,
+        f1ap_ue_context_modification_req->cu_to_du_rrc_information->cG_ConfigInfo_length);
+    }
     /* optional */
-    OCTET_STRING_fromBuf(tmp, "asdsa1d32sa1d31asd31as",
-                         strlen("asdsa1d32sa1d31asd31as"));
-    asn1cCalloc(ie5->value.choice.CUtoDURRCInformation.uE_CapabilityRAT_ContainerList,
-                tmp2);
+    /* 6.2 uE_CapabilityRAT_ContainerList */
+    if(f1ap_ue_context_modification_req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList!=NULL){
+      asn1cCalloc(ie6->value.choice.CUtoDURRCInformation.uE_CapabilityRAT_ContainerList, uE_CapabilityRAT_ContainerList );
+      OCTET_STRING_fromBuf(uE_CapabilityRAT_ContainerList, (const char *)f1ap_ue_context_modification_req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList,
+          f1ap_ue_context_modification_req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList_length) ;
+    }
     /* optional */
-    OCTET_STRING_fromBuf(tmp2, "asdsa1d32sa1d31asd31as",
-                         strlen("asdsa1d32sa1d31asd31as"));
+    /* 6.3 measConfig */
+    if(f1ap_ue_context_modification_req->cu_to_du_rrc_information->measConfig!=NULL){
+      asn1cCalloc(ie6->value.choice.CUtoDURRCInformation.measConfig,  measConfig);
+      OCTET_STRING_fromBuf(measConfig, (const char *)f1ap_ue_context_modification_req->cu_to_du_rrc_information->measConfig,
+          f1ap_ue_context_modification_req->cu_to_du_rrc_information->measConfig_length);
+    }
   }
 
   /* optional */
-  /* c6. TransmissionActionIndicator */
-  if (1) {
-    asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie6);
-    ie6->id                                     = F1AP_ProtocolIE_ID_id_TransmissionActionIndicator;
-    ie6->criticality                            = F1AP_Criticality_ignore;
-    ie6->value.present                          = F1AP_UEContextModificationRequestIEs__value_PR_TransmissionActionIndicator;
-    ie6->value.choice.TransmissionActionIndicator = F1AP_TransmissionActionIndicator_stop;
+  /* c7. TransmissionActionIndicator */
+  if (0) {
+    asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie7);
+    ie7->id                                     = F1AP_ProtocolIE_ID_id_TransmissionActionIndicator;
+    ie7->criticality                            = F1AP_Criticality_ignore;
+    ie7->value.present                          = F1AP_UEContextModificationRequestIEs__value_PR_TransmissionActionIndicator;
+    ie7->value.choice.TransmissionActionIndicator = F1AP_TransmissionActionIndicator_stop;
   }
 
   /* optional */
-  /* c7. ResourceCoordinationTransferContainer */
+  /* c8. ResourceCoordinationTransferContainer */
   if (0) {
-    asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie7);
-    ie7->id                             = F1AP_ProtocolIE_ID_id_ResourceCoordinationTransferContainer;
-    ie7->criticality                    = F1AP_Criticality_ignore;
-    ie7->value.present                  = F1AP_UEContextModificationRequestIEs__value_PR_ResourceCoordinationTransferContainer;
-    OCTET_STRING_fromBuf(&ie7->value.choice.ResourceCoordinationTransferContainer, "asdsa1d32sa1d31asd31as",
+    asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie8);
+    ie8->id                             = F1AP_ProtocolIE_ID_id_ResourceCoordinationTransferContainer;
+    ie8->criticality                    = F1AP_Criticality_ignore;
+    ie8->value.present                  = F1AP_UEContextModificationRequestIEs__value_PR_ResourceCoordinationTransferContainer;
+    OCTET_STRING_fromBuf(&ie8->value.choice.ResourceCoordinationTransferContainer, "asdsa1d32sa1d31asd31as",
                          strlen("asdsa1d32sa1d31asd31as"));
   }
 
   /* optional */
   /* c7. RRCRconfigurationCompleteIndicator */
-  if (1) {
+  if (f1ap_ue_context_modification_req->ReconfigComplOutcome == RRCreconf_success) {
     asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie71);
     ie71->id                             = F1AP_ProtocolIE_ID_id_RRCReconfigurationCompleteIndicator;
     ie71->criticality                    = F1AP_Criticality_ignore;
@@ -1127,218 +1152,488 @@ int CU_send_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance) {
 
   /* optional */
   /* c8. RRCContainer */
-  if (1) {
-    asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie8);
-    ie8->id                             = F1AP_ProtocolIE_ID_id_RRCContainer;
-    ie8->criticality                    = F1AP_Criticality_ignore;
-    ie8->value.present                  = F1AP_UEContextModificationRequestIEs__value_PR_RRCContainer;
-    OCTET_STRING_fromBuf(&ie8->value.choice.RRCContainer, "asdsa1d32sa1d31asd31as",
-                         strlen("asdsa1d32sa1d31asd31as"));
+  if (f1ap_ue_context_modification_req->rrc_container != NULL) {
+    asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie81);
+    ie81->id                             = F1AP_ProtocolIE_ID_id_RRCContainer;
+    ie81->criticality                    = F1AP_Criticality_ignore;
+    ie81->value.present                  = F1AP_UEContextModificationRequestIEs__value_PR_RRCContainer;
+    OCTET_STRING_fromBuf(&ie81->value.choice.RRCContainer, (const char*)f1ap_ue_context_modification_req->rrc_container,
+        f1ap_ue_context_modification_req->rrc_container_length);
   }
 
-  /* mandatory */
+  /* optional */
   /* c9. SCell_ToBeSetupMod_List */
-  asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie9);
-  ie9->id                             = F1AP_ProtocolIE_ID_id_SCell_ToBeSetupMod_List;
-  ie9->criticality                    = F1AP_Criticality_ignore;
-  ie9->value.present                  = F1AP_UEContextModificationRequestIEs__value_PR_SCell_ToBeSetupMod_List;
+  if(0){
+    asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie9);
+    ie9->id                             = F1AP_ProtocolIE_ID_id_SCell_ToBeSetupMod_List;
+    ie9->criticality                    = F1AP_Criticality_ignore;
+    ie9->value.present                  = F1AP_UEContextModificationRequestIEs__value_PR_SCell_ToBeSetupMod_List;
 
-  for (int i=0; i<1; i++) {
-    //
-    asn1cSequenceAdd(ie9->value.choice.SCell_ToBeSetupMod_List.list,
+    for (int i=0; i<1; i++) {
+      //
+      asn1cSequenceAdd(ie9->value.choice.SCell_ToBeSetupMod_List.list,
                      F1AP_SCell_ToBeSetupMod_ItemIEs_t, scell_toBeSetupMod_item_ies);
-    scell_toBeSetupMod_item_ies->id            = F1AP_ProtocolIE_ID_id_SCell_ToBeSetupMod_Item;
-    scell_toBeSetupMod_item_ies->criticality   = F1AP_Criticality_ignore;
-    scell_toBeSetupMod_item_ies->value.present = F1AP_SCell_ToBeSetupMod_ItemIEs__value_PR_SCell_ToBeSetupMod_Item;
-    /* 8.1 SCell_ToBeSetup_Item */
-    F1AP_SCell_ToBeSetupMod_Item_t *scell_toBeSetupMod_item=
-      &scell_toBeSetupMod_item_ies->value.choice.SCell_ToBeSetupMod_Item;
-    //   /* - sCell_ID */
-    addnRCGI(scell_toBeSetupMod_item->sCell_ID, &hardCoded);
-    /* sCellIndex */
-    scell_toBeSetupMod_item->sCellIndex = 6;  // issue here
+      scell_toBeSetupMod_item_ies->id            = F1AP_ProtocolIE_ID_id_SCell_ToBeSetupMod_Item;
+      scell_toBeSetupMod_item_ies->criticality   = F1AP_Criticality_ignore;
+      scell_toBeSetupMod_item_ies->value.present = F1AP_SCell_ToBeSetupMod_ItemIEs__value_PR_SCell_ToBeSetupMod_Item;
+      /* 8.1 SCell_ToBeSetup_Item */
+      F1AP_SCell_ToBeSetupMod_Item_t *scell_toBeSetupMod_item=
+          &scell_toBeSetupMod_item_ies->value.choice.SCell_ToBeSetupMod_Item;
+      //   /* - sCell_ID */
+      addnRCGI(scell_toBeSetupMod_item->sCell_ID, &hardCoded);
+      /* sCellIndex */
+      scell_toBeSetupMod_item->sCellIndex = 6;  // issue here
+      }
   }
 
-  /* mandatory */
+  /* optional */
   /* c10. SCell_ToBeRemoved_List */
-  asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie10);
-  ie10->id                             = F1AP_ProtocolIE_ID_id_SCell_ToBeRemoved_List;
-  ie10->criticality                    = F1AP_Criticality_ignore;
-  ie10->value.present                  = F1AP_UEContextModificationRequestIEs__value_PR_SCell_ToBeRemoved_List;
-
-  for (int i=0;  i<1; i++) {
-    //
-    asn1cSequenceAdd(ie10->value.choice.SCell_ToBeRemoved_List.list,
+  if(0){
+    asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie10);
+    ie10->id                             = F1AP_ProtocolIE_ID_id_SCell_ToBeRemoved_List;
+    ie10->criticality                    = F1AP_Criticality_ignore;
+    ie10->value.present                  = F1AP_UEContextModificationRequestIEs__value_PR_SCell_ToBeRemoved_List;
+
+    for (int i=0;  i<1; i++) {
+      //
+      asn1cSequenceAdd(ie10->value.choice.SCell_ToBeRemoved_List.list,
                      F1AP_SCell_ToBeRemoved_ItemIEs_t, scell_toBeRemoved_item_ies);
-    scell_toBeRemoved_item_ies = (F1AP_SCell_ToBeRemoved_ItemIEs_t *)calloc(1, sizeof(F1AP_SCell_ToBeRemoved_ItemIEs_t));
-    //memset((void *)&scell_toBeRemoved_item_ies, 0, sizeof(F1AP_SCell_ToBeRemoved_ItemIEs_t));
-    scell_toBeRemoved_item_ies->id            = F1AP_ProtocolIE_ID_id_SCell_ToBeRemoved_Item;
-    scell_toBeRemoved_item_ies->criticality   = F1AP_Criticality_ignore;
-    scell_toBeRemoved_item_ies->value.present = F1AP_SCell_ToBeRemoved_ItemIEs__value_PR_SCell_ToBeRemoved_Item;
-    /* 10.1 SCell_ToBeRemoved_Item */
-    F1AP_SCell_ToBeRemoved_Item_t *scell_toBeRemoved_item=
-      &scell_toBeRemoved_item_ies->value.choice.SCell_ToBeRemoved_Item;
-    /* - sCell_ID */
-    addnRCGI(scell_toBeRemoved_item->sCell_ID, &hardCoded);
+      scell_toBeRemoved_item_ies = (F1AP_SCell_ToBeRemoved_ItemIEs_t *)calloc(1, sizeof(F1AP_SCell_ToBeRemoved_ItemIEs_t));
+      //memset((void *)&scell_toBeRemoved_item_ies, 0, sizeof(F1AP_SCell_ToBeRemoved_ItemIEs_t));
+      scell_toBeRemoved_item_ies->id            = F1AP_ProtocolIE_ID_id_SCell_ToBeRemoved_Item;
+      scell_toBeRemoved_item_ies->criticality   = F1AP_Criticality_ignore;
+      scell_toBeRemoved_item_ies->value.present = F1AP_SCell_ToBeRemoved_ItemIEs__value_PR_SCell_ToBeRemoved_Item;
+      /* 10.1 SCell_ToBeRemoved_Item */
+      F1AP_SCell_ToBeRemoved_Item_t *scell_toBeRemoved_item=
+        &scell_toBeRemoved_item_ies->value.choice.SCell_ToBeRemoved_Item;
+      /* - sCell_ID */
+      addnRCGI(scell_toBeRemoved_item->sCell_ID, &hardCoded);
+    }
   }
 
   /* mandatory */
   /* c11. SRBs_ToBeSetupMod_List */
-  asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie11);
-  ie11->id                             = F1AP_ProtocolIE_ID_id_SRBs_ToBeSetupMod_List;
-  ie11->criticality                    = F1AP_Criticality_reject;
-  ie11->value.present                  = F1AP_UEContextModificationRequestIEs__value_PR_SRBs_ToBeSetupMod_List;
-
-  for (int i=0;  i<1; i++) {
-    //
-    asn1cSequenceAdd(ie11->value.choice.SRBs_ToBeSetupMod_List.list,
-                     F1AP_SRBs_ToBeSetupMod_ItemIEs_t, srbs_toBeSetupMod_item_ies);
-    srbs_toBeSetupMod_item_ies->id            = F1AP_ProtocolIE_ID_id_SRBs_ToBeSetupMod_Item;
-    srbs_toBeSetupMod_item_ies->criticality   = F1AP_Criticality_ignore;
-    srbs_toBeSetupMod_item_ies->value.present = F1AP_SRBs_ToBeSetupMod_ItemIEs__value_PR_SRBs_ToBeSetupMod_Item;
-    /* 9.1 SRBs_ToBeSetupMod_Item */
-    F1AP_SRBs_ToBeSetupMod_Item_t *srbs_toBeSetupMod_item=
-      &srbs_toBeSetupMod_item_ies->value.choice.SRBs_ToBeSetupMod_Item;
-    /* - sRBID */
-    srbs_toBeSetupMod_item->sRBID = 3L;
+  if(f1ap_ue_context_modification_req->srbs_to_be_setup_length > 0){
+    asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie11);
+    ie11->id                             = F1AP_ProtocolIE_ID_id_SRBs_ToBeSetupMod_List;
+    ie11->criticality                    = F1AP_Criticality_reject;
+    ie11->value.present                  = F1AP_UEContextModificationRequestIEs__value_PR_SRBs_ToBeSetupMod_List;
+
+    for (int i=0; i<f1ap_ue_context_modification_req->srbs_to_be_setup_length; i++) {
+      //
+      asn1cSequenceAdd(ie11->value.choice.SRBs_ToBeSetupMod_List, F1AP_SRBs_ToBeSetupMod_ItemIEs_t, srbs_toBeSetupMod_item_ies);
+      srbs_toBeSetupMod_item_ies->id            = F1AP_ProtocolIE_ID_id_SRBs_ToBeSetupMod_Item; // 73
+      srbs_toBeSetupMod_item_ies->criticality   = F1AP_Criticality_reject;
+      srbs_toBeSetupMod_item_ies->value.present = F1AP_SRBs_ToBeSetupMod_ItemIEs__value_PR_SRBs_ToBeSetupMod_Item;
+      /* 11.1 SRBs_ToBeSetup_Item */
+      F1AP_SRBs_ToBeSetupMod_Item_t *srbs_toBeSetupMod_item=&srbs_toBeSetupMod_item_ies->value.choice.SRBs_ToBeSetupMod_Item;
+      /* 11.1.1 sRBID */
+      srbs_toBeSetupMod_item->sRBID = f1ap_ue_context_modification_req->srbs_to_be_setup[i].srb_id;
+      /* OPTIONAL */
+      /* 11.1.2 duplicationIndication */
+      asn1cCallocOne(srbs_toBeSetupMod_item->duplicationIndication,
+                   F1AP_DuplicationIndication_true); // enum
+    }
   }
 
   /* mandatory */
   /* c12. DRBs_ToBeSetupMod_List */
-  asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie12);
-  ie12->id                             = F1AP_ProtocolIE_ID_id_DRBs_ToBeSetupMod_List;
-  ie12->criticality                    = F1AP_Criticality_reject;
-  ie12->value.present                  = F1AP_UEContextModificationRequestIEs__value_PR_DRBs_ToBeSetupMod_List;
+  if(f1ap_ue_context_modification_req->drbs_to_be_setup_length){
+    asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie12);
+    ie12->id                             = F1AP_ProtocolIE_ID_id_DRBs_ToBeSetupMod_List;
+    ie12->criticality                    = F1AP_Criticality_reject;
+    ie12->value.present                  = F1AP_UEContextModificationRequestIEs__value_PR_DRBs_ToBeSetupMod_List;
 
-  for (int i=0;   i<1; i++) {
-    //
-    asn1cSequenceAdd(ie12->value.choice.DRBs_ToBeSetupMod_List.list,
+    for (int i = 0; i < f1ap_ue_context_modification_req->drbs_to_be_setup_length; i++) {
+      asn1cSequenceAdd(ie12->value.choice.DRBs_ToBeSetupMod_List.list,
                      F1AP_DRBs_ToBeSetupMod_ItemIEs_t, drbs_toBeSetupMod_item_ies);
-    drbs_toBeSetupMod_item_ies->id            = F1AP_ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item;
-    drbs_toBeSetupMod_item_ies->criticality   = F1AP_Criticality_reject;
-    drbs_toBeSetupMod_item_ies->value.present = F1AP_DRBs_ToBeSetupMod_ItemIEs__value_PR_DRBs_ToBeSetupMod_Item;
-    /* 12.1 DRBs_ToBeSetupMod_Item */
-    F1AP_DRBs_ToBeSetupMod_Item_t *drbs_toBeSetupMod_item=
-      &drbs_toBeSetupMod_item_ies->value.choice.DRBs_ToBeSetupMod_Item;
-    /* dRBID */
-    drbs_toBeSetupMod_item->dRBID = 30L;
-    /* qoSInformation */
-    drbs_toBeSetupMod_item->qoSInformation.present = F1AP_QoSInformation_PR_eUTRANQoS;
-    drbs_toBeSetupMod_item->qoSInformation.choice.eUTRANQoS = (F1AP_EUTRANQoS_t *)calloc(1, sizeof(F1AP_EUTRANQoS_t));
-    drbs_toBeSetupMod_item->qoSInformation.choice.eUTRANQoS->qCI = 253L;
-    /* uLUPTNLInformation_ToBeSetup_List */
-    int maxnoofULTunnels = 1; // 2;
-
-    for (int j=0;  j<maxnoofULTunnels;  j++) {
-      /*  ULTunnels_ToBeSetup_Item */
-      asn1cSequenceAdd( drbs_toBeSetupMod_item->uLUPTNLInformation_ToBeSetup_List.list,
+      drbs_toBeSetupMod_item_ies->id            = F1AP_ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item;
+      drbs_toBeSetupMod_item_ies->criticality   = F1AP_Criticality_reject;
+      drbs_toBeSetupMod_item_ies->value.present = F1AP_DRBs_ToBeSetupMod_ItemIEs__value_PR_DRBs_ToBeSetupMod_Item;
+      /* 12.1 DRBs_ToBeSetupMod_Item */
+      F1AP_DRBs_ToBeSetupMod_Item_t *drbs_toBeSetupMod_item=
+          &drbs_toBeSetupMod_item_ies->value.choice.DRBs_ToBeSetupMod_Item;
+      /* dRBID */
+      drbs_toBeSetupMod_item->dRBID = f1ap_ue_context_modification_req->drbs_to_be_setup[i].drb_id;
+      /* qoSInformation */
+
+      if(f1ap_ue_context_modification_req->QoS_information_type == EUTRAN_QoS){
+        drbs_toBeSetupMod_item->qoSInformation.present = F1AP_QoSInformation_PR_eUTRANQoS;
+        drbs_toBeSetupMod_item->qoSInformation.choice.eUTRANQoS = (F1AP_EUTRANQoS_t *)calloc(1, sizeof(F1AP_EUTRANQoS_t));
+        drbs_toBeSetupMod_item->qoSInformation.choice.eUTRANQoS->qCI = 253L;
+        /* uLUPTNLInformation_ToBeSetup_List */
+        int maxnoofULTunnels = 1; // 2;
+
+        for (int j=0;  j<maxnoofULTunnels;  j++) {
+          /*  ULTunnels_ToBeSetup_Item */
+          asn1cSequenceAdd( drbs_toBeSetupMod_item->uLUPTNLInformation_ToBeSetup_List.list,
                         F1AP_ULUPTNLInformation_ToBeSetup_Item_t, uLUPTNLInformation_ToBeSetup_Item);
-      uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.present = F1AP_UPTransportLayerInformation_PR_gTPTunnel;
-      asn1cCalloc(uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.choice.gTPTunnel,
+          uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.present = F1AP_UPTransportLayerInformation_PR_gTPTunnel;
+          asn1cCalloc(uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.choice.gTPTunnel,
                   gTPTunnel)
-      /* transportLayerAddress */
-      TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(1234, &gTPTunnel->transportLayerAddress);
-      /* gTP_TEID */
-      OCTET_STRING_fromBuf(&gTPTunnel->gTP_TEID, "4567",
-                           strlen("4567"));
-    }
+          /* transportLayerAddress */
+          TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(1234, &gTPTunnel->transportLayerAddress);
+          /* gTP_TEID */
+          OCTET_STRING_fromBuf(&gTPTunnel->gTP_TEID, "4567",
+            strlen("4567"));
+        }
 
-    /* rLCMode */
-    drbs_toBeSetupMod_item->rLCMode = F1AP_RLCMode_rlc_um_bidirectional; // enum
+        /* rLCMode */
+        drbs_toBeSetupMod_item->rLCMode = F1AP_RLCMode_rlc_um_bidirectional; // enum
 
-    /* OPTIONAL */
-    /* ULConfiguration */
-    if (0) {
-      drbs_toBeSetupMod_item->uLConfiguration = (F1AP_ULConfiguration_t *)calloc(1, sizeof(F1AP_ULConfiguration_t));
+        /* OPTIONAL */
+        /* ULConfiguration */
+        if (0) {
+          drbs_toBeSetupMod_item->uLConfiguration = (F1AP_ULConfiguration_t *)calloc(1, sizeof(F1AP_ULConfiguration_t));
+        }
+      } //QoS information
+
+      else{
+        /* 12.1.2 DRB_Information */
+        drbs_toBeSetupMod_item->qoSInformation.present = F1AP_QoSInformation_PR_choice_extension;
+        F1AP_QoSInformation_ExtIEs_t *ie = (F1AP_QoSInformation_ExtIEs_t *)calloc(1, sizeof(*ie));
+        ie->id                             = F1AP_ProtocolIE_ID_id_DRB_Information;
+        ie->criticality                    = F1AP_Criticality_reject;
+        ie->value.present                  = F1AP_QoSInformation_ExtIEs__value_PR_DRB_Information;
+        F1AP_DRB_Information_t   *DRB_Information = &ie->value.choice.DRB_Information;
+        drbs_toBeSetupMod_item->qoSInformation.choice.choice_extension = (struct F1AP_ProtocolIE_SingleContainer *)ie;
+        /* 12.1.2.1 dRB_QoS */
+        {
+          /* qoS_Characteristics */
+          {
+            int some_decide_qoS_characteristics = 0; // BK: Need Check
+
+            if (some_decide_qoS_characteristics) {
+              DRB_Information->dRB_QoS.qoS_Characteristics.present = F1AP_QoS_Characteristics_PR_non_Dynamic_5QI;
+              setQos(DRB_Information->dRB_QoS.qoS_Characteristics.choice.non_Dynamic_5QI);
+            } else {
+                DRB_Information->dRB_QoS.qoS_Characteristics.present = F1AP_QoS_Characteristics_PR_dynamic_5QI;
+                asn1cCalloc(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI, tmp);
+                /* qoSPriorityLevel */
+                tmp->qoSPriorityLevel = 1L;
+                /* packetDelayBudget */
+                tmp->packetDelayBudget = 1L;
+                /* packetErrorRate */
+                tmp->packetErrorRate.pER_Scalar = 1L;
+                tmp->packetErrorRate.pER_Exponent = 6L;
+
+                /* OPTIONAL */
+                /* delayCritical */
+                if (0) {
+                  asn1cCallocOne(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI->delayCritical, 1L);
+                }
+
+                /* OPTIONAL */
+                /* averagingWindow */
+                if (0) {
+                  asn1cCallocOne(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI->averagingWindow, 1L);
+                }
+
+                /* OPTIONAL */
+                /* maxDataBurstVolume */
+                if (0) {
+                  asn1cCallocOne(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI->maxDataBurstVolume, 1L);
+                }
+              } // if some_decide_qoS_characteristics
+
+            } // qoS_Characteristics
+            /* nGRANallocationRetentionPriority */
+            {
+              DRB_Information->dRB_QoS.nGRANallocationRetentionPriority.priorityLevel = F1AP_PriorityLevel_highest; // enum
+              DRB_Information->dRB_QoS.nGRANallocationRetentionPriority.pre_emptionCapability = F1AP_Pre_emptionCapability_shall_not_trigger_pre_emption; // enum
+              DRB_Information->dRB_QoS.nGRANallocationRetentionPriority.pre_emptionVulnerability = F1AP_Pre_emptionVulnerability_not_pre_emptable; // enum
+            } // nGRANallocationRetentionPriority
+
+          /* OPTIONAL */
+          /* gBR_QoS_Flow_Information */
+          if (0) {
+            asn1cCalloc(DRB_Information->dRB_QoS.gBR_QoS_Flow_Information, tmp);
+            asn_long2INTEGER(&tmp->maxFlowBitRateDownlink, 1L);
+            asn_long2INTEGER(&tmp->maxFlowBitRateUplink, 1L);
+            asn_long2INTEGER(&tmp->guaranteedFlowBitRateDownlink, 1L);
+            asn_long2INTEGER(&tmp->guaranteedFlowBitRateUplink, 1L);
+
+            /* OPTIONAL */
+            /* maxPacketLossRateDownlink */
+            if (0) {
+              asn1cCallocOne(DRB_Information->dRB_QoS.gBR_QoS_Flow_Information->maxPacketLossRateDownlink, 1L);
+            }
+
+            /* OPTIONAL */
+            /* maxPacketLossRateUplink */
+            if (0) {
+              asn1cCallocOne(DRB_Information->dRB_QoS.gBR_QoS_Flow_Information->maxPacketLossRateUplink, 1L);
+            }
+          }
+
+          /* OPTIONAL */
+          /* reflective_QoS_Attribute */
+          if (0) {
+            asn1cCallocOne(DRB_Information->dRB_QoS.reflective_QoS_Attribute, 1L);
+          }
+        } // dRB_QoS
+        /* 12.1.2.2 sNSSAI */
+        {
+          /* sST */
+
+          OCTET_STRING_fromBuf(&DRB_Information->sNSSAI.sST, "1", 1);
+
+          /* OPTIONAL */
+          /* sD */
+          if (0) {
+            asn1cCalloc(DRB_Information->sNSSAI.sD, tmp);
+            OCTET_STRING_fromBuf(tmp, "asdsa1d32sa1d31asd31as",
+            strlen("asdsa1d32sa1d31asd31as"));
+          }
+        }
+
+        /* OPTIONAL */
+        /* 12.1.2.3 notificationControl */
+        if (0) {
+          asn1cCallocOne(DRB_Information->notificationControl,
+              F1AP_NotificationControl_active); // enum
+        }
+
+        /* 12.1.2.4 flows_Mapped_To_DRB_List */  // BK: need verifiy
+
+        for (int k = 0; k < 1; k ++) {
+          asn1cSequenceAdd(DRB_Information->flows_Mapped_To_DRB_List.list,
+                         F1AP_Flows_Mapped_To_DRB_Item_t, flows_mapped_to_drb_item);
+          /* qoSFlowIndicator */
+          flows_mapped_to_drb_item->qoSFlowIdentifier = 1L;
+          /* qoSFlowLevelQoSParameters */
+          {
+            /* qoS_Characteristics */
+            {
+              int some_decide_qoS_characteristics = 0; // BK: Need Check
+              F1AP_QoS_Characteristics_t *QosParams=&flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.qoS_Characteristics;
+
+              if (some_decide_qoS_characteristics) {
+                QosParams->present = F1AP_QoS_Characteristics_PR_non_Dynamic_5QI;
+                setQos(QosParams->choice.non_Dynamic_5QI);
+              } else {
+                QosParams->present = F1AP_QoS_Characteristics_PR_dynamic_5QI;
+                asn1cCalloc(QosParams->choice.dynamic_5QI, tmp);
+                /* qoSPriorityLevel */
+                tmp->qoSPriorityLevel = 1L;
+                /* packetDelayBudget */
+                tmp->packetDelayBudget = 1L;
+                /* packetErrorRate */
+                tmp->packetErrorRate.pER_Scalar = 1L;
+                tmp->packetErrorRate.pER_Exponent = 6L;
+
+                /* OPTIONAL */
+                /* delayCritical */
+                if (0) {
+                  asn1cCalloc(QosParams->choice.dynamic_5QI->delayCritical, tmp);
+                  *tmp = 1L;
+                }
+
+                /* OPTIONAL */
+                /* averagingWindow */
+                if (0) {
+                  asn1cCalloc(QosParams->choice.dynamic_5QI->averagingWindow, tmp);
+                  *tmp = 1L;
+                }
+
+                /* OPTIONAL */
+                /* maxDataBurstVolume */
+                if (0) {
+                  asn1cCalloc(QosParams->choice.dynamic_5QI->maxDataBurstVolume, tmp);
+                  *tmp= 1L;
+                }
+              } // if some_decide_qoS_characteristics
+
+            } // qoS_Characteristics
+            /* nGRANallocationRetentionPriority */
+            {
+              flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.nGRANallocationRetentionPriority.priorityLevel = F1AP_PriorityLevel_highest; // enum
+              flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.nGRANallocationRetentionPriority.pre_emptionCapability = F1AP_Pre_emptionCapability_shall_not_trigger_pre_emption; // enum
+              flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.nGRANallocationRetentionPriority.pre_emptionVulnerability = F1AP_Pre_emptionVulnerability_not_pre_emptable; // enum
+            } // nGRANallocationRetentionPriority
+
+            /* OPTIONAL */
+            /* gBR_QoS_Flow_Information */
+            if (0) {
+              asn1cCalloc(flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.gBR_QoS_Flow_Information, tmp);
+              asn_long2INTEGER(&tmp->maxFlowBitRateDownlink, 1L);
+              asn_long2INTEGER(&tmp->maxFlowBitRateUplink, 1L);
+              asn_long2INTEGER(&tmp->guaranteedFlowBitRateDownlink, 1L);
+              asn_long2INTEGER(&tmp->guaranteedFlowBitRateUplink, 1L);
+
+              /* OPTIONAL */
+              /* maxPacketLossRateDownlink */
+              if (0) {
+                asn1cCallocOne(flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.gBR_QoS_Flow_Information->maxPacketLossRateDownlink, 1L);
+              }
+
+              /* OPTIONAL */
+              /* maxPacketLossRateUplink */
+              if (0) {
+                asn1cCallocOne(flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.gBR_QoS_Flow_Information->maxPacketLossRateUplink, 1L);
+              }
+            }
+
+            /* OPTIONAL */
+            /* reflective_QoS_Attribute */
+            if (0) {
+              asn1cCallocOne(flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.reflective_QoS_Attribute, 1L);
+            }
+          } // qoSFlowLevelQoSParameters
+        }
+
+      } //QoS information
+
+      /* 12.1.3 uLUPTNLInformation_ToBeSetup_List */
+      for (int j = 0; j < f1ap_ue_context_modification_req->drbs_to_be_setup[i].up_ul_tnl_length; j++) {
+        /*Use a dummy teid for the outgoing GTP-U tunnel (DU) which will be updated once we get the UE context setup response from the DU*/
+        transport_layer_addr_t addr;
+        int sz=sizeof(f1ap_ue_context_modification_req->drbs_to_be_setup[i].up_dl_tnl[0].tl_address);
+        memcpy(addr.buffer,&f1ap_ue_context_modification_req->drbs_to_be_setup[i].up_dl_tnl[0].tl_address, sz);
+        addr.length = sz*8;
+
+        f1ap_ue_context_modification_req->drbs_to_be_setup[i].up_ul_tnl[j].teid = newGtpuCreateTunnel(getCxt(CUtype, instance)->gtpInst,
+                                                                                                      f1ap_ue_context_modification_req->rnti,
+                                                                                                      f1ap_ue_context_modification_req->drbs_to_be_setup[i].drb_id,
+                                                                                                      f1ap_ue_context_modification_req->drbs_to_be_setup[i].drb_id,
+                                                                                                      0xFFFF, // We will set the right value from DU answer
+                                                                                                      -1, // no qfi
+                                                                                                      addr,
+                                                                                                      f1ap_ue_context_modification_req->drbs_to_be_setup[i].up_dl_tnl[0].port,
+                                                                                                      cu_f1u_data_req,
+                                                                                                      NULL);
+        /*  12.3.1 ULTunnels_ToBeSetup_Item */
+        asn1cSequenceAdd(drbs_toBeSetupMod_item->uLUPTNLInformation_ToBeSetup_List.list,
+                       F1AP_ULUPTNLInformation_ToBeSetup_Item_t, uLUPTNLInformation_ToBeSetup_Item);
+        uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.present = F1AP_UPTransportLayerInformation_PR_gTPTunnel;
+        asn1cCalloc( uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.choice.gTPTunnel,
+                   gTPTunnel);
+        /* 12.3.1.1.1 transportLayerAddress */
+        TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(f1ap_ue_context_modification_req->drbs_to_be_setup[i].up_ul_tnl[j].tl_address,
+                          &gTPTunnel->transportLayerAddress);
+        /* 12.3.1.1.2 gTP_TEID */
+        INT32_TO_OCTET_STRING(f1ap_ue_context_modification_req->drbs_to_be_setup[i].up_ul_tnl[j].teid,
+                &gTPTunnel->gTP_TEID);
+      }
+      /* 12.1.4 rLCMode */
+      /* TODO use rlc_mode from f1ap_drb_to_be_setup */
+      switch (f1ap_ue_context_modification_req->drbs_to_be_setup[i].rlc_mode) {
+        case RLC_MODE_AM:
+          drbs_toBeSetupMod_item->rLCMode = F1AP_RLCMode_rlc_am;
+          break;
+
+        default:
+          drbs_toBeSetupMod_item->rLCMode = F1AP_RLCMode_rlc_um_bidirectional;
+      }
+
+      /* OPTIONAL */
+      /* 12.1.5 ULConfiguration */
+      if (0) {
+        asn1cCalloc(drbs_toBeSetupMod_item->uLConfiguration, tmp);
+        tmp->uLUEConfiguration = F1AP_ULUEConfiguration_no_data;
+      }
+
+      /* OPTIONAL */
+      /* 12.1.6 duplicationActivation */
+      if (0) {
+        asn1cCalloc(drbs_toBeSetupMod_item->duplicationActivation, tmp);
+        *tmp = F1AP_DuplicationActivation_active;  // enum
+      }
     }
   }
 
-  /* mandatory */
-  /* c13. DRBs_ToBeModified_List */
-  asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie13);
-  ie13->id                             = F1AP_ProtocolIE_ID_id_DRBs_ToBeModified_List;
-  ie13->criticality                    = F1AP_Criticality_reject;
-  ie13->value.present                  = F1AP_UEContextModificationRequestIEs__value_PR_DRBs_ToBeModified_List;
+  /* optional */
+  if(0){
+    /* c13. DRBs_ToBeModified_List */
+    asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie13);
+    ie13->id                             = F1AP_ProtocolIE_ID_id_DRBs_ToBeModified_List;
+    ie13->criticality                    = F1AP_Criticality_reject;
+    ie13->value.present                  = F1AP_UEContextModificationRequestIEs__value_PR_DRBs_ToBeModified_List;
 
-  for (int i=0;   i<1; i++) {
-    //
-    asn1cSequenceAdd( ie13->value.choice.DRBs_ToBeModified_List.list,
+    for (int i=0;   i<1; i++) {
+      //
+      asn1cSequenceAdd( ie13->value.choice.DRBs_ToBeModified_List.list,
                       F1AP_DRBs_ToBeModified_ItemIEs_t, drbs_toBeModified_item_ies);
-    drbs_toBeModified_item_ies->id            = F1AP_ProtocolIE_ID_id_DRBs_ToBeModified_Item;
-    drbs_toBeModified_item_ies->criticality   = F1AP_Criticality_reject;
-    drbs_toBeModified_item_ies->value.present = F1AP_DRBs_ToBeModified_ItemIEs__value_PR_DRBs_ToBeModified_Item;
-    /* 13.1 SRBs_ToBeModified_Item */
-    F1AP_DRBs_ToBeModified_Item_t *drbs_toBeModified_item=
-      &drbs_toBeModified_item_ies->value.choice.DRBs_ToBeModified_Item;
-    /* dRBID */
-    drbs_toBeModified_item->dRBID = 30L;
-    /* qoSInformation */
-    asn1cCalloc(drbs_toBeModified_item->qoSInformation, tmp);
-    tmp->present = F1AP_QoSInformation_PR_eUTRANQoS;
-    tmp->choice.eUTRANQoS = (F1AP_EUTRANQoS_t *)calloc(1, sizeof(F1AP_EUTRANQoS_t));
-    tmp->choice.eUTRANQoS->qCI = 254L;
-    /* ULTunnels_ToBeModified_List */
-    int maxnoofULTunnels = 1; // 2;
-
-    for (int j=0; j<maxnoofULTunnels; j++) {
-      /*  ULTunnels_ToBeModified_Item */
-      asn1cSequenceAdd(drbs_toBeModified_item->uLUPTNLInformation_ToBeSetup_List.list,
+      drbs_toBeModified_item_ies->id            = F1AP_ProtocolIE_ID_id_DRBs_ToBeModified_Item;
+      drbs_toBeModified_item_ies->criticality   = F1AP_Criticality_reject;
+      drbs_toBeModified_item_ies->value.present = F1AP_DRBs_ToBeModified_ItemIEs__value_PR_DRBs_ToBeModified_Item;
+      /* 13.1 SRBs_ToBeModified_Item */
+      F1AP_DRBs_ToBeModified_Item_t *drbs_toBeModified_item=
+          &drbs_toBeModified_item_ies->value.choice.DRBs_ToBeModified_Item;
+      /* dRBID */
+      drbs_toBeModified_item->dRBID = 30L;
+      /* qoSInformation */
+      asn1cCalloc(drbs_toBeModified_item->qoSInformation, tmp);
+      tmp->present = F1AP_QoSInformation_PR_eUTRANQoS;
+      tmp->choice.eUTRANQoS = (F1AP_EUTRANQoS_t *)calloc(1, sizeof(F1AP_EUTRANQoS_t));
+      tmp->choice.eUTRANQoS->qCI = 254L;
+      /* ULTunnels_ToBeModified_List */
+      int maxnoofULTunnels = 1; // 2;
+
+      for (int j=0; j<maxnoofULTunnels; j++) {
+        /*  ULTunnels_ToBeModified_Item */
+        asn1cSequenceAdd(drbs_toBeModified_item->uLUPTNLInformation_ToBeSetup_List.list,
                        F1AP_ULUPTNLInformation_ToBeSetup_Item_t, uLUPTNLInformation_ToBeSetup_Item);
-      uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.present = F1AP_UPTransportLayerInformation_PR_gTPTunnel;
-      asn1cCalloc(uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.choice.gTPTunnel,
+        uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.present = F1AP_UPTransportLayerInformation_PR_gTPTunnel;
+        asn1cCalloc(uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.choice.gTPTunnel,
                   gTPTunnel);
-      TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(1234, &gTPTunnel->transportLayerAddress);
-      OCTET_STRING_fromBuf(&gTPTunnel->gTP_TEID, "1204",
+        TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(1234, &gTPTunnel->transportLayerAddress);
+        OCTET_STRING_fromBuf(&gTPTunnel->gTP_TEID, "1204",
                            strlen("1204"));
-    }
+      }
 
-    /* OPTIONAL */
-    /* ULConfiguration */
-    if (0) {
-      drbs_toBeModified_item->uLConfiguration = (F1AP_ULConfiguration_t *)calloc(1, sizeof(F1AP_ULConfiguration_t));
+      /* OPTIONAL */
+      /* ULConfiguration */
+      if (0) {
+        drbs_toBeModified_item->uLConfiguration = (F1AP_ULConfiguration_t *)calloc(1, sizeof(F1AP_ULConfiguration_t));
+      }
     }
   }
 
-  /* mandatory */
-  /* c14. SRBs_ToBeReleased_List */
-  asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie14);
-  ie14->id                             = F1AP_ProtocolIE_ID_id_SRBs_ToBeReleased_List;
-  ie14->criticality                    = F1AP_Criticality_reject;
-  ie14->value.present                  = F1AP_UEContextModificationRequestIEs__value_PR_SRBs_ToBeReleased_List;
+  /* optional */
+  if(0){
+    /* c14. SRBs_ToBeReleased_List */
+    asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie14);
+    ie14->id                             = F1AP_ProtocolIE_ID_id_SRBs_ToBeReleased_List;
+    ie14->criticality                    = F1AP_Criticality_reject;
+    ie14->value.present                  = F1AP_UEContextModificationRequestIEs__value_PR_SRBs_ToBeReleased_List;
 
-  for (int i=0;  i<1; i++) {
-    //
-    asn1cSequenceAdd(ie14->value.choice.SRBs_ToBeReleased_List.list,
+    for (int i=0;  i<1; i++) {
+      //
+      asn1cSequenceAdd(ie14->value.choice.SRBs_ToBeReleased_List.list,
                      F1AP_SRBs_ToBeReleased_ItemIEs_t, srbs_toBeReleased_item_ies);
-    srbs_toBeReleased_item_ies->id            = F1AP_ProtocolIE_ID_id_SRBs_ToBeReleased_Item;
-    srbs_toBeReleased_item_ies->criticality   = F1AP_Criticality_ignore;
-    srbs_toBeReleased_item_ies->value.present = F1AP_SRBs_ToBeReleased_ItemIEs__value_PR_SRBs_ToBeReleased_Item;
-    /* 9.1 SRBs_ToBeReleased_Item */
-    F1AP_SRBs_ToBeReleased_Item_t *srbs_toBeReleased_item=
-      &srbs_toBeReleased_item_ies->value.choice.SRBs_ToBeReleased_Item;
-    /* - sRBID */
-    srbs_toBeReleased_item->sRBID = 2L;
+      srbs_toBeReleased_item_ies->id            = F1AP_ProtocolIE_ID_id_SRBs_ToBeReleased_Item;
+      srbs_toBeReleased_item_ies->criticality   = F1AP_Criticality_ignore;
+      srbs_toBeReleased_item_ies->value.present = F1AP_SRBs_ToBeReleased_ItemIEs__value_PR_SRBs_ToBeReleased_Item;
+      /* 9.1 SRBs_ToBeReleased_Item */
+      F1AP_SRBs_ToBeReleased_Item_t *srbs_toBeReleased_item=
+          &srbs_toBeReleased_item_ies->value.choice.SRBs_ToBeReleased_Item;
+      /* - sRBID */
+      srbs_toBeReleased_item->sRBID = 2L;
+    }
   }
 
-  /* mandatory */
-  /* c15. DRBs_ToBeReleased_List */
-  asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie15);
-  ie15->id                             = F1AP_ProtocolIE_ID_id_DRBs_ToBeReleased_List;
-  ie15->criticality                    = F1AP_Criticality_reject;
-  ie15->value.present                  = F1AP_UEContextModificationRequestIEs__value_PR_DRBs_ToBeReleased_List;
+  /* optional */
+  if(0){
+    /* c15. DRBs_ToBeReleased_List */
+    asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie15);
+    ie15->id                             = F1AP_ProtocolIE_ID_id_DRBs_ToBeReleased_List;
+    ie15->criticality                    = F1AP_Criticality_reject;
+    ie15->value.present                  = F1AP_UEContextModificationRequestIEs__value_PR_DRBs_ToBeReleased_List;
 
-  for (int i=0; i<1;  i++) {
-    //
-    asn1cSequenceAdd(ie15->value.choice.DRBs_ToBeReleased_List.list,
+    for (int i=0; i<1;  i++) {
+      //
+      asn1cSequenceAdd(ie15->value.choice.DRBs_ToBeReleased_List.list,
                      F1AP_DRBs_ToBeReleased_ItemIEs_t, drbs_toBeReleased_item_ies);
-    drbs_toBeReleased_item_ies->id            = F1AP_ProtocolIE_ID_id_DRBs_ToBeReleased_Item;
-    drbs_toBeReleased_item_ies->criticality   = F1AP_Criticality_reject;
-    drbs_toBeReleased_item_ies->value.present = F1AP_DRBs_ToBeReleased_ItemIEs__value_PR_DRBs_ToBeReleased_Item;
-    /* 14.1 SRBs_ToBeReleased_Item */
-    F1AP_DRBs_ToBeReleased_Item_t *drbs_toBeReleased_item=
-      &drbs_toBeReleased_item_ies->value.choice.DRBs_ToBeReleased_Item;
-    /* dRBID */
-    drbs_toBeReleased_item->dRBID = 30L;
+      drbs_toBeReleased_item_ies->id            = F1AP_ProtocolIE_ID_id_DRBs_ToBeReleased_Item;
+      drbs_toBeReleased_item_ies->criticality   = F1AP_Criticality_reject;
+      drbs_toBeReleased_item_ies->value.present = F1AP_DRBs_ToBeReleased_ItemIEs__value_PR_DRBs_ToBeReleased_Item;
+      /* 14.1 SRBs_ToBeReleased_Item */
+      F1AP_DRBs_ToBeReleased_Item_t *drbs_toBeReleased_item=
+          &drbs_toBeReleased_item_ies->value.choice.DRBs_ToBeReleased_Item;
+      /* dRBID */
+      drbs_toBeReleased_item->dRBID = 30L;
+    }
   }
 
   /* encode */
@@ -1346,7 +1641,7 @@ int CU_send_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance) {
     LOG_E(F1AP, "Failed to encode F1 UE CONTEXT_MODIFICATION REQUEST\n");
     return -1;
   }
-
+  f1ap_itti_send_sctp_data_req(true, instance, buffer, len, 0 /* BK: fix me*/);
   return 0;
 }
 
@@ -1354,7 +1649,130 @@ int CU_handle_UE_CONTEXT_MODIFICATION_RESPONSE(instance_t       instance,
     uint32_t         assoc_id,
     uint32_t         stream,
     F1AP_F1AP_PDU_t *pdu) {
-  AssertFatal(1==0,"Not implemented yet\n");
+
+  MessageDef                       *msg_p;
+  F1AP_UEContextModificationResponse_t    *container;
+  F1AP_UEContextModificationResponseIEs_t *ie;
+  DevAssert(pdu);
+  msg_p = itti_alloc_new_message(TASK_DU_F1, 0,  F1AP_UE_CONTEXT_MODIFICATION_RESP);
+  f1ap_ue_context_setup_t *f1ap_ue_context_modification_resp = &F1AP_UE_CONTEXT_MODIFICATION_RESP(msg_p);
+  container = &pdu->choice.successfulOutcome->value.choice.UEContextModificationResponse;
+  int i;
+
+    /* GNB_CU_UE_F1AP_ID */
+    F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationResponseIEs_t, ie, container,
+                               F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID, true);
+    f1ap_ue_context_modification_resp->gNB_CU_ue_id = ie->value.choice.GNB_CU_UE_F1AP_ID;
+
+    LOG_D(F1AP, "f1ap_ue_context_setup_resp->gNB_CU_ue_id is: %d \n", f1ap_ue_context_modification_resp->gNB_CU_ue_id);
+
+    /* GNB_DU_UE_F1AP_ID */
+    F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationResponseIEs_t, ie, container,
+                               F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID, true);
+    f1ap_ue_context_modification_resp->gNB_DU_ue_id = ie->value.choice.GNB_DU_UE_F1AP_ID;
+
+    LOG_D(F1AP, "f1ap_ue_context_setup_resp->gNB_DU_ue_id is: %d \n", f1ap_ue_context_modification_resp->gNB_DU_ue_id);
+
+    f1ap_ue_context_modification_resp->rnti =
+          f1ap_get_rnti_by_du_id(CUtype, instance, f1ap_ue_context_modification_resp->gNB_DU_ue_id);
+
+    // DUtoCURRCInformation
+    F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationResponseIEs_t, ie, container,
+                               F1AP_ProtocolIE_ID_id_DUtoCURRCInformation, false);
+    if(ie!=NULL){
+      f1ap_ue_context_modification_resp->du_to_cu_rrc_information = (du_to_cu_rrc_information_t *)calloc(1, sizeof(du_to_cu_rrc_information_t));
+      f1ap_ue_context_modification_resp->du_to_cu_rrc_information->cellGroupConfig = (uint8_t *)calloc(1,ie->value.choice.DUtoCURRCInformation.cellGroupConfig.size);
+
+      memcpy(f1ap_ue_context_modification_resp->du_to_cu_rrc_information->cellGroupConfig, ie->value.choice.DUtoCURRCInformation.cellGroupConfig.buf, ie->value.choice.DUtoCURRCInformation.cellGroupConfig.size);
+      f1ap_ue_context_modification_resp->du_to_cu_rrc_information->cellGroupConfig_length = ie->value.choice.DUtoCURRCInformation.cellGroupConfig.size;
+    }
+
+    // DRBs_SetupMod_List
+    F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationResponseIEs_t, ie, container,
+                               F1AP_ProtocolIE_ID_id_DRBs_SetupMod_List, false);
+    if(ie!=NULL){
+      f1ap_ue_context_modification_resp->drbs_to_be_setup_length = ie->value.choice.DRBs_SetupMod_List.list.count;
+      f1ap_ue_context_modification_resp->drbs_to_be_setup = calloc(f1ap_ue_context_modification_resp->drbs_to_be_setup_length,
+          sizeof(f1ap_drb_to_be_setup_t));
+      AssertFatal(f1ap_ue_context_modification_resp->drbs_to_be_setup,
+                "could not allocate memory for f1ap_ue_context_setup_resp->drbs_setup\n");
+      for (i = 0; i < f1ap_ue_context_modification_resp->drbs_to_be_setup_length; ++i) {
+        f1ap_drb_to_be_setup_t *drb_p = &f1ap_ue_context_modification_resp->drbs_to_be_setup[i];
+        F1AP_DRBs_SetupMod_Item_t *drbs_setupmod_item_p;
+        drbs_setupmod_item_p = &((F1AP_DRBs_SetupMod_ItemIEs_t *)ie->value.choice.DRBs_SetupMod_List.list.array[i])->value.choice.DRBs_SetupMod_Item;
+        drb_p->drb_id = drbs_setupmod_item_p->dRBID;
+        // TODO in the following, assume only one UP UL TNL is present.
+         // this matches/assumes OAI CU/DU implementation, can be up to 2!
+        drb_p->up_dl_tnl_length = 1;
+        AssertFatal(drbs_setupmod_item_p->dLUPTNLInformation_ToBeSetup_List.list.count > 0,
+            "no DL UP TNL Information in DRBs to be Setup list\n");
+        F1AP_DLUPTNLInformation_ToBeSetup_Item_t *dl_up_tnl_info_p = (F1AP_DLUPTNLInformation_ToBeSetup_Item_t *)drbs_setupmod_item_p->dLUPTNLInformation_ToBeSetup_List.list.array[0];
+        F1AP_GTPTunnel_t *dl_up_tnl0 = dl_up_tnl_info_p->dLUPTNLInformation.choice.gTPTunnel;
+        BIT_STRING_TO_TRANSPORT_LAYER_ADDRESS_IPv4(&dl_up_tnl0->transportLayerAddress, drb_p->up_dl_tnl[0].tl_address);
+        OCTET_STRING_TO_INT32(&dl_up_tnl0->gTP_TEID, drb_p->up_dl_tnl[0].teid);
+        GtpuUpdateTunnelOutgoingTeid(getCxt(CUtype, instance)->gtpInst,
+                     f1ap_ue_context_modification_resp->rnti,
+                     (ebi_t)drbs_setupmod_item_p->dRBID,
+                     drb_p->up_dl_tnl[0].teid);
+      }
+    }
+    // SRBs_FailedToBeSetupMod_List
+    F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationResponseIEs_t, ie, container,
+                               F1AP_ProtocolIE_ID_id_SRBs_FailedToBeSetupMod_List, false);
+    if(ie!=NULL){
+      f1ap_ue_context_modification_resp->srbs_failed_to_be_setup_length = ie->value.choice.SRBs_FailedToBeSetupMod_List.list.count;
+      f1ap_ue_context_modification_resp->srbs_failed_to_be_setup = calloc(f1ap_ue_context_modification_resp->srbs_failed_to_be_setup_length,
+          sizeof(f1ap_rb_failed_to_be_setup_t));
+      AssertFatal(f1ap_ue_context_modification_resp->srbs_failed_to_be_setup,
+          "could not allocate memory for f1ap_ue_context_setup_resp->srbs_failed_to_be_setup\n");
+      for (i = 0; i < f1ap_ue_context_modification_resp->srbs_failed_to_be_setup_length; ++i) {
+        f1ap_rb_failed_to_be_setup_t *srb_p = &f1ap_ue_context_modification_resp->srbs_failed_to_be_setup[i];
+        srb_p->rb_id = ((F1AP_SRBs_FailedToBeSetupMod_Item_t *)ie->value.choice.SRBs_FailedToBeSetupMod_List.list.array[i])->sRBID;
+      }
+
+    }
+    // DRBs_FailedToBeSetupMod_List
+    F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationResponseIEs_t, ie, container,
+                               F1AP_ProtocolIE_ID_id_DRBs_FailedToBeSetupMod_List, false);
+    if(ie!=NULL){
+      f1ap_ue_context_modification_resp->drbs_failed_to_be_setup_length = ie->value.choice.DRBs_FailedToBeSetupMod_List.list.count;
+      f1ap_ue_context_modification_resp->drbs_failed_to_be_setup = calloc(f1ap_ue_context_modification_resp->drbs_failed_to_be_setup_length,
+          sizeof(f1ap_rb_failed_to_be_setup_t));
+      AssertFatal(f1ap_ue_context_modification_resp->drbs_failed_to_be_setup,
+          "could not allocate memory for f1ap_ue_context_setup_resp->drbs_failed_to_be_setup\n");
+      for (i = 0; i < f1ap_ue_context_modification_resp->drbs_failed_to_be_setup_length; ++i) {
+        f1ap_rb_failed_to_be_setup_t *drb_p = &f1ap_ue_context_modification_resp->drbs_failed_to_be_setup[i];
+        drb_p->rb_id = ((F1AP_DRBs_FailedToBeSetupMod_Item_t *)ie->value.choice.DRBs_FailedToBeSetupMod_List.list.array[i])->dRBID;
+      }
+    }
+
+    // SCell_FailedtoSetupMod_List
+    F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationResponseIEs_t, ie, container,
+                               F1AP_ProtocolIE_ID_id_SCell_FailedtoSetupMod_List, false);
+    if(ie!=NULL){
+      LOG_E (F1AP, "Not supporting handling of SCell_FailedtoSetupMod_List \n");
+    }
+
+    // SRBs_Setup_List
+    F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationResponseIEs_t, ie, container,
+        F1AP_ProtocolIE_ID_id_SRBs_SetupMod_List, false);
+    if(ie!=NULL){
+      f1ap_ue_context_modification_resp->srbs_to_be_setup_length = ie->value.choice.SRBs_SetupMod_List.list.count;
+      f1ap_ue_context_modification_resp->srbs_to_be_setup = calloc(f1ap_ue_context_modification_resp->srbs_to_be_setup_length,
+          sizeof(f1ap_srb_to_be_setup_t));
+      AssertFatal(f1ap_ue_context_modification_resp->srbs_to_be_setup,
+          "could not allocate memory for f1ap_ue_context_setup_resp->drbs_setup\n");
+      for (i = 0; i < f1ap_ue_context_modification_resp->srbs_to_be_setup_length; ++i) {
+        f1ap_srb_to_be_setup_t *srb_p = &f1ap_ue_context_modification_resp->srbs_to_be_setup[i];
+        F1AP_SRBs_SetupMod_Item_t *srbs_setup_item_p;
+        srbs_setup_item_p = &((F1AP_SRBs_SetupMod_ItemIEs_t *)ie->value.choice.SRBs_SetupMod_List.list.array[i])->value.choice.SRBs_SetupMod_Item;
+        srb_p->srb_id = srbs_setup_item_p->sRBID;
+        srb_p->lcid = srbs_setup_item_p->lCID;
+      }
+    }
+
+    itti_send_msg_to_task(TASK_RRC_GNB, instance, msg_p);
+    return 0;
 }
 
 int CU_handle_UE_CONTEXT_MODIFICATION_FAILURE(instance_t       instance,
diff --git a/openair2/F1AP/f1ap_cu_ue_context_management.h b/openair2/F1AP/f1ap_cu_ue_context_management.h
index 09af51ec54c2a9328e840e92151895c009fa9513..87563e97b1d39396bb26ad594b83e9c983b2ddae 100644
--- a/openair2/F1AP/f1ap_cu_ue_context_management.h
+++ b/openair2/F1AP/f1ap_cu_ue_context_management.h
@@ -72,7 +72,8 @@ int CU_handle_UE_CONTEXT_RELEASE_COMPLETE(instance_t       instance,
 /*
  * UE Context Modification (gNB-CU initiated)
  */
-int CU_send_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance);
+int CU_send_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance,
+    f1ap_ue_context_setup_t *f1ap_ue_context_modification_req);
 int CU_handle_UE_CONTEXT_MODIFICATION_RESPONSE(instance_t       instance,
     uint32_t         assoc_id,
     uint32_t         stream,
diff --git a/openair2/F1AP/f1ap_decoder.c b/openair2/F1AP/f1ap_decoder.c
index 6ebf1cc16d483445fe7095cfc633109f1193fc53..60b3f94310e21e85d9e6f33194fb1e1cf4c85b3d 100644
--- a/openair2/F1AP/f1ap_decoder.c
+++ b/openair2/F1AP/f1ap_decoder.c
@@ -78,6 +78,10 @@ static int f1ap_decode_initiating_message(F1AP_F1AP_PDU_t *pdu) {
     case F1AP_ProcedureCode_id_UEContextSetup:
       LOG_I(F1AP, "%s(): F1AP_ProcedureCode_id_UEContextSetup\n", __func__);
       break;
+    
+    case F1AP_ProcedureCode_id_UEContextModification:
+      LOG_I(F1AP, "%s(): F1AP_ProcedureCode_id_UEContextModification\n", __func__);
+      break;
 
     // case F1AP_ProcedureCode_id_InitialContextSetup:
     //   res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_F1AP_F1AP_PDU, pdu);
@@ -123,6 +127,10 @@ static int f1ap_decode_successful_outcome(F1AP_F1AP_PDU_t *pdu) {
       LOG_I(F1AP, "%s(): F1AP_ProcedureCode_id_UEContextSetup\n", __func__);
       break;
 
+    case F1AP_ProcedureCode_id_UEContextModification:
+      LOG_I(F1AP, "%s(): F1AP_ProcedureCode_id_UEContextModification\n", __func__);
+      break;
+
     default:
       LOG_E(F1AP,"Unknown procedure ID (%d) for successfull outcome message\n",
             (int)pdu->choice.successfulOutcome->procedureCode);
diff --git a/openair2/F1AP/f1ap_default_values.h b/openair2/F1AP/f1ap_default_values.h
index 91a11796240a85284a8388b717a16783d7a110b8..7c64614f50af3e6dfa88ff6f504217e338bfb90a 100644
--- a/openair2/F1AP/f1ap_default_values.h
+++ b/openair2/F1AP/f1ap_default_values.h
@@ -40,7 +40,7 @@
 #define ENB_NAME        "Eurecom ENB"
 #define ENB_NAME_FORMAT (ENB_NAME" %u")
 
-#define F1AP_PORT_NUMBER        (30923)
+#define F1AP_PORT_NUMBER        (38472)
 #define F1AP_SCTP_PPID          (62)
 
 #endif /* F1AP_DEFAULT_VALUES_H_ */
diff --git a/openair2/F1AP/f1ap_du_interface_management.c b/openair2/F1AP/f1ap_du_interface_management.c
index 6d4757be6f6ea0b365cb42b7f33bfbc76222fa3f..367b71fed5f03b267b5d288bc3c4837bde5f2038 100644
--- a/openair2/F1AP/f1ap_du_interface_management.c
+++ b/openair2/F1AP/f1ap_du_interface_management.c
@@ -172,7 +172,20 @@ int DU_send_F1_SETUP_REQUEST(instance_t instance) {
     MCC_MNC_TO_PLMNID(cell->mcc, cell->mnc, cell->mnc_digit_length, &servedPLMN_item->pLMN_Identity);
     // // /* - CHOICE NR-MODE-Info */
     F1AP_NR_Mode_Info_t *nR_Mode_Info= &served_cell_information->nR_Mode_Info;
-
+    F1AP_ProtocolExtensionContainer_154P34_t *p_154P34=calloc(1,sizeof(* p_154P34));
+    servedPLMN_item->iE_Extensions = (struct F1AP_ProtocolExtensionContainer *)p_154P34;
+    asn1cSequenceAdd(p_154P34->list, F1AP_ServedPLMNs_ItemExtIEs_t , served_plmns_itemExtIEs);
+    served_plmns_itemExtIEs->criticality = F1AP_Criticality_ignore;
+    served_plmns_itemExtIEs->id = F1AP_ProtocolIE_ID_id_TAISliceSupportList;
+    served_plmns_itemExtIEs->extensionValue.present = F1AP_ServedPLMNs_ItemExtIEs__extensionValue_PR_SliceSupportList;
+    F1AP_SliceSupportList_t *slice_support_list = &served_plmns_itemExtIEs->extensionValue.choice.SliceSupportList;
+
+    asn1cSequenceAdd(slice_support_list->list, F1AP_SliceSupportItem_t, SliceSupport_item);
+    INT8_TO_OCTET_STRING(1,&SliceSupport_item->sNSSAI.sST);
+    asn1cCalloc(SliceSupport_item->sNSSAI.sD, tmp);
+    INT24_TO_OCTET_STRING(10203,tmp);
+    //INT24_TO_OCTET_STRING(1,tmp);
+    
     if (f1ap_req(false, instance)->fdd_flag) { // FDD
       nR_Mode_Info->present = F1AP_NR_Mode_Info_PR_fDD;
       asn1cCalloc(nR_Mode_Info->choice.fDD, fDD_Info);
diff --git a/openair2/F1AP/f1ap_du_rrc_message_transfer.c b/openair2/F1AP/f1ap_du_rrc_message_transfer.c
index 90ea324a2821479682a1bedd3aa5b2e1665f43f4..e158e9519a9ef73524a7f53a46f11fc3033871a1 100644
--- a/openair2/F1AP/f1ap_du_rrc_message_transfer.c
+++ b/openair2/F1AP/f1ap_du_rrc_message_transfer.c
@@ -509,7 +509,7 @@ int DU_handle_DL_RRC_MESSAGE_TRANSFER(instance_t       instance,
 
   LOG_I(F1AP, "Received DL RRC Transfer on srb_id %ld\n", srb_id);
   rlc_op_status_t    rlc_status;
-  boolean_t          ret             = TRUE;
+  bool               ret             = true;
   mem_block_t       *pdcp_pdu_p      = NULL;
   pdcp_pdu_p = get_free_mem_block(rrc_dl_sdu_len, __func__);
 
@@ -539,27 +539,27 @@ int DU_handle_DL_RRC_MESSAGE_TRANSFER(instance_t       instance,
     switch (rlc_status) {
       case RLC_OP_STATUS_OK:
         //LOG_I(F1AP, "Data sending request over RLC succeeded!\n");
-        ret=TRUE;
+        ret=true;
         break;
 
       case RLC_OP_STATUS_BAD_PARAMETER:
         LOG_W(F1AP, "Data sending request over RLC failed with 'Bad Parameter' reason!\n");
-        ret= FALSE;
+        ret= false;
         break;
 
       case RLC_OP_STATUS_INTERNAL_ERROR:
         LOG_W(F1AP, "Data sending request over RLC failed with 'Internal Error' reason!\n");
-        ret= FALSE;
+        ret= false;
         break;
 
       case RLC_OP_STATUS_OUT_OF_RESSOURCES:
         LOG_W(F1AP, "Data sending request over RLC failed with 'Out of Resources' reason!\n");
-        ret= FALSE;
+        ret= false;
         break;
 
       default:
         LOG_W(F1AP, "RLC returned an unknown status code after PDCP placed the order to send some data (Status Code:%d)\n", rlc_status);
-        ret= FALSE;
+        ret= false;
         break;
     } // switch case
 
@@ -667,9 +667,9 @@ int DU_send_UL_RRC_MESSAGE_TRANSFER(instance_t instance,
 
           UE_sched_ctrl_t *UE_scheduling_control = &(RC.mac[instance]->UE_info.UE_sched_ctrl[UE_id_mac]);
 
-          if (UE_scheduling_control->cdrx_waiting_ack == TRUE) {
-            UE_scheduling_control->cdrx_waiting_ack = FALSE;
-            UE_scheduling_control->cdrx_configured = TRUE; // Set to TRUE when RRC Connection Reconfiguration Complete is received
+          if (UE_scheduling_control->cdrx_waiting_ack == true) {
+            UE_scheduling_control->cdrx_waiting_ack = false;
+            UE_scheduling_control->cdrx_configured = true; // Set to TRUE when RRC Connection Reconfiguration Complete is received
             LOG_I(F1AP, "CDRX configuration activated after RRC Connection Reconfiguration Complete reception\n");
           }
 
@@ -810,6 +810,13 @@ int DU_send_INITIAL_UL_RRC_MESSAGE_TRANSFER(instance_t     instanceP,
                          sdu2P,
                          sdu2_lenP);
   }
+  /* mandatory */
+  /* c6. Transaction ID (integer value) */
+  asn1cSequenceAdd(out->protocolIEs.list, F1AP_InitialULRRCMessageTransferIEs_t, ie6);
+  ie6->id                        = F1AP_ProtocolIE_ID_id_TransactionID;
+  ie6->criticality               = F1AP_Criticality_ignore;
+  ie6->value.present             = F1AP_F1SetupRequestIEs__value_PR_TransactionID;
+  ie6->value.choice.TransactionID = F1AP_get_next_transaction_identifier(f1ap_req(false, instanceP)->gNB_DU_id, f1ap_req(false, instanceP)->gNB_DU_id);
 
   /* encode */
   if (f1ap_encode_pdu(&pdu, &buffer, &len) < 0) {
diff --git a/openair2/F1AP/f1ap_du_task.c b/openair2/F1AP/f1ap_du_task.c
index c8cfadb99901b6117486da7353961b0ca8eeb78b..f8cf2162201495b90241439e455b4561c4b144b3 100644
--- a/openair2/F1AP/f1ap_du_task.c
+++ b/openair2/F1AP/f1ap_du_task.c
@@ -126,7 +126,7 @@ void *F1AP_DU_task(void *arg) {
         LOG_I(F1AP, "DU Task Received F1AP_SETUP_REQ\n");
         f1ap_setup_req_t *msgSetup=&F1AP_SETUP_REQ(msg);
         createF1inst(false, myInstance, msgSetup);
-        getCxt(DUtype, myInstance)->gtpInst=du_create_gtpu_instance_to_cu(msgSetup->CU_f1_ip_address.ipv4_address,
+        getCxt(DUtype, myInstance)->gtpInst=du_create_gtpu_instance_to_cu(msgSetup->CU_f1_ip_address.ipv4_address, //"172.21.6.9", //"172.21.10.9",//"172.21.9.5", //msgSetup->CU_f1_ip_address.ipv4_address, //"192.168.18.91"
                                             msgSetup->CUport,
                                             msgSetup->DU_f1_ip_address.ipv4_address,
                                             msgSetup->DUport);
@@ -175,7 +175,7 @@ void *F1AP_DU_task(void *arg) {
         break;
 
       case F1AP_UL_RRC_MESSAGE: // to rrc
-        LOG_I(F1AP, "DU Task Received F1AP_UL_RRC_MESSAGE\n");
+        LOG_D(F1AP, "DU Task Received F1AP_UL_RRC_MESSAGE\n");
 
         if (RC.nrrrc && RC.nrrrc[0]->node_type == ngran_gNB_DU) {
           DU_send_UL_NR_RRC_MESSAGE_TRANSFER(myInstance,
@@ -191,6 +191,11 @@ void *F1AP_DU_task(void *arg) {
         DU_send_UE_CONTEXT_SETUP_RESPONSE(myInstance, &F1AP_UE_CONTEXT_SETUP_RESP(msg));
         break;
 
+      case F1AP_UE_CONTEXT_MODIFICATION_RESP:
+        LOG_I(F1AP, "DU task received itti message from RRC for F1AP_UE_CONTEXT_MODIFICATION_RESP message generation \n");
+        DU_send_UE_CONTEXT_MODIFICATION_RESPONSE(myInstance, &F1AP_UE_CONTEXT_MODIFICATION_RESP(msg));
+        break;
+
       case F1AP_UE_CONTEXT_RELEASE_REQ: // from MAC
         LOG_I(F1AP, "DU Task Received F1AP_UE_CONTEXT_RELEASE_REQ\n");
         DU_send_UE_CONTEXT_RELEASE_REQUEST(myInstance,
diff --git a/openair2/F1AP/f1ap_du_ue_context_management.c b/openair2/F1AP/f1ap_du_ue_context_management.c
index 7b20bfb2aa54aa81962809ce9c7bdd6a21d0a72d..cb15862921412be5bfd085cc01ecbcf92121db3e 100644
--- a/openair2/F1AP/f1ap_du_ue_context_management.c
+++ b/openair2/F1AP/f1ap_du_ue_context_management.c
@@ -42,16 +42,16 @@
 #include "openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h"
 #include <openair3/ocp-gtpu/gtp_itf.h>
 
-boolean_t lteDURecvCb( protocol_ctxt_t  *ctxt_pP,
-                       const srb_flag_t     srb_flagP,
-                       const rb_id_t        rb_idP,
-                       const mui_t          muiP,
-                       const confirm_t      confirmP,
-                       const sdu_size_t     sdu_buffer_sizeP,
-                       unsigned char *const sdu_buffer_pP,
-                       const pdcp_transmission_mode_t modeP,
-                       const uint32_t *sourceL2Id,
-                       const uint32_t *destinationL2Id) {
+bool lteDURecvCb(protocol_ctxt_t  *ctxt_pP,
+                 const srb_flag_t     srb_flagP,
+                 const rb_id_t        rb_idP,
+                 const mui_t          muiP,
+                 const confirm_t      confirmP,
+                 const sdu_size_t     sdu_buffer_sizeP,
+                 unsigned char *const sdu_buffer_pP,
+                 const pdcp_transmission_mode_t modeP,
+                 const uint32_t *sourceL2Id,
+                 const uint32_t *destinationL2Id) {
   // The buffer comes from the stack in gtp-u thread, we have a make a separate buffer to enqueue in a inter-thread message queue
   mem_block_t *sdu=get_free_mem_block(sdu_buffer_sizeP, __func__);
   memcpy(sdu->data,  sdu_buffer_pP,  sdu_buffer_sizeP);
@@ -131,6 +131,19 @@ int DU_handle_UE_CONTEXT_SETUP_REQUEST(instance_t       instance,
     f1ap_ue_context_setup_req->cellULConfigured = NULL;
   }
 
+  F1AP_UEContextSetupRequestIEs_t *ieCuRrcInfo;
+  F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextSetupRequestIEs_t, ieCuRrcInfo, container,
+      F1AP_ProtocolIE_ID_id_CUtoDURRCInformation, false);
+  if(ieCuRrcInfo!=NULL){
+    f1ap_ue_context_setup_req->cu_to_du_rrc_information = (cu_to_du_rrc_information_t *)calloc(1,sizeof(cu_to_du_rrc_information_t));
+    if(ieCuRrcInfo->value.choice.CUtoDURRCInformation.uE_CapabilityRAT_ContainerList!=NULL){
+      f1ap_ue_context_setup_req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList = (uint8_t *)calloc(1,ieCuRrcInfo->value.choice.CUtoDURRCInformation.uE_CapabilityRAT_ContainerList->size);
+      memcpy(f1ap_ue_context_setup_req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList, ieCuRrcInfo->value.choice.CUtoDURRCInformation.uE_CapabilityRAT_ContainerList->buf, ieCuRrcInfo->value.choice.CUtoDURRCInformation.uE_CapabilityRAT_ContainerList->size);
+      f1ap_ue_context_setup_req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList_length = ieCuRrcInfo->value.choice.CUtoDURRCInformation.uE_CapabilityRAT_ContainerList->size;
+      LOG_I(F1AP, "Size f1ap_ue_context_setup_req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList_length: %d \n", f1ap_ue_context_setup_req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList_length);
+    }
+  }
+
   /* DRB */
   F1AP_UEContextSetupRequestIEs_t *ieDrb;
   F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextSetupRequestIEs_t, ieDrb, container,
@@ -174,14 +187,16 @@ int DU_handle_UE_CONTEXT_SETUP_REQUEST(instance_t       instance,
         transport_layer_addr_t addr;
         memcpy(addr.buffer, &drb_p->up_ul_tnl[0].tl_address, sizeof(drb_p->up_ul_tnl[0].tl_address));
         addr.length=sizeof(drb_p->up_ul_tnl[0].tl_address)*8;
-        drb_p->up_dl_tnl[0].teid=newGtpuCreateTunnel(INSTANCE_DEFAULT,
-                                 f1ap_ue_context_setup_req->rnti,
-                                 drb_p->drb_id,
-                                 drb_p->drb_id,
-                                 drb_p->up_ul_tnl[0].teid,
-                                 addr,
-                                 drb_p->up_ul_tnl[0].port,
-                                 lteDURecvCb);
+        drb_p->up_dl_tnl[0].teid = newGtpuCreateTunnel(INSTANCE_DEFAULT,
+                                                       f1ap_ue_context_setup_req->rnti,
+                                                       drb_p->drb_id,
+                                                       drb_p->drb_id,
+                                                       drb_p->up_ul_tnl[0].teid,
+                                                       -1, // no qfi
+                                                       addr,
+                                                       drb_p->up_ul_tnl[0].port,
+                                                       lteDURecvCb,
+                                                       NULL);
         drb_p->up_dl_tnl_length++;
       }
     }
@@ -218,17 +233,8 @@ int DU_handle_UE_CONTEXT_SETUP_REQUEST(instance_t       instance,
       f1ap_ue_context_setup_req->rrc_container = malloc(ieRRC->value.choice.RRCContainer.size);
       memcpy(f1ap_ue_context_setup_req->rrc_container,
              ieRRC->value.choice.RRCContainer.buf, ieRRC->value.choice.RRCContainer.size);
+      f1ap_ue_context_setup_req->rrc_container_length = ieRRC->value.choice.RRCContainer.size;
       // AssertFatal(0, "check configuration, send to appropriate handler\n");
-      protocol_ctxt_t ctxt;
-      // decode RRC Container and act on the message type
-      //FIXME
-      //rnti_t rnti      = f1ap_get_rnti_by_du_id(DUtype, instance, du_ue_f1ap_id);
-      ctxt.instance = instance;
-      ctxt.instance  = instance;
-      ctxt.enb_flag  = 1;
-      mem_block_t *pdcp_pdu_p = get_free_mem_block(ieRRC->value.choice.RRCContainer.size, __func__);
-      memcpy(&pdcp_pdu_p->data[0], ieRRC->value.choice.RRCContainer.buf, ieRRC->value.choice.RRCContainer.size);
-      du_rlc_data_req(&ctxt, 1, 0x00, 1, 1, 0, ieRRC->value.choice.RRCContainer.size, pdcp_pdu_p);
     } else {
       LOG_E(F1AP, " RRCContainer in UEContextSetupRequestIEs size id 0\n");
     }
@@ -245,7 +251,7 @@ int DU_handle_UE_CONTEXT_SETUP_REQUEST(instance_t       instance,
   return 0;
 }
 
-int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance, f1ap_ue_context_setup_t *req) {
+int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance, f1ap_ue_context_setup_t *resp) {
   F1AP_F1AP_PDU_t                  pdu= {0};
   F1AP_UEContextSetupResponse_t    *out;
   uint8_t  *buffer=NULL;
@@ -264,41 +270,42 @@ int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance, f1ap_ue_context_setup
   ie1->id                             = F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
   ie1->criticality                    = F1AP_Criticality_reject;
   ie1->value.present                  = F1AP_UEContextSetupResponseIEs__value_PR_GNB_CU_UE_F1AP_ID;
-  ie1->value.choice.GNB_CU_UE_F1AP_ID = req->gNB_CU_ue_id;
+  ie1->value.choice.GNB_CU_UE_F1AP_ID = resp->gNB_CU_ue_id;
   /* mandatory */
   /* c2. GNB_DU_UE_F1AP_ID */
   asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupResponseIEs_t, ie2);
   ie2->id                             = F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
   ie2->criticality                    = F1AP_Criticality_reject;
   ie2->value.present                  = F1AP_UEContextSetupResponseIEs__value_PR_GNB_DU_UE_F1AP_ID;
-  ie2->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(DUtype, instance, req->rnti);
+  ie2->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(DUtype, instance, resp->rnti);
+
   /* mandatory */
   /* c3. DUtoCURRCInformation */
-  //if (0) {
-  asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupResponseIEs_t, ie3);
-  ie3->id                             = F1AP_ProtocolIE_ID_id_DUtoCURRCInformation;
-  ie3->criticality                    = F1AP_Criticality_reject;
-  ie3->value.present                  = F1AP_UEContextSetupResponseIEs__value_PR_DUtoCURRCInformation;
-  {
-    /* cellGroupConfig */
-    OCTET_STRING_fromBuf(&ie3->value.choice.DUtoCURRCInformation.cellGroupConfig, (const char *)req->du_to_cu_rrc_information,
-                         req->du_to_cu_rrc_information_length);
+  if(resp->du_to_cu_rrc_information){
+    asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupResponseIEs_t, ie3);
+    ie3->id                             = F1AP_ProtocolIE_ID_id_DUtoCURRCInformation;
+    ie3->criticality                    = F1AP_Criticality_reject;
+    ie3->value.present                  = F1AP_UEContextSetupResponseIEs__value_PR_DUtoCURRCInformation;
+    if(resp->du_to_cu_rrc_information->cellGroupConfig!=NULL){
+      /* cellGroupConfig */
+      OCTET_STRING_fromBuf(&ie3->value.choice.DUtoCURRCInformation.cellGroupConfig, (const char *)resp->du_to_cu_rrc_information->cellGroupConfig,
+        resp->du_to_cu_rrc_information->cellGroupConfig_length);
+    }
 
     /* OPTIONAL */
     /* measGapConfig */
-    if (0) {
-      asn1cCalloc(ie3->value.choice.DUtoCURRCInformation.measGapConfig, tmp);
-      OCTET_STRING_fromBuf(tmp, "asdsa", strlen("asdsa"));
+    if (resp->du_to_cu_rrc_information->measGapConfig!=NULL) {
+      OCTET_STRING_fromBuf(ie3->value.choice.DUtoCURRCInformation.measGapConfig, (const char *)resp->du_to_cu_rrc_information->measGapConfig,
+        resp->du_to_cu_rrc_information->measGapConfig_length);
     }
 
     /* OPTIONAL */
     /* requestedP_MaxFR1 */
-    if (0) {
-      asn1cCalloc(ie3->value.choice.DUtoCURRCInformation.requestedP_MaxFR1, tmp);
-      OCTET_STRING_fromBuf(tmp, "asdsa", strlen("asdsa"));
+    if (resp->du_to_cu_rrc_information->requestedP_MaxFR1!=NULL) {
+      OCTET_STRING_fromBuf(ie3->value.choice.DUtoCURRCInformation.requestedP_MaxFR1, (const char *)resp->du_to_cu_rrc_information->requestedP_MaxFR1,
+          resp->du_to_cu_rrc_information->requestedP_MaxFR1_length);
     }
   }
-  //}
 
   /* optional */
   /* c4. C_RNTI */
@@ -308,7 +315,7 @@ int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance, f1ap_ue_context_setup
     ie4->criticality                    = F1AP_Criticality_ignore;
     ie4->value.present                  = F1AP_UEContextSetupResponseIEs__value_PR_C_RNTI;
     //C_RNTI_TO_BIT_STRING(rntiP, &ie->value.choice.C_RNTI);
-    ie4->value.choice.C_RNTI=req->rnti;
+    ie4->value.choice.C_RNTI=resp->rnti;
     LOG_E(F1AP,"RNTI to code!\n");
   }
 
@@ -335,46 +342,48 @@ int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance, f1ap_ue_context_setup
 
   /* mandatory */
   /* c7. DRBs_Setup_List */
-  asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupResponseIEs_t, ie7);
-  ie7->id                             = F1AP_ProtocolIE_ID_id_DRBs_Setup_List;
-  ie7->criticality                    = F1AP_Criticality_ignore;
-  ie7->value.present                  = F1AP_UEContextSetupResponseIEs__value_PR_DRBs_Setup_List;
-
-  for (int i=0;  i< req->drbs_to_be_setup_length; i++) {
-    //
-    asn1cSequenceAdd(ie7->value.choice.DRBs_Setup_List.list,
-                     F1AP_DRBs_Setup_ItemIEs_t, drbs_setup_item_ies);
-    drbs_setup_item_ies->id            = F1AP_ProtocolIE_ID_id_DRBs_Setup_Item;
-    drbs_setup_item_ies->criticality   = F1AP_Criticality_ignore;
-    drbs_setup_item_ies->value.present = F1AP_SRBs_FailedToBeSetup_ItemIEs__value_PR_SRBs_FailedToBeSetup_Item;
-    /* 7.1 DRBs_Setup_Item */
-    /* ADD */
-    F1AP_DRBs_Setup_Item_t *drbs_setup_item=&drbs_setup_item_ies->value.choice.DRBs_Setup_Item;
-    /* dRBID */
-    drbs_setup_item->dRBID = req->drbs_to_be_setup[i].drb_id;
+  if(resp->drbs_to_be_setup_length > 0){
+    asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupResponseIEs_t, ie7);
+    ie7->id                             = F1AP_ProtocolIE_ID_id_DRBs_Setup_List;
+    ie7->criticality                    = F1AP_Criticality_ignore;
+    ie7->value.present                  = F1AP_UEContextSetupResponseIEs__value_PR_DRBs_Setup_List;
+    for (int i=0;  i< resp->drbs_to_be_setup_length; i++) {
+      //
+      asn1cSequenceAdd(ie7->value.choice.DRBs_Setup_List.list,
+          F1AP_DRBs_Setup_ItemIEs_t, drbs_setup_item_ies);
+      drbs_setup_item_ies->id            = F1AP_ProtocolIE_ID_id_DRBs_Setup_Item;
+      drbs_setup_item_ies->criticality   = F1AP_Criticality_ignore;
+      drbs_setup_item_ies->value.present = F1AP_DRBs_Setup_ItemIEs__value_PR_DRBs_Setup_Item;
+      /* 7.1 DRBs_Setup_Item */
+      /* ADD */
+      F1AP_DRBs_Setup_Item_t *drbs_setup_item=&drbs_setup_item_ies->value.choice.DRBs_Setup_Item;
+      /* dRBID */
+      drbs_setup_item->dRBID = resp->drbs_to_be_setup[i].drb_id;
 
-    /* OPTIONAL */
-    /* lCID */
-    //drbs_setup_item.lCID = (F1AP_LCID_t *)calloc(1, sizeof(F1AP_LCID_t));
-    //drbs_setup_item.lCID = 1L;
+      /* OPTIONAL */
+      /* lCID */
+      //drbs_setup_item.lCID = (F1AP_LCID_t *)calloc(1, sizeof(F1AP_LCID_t));
+      //drbs_setup_item.lCID = 1L;
 
-    for (int j=0;  j<req->drbs_to_be_setup[i].up_dl_tnl_length; j++) {
-      /* ADD */
-      asn1cSequenceAdd(drbs_setup_item->dLUPTNLInformation_ToBeSetup_List.list,
+      for (int j=0;  j<resp->drbs_to_be_setup[i].up_dl_tnl_length; j++) {
+        /* ADD */
+        asn1cSequenceAdd(drbs_setup_item->dLUPTNLInformation_ToBeSetup_List.list,
                        F1AP_DLUPTNLInformation_ToBeSetup_Item_t, dLUPTNLInformation_ToBeSetup_Item);
-      dLUPTNLInformation_ToBeSetup_Item->dLUPTNLInformation.present = F1AP_UPTransportLayerInformation_PR_gTPTunnel;
-      /* gTPTunnel */
-      asn1cCalloc(dLUPTNLInformation_ToBeSetup_Item->dLUPTNLInformation.choice.gTPTunnel,gTPTunnel);
-      /* transportLayerAddress */
-      struct sockaddr_in addr= {0};
-      inet_pton(AF_INET, getCxt(false,instance)->setupReq.DU_f1_ip_address.ipv4_address,
-                &addr.sin_addr.s_addr);
-      TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(addr.sin_addr.s_addr,
-          &gTPTunnel->transportLayerAddress);
-      /* gTP_TEID */
-      INT32_TO_OCTET_STRING(req->drbs_to_be_setup[i].up_dl_tnl[j].teid, &gTPTunnel->gTP_TEID);
-    } // for j
-  } // for i
+        dLUPTNLInformation_ToBeSetup_Item->dLUPTNLInformation.present = F1AP_UPTransportLayerInformation_PR_gTPTunnel;
+        /* gTPTunnel */
+        asn1cCalloc(dLUPTNLInformation_ToBeSetup_Item->dLUPTNLInformation.choice.gTPTunnel,gTPTunnel);
+        /* transportLayerAddress */
+        struct sockaddr_in addr= {0};
+        inet_pton(AF_INET, getCxt(false,instance)->setupReq.DU_f1_ip_address.ipv4_address,
+            &addr.sin_addr.s_addr);
+        TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(addr.sin_addr.s_addr,
+            &gTPTunnel->transportLayerAddress);
+        /* gTP_TEID */
+        INT32_TO_OCTET_STRING(resp->drbs_to_be_setup[i].up_dl_tnl[j].teid, &gTPTunnel->gTP_TEID);
+      } // for j
+    } // for i
+
+  }
 
   /* mandatory */
   /* c8. SRBs_FailedToBeSetup_List */
@@ -387,7 +396,7 @@ int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance, f1ap_ue_context_setup
     for (int i=0;  i<1; i++) {
       //
       asn1cSequenceAdd(ie8->value.choice.SRBs_FailedToBeSetup_List.list,
-                       F1AP_SRBs_FailedToBeSetup_ItemIEs_t, srbs_failedToBeSetup_item_ies);
+        F1AP_SRBs_FailedToBeSetup_ItemIEs_t, srbs_failedToBeSetup_item_ies);
       srbs_failedToBeSetup_item_ies->id            = F1AP_ProtocolIE_ID_id_SRBs_FailedToBeSetup_Item;
       srbs_failedToBeSetup_item_ies->criticality   = F1AP_Criticality_ignore;
       srbs_failedToBeSetup_item_ies->value.present = F1AP_SRBs_FailedToBeSetup_ItemIEs__value_PR_SRBs_FailedToBeSetup_Item;
@@ -524,12 +533,13 @@ int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance, f1ap_ue_context_setup
 
   /* mandatory */
   /* c11. SRBs_Setup_List */
+  if(resp->srbs_to_be_setup_length > 0){
   asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupResponseIEs_t, ie11);
   ie11->id                             = F1AP_ProtocolIE_ID_id_SRBs_Setup_List;
   ie11->criticality                    = F1AP_Criticality_ignore;
   ie11->value.present                  = F1AP_UEContextSetupResponseIEs__value_PR_SRBs_Setup_List;
 
-  for (int i=0;  i< req->srbs_to_be_setup_length; i++) {//
+  for (int i=0;  i< resp->srbs_to_be_setup_length; i++) {//
     asn1cSequenceAdd(ie11->value.choice.SRBs_Setup_List.list,
                      F1AP_SRBs_Setup_ItemIEs_t, srbs_setup_item_ies);
     srbs_setup_item_ies->id            = F1AP_ProtocolIE_ID_id_SRBs_Setup_Item;
@@ -539,7 +549,8 @@ int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance, f1ap_ue_context_setup
     /* ADD */
     F1AP_SRBs_Setup_Item_t *srbs_setup_item=&srbs_setup_item_ies->value.choice.SRBs_Setup_Item;
     /* sRBID */
-    srbs_setup_item->sRBID = req->srbs_to_be_setup[i].srb_id;
+    srbs_setup_item->sRBID = resp->srbs_to_be_setup[i].srb_id;
+  }
   }
 
   /* Optional */
@@ -581,6 +592,7 @@ int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance, f1ap_ue_context_setup
                                getCxt(false, instance)->default_sctp_stream_id);
   return 0;
 }
+
 int DU_send_UE_CONTEXT_SETUP_FAILURE(instance_t instance) {
   AssertFatal(1==0,"Not implemented yet\n");
 }
@@ -658,7 +670,7 @@ int DU_send_UE_CONTEXT_RELEASE_REQUEST(instance_t instance,
                                getCxt(false, instance)->default_sctp_stream_id);
   return 0;
 }
-int DU_handle_UE_CONTEXT_RELEASE_COMMAND(instance_t       instance,
+/*int DU_handle_UE_CONTEXT_RELEASE_COMMAND(instance_t       instance,
     uint32_t         assoc_id,
     uint32_t         stream,
     F1AP_F1AP_PDU_t *pdu) {
@@ -667,14 +679,14 @@ int DU_handle_UE_CONTEXT_RELEASE_COMMAND(instance_t       instance,
   protocol_ctxt_t ctxt;
   DevAssert(pdu);
   container = &pdu->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
-  /* GNB_CU_UE_F1AP_ID */
+  // GNB_CU_UE_F1AP_ID
   F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextReleaseCommandIEs_t, ie, container,
                              F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID, true);
   ctxt.rnti = f1ap_get_rnti_by_cu_id(DUtype, instance, ie->value.choice.GNB_CU_UE_F1AP_ID);
   ctxt.instance = instance;
   ctxt.module_id = instance;
   ctxt.enb_flag  = 1;
-  /* GNB_DU_UE_F1AP_ID */
+  // GNB_DU_UE_F1AP_ID
   F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextReleaseCommandIEs_t, ie, container,
                              F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID, true);
   const rnti_t rnti = f1ap_get_rnti_by_du_id(DUtype, instance,
@@ -683,18 +695,18 @@ int DU_handle_UE_CONTEXT_RELEASE_COMMAND(instance_t       instance,
               "RNTI obtained through DU ID (%x) is different from CU ID (%x)\n",
               rnti, ctxt.rnti);
   int UE_out_of_sync = 0;
-
   if (RC.nrrrc && RC.nrrrc[instance]->node_type == ngran_gNB_DU) {
-    for (int n = 0; n < MAX_MOBILES_PER_GNB; ++n) {
-      if (RC.nrmac[instance]->UE_info.active[n] == TRUE
-          && rnti == RC.nrmac[instance]->UE_info.rnti[n]) {
+    UE_iterator(RC.nrmac[instance]->UE_info.list, UE) {
+      if (UE->rnti == rnti) {
         UE_out_of_sync = 0;
         break;
       }
     }
+    if (!UE)
+      LOG_E(F1AP,"Not found rnti: %x\n", rnti);
   } else {
     for (int n = 0; n < MAX_MOBILES_PER_ENB; ++n) {
-      if (RC.mac[instance]->UE_info.active[n] == TRUE
+      if (RC.mac[instance]->UE_info.active[n] == true
           && rnti == UE_RNTI(instance, n)) {
         UE_out_of_sync = RC.mac[instance]->UE_info.UE_sched_ctrl[n].ul_out_of_sync;
         break;
@@ -702,13 +714,13 @@ int DU_handle_UE_CONTEXT_RELEASE_COMMAND(instance_t       instance,
     }
   }
 
-  /* We don't need the Cause */
-  /* Optional RRC Container: if present, send to UE */
+  // We don't need the Cause
+  // Optional RRC Container: if present, send to UE
   F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextReleaseCommandIEs_t, ie, container,
                              F1AP_ProtocolIE_ID_id_RRCContainer, false);
 
   if (ie && !UE_out_of_sync) {
-    /* RRC message and UE is reachable, send message */
+    // RRC message and UE is reachable, send message
     const sdu_size_t sdu_len = ie->value.choice.RRCContainer.size;
     mem_block_t *pdu_p = NULL;
     pdu_p = get_free_mem_block(sdu_len, __func__);
@@ -759,8 +771,8 @@ int DU_handle_UE_CONTEXT_RELEASE_COMMAND(instance_t       instance,
     ue_context_p = rrc_eNB_get_ue_context(RC.rrc[ctxt.instance], ctxt.rnti);
 
     if (ue_context_p && !UE_out_of_sync) {
-      /* UE exists and is in sync so we start a timer before releasing the
-       * connection */
+      // UE exists and is in sync so we start a timer before releasing the
+      //  connection
       pthread_mutex_lock(&rrc_release_freelist);
 
       for (uint16_t release_num = 0; release_num < NUMBER_OF_UE_MAX; release_num++) {
@@ -784,19 +796,198 @@ int DU_handle_UE_CONTEXT_RELEASE_COMMAND(instance_t       instance,
       pthread_mutex_unlock(&rrc_release_freelist);
       ue_context_p->ue_context.ue_release_timer_s1 = 0;
     } else if (ue_context_p && UE_out_of_sync) {
-      /* UE exists and is out of sync, drop the connection */
+      // UE exists and is out of sync, drop the connection
       mac_eNB_rrc_ul_failure(instance, 0, 0, 0, rnti);
     } else {
       LOG_E(F1AP, "no ue_context for RNTI %x, acknowledging release\n", rnti);
     }
 
-    /* TODO send this once the connection has really been released */
+    // TODO send this once the connection has really been released
+    f1ap_ue_context_release_cplt_t cplt;
+    cplt.rnti = ctxt.rnti;
+    DU_send_UE_CONTEXT_RELEASE_COMPLETE(instance, &cplt);
+    return 0;
+  }
+}*/
+
+
+int DU_handle_UE_CONTEXT_RELEASE_COMMAND(instance_t       instance,
+    uint32_t         assoc_id,
+    uint32_t         stream,
+    F1AP_F1AP_PDU_t *pdu) {
+  F1AP_UEContextReleaseCommand_t *container;
+  F1AP_UEContextReleaseCommandIEs_t *ie;
+  protocol_ctxt_t ctxt;
+
+  /* ITTI message to NR-RRC for the case of gNB-DU */
+  MessageDef                      *msg_p; // message to NR-RRC
+  msg_p = itti_alloc_new_message(TASK_DU_F1, 0,  F1AP_UE_CONTEXT_RELEASE_CMD);
+  f1ap_ue_context_release_req_t *f1ap_ue_context_release_cmd = &F1AP_UE_CONTEXT_RELEASE_CMD(msg_p);
+
+
+  DevAssert(pdu);
+  container = &pdu->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
+  // GNB_CU_UE_F1AP_ID
+  F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextReleaseCommandIEs_t, ie, container,
+                             F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID, true);
+  if(RC.nrrrc && RC.nrrrc[instance]->node_type == ngran_gNB_DU){
+    f1ap_ue_context_release_cmd->rnti = f1ap_get_rnti_by_cu_id(DUtype, instance, ie->value.choice.GNB_CU_UE_F1AP_ID);
+  }
+  else{
+    ctxt.rnti = f1ap_get_rnti_by_cu_id(DUtype, instance, ie->value.choice.GNB_CU_UE_F1AP_ID);
+    ctxt.instance = instance;
+    ctxt.module_id = instance;
+    ctxt.enb_flag  = 1;
+  }
+  // GNB_DU_UE_F1AP_ID
+  F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextReleaseCommandIEs_t, ie, container,
+                             F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID, true);
+  const rnti_t rnti = f1ap_get_rnti_by_du_id(DUtype, instance,
+                      ie->value.choice.GNB_DU_UE_F1AP_ID);
+  if(RC.nrrrc && RC.nrrrc[instance]->node_type == ngran_gNB_DU){
+    AssertFatal(f1ap_ue_context_release_cmd->rnti == rnti,
+            "RNTI obtained through DU ID (%x) is different from CU ID (%x)\n",
+            rnti, f1ap_ue_context_release_cmd->rnti);
+  }
+  else{
+    AssertFatal(ctxt.rnti == rnti,
+        "RNTI obtained through DU ID (%x) is different from CU ID (%x)\n",
+        rnti, ctxt.rnti);
+  }
+  int UE_out_of_sync = 0;
+
+  if(RC.rrc && RC.rrc[instance]->node_type == ngran_eNB_DU){
+    for (int n = 0; n < MAX_MOBILES_PER_ENB; ++n) {
+      if (RC.mac[instance]->UE_info.active[n] == true
+          && rnti == UE_RNTI(instance, n)) {
+        UE_out_of_sync = RC.mac[instance]->UE_info.UE_sched_ctrl[n].ul_out_of_sync;
+        break;
+      }
+    }
+  }
+
+  // We don't need the Cause
+  // Optional RRC Container: if present, send to UE
+  F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextReleaseCommandIEs_t, ie, container,
+                             F1AP_ProtocolIE_ID_id_RRCContainer, false);
+
+  if (ie && !UE_out_of_sync && RC.rrc && RC.rrc[instance]->node_type == ngran_eNB_DU) {
+    // RRC message and UE is reachable, send message
+    const sdu_size_t sdu_len = ie->value.choice.RRCContainer.size;
+    mem_block_t *pdu_p = NULL;
+    pdu_p = get_free_mem_block(sdu_len, __func__);
+    memcpy(&pdu_p->data[0], ie->value.choice.RRCContainer.buf, sdu_len);
+    rlc_op_status_t rlc_status = rlc_data_req(&ctxt
+                                 , 1
+                                 , MBMS_FLAG_NO
+                                 , 1 // SRB 1 correct?
+                                 , 0
+                                 , 0
+                                 , sdu_len
+                                 , pdu_p
+                                 ,NULL
+                                 ,NULL
+                                             );
+
+    switch (rlc_status) {
+      case RLC_OP_STATUS_OK:
+        break;
+
+      case RLC_OP_STATUS_BAD_PARAMETER:
+        LOG_W(F1AP, "Data sending request over RLC failed with 'Bad Parameter' reason!\n");
+        break;
+
+      case RLC_OP_STATUS_INTERNAL_ERROR:
+        LOG_W(F1AP, "Data sending request over RLC failed with 'Internal Error' reason!\n");
+        break;
+
+      case RLC_OP_STATUS_OUT_OF_RESSOURCES:
+        LOG_W(F1AP, "Data sending request over RLC failed with 'Out of Resources' reason!\n");
+        break;
+
+      default:
+        LOG_W(F1AP, "RLC returned an unknown status code after F1AP placed "
+              "the order to send some data (Status Code:%d)\n", rlc_status);
+        break;
+    }
+  }
+  else if(ie && RC.nrrrc && RC.nrrrc[instance]->node_type == ngran_gNB_DU) {
+    f1ap_ue_context_release_cmd->rrc_container = malloc(ie->value.choice.RRCContainer.size);
+    memcpy(f1ap_ue_context_release_cmd->rrc_container,
+        ie->value.choice.RRCContainer.buf, ie->value.choice.RRCContainer.size);
+  }
+
+  if (RC.nrrrc && RC.nrrrc[instance]->node_type == ngran_gNB_DU) {
+    F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextReleaseCommandIEs_t, ie, container,
+        F1AP_ProtocolIE_ID_id_Cause, true);
+    switch (ie->value.choice.Cause.present){
+    case  F1AP_Cause_PR_radioNetwork:
+      LOG_W (F1AP, "UE context release command cause is due to radioNetwork with specific code: %ld\n",ie->value.choice.Cause.choice.radioNetwork);
+      f1ap_ue_context_release_cmd->cause = F1AP_CAUSE_RADIO_NETWORK;
+      break;
+    case F1AP_Cause_PR_transport:
+      LOG_W (F1AP, "UE context release command cause is due to transport with specific code: %ld\n",ie->value.choice.Cause.choice.transport);
+      f1ap_ue_context_release_cmd->cause = F1AP_CAUSE_TRANSPORT;
+      break;
+    case F1AP_Cause_PR_protocol:
+      LOG_W (F1AP, "UE context release command cause is due to protocol with specific code: %ld\n",ie->value.choice.Cause.choice.protocol);
+      f1ap_ue_context_release_cmd->cause = F1AP_CAUSE_PROTOCOL;
+      break;
+    case F1AP_Cause_PR_misc:
+      LOG_W (F1AP, "UE context release command cause is misc with specific code: %ld \n",ie->value.choice.Cause.choice.misc);
+      f1ap_ue_context_release_cmd->cause = F1AP_CAUSE_MISC;
+      break;
+    default:
+      LOG_W(F1AP, "Unknown cause for UE context release command\n");
+      break;
+
+    }
+    itti_send_msg_to_task(TASK_RRC_GNB, instance, msg_p);
+    return 0;
+  } else {
+    struct rrc_eNB_ue_context_s *ue_context_p;
+    ue_context_p = rrc_eNB_get_ue_context(RC.rrc[ctxt.instance], ctxt.rnti);
+
+    if (ue_context_p && !UE_out_of_sync) {
+      // UE exists and is in sync so we start a timer before releasing the
+      //  connection
+      pthread_mutex_lock(&rrc_release_freelist);
+
+      for (uint16_t release_num = 0; release_num < NUMBER_OF_UE_MAX; release_num++) {
+        if (rrc_release_info.RRC_release_ctrl[release_num].flag == 0) {
+          if (ue_context_p->ue_context.ue_release_timer_s1 > 0)
+            rrc_release_info.RRC_release_ctrl[release_num].flag = 1;
+          else
+            rrc_release_info.RRC_release_ctrl[release_num].flag = 2;
+
+          rrc_release_info.RRC_release_ctrl[release_num].rnti = ctxt.rnti;
+          LOG_D(F1AP, "add rrc_release_info RNTI %x\n", ctxt.rnti);
+          // TODO: how to provide the correct MUI?
+          rrc_release_info.RRC_release_ctrl[release_num].rrc_eNB_mui = 0;
+          rrc_release_info.num_UEs++;
+          LOG_D(RRC,"Generate DLSCH Release send: index %d rnti %x mui %d flag %d \n",release_num,
+                ctxt.rnti, 0, rrc_release_info.RRC_release_ctrl[release_num].flag);
+          break;
+        }
+      }
+
+      pthread_mutex_unlock(&rrc_release_freelist);
+      ue_context_p->ue_context.ue_release_timer_s1 = 0;
+    } else if (ue_context_p && UE_out_of_sync) {
+      // UE exists and is out of sync, drop the connection
+      mac_eNB_rrc_ul_failure(instance, 0, 0, 0, rnti);
+    } else {
+      LOG_E(F1AP, "no ue_context for RNTI %x, acknowledging release\n", rnti);
+    }
+
+    // TODO send this once the connection has really been released
     f1ap_ue_context_release_cplt_t cplt;
     cplt.rnti = ctxt.rnti;
     DU_send_UE_CONTEXT_RELEASE_COMPLETE(instance, &cplt);
     return 0;
   }
 }
+
 int DU_send_UE_CONTEXT_RELEASE_COMPLETE(instance_t instance,
                                         f1ap_ue_context_release_cplt_t *cplt) {
   F1AP_F1AP_PDU_t                     pdu= {0};
@@ -891,10 +1082,162 @@ int DU_handle_UE_CONTEXT_MODIFICATION_REQUEST(instance_t       instance,
     uint32_t         assoc_id,
     uint32_t         stream,
     F1AP_F1AP_PDU_t *pdu) {
-  AssertFatal(1==0,"Not implemented yet\n");
+
+  MessageDef                      *msg_p; // message to RRC
+  F1AP_UEContextModificationRequest_t    *container;
+  int i;
+  DevAssert(pdu);
+  msg_p = itti_alloc_new_message(TASK_DU_F1, 0,  F1AP_UE_CONTEXT_MODIFICATION_REQ);
+  f1ap_ue_context_setup_t *f1ap_ue_context_modification_req = &F1AP_UE_CONTEXT_MODIFICATION_REQ(msg_p);
+  container = &pdu->choice.initiatingMessage->value.choice.UEContextModificationRequest;
+
+  /* mandatory */
+  /* GNB_CU_UE_F1AP_ID */
+  F1AP_UEContextModificationRequestIEs_t *ieCU;
+  F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationRequestIEs_t, ieCU, container,
+      F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID, true);
+  f1ap_ue_context_modification_req->gNB_CU_ue_id = ieCU->value.choice.GNB_CU_UE_F1AP_ID;
+
+  /* mandatory */
+  /* GNB_DU_UE_F1AP_ID */
+  F1AP_UEContextModificationRequestIEs_t *ieDU_UE;
+  F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationRequestIEs_t, ieDU_UE, container,
+      F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID, true);
+  f1ap_ue_context_modification_req->gNB_DU_ue_id = ieDU_UE->value.choice.GNB_DU_UE_F1AP_ID;
+  f1ap_ue_context_modification_req->rnti = f1ap_get_rnti_by_du_id(DUtype, instance, f1ap_ue_context_modification_req->gNB_DU_ue_id);
+
+  if(f1ap_ue_context_modification_req->rnti<0)
+      LOG_E(F1AP, "Could not retrieve UE rnti based on the DU UE id \n");
+  else
+      LOG_I(F1AP, "Retrieved rnti is: %d \n", f1ap_ue_context_modification_req->rnti);
+
+  /* SRB */
+  F1AP_UEContextModificationRequestIEs_t *ieSrb;
+  F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationRequestIEs_t, ieSrb, container,
+      F1AP_ProtocolIE_ID_id_SRBs_ToBeSetupMod_List, false);
+
+  if(ieSrb != NULL) {
+    f1ap_ue_context_modification_req->srbs_to_be_setup_length = ieSrb->value.choice.SRBs_ToBeSetupMod_List.list.count;
+    f1ap_ue_context_modification_req->srbs_to_be_setup = calloc(f1ap_ue_context_modification_req->srbs_to_be_setup_length,
+        sizeof(f1ap_srb_to_be_setup_t));
+    AssertFatal(f1ap_ue_context_modification_req->srbs_to_be_setup,
+        "could not allocate memory for f1ap_ue_context_setup_req->srbs_to_be_setup\n");
+
+    for (i = 0; i < f1ap_ue_context_modification_req->srbs_to_be_setup_length; ++i) {
+      f1ap_srb_to_be_setup_t *srb_p = &f1ap_ue_context_modification_req->srbs_to_be_setup[i];
+      F1AP_SRBs_ToBeSetupMod_Item_t *srbs_tobesetupmod_item_p;
+      srbs_tobesetupmod_item_p = &((F1AP_SRBs_ToBeSetupMod_ItemIEs_t *)ieSrb->value.choice.SRBs_ToBeSetupMod_List.list.array[i])->value.choice.SRBs_ToBeSetupMod_Item;
+      srb_p->srb_id = srbs_tobesetupmod_item_p->sRBID;
+    }
+  }
+
+  /* DRB */
+  F1AP_UEContextModificationRequestIEs_t *ieDrb;
+  F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationRequestIEs_t, ieDrb, container,
+                   F1AP_ProtocolIE_ID_id_DRBs_ToBeSetupMod_List, false);
+
+  if(ieDrb!=NULL) {
+    f1ap_ue_context_modification_req->drbs_to_be_setup_length = ieDrb->value.choice.DRBs_ToBeSetupMod_List.list.count;
+    f1ap_ue_context_modification_req->drbs_to_be_setup = calloc(f1ap_ue_context_modification_req->drbs_to_be_setup_length,
+                               sizeof(f1ap_drb_to_be_setup_t));
+    AssertFatal(f1ap_ue_context_modification_req->drbs_to_be_setup,
+          "could not allocate memory for f1ap_ue_context_setup_req->drbs_to_be_setup\n");
+
+    for (i = 0; i < f1ap_ue_context_modification_req->drbs_to_be_setup_length; ++i) {
+      f1ap_drb_to_be_setup_t *drb_p = &f1ap_ue_context_modification_req->drbs_to_be_setup[i];
+      F1AP_DRBs_ToBeSetupMod_Item_t *drbs_tobesetupmod_item_p =
+          &((F1AP_DRBs_ToBeSetupMod_ItemIEs_t *)ieDrb->value.choice.DRBs_ToBeSetupMod_List.list.array[i])->value.choice.DRBs_ToBeSetupMod_Item;
+      drb_p->drb_id = drbs_tobesetupmod_item_p->dRBID;
+      /* TODO in the following, assume only one UP UL TNL is present.
+       * this matches/assumes OAI CU implementation, can be up to 2! */
+      drb_p->up_ul_tnl_length = 1;
+      AssertFatal(drbs_tobesetupmod_item_p->uLUPTNLInformation_ToBeSetup_List.list.count > 0,
+          "no UL UP TNL Information in DRBs to be Setup list\n");
+      F1AP_ULUPTNLInformation_ToBeSetup_Item_t *ul_up_tnl_info_p = (F1AP_ULUPTNLInformation_ToBeSetup_Item_t *)drbs_tobesetupmod_item_p->uLUPTNLInformation_ToBeSetup_List.list.array[0];
+      F1AP_GTPTunnel_t *ul_up_tnl0 = ul_up_tnl_info_p->uLUPTNLInformation.choice.gTPTunnel;
+      BIT_STRING_TO_TRANSPORT_LAYER_ADDRESS_IPv4(&ul_up_tnl0->transportLayerAddress, drb_p->up_ul_tnl[0].tl_address);
+      OCTET_STRING_TO_INT32(&ul_up_tnl0->gTP_TEID, drb_p->up_ul_tnl[0].teid);
+       // 3GPP assumes GTP-U is on port 2152, but OAI is configurable
+      drb_p->up_ul_tnl[0].port=getCxt(false,instance)->setupReq.CUport;
+
+      switch (drbs_tobesetupmod_item_p->rLCMode) {
+      case F1AP_RLCMode_rlc_am:
+        drb_p->rlc_mode = RLC_MODE_AM;
+        break;
+
+      default:
+        drb_p->rlc_mode = RLC_MODE_TM;
+        break;
+      }
+      if (!(RC.nrrrc && RC.nrrrc[instance]->node_type == ngran_gNB_DU)) {
+        transport_layer_addr_t addr;
+          memcpy(addr.buffer, &drb_p->up_ul_tnl[0].tl_address, sizeof(drb_p->up_ul_tnl[0].tl_address));
+          addr.length=sizeof(drb_p->up_ul_tnl[0].tl_address)*8;
+          drb_p->up_dl_tnl[0].teid = newGtpuCreateTunnel(INSTANCE_DEFAULT,
+                                                         f1ap_ue_context_modification_req->rnti,
+                                                         drb_p->drb_id,
+                                                         drb_p->drb_id,
+                                                         drb_p->up_ul_tnl[0].teid,
+                                                         -1, // no qfi
+                                                         addr,
+                                                         drb_p->up_ul_tnl[0].port,
+                                                         lteDURecvCb,
+                                                         NULL);
+          drb_p->up_dl_tnl_length++;
+      }
+    }
+  }
+  /* RRC Reconfiguration Complete indicator */
+  F1AP_UEContextModificationRequestIEs_t *ieReconf;
+  F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationRequestIEs_t, ieReconf, container,
+      F1AP_ProtocolIE_ID_id_RRCReconfigurationCompleteIndicator, false);
+
+  if(ieReconf) {
+    switch(ieReconf->value.choice.RRCReconfigurationCompleteIndicator){
+    case F1AP_RRCReconfigurationCompleteIndicator_true:
+      f1ap_ue_context_modification_req->ReconfigComplOutcome = RRCreconf_success;
+      break;
+
+    case F1AP_RRCReconfigurationCompleteIndicator_failure:
+      f1ap_ue_context_modification_req->ReconfigComplOutcome = RRCreconf_failure;
+      break;
+    }
+  }
+
+  /* RRCContainer */
+  F1AP_UEContextModificationRequestIEs_t *ieRRC;
+  F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationRequestIEs_t, ieRRC, container,
+      F1AP_ProtocolIE_ID_id_RRCContainer, false);
+
+  if (ieRRC) {
+    /* correct here */
+    if ( ieRRC->value.choice.RRCContainer.size )  {
+      f1ap_ue_context_modification_req->rrc_container = malloc(ieRRC->value.choice.RRCContainer.size);
+      memcpy(f1ap_ue_context_modification_req->rrc_container,
+          ieRRC->value.choice.RRCContainer.buf, ieRRC->value.choice.RRCContainer.size);
+      protocol_ctxt_t ctxt;
+      // decode RRC Container and act on the message type
+      ctxt.rnti = f1ap_ue_context_modification_req->rnti;
+      ctxt.instance = instance;
+      ctxt.module_id  = instance;
+      ctxt.enb_flag  = 1;
+      ctxt.eNB_index = instance;
+      mem_block_t *pdcp_pdu_p = get_free_mem_block(ieRRC->value.choice.RRCContainer.size, __func__);
+      memcpy(&pdcp_pdu_p->data[0], ieRRC->value.choice.RRCContainer.buf, ieRRC->value.choice.RRCContainer.size);
+      du_rlc_data_req(&ctxt, 1, 0x00, 1, 1, 0, ieRRC->value.choice.RRCContainer.size, pdcp_pdu_p);
+    } else {
+      LOG_E(F1AP, " RRCContainer in UEContextModificationRequestIEs size id 0\n");
+    }
+  } else {
+    LOG_W(F1AP, "can't find RRCContainer in UEContextModificationRequestIEs by id %ld \n", F1AP_ProtocolIE_ID_id_RRCContainer);
+  }
+
+  itti_send_msg_to_task(TASK_RRC_GNB, instance, msg_p);
+  return 0;
 }
+
 //void DU_send_UE_CONTEXT_MODIFICATION_RESPONSE(F1AP_UEContextModificationResponse_t *UEContextModificationResponse) {
-int DU_send_UE_CONTEXT_MODIFICATION_RESPONSE(instance_t instance) {
+int DU_send_UE_CONTEXT_MODIFICATION_RESPONSE(instance_t instance, f1ap_ue_context_setup_t *resp) {
   F1AP_F1AP_PDU_t                        pdu= {0};
   F1AP_UEContextModificationResponse_t    *out;
   uint8_t  *buffer=NULL;
@@ -913,14 +1256,14 @@ int DU_send_UE_CONTEXT_MODIFICATION_RESPONSE(instance_t instance) {
   ie1->id                             = F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
   ie1->criticality                    = F1AP_Criticality_reject;
   ie1->value.present                  = F1AP_UEContextModificationResponseIEs__value_PR_GNB_CU_UE_F1AP_ID;
-  ie1->value.choice.GNB_CU_UE_F1AP_ID = 126L;
+  ie1->value.choice.GNB_CU_UE_F1AP_ID = resp->gNB_CU_ue_id;
   /* mandatory */
   /* c2. GNB_DU_UE_F1AP_ID */
   asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie2);
   ie2->id                             = F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
   ie2->criticality                    = F1AP_Criticality_reject;
   ie2->value.present                  = F1AP_UEContextModificationResponseIEs__value_PR_GNB_DU_UE_F1AP_ID;
-  ie2->value.choice.GNB_DU_UE_F1AP_ID = 651L;
+  ie2->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(DUtype, instance, resp->rnti);
 
   /* optional */
   /* c3. ResourceCoordinationTransferContainer */
@@ -935,184 +1278,205 @@ int DU_send_UE_CONTEXT_MODIFICATION_RESPONSE(instance_t instance) {
 
   /* optional */
   /* c4. DUtoCURRCInformation */
-  if (0) {
+  if(resp->du_to_cu_rrc_information!=NULL){
     asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie4);
     ie4->id                             = F1AP_ProtocolIE_ID_id_DUtoCURRCInformation;
     ie4->criticality                    = F1AP_Criticality_reject;
     ie4->value.present                  = F1AP_UEContextModificationResponseIEs__value_PR_DUtoCURRCInformation;
-    OCTET_STRING_fromBuf(&ie4->value.choice.DUtoCURRCInformation.cellGroupConfig, "asdsa1d32sa1d31asd31as",
-                         strlen("asdsa1d32sa1d31asd31as"));
+    if(resp->du_to_cu_rrc_information->cellGroupConfig!=NULL){
+      /* cellGroupConfig */
+      OCTET_STRING_fromBuf(&ie4->value.choice.DUtoCURRCInformation.cellGroupConfig, (const char *)resp->du_to_cu_rrc_information->cellGroupConfig,
+          resp->du_to_cu_rrc_information->cellGroupConfig_length);
+    }
 
     /* OPTIONAL */
-    if (1) {
-      asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie41);
-      ie41->value.choice.DUtoCURRCInformation.measGapConfig = (F1AP_MeasGapConfig_t *)calloc(1, sizeof(F1AP_MeasGapConfig_t));
-      OCTET_STRING_fromBuf( ie41->value.choice.DUtoCURRCInformation.measGapConfig, "asdsa1d32sa1d31asd31as",
-                            strlen("asdsa1d32sa1d31asd31as"));
+    /* measGapConfig */
+    if (resp->du_to_cu_rrc_information->measGapConfig!=NULL) {
+      OCTET_STRING_fromBuf(ie4->value.choice.DUtoCURRCInformation.measGapConfig, (const char *)resp->du_to_cu_rrc_information->measGapConfig,
+        resp->du_to_cu_rrc_information->measGapConfig_length);
     }
-  }
 
-  /* mandatory */
-  /* c5. DRBs_SetupMod_List */
-  asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie5);
-  ie5->id                             = F1AP_ProtocolIE_ID_id_DRBs_SetupMod_List;
-  ie5->criticality                    = F1AP_Criticality_reject;
-  ie5->value.present                  = F1AP_UEContextModificationResponseIEs__value_PR_DRBs_SetupMod_List;
-
-  for (int i=0;   i<1;  i++) {
-    //
-    asn1cSequenceAdd(ie5->value.choice.DRBs_SetupMod_List.list,
-                     F1AP_DRBs_SetupMod_ItemIEs_t, drbs_setupMod_item_ies);
-    drbs_setupMod_item_ies->id            = F1AP_ProtocolIE_ID_id_DRBs_SetupMod_Item;
-    drbs_setupMod_item_ies->criticality   = F1AP_Criticality_reject;
-    drbs_setupMod_item_ies->value.present = F1AP_DRBs_SetupMod_ItemIEs__value_PR_DRBs_SetupMod_Item;
-    /* 10.1 DRBs_SetupMod_Item */
-    F1AP_DRBs_SetupMod_Item_t *drbs_setupMod_item=&drbs_setupMod_item_ies->value.choice.DRBs_SetupMod_Item;
-    /* dRBID */
-    drbs_setupMod_item->dRBID = 30L;
-    /* DLTunnels_SetupMod_List */
-    int maxnoofDLUPTNLInformation = 1; // 2;
-
-    for (int j=0;    j<maxnoofDLUPTNLInformation;    j++) {
-      /*  DLTunnels_ToBeSetup_Item */
-      asn1cSequenceAdd(ie5->value.choice.DRBs_SetupMod_List.list,
-                       F1AP_DLUPTNLInformation_ToBeSetup_Item_t, dLUPTNLInformation_ToBeSetup_Item);
-      dLUPTNLInformation_ToBeSetup_Item->dLUPTNLInformation.present = F1AP_UPTransportLayerInformation_PR_gTPTunnel;
-      asn1cCalloc(dLUPTNLInformation_ToBeSetup_Item->dLUPTNLInformation.choice.gTPTunnel,
-                  gTPTunnel);
-      TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(1234, &gTPTunnel->transportLayerAddress);
-      OCTET_STRING_fromBuf(&gTPTunnel->gTP_TEID, "1204",
-                           strlen("1204"));
+    /* OPTIONAL */
+    /* requestedP_MaxFR1 */
+    if (resp->du_to_cu_rrc_information->requestedP_MaxFR1!=NULL) {
+      OCTET_STRING_fromBuf(ie4->value.choice.DUtoCURRCInformation.requestedP_MaxFR1, (const char *)resp->du_to_cu_rrc_information->requestedP_MaxFR1,
+          resp->du_to_cu_rrc_information->requestedP_MaxFR1_length);
     }
   }
 
-  /* mandatory */
+
+  /* optional */
+  /* c5. DRBs_Setup_List */
+  if(resp->drbs_to_be_setup_length > 0) {
+    asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie5);
+    ie5->id                             = F1AP_ProtocolIE_ID_id_DRBs_SetupMod_List;
+    ie5->criticality                    = F1AP_Criticality_ignore;
+    ie5->value.present                  = F1AP_UEContextModificationResponseIEs__value_PR_DRBs_SetupMod_List;
+    for (int i=0;  i< resp->drbs_to_be_setup_length; i++) {
+      asn1cSequenceAdd(ie5->value.choice.DRBs_SetupMod_List.list, F1AP_DRBs_SetupMod_ItemIEs_t, drbs_setupmod_item_ies);
+      drbs_setupmod_item_ies->id            = F1AP_ProtocolIE_ID_id_DRBs_SetupMod_Item;
+      drbs_setupmod_item_ies->criticality   = F1AP_Criticality_ignore;
+      drbs_setupmod_item_ies->value.present = F1AP_DRBs_SetupMod_ItemIEs__value_PR_DRBs_SetupMod_Item;
+      /* 7.1 DRBs_Setup_Item */
+      /* ADD */
+      F1AP_DRBs_SetupMod_Item_t *drbs_setupmod_item=&drbs_setupmod_item_ies->value.choice.DRBs_SetupMod_Item;
+      /* dRBID */
+      drbs_setupmod_item->dRBID = resp->drbs_to_be_setup[i].drb_id;
+
+      for (int j=0;  j<resp->drbs_to_be_setup[i].up_dl_tnl_length; j++) {
+        /* ADD */
+        asn1cSequenceAdd(drbs_setupmod_item->dLUPTNLInformation_ToBeSetup_List.list,
+          F1AP_DLUPTNLInformation_ToBeSetup_Item_t, dLUPTNLInformation_ToBeSetup_Item);
+        dLUPTNLInformation_ToBeSetup_Item->dLUPTNLInformation.present = F1AP_UPTransportLayerInformation_PR_gTPTunnel;
+        /* gTPTunnel */
+        asn1cCalloc(dLUPTNLInformation_ToBeSetup_Item->dLUPTNLInformation.choice.gTPTunnel,gTPTunnel);
+        /* transportLayerAddress */
+        struct sockaddr_in addr= {0};
+        inet_pton(AF_INET, getCxt(false,instance)->setupReq.DU_f1_ip_address.ipv4_address,
+          &addr.sin_addr.s_addr);
+        TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(addr.sin_addr.s_addr,
+          &gTPTunnel->transportLayerAddress);
+        /* gTP_TEID */
+        INT32_TO_OCTET_STRING(resp->drbs_to_be_setup[i].up_dl_tnl[j].teid, &gTPTunnel->gTP_TEID);
+      } // for j
+    } // for i
+  }
+
+  /* optional */
   /* c6. DRBs_Modified_List */
-  asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie6);
-  ie6->id                             = F1AP_ProtocolIE_ID_id_DRBs_Modified_List;
-  ie6->criticality                    = F1AP_Criticality_reject;
-  ie6->value.present                  = F1AP_UEContextModificationResponseIEs__value_PR_DRBs_Modified_List;
-
-  for (int i=0;  i<1; i++) {
-    //
-    asn1cSequenceAdd(ie6->value.choice.DRBs_Modified_List.list,
-                     F1AP_DRBs_Modified_ItemIEs_t, drbs_modified_item_ies);
-    drbs_modified_item_ies->id            = F1AP_ProtocolIE_ID_id_DRBs_Modified_Item;
-    drbs_modified_item_ies->criticality   = F1AP_Criticality_reject;
-    drbs_modified_item_ies->value.present = F1AP_DRBs_Modified_ItemIEs__value_PR_DRBs_Modified_Item;
-    /* 13.1 SRBs_modified_Item */
-    F1AP_DRBs_Modified_Item_t *drbs_modified_item=
-      &drbs_modified_item_ies->value.choice.DRBs_Modified_Item;
-    /* dRBID */
-    drbs_modified_item->dRBID = 25L;
-    /* ULTunnels_Modified_List */
-    int maxnoofULTunnels = 1; // 2;
-
-    for (int j=0;  j<maxnoofULTunnels;  j++) {
-      /*  DLTunnels_Modified_Item */
-      asn1cSequenceAdd(drbs_modified_item->dLUPTNLInformation_ToBeSetup_List.list,
-                       F1AP_DLUPTNLInformation_ToBeSetup_Item_t, dLUPTNLInformation_ToBeSetup_Item);
-      asn1cCalloc(dLUPTNLInformation_ToBeSetup_Item, tmp);
-      tmp->dLUPTNLInformation.present = F1AP_UPTransportLayerInformation_PR_gTPTunnel;
-      asn1cCalloc(dLUPTNLInformation_ToBeSetup_Item->dLUPTNLInformation.choice.gTPTunnel, gTPTunnel);
-      TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(1234, &gTPTunnel->transportLayerAddress);
-      OCTET_STRING_fromBuf(&gTPTunnel->gTP_TEID, "1204", strlen("1204"));
+  if(resp->drbs_to_be_modified_length > 0){
+    asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie6);
+    ie6->id                             = F1AP_ProtocolIE_ID_id_DRBs_Modified_List;
+    ie6->criticality                    = F1AP_Criticality_ignore;
+    ie6->value.present                  = F1AP_UEContextModificationResponseIEs__value_PR_DRBs_Modified_List;
+
+    for (int i=0;  i<resp->drbs_to_be_modified_length; i++) {
+      asn1cSequenceAdd(ie6->value.choice.DRBs_Modified_List.list,
+        F1AP_DRBs_Modified_ItemIEs_t, drbs_modified_item_ies);
+      drbs_modified_item_ies->id            = F1AP_ProtocolIE_ID_id_DRBs_Modified_Item;
+      drbs_modified_item_ies->criticality   = F1AP_Criticality_ignore;
+      drbs_modified_item_ies->value.present = F1AP_DRBs_Modified_ItemIEs__value_PR_DRBs_Modified_Item;
+      /* DRBs_modified_Item */
+      F1AP_DRBs_Modified_Item_t *drbs_modified_item= &drbs_modified_item_ies->value.choice.DRBs_Modified_Item;
+      /* dRBID */
+      drbs_modified_item->dRBID = resp->drbs_to_be_modified[i].drb_id;
+      
+      /* ULTunnels_Modified_List */
+      for (int j=0;  j<resp->drbs_to_be_modified[i].up_dl_tnl_length;  j++) {
+        /*  DLTunnels_Modified_Item */
+        asn1cSequenceAdd(drbs_modified_item->dLUPTNLInformation_ToBeSetup_List.list,
+          F1AP_DLUPTNLInformation_ToBeSetup_Item_t, dLUPTNLInformation_ToBeSetup_Item);
+        asn1cCalloc(dLUPTNLInformation_ToBeSetup_Item, tmp);
+        tmp->dLUPTNLInformation.present = F1AP_UPTransportLayerInformation_PR_gTPTunnel;
+        asn1cCalloc(dLUPTNLInformation_ToBeSetup_Item->dLUPTNLInformation.choice.gTPTunnel, gTPTunnel);
+        /* transportLayerAddress */
+        struct sockaddr_in addr= {0};
+        inet_pton(AF_INET, getCxt(false,instance)->setupReq.DU_f1_ip_address.ipv4_address,
+          &addr.sin_addr.s_addr);
+        TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(addr.sin_addr.s_addr, &gTPTunnel->transportLayerAddress);
+        /* gTP_TEID */
+        INT32_TO_OCTET_STRING(resp->drbs_to_be_modified[i].up_dl_tnl[j].teid, &gTPTunnel->gTP_TEID);
+      }
     }
   }
 
-  /* mandatory */
+  /* optional */
   /* c7. SRBs_FailedToBeSetupMod_List */
-  asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie7);
-  ie7->id                             = F1AP_ProtocolIE_ID_id_SRBs_FailedToBeSetupMod_List;
-  ie7->criticality                    = F1AP_Criticality_reject;
-  ie7->value.present                  = F1AP_UEContextModificationResponseIEs__value_PR_SRBs_FailedToBeSetupMod_List;
-
-  for (int i=0; i<1; i++) {
-    //
-    asn1cSequenceAdd(ie7->value.choice.SRBs_FailedToBeSetupMod_List.list,
-                     F1AP_SRBs_FailedToBeSetupMod_ItemIEs_t, srbs_failedToBeSetupMod_item_ies);
-    srbs_failedToBeSetupMod_item_ies->id            = F1AP_ProtocolIE_ID_id_SRBs_FailedToBeSetupMod_Item;
-    srbs_failedToBeSetupMod_item_ies->criticality   = F1AP_Criticality_ignore;
-    srbs_failedToBeSetupMod_item_ies->value.present = F1AP_SRBs_FailedToBeSetupMod_ItemIEs__value_PR_SRBs_FailedToBeSetupMod_Item;
-    /* 9.1 SRBs_FailedToBeSetupMod_Item */
-    F1AP_SRBs_FailedToBeSetupMod_Item_t *srbs_failedToBeSetupMod_item=
-      &srbs_failedToBeSetupMod_item_ies->value.choice.SRBs_FailedToBeSetupMod_Item;
-    /* - sRBID */
-    srbs_failedToBeSetupMod_item->sRBID = 50L;
-    asn1cCalloc(srbs_failedToBeSetupMod_item->cause, tmp)
-    tmp->present = F1AP_Cause_PR_radioNetwork;
-    tmp->choice.radioNetwork = F1AP_CauseRadioNetwork_unknown_or_already_allocated_gnb_du_ue_f1ap_id;
+  if(resp->srbs_failed_to_be_setup_length > 0){
+    asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie7);
+    ie7->id                             = F1AP_ProtocolIE_ID_id_SRBs_FailedToBeSetupMod_List;
+    ie7->criticality                    = F1AP_Criticality_reject;
+    ie7->value.present                  = F1AP_UEContextModificationResponseIEs__value_PR_SRBs_FailedToBeSetupMod_List;
+
+    for (int i=0; i<resp->srbs_to_be_setup_length; i++) {
+      asn1cSequenceAdd(ie7->value.choice.SRBs_FailedToBeSetupMod_List.list,
+        F1AP_SRBs_FailedToBeSetupMod_ItemIEs_t, srbs_failedToBeSetupMod_item_ies);
+      srbs_failedToBeSetupMod_item_ies->id            = F1AP_ProtocolIE_ID_id_SRBs_FailedToBeSetupMod_Item;
+      srbs_failedToBeSetupMod_item_ies->criticality   = F1AP_Criticality_ignore;
+      srbs_failedToBeSetupMod_item_ies->value.present = F1AP_SRBs_FailedToBeSetupMod_ItemIEs__value_PR_SRBs_FailedToBeSetupMod_Item;
+      /* 9.1 SRBs_FailedToBeSetupMod_Item */
+      F1AP_SRBs_FailedToBeSetupMod_Item_t *srbs_failedToBeSetupMod_item=
+        &srbs_failedToBeSetupMod_item_ies->value.choice.SRBs_FailedToBeSetupMod_Item;
+      /* - sRBID */
+      srbs_failedToBeSetupMod_item->sRBID = resp->srbs_failed_to_be_setup[i].rb_id;
+      asn1cCalloc(srbs_failedToBeSetupMod_item->cause, tmp)
+      tmp->present = F1AP_Cause_PR_radioNetwork;
+      tmp->choice.radioNetwork = F1AP_CauseRadioNetwork_unknown_or_already_allocated_gnb_du_ue_f1ap_id;
+    }
   }
 
-  /* mandatory */
+  /* optional */
   /* c8. DRBs_FailedToBeSetupMod_List */
-  asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie8);
-  ie8->id                             = F1AP_ProtocolIE_ID_id_DRBs_FailedToBeSetupMod_List;
-  ie8->criticality                    = F1AP_Criticality_reject;
-  ie8->value.present                  = F1AP_UEContextModificationResponseIEs__value_PR_DRBs_FailedToBeSetupMod_List;
-
-  for (int i=0;   i<1; i++) {
-    //
-    asn1cSequenceAdd(ie8->value.choice.DRBs_FailedToBeSetupMod_List.list,
-                     F1AP_DRBs_FailedToBeSetupMod_ItemIEs_t, drbs_failedToBeSetupMod_item_ies);
-    drbs_failedToBeSetupMod_item_ies->id            = F1AP_ProtocolIE_ID_id_DRBs_FailedToBeSetupMod_Item;
-    drbs_failedToBeSetupMod_item_ies->criticality   = F1AP_Criticality_reject;
-    drbs_failedToBeSetupMod_item_ies->value.present = F1AP_DRBs_FailedToBeSetupMod_ItemIEs__value_PR_DRBs_FailedToBeSetupMod_Item;
-    /* 10.1 DRBs_ToBeSetupMod_Item */
-    F1AP_DRBs_FailedToBeSetupMod_Item_t *drbs_failedToBeSetupMod_item=
-      &drbs_failedToBeSetupMod_item_ies->value.choice.DRBs_FailedToBeSetupMod_Item;
-    /* dRBID */
-    drbs_failedToBeSetupMod_item->dRBID = 30L;
-    drbs_failedToBeSetupMod_item->cause = (F1AP_Cause_t *)calloc(1, sizeof(F1AP_Cause_t));
-    drbs_failedToBeSetupMod_item->cause->present = F1AP_Cause_PR_radioNetwork;
-    drbs_failedToBeSetupMod_item->cause->choice.radioNetwork = F1AP_CauseRadioNetwork_unknown_or_already_allocated_gnb_du_ue_f1ap_id;
+  if(resp->drbs_failed_to_be_setup_length > 0){
+    asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie8);
+    ie8->id                             = F1AP_ProtocolIE_ID_id_DRBs_FailedToBeSetupMod_List;
+    ie8->criticality                    = F1AP_Criticality_reject;
+    ie8->value.present                  = F1AP_UEContextModificationResponseIEs__value_PR_DRBs_FailedToBeSetupMod_List;
+
+    for (int i=0;   i<resp->drbs_failed_to_be_setup_length; i++) {
+      asn1cSequenceAdd(ie8->value.choice.DRBs_FailedToBeSetupMod_List.list,
+        F1AP_DRBs_FailedToBeSetupMod_ItemIEs_t, drbs_failedToBeSetupMod_item_ies);
+      drbs_failedToBeSetupMod_item_ies->id            = F1AP_ProtocolIE_ID_id_DRBs_FailedToBeSetupMod_Item;
+      drbs_failedToBeSetupMod_item_ies->criticality   = F1AP_Criticality_reject;
+      drbs_failedToBeSetupMod_item_ies->value.present = F1AP_DRBs_FailedToBeSetupMod_ItemIEs__value_PR_DRBs_FailedToBeSetupMod_Item;
+      /* DRBs_FailedToBeSetupMod_Item */
+      F1AP_DRBs_FailedToBeSetupMod_Item_t *drbs_failedToBeSetupMod_item=
+        &drbs_failedToBeSetupMod_item_ies->value.choice.DRBs_FailedToBeSetupMod_Item;
+      /* dRBID */
+      drbs_failedToBeSetupMod_item->dRBID = resp->drbs_failed_to_be_setup[i].rb_id;
+      drbs_failedToBeSetupMod_item->cause = (F1AP_Cause_t *)calloc(1, sizeof(F1AP_Cause_t));
+      drbs_failedToBeSetupMod_item->cause->present = F1AP_Cause_PR_radioNetwork;
+      drbs_failedToBeSetupMod_item->cause->choice.radioNetwork = F1AP_CauseRadioNetwork_unknown_or_already_allocated_gnb_du_ue_f1ap_id;
+    }
   }
 
-  /* mandatory */
+  /* optional */
   /* c9. SCell_FailedtoSetupMod_List */
-  asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie9);
-  ie9->id                             = F1AP_ProtocolIE_ID_id_SCell_FailedtoSetupMod_List;
-  ie9->criticality                    = F1AP_Criticality_ignore;
-  ie9->value.present                  = F1AP_UEContextModificationResponseIEs__value_PR_SCell_FailedtoSetupMod_List;
-
-  for (int i=0; i<1; i++) {
-    //
-    asn1cSequenceAdd(ie9->value.choice.SCell_FailedtoSetupMod_List.list,
-                     F1AP_SCell_FailedtoSetupMod_ItemIEs_t, scell_failedtoSetupMod_item_ies);
-    scell_failedtoSetupMod_item_ies->id            = F1AP_ProtocolIE_ID_id_SCell_FailedtoSetupMod_Item;
-    scell_failedtoSetupMod_item_ies->criticality   = F1AP_Criticality_ignore;
-    scell_failedtoSetupMod_item_ies->value.present = F1AP_SCell_FailedtoSetupMod_ItemIEs__value_PR_SCell_FailedtoSetupMod_Item;
-    /* 8.1 SCell_ToBeSetup_Item */
-    F1AP_SCell_FailedtoSetupMod_Item_t *scell_failedtoSetupMod_item=&scell_failedtoSetupMod_item_ies->value.choice.SCell_FailedtoSetupMod_Item;
-    /* - sCell_ID */
-    addnRCGI(scell_failedtoSetupMod_item->sCell_ID, &f1ap_req(false, instance)->cell[i]);
-    asn1cCalloc(scell_failedtoSetupMod_item->cause, tmp);
-    tmp->present = F1AP_Cause_PR_radioNetwork;
-    tmp->choice.radioNetwork = F1AP_CauseRadioNetwork_unknown_or_already_allocated_gnb_du_ue_f1ap_id;
+  if(0){
+    asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie9);
+    ie9->id                             = F1AP_ProtocolIE_ID_id_SCell_FailedtoSetupMod_List;
+    ie9->criticality                    = F1AP_Criticality_ignore;
+    ie9->value.present                  = F1AP_UEContextModificationResponseIEs__value_PR_SCell_FailedtoSetupMod_List;
+
+    for (int i=0; i<1; i++) {
+      asn1cSequenceAdd(ie9->value.choice.SCell_FailedtoSetupMod_List.list,
+        F1AP_SCell_FailedtoSetupMod_ItemIEs_t, scell_failedtoSetupMod_item_ies);
+      scell_failedtoSetupMod_item_ies->id            = F1AP_ProtocolIE_ID_id_SCell_FailedtoSetupMod_Item;
+      scell_failedtoSetupMod_item_ies->criticality   = F1AP_Criticality_ignore;
+      scell_failedtoSetupMod_item_ies->value.present = F1AP_SCell_FailedtoSetupMod_ItemIEs__value_PR_SCell_FailedtoSetupMod_Item;
+      /* 8.1 SCell_ToBeSetup_Item */
+      F1AP_SCell_FailedtoSetupMod_Item_t *scell_failedtoSetupMod_item=&scell_failedtoSetupMod_item_ies->value.choice.SCell_FailedtoSetupMod_Item;
+      /* - sCell_ID */
+      addnRCGI(scell_failedtoSetupMod_item->sCell_ID, &f1ap_req(false, instance)->cell[i]);
+      asn1cCalloc(scell_failedtoSetupMod_item->cause, tmp);
+      tmp->present = F1AP_Cause_PR_radioNetwork;
+      tmp->choice.radioNetwork = F1AP_CauseRadioNetwork_unknown_or_already_allocated_gnb_du_ue_f1ap_id;
+    }
   }
 
-  /* mandatory */
+  /* optional */
   /* c10. DRBs_FailedToBeModified_List */
-  asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie10);
-  ie10->id                             = F1AP_ProtocolIE_ID_id_DRBs_FailedToBeModified_List;
-  ie10->criticality                    = F1AP_Criticality_reject;
-  ie10->value.present                  = F1AP_UEContextModificationResponseIEs__value_PR_DRBs_FailedToBeModified_List;
-
-  for (int i=0; i<1; i++) {
-    //
-    asn1cSequenceAdd(ie10->value.choice.DRBs_FailedToBeModified_List.list,
-                     F1AP_DRBs_FailedToBeModified_ItemIEs_t, drbs_failedToBeModified_item_ies);
-    drbs_failedToBeModified_item_ies->id            = F1AP_ProtocolIE_ID_id_DRBs_FailedToBeModified_Item;
-    drbs_failedToBeModified_item_ies->criticality   = F1AP_Criticality_reject;
-    drbs_failedToBeModified_item_ies->value.present = F1AP_DRBs_FailedToBeModified_ItemIEs__value_PR_DRBs_FailedToBeModified_Item;
-    /* 13.1 DRBs_FailedToBeModified_Item */
-    F1AP_DRBs_FailedToBeModified_Item_t *drbs_failedToBeModified_item=
-      &drbs_failedToBeModified_item_ies->value.choice.DRBs_FailedToBeModified_Item ;
-    /* dRBID */
-    drbs_failedToBeModified_item->dRBID = 30L;
-    asn1cCalloc(drbs_failedToBeModified_item->cause, tmp);
-    tmp->present = F1AP_Cause_PR_radioNetwork;
-    tmp->choice.radioNetwork = F1AP_CauseRadioNetwork_unknown_or_already_allocated_gnb_du_ue_f1ap_id;
+  if(0){
+    asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie10);
+    ie10->id                             = F1AP_ProtocolIE_ID_id_DRBs_FailedToBeModified_List;
+    ie10->criticality                    = F1AP_Criticality_reject;
+    ie10->value.present                  = F1AP_UEContextModificationResponseIEs__value_PR_DRBs_FailedToBeModified_List;
+
+    for (int i=0; i<1; i++) {
+      asn1cSequenceAdd(ie10->value.choice.DRBs_FailedToBeModified_List.list,
+        F1AP_DRBs_FailedToBeModified_ItemIEs_t, drbs_failedToBeModified_item_ies);
+      drbs_failedToBeModified_item_ies->id            = F1AP_ProtocolIE_ID_id_DRBs_FailedToBeModified_Item;
+      drbs_failedToBeModified_item_ies->criticality   = F1AP_Criticality_reject;
+      drbs_failedToBeModified_item_ies->value.present = F1AP_DRBs_FailedToBeModified_ItemIEs__value_PR_DRBs_FailedToBeModified_Item;
+      /* 13.1 DRBs_FailedToBeModified_Item */
+      F1AP_DRBs_FailedToBeModified_Item_t *drbs_failedToBeModified_item=
+        &drbs_failedToBeModified_item_ies->value.choice.DRBs_FailedToBeModified_Item ;
+      /* dRBID */
+      drbs_failedToBeModified_item->dRBID = 30L;
+      asn1cCalloc(drbs_failedToBeModified_item->cause, tmp);
+      tmp->present = F1AP_Cause_PR_radioNetwork;
+      tmp->choice.radioNetwork = F1AP_CauseRadioNetwork_unknown_or_already_allocated_gnb_du_ue_f1ap_id;
+    }
   }
 
   // /*  */
@@ -1163,6 +1527,28 @@ int DU_send_UE_CONTEXT_MODIFICATION_RESPONSE(instance_t instance) {
       }
     }
   }
+  /* optional */
+  /* c12. SRBs_Setup_List */
+  if(resp->srbs_to_be_setup_length > 0){
+    asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie12);
+    ie12->id                             = F1AP_ProtocolIE_ID_id_SRBs_SetupMod_List;
+    ie12->criticality                    = F1AP_Criticality_ignore;
+    ie12->value.present                  = F1AP_UEContextModificationResponseIEs__value_PR_SRBs_SetupMod_List;
+
+    for (int i=0;  i< resp->srbs_to_be_setup_length; i++) {//
+      asn1cSequenceAdd(ie12->value.choice.SRBs_SetupMod_List.list,
+        F1AP_SRBs_SetupMod_ItemIEs_t, srbs_setupmod_item_ies);
+      srbs_setupmod_item_ies->id            = F1AP_ProtocolIE_ID_id_SRBs_SetupMod_Item;
+      srbs_setupmod_item_ies->criticality   = F1AP_Criticality_ignore;
+      srbs_setupmod_item_ies->value.present = F1AP_SRBs_SetupMod_ItemIEs__value_PR_SRBs_SetupMod_Item;
+      /* 11.1 SRBs_Setup_Item */
+      /* ADD */
+      F1AP_SRBs_SetupMod_Item_t *srbs_setupmod_item=&srbs_setupmod_item_ies->value.choice.SRBs_SetupMod_Item;
+      /* sRBID */
+      srbs_setupmod_item->sRBID = resp->srbs_to_be_setup[i].srb_id;
+      srbs_setupmod_item->lCID = resp->srbs_to_be_setup[i].srb_id;
+    }
+  }
 
   /* encode */
   if (f1ap_encode_pdu(&pdu, &buffer, &len) < 0) {
@@ -1170,9 +1556,10 @@ int DU_send_UE_CONTEXT_MODIFICATION_RESPONSE(instance_t instance) {
     return -1;
   }
 
-  //f1ap_itti_send_sctp_data_req(false, instance, buffer, len, 0);
+  f1ap_itti_send_sctp_data_req(false, instance, buffer, len, getCxt(false, instance)->default_sctp_stream_id);
   return 0;
 }
+
 int DU_send_UE_CONTEXT_MODIFICATION_FAILURE(instance_t instance) {
   AssertFatal(1==0,"Not implemented yet\n");
 }
diff --git a/openair2/F1AP/f1ap_du_ue_context_management.h b/openair2/F1AP/f1ap_du_ue_context_management.h
index 82643fa933ca306e73781730be184b8b7dcbd7a3..acf74f69d7216b1e77c9a9ad3868b781136ed7d5 100644
--- a/openair2/F1AP/f1ap_du_ue_context_management.h
+++ b/openair2/F1AP/f1ap_du_ue_context_management.h
@@ -74,7 +74,7 @@ int DU_handle_UE_CONTEXT_MODIFICATION_REQUEST(instance_t       instance,
     uint32_t         assoc_id,
     uint32_t         stream,
     F1AP_F1AP_PDU_t *pdu);
-int DU_send_UE_CONTEXT_MODIFICATION_RESPONSE(instance_t instance);
+int DU_send_UE_CONTEXT_MODIFICATION_RESPONSE(instance_t instance, f1ap_ue_context_setup_t *resp);
 int DU_send_UE_CONTEXT_MODIFICATION_FAILURE(instance_t instance);
 
 
diff --git a/openair2/F1AP/f1ap_encoder.c b/openair2/F1AP/f1ap_encoder.c
index e623e665362ec38227b55b8558d8ce9d0ec8e68e..b249f23cfece87d4af88896c0eec0544f371e6ff 100644
--- a/openair2/F1AP/f1ap_encoder.c
+++ b/openair2/F1AP/f1ap_encoder.c
@@ -33,7 +33,7 @@
 #include "f1ap_common.h"
 #include "f1ap_encoder.h"
 
-int asn1_encoder_xer_print = 1;
+int asn1_encoder_xer_print = 0;
 
 int f1ap_encode_pdu(F1AP_F1AP_PDU_t *pdu, uint8_t **buffer, uint32_t *length) {
   ssize_t    encoded;
diff --git a/openair2/F1AP/f1ap_handlers.c b/openair2/F1AP/f1ap_handlers.c
index fec03bb0b90002a399cdfd027fccf92acd5c0d0c..0812a976f634363b81f7368a56269540129675ab 100644
--- a/openair2/F1AP/f1ap_handlers.c
+++ b/openair2/F1AP/f1ap_handlers.c
@@ -50,7 +50,7 @@ f1ap_message_processing_t f1ap_messages_processing[][3] = {
   { DU_handle_gNB_CU_CONFIGURATION_UPDATE, CU_handle_gNB_CU_CONFIGURATION_UPDATE_ACKNOWLEDGE, CU_handle_gNB_CU_CONFIGURATION_UPDATE_FAILURE }, /* gNBCUConfigurationUpdate */
   { DU_handle_UE_CONTEXT_SETUP_REQUEST, CU_handle_UE_CONTEXT_SETUP_RESPONSE, 0 }, /* UEContextSetup */
   { DU_handle_UE_CONTEXT_RELEASE_COMMAND, CU_handle_UE_CONTEXT_RELEASE_COMPLETE, 0 }, /* UEContextRelease */
-  { 0, 0, 0 }, /* UEContextModification */
+  { DU_handle_UE_CONTEXT_MODIFICATION_REQUEST, CU_handle_UE_CONTEXT_MODIFICATION_RESPONSE, 0 }, /* UEContextModification */
   { 0, 0, 0 }, /* UEContextModificationRequired */
   { 0, 0, 0 }, /* UEMobilityCommand */
   { CU_handle_UE_CONTEXT_RELEASE_REQUEST, 0, 0 }, /* UEContextReleaseRequest */
diff --git a/openair2/F1AP/f1ap_itti_messaging.c b/openair2/F1AP/f1ap_itti_messaging.c
index 21096a65188cb41ffb8f6946be24047b61ee5bf0..e45edcc3a3bfed2ca60d06a60e5bb39a7827333a 100644
--- a/openair2/F1AP/f1ap_itti_messaging.c
+++ b/openair2/F1AP/f1ap_itti_messaging.c
@@ -32,7 +32,7 @@ void f1ap_itti_send_sctp_data_req(bool isCu, instance_t instance, uint8_t *buffe
   sctp_data_req->buffer        = buffer;
   sctp_data_req->buffer_length = buffer_length;
   sctp_data_req->stream        = stream;
-  LOG_I(F1AP, "Sending ITTI message to SCTP Task\n");
+  LOG_D(F1AP, "Sending ITTI message to SCTP Task\n");
   itti_send_msg_to_task(TASK_SCTP, instance, message_p);
 }
 
diff --git a/openair2/GNB_APP/L1_nr_paramdef.h b/openair2/GNB_APP/L1_nr_paramdef.h
index 90cd9aae2900054567423a3bcadc822b7c6eedab..1e5122956e0a4532ec79bff7b6083a5b1ed7cdcc 100644
--- a/openair2/GNB_APP/L1_nr_paramdef.h
+++ b/openair2/GNB_APP/L1_nr_paramdef.h
@@ -51,6 +51,7 @@
 #define CONFIG_STRING_L1_PUCCH0_DTX_THRESHOLD              "pucch0_dtx_threshold"
 #define CONFIG_STRING_L1_PRACH_DTX_THRESHOLD               "prach_dtx_threshold"
 #define CONFIG_STRING_L1_PUSCH_DTX_THRESHOLD               "pusch_dtx_threshold"
+#define CONFIG_STRING_L1_MAX_LDPC_ITERATIONS               "max_ldpc_iterations"
 /*----------------------------------------------------------------------------------------------------------------------------------------------------*/
 /*                                            L1 configuration parameters                                                                             */
 /*   optname                                         helpstr   paramflags    XXXptr              defXXXval                  type           numelt     */
@@ -69,7 +70,8 @@
 {CONFIG_STRING_L1_OFDM_OFFSET_DIVISOR,               NULL,      0,         uptr:NULL,           defuintval:8,              TYPE_UINT,     0},         \
 {CONFIG_STRING_L1_PUCCH0_DTX_THRESHOLD,              NULL,      0,         uptr:NULL,           defintval:100,             TYPE_UINT,     0},         \
 {CONFIG_STRING_L1_PRACH_DTX_THRESHOLD,               NULL,      0,         uptr:NULL,           defintval:150,             TYPE_UINT,     0},         \
-{CONFIG_STRING_L1_PUSCH_DTX_THRESHOLD,               NULL,      0,         uptr:NULL,           defintval:50,              TYPE_UINT,     0}          \
+{CONFIG_STRING_L1_PUSCH_DTX_THRESHOLD,               NULL,      0,         uptr:NULL,           defintval:50,              TYPE_UINT,     0},         \
+{CONFIG_STRING_L1_MAX_LDPC_ITERATIONS,               NULL,      0,         uptr:NULL,           defintval:5,               TYPE_UINT,     0},          \
 }
 #define L1_CC_IDX                                          0
 #define L1_TRANSPORT_N_PREFERENCE_IDX                      1
@@ -85,6 +87,7 @@
 #define L1_PUCCH0_DTX_THRESHOLD                            11
 #define L1_PRACH_DTX_THRESHOLD                             12
 #define L1_PUSCH_DTX_THRESHOLD                             13
+#define L1_MAX_LDPC_ITERATIONS                             14
 
 /*----------------------------------------------------------------------------------------------------------------------------------------------------*/
 #endif
diff --git a/openair2/GNB_APP/MACRLC_nr_paramdef.h b/openair2/GNB_APP/MACRLC_nr_paramdef.h
index e634f077e269c030b2ab53da28f8f2ff7e216e1e..0a50d19e139dbea8be7af77f384ff42459aa23af 100644
--- a/openair2/GNB_APP/MACRLC_nr_paramdef.h
+++ b/openair2/GNB_APP/MACRLC_nr_paramdef.h
@@ -58,16 +58,21 @@
 #define CONFIG_STRING_MACRLC_ULSCH_MAX_FRAME_INACTIVITY    "ulsch_max_frame_inactivity"
 #define CONFIG_STRING_MACRLC_PUSCHTARGETSNRX10             "pusch_TargetSNRx10"
 #define CONFIG_STRING_MACRLC_PUCCHTARGETSNRX10             "pucch_TargetSNRx10"
+#define CONFIG_STRING_MACRLC_UL_PRBBLACK_SNR_THRESHOLD     "ul_prbblack_SNR_threshold"
 #define CONFIG_STRING_MACRLC_PUCCHFAILURETHRES             "pucch_FailureThres"
 #define CONFIG_STRING_MACRLC_PUSCHFAILURETHRES             "pusch_FailureThres"
 #define CONFIG_STRING_MACRLC_DL_BLER_TARGET_UPPER          "dl_bler_target_upper"
 #define CONFIG_STRING_MACRLC_DL_BLER_TARGET_LOWER          "dl_bler_target_lower"
-#define CONFIG_STRING_MACRLC_DL_RD2_BLER_THRESHOLD         "dl_rd2_bler_threshold"
 #define CONFIG_STRING_MACRLC_DL_MAX_MCS                    "dl_max_mcs"
-#define CONFIG_STRING_MACRLC_HARQ_ROUND_MAX                "harq_round_max"
+#define CONFIG_STRING_MACRLC_UL_BLER_TARGET_UPPER          "ul_bler_target_upper"
+#define CONFIG_STRING_MACRLC_UL_BLER_TARGET_LOWER          "ul_bler_target_lower"
+#define CONFIG_STRING_MACRLC_UL_MAX_MCS                    "ul_max_mcs"
+#define CONFIG_STRING_MACRLC_DL_HARQ_ROUND_MAX             "dl_harq_round_max"
+#define CONFIG_STRING_MACRLC_UL_HARQ_ROUND_MAX             "ul_harq_round_max"
 #define CONFIG_STRING_MACRLC_MIN_GRANT_PRB                 "min_grant_prb"
 #define CONFIG_STRING_MACRLC_MIN_GRANT_MCS                 "min_grant_mcs"
 
+
 /*-------------------------------------------------------------------------------------------------------------------------------------------------------*/
 /*                                            MacRLC  configuration parameters                                                                           */
 /*   optname                                            helpstr   paramflags    XXXptr              defXXXval                  type           numelt     */
@@ -93,15 +98,19 @@
 {CONFIG_STRING_MACRLC_ULSCH_MAX_FRAME_INACTIVITY,        NULL,     0,          uptr:NULL,           defintval:10,              TYPE_UINT,     0},        \
 {CONFIG_STRING_MACRLC_PUSCHTARGETSNRX10,                 NULL,     0,          iptr:NULL,           defintval:200,             TYPE_INT,      0},        \
 {CONFIG_STRING_MACRLC_PUCCHTARGETSNRX10,                 NULL,     0,          iptr:NULL,           defintval:150,             TYPE_INT,      0},        \
+{CONFIG_STRING_MACRLC_UL_PRBBLACK_SNR_THRESHOLD, "SNR threshold to decide whether a PRB will be blacklisted or not", 0, iptr:NULL, defintval:10, TYPE_INT, 0}, \
 {CONFIG_STRING_MACRLC_PUCCHFAILURETHRES,                 NULL,     0,          iptr:NULL,           defintval:10,              TYPE_INT,      0},        \
 {CONFIG_STRING_MACRLC_PUSCHFAILURETHRES,                 NULL,     0,          iptr:NULL,           defintval:10,              TYPE_INT,      0},        \
 {CONFIG_STRING_MACRLC_DL_BLER_TARGET_UPPER,   "Upper threshold of BLER to decrease DL MCS",   0, dblptr:NULL,  defdblval:0.15,  TYPE_DOUBLE,  0},        \
 {CONFIG_STRING_MACRLC_DL_BLER_TARGET_LOWER,   "Lower threshold of BLER to increase DL MCS",   0, dblptr:NULL,  defdblval:0.05,  TYPE_DOUBLE,  0},        \
-{CONFIG_STRING_MACRLC_DL_RD2_BLER_THRESHOLD,  "Threshold of RD2/RETX2 BLER to decrease DL MCS", 0, dblptr:NULL,  defdblval:0.01,  TYPE_DOUBLE,  0},      \
 {CONFIG_STRING_MACRLC_DL_MAX_MCS,             "Maximum DL MCS that should be used", 0, u8ptr:NULL,  defintval:28,  TYPE_UINT8,  0},      \
-{CONFIG_STRING_MACRLC_HARQ_ROUND_MAX,         "Maximum number of HARQ rounds", 0, u8ptr:NULL, defintval:4, TYPE_UINT8, 0}, \
+{CONFIG_STRING_MACRLC_UL_BLER_TARGET_UPPER,   "Upper threshold of BLER to decrease UL MCS",   0, dblptr:NULL,  defdblval:0.15,  TYPE_DOUBLE,  0},        \
+{CONFIG_STRING_MACRLC_UL_BLER_TARGET_LOWER,   "Lower threshold of BLER to increase UL MCS",   0, dblptr:NULL,  defdblval:0.05,  TYPE_DOUBLE,  0},        \
+{CONFIG_STRING_MACRLC_UL_MAX_MCS,             "Maximum UL MCS that should be used", 0, u8ptr:NULL,  defintval:9,   TYPE_UINT8,  0},      \
+{CONFIG_STRING_MACRLC_DL_HARQ_ROUND_MAX,         "Maximum number of DL HARQ rounds", 0, u8ptr:NULL, defintval:4, TYPE_UINT8, 0}, \
+{CONFIG_STRING_MACRLC_UL_HARQ_ROUND_MAX,         "Maximum number of UL HARQ rounds", 0, u8ptr:NULL, defintval:4, TYPE_UINT8, 0}, \
 {CONFIG_STRING_MACRLC_MIN_GRANT_PRB,         "Minimal Periodic ULSCH Grant PRBs", 0, u8ptr:NULL, defintval:5, TYPE_UINT8, 0}, \
-{CONFIG_STRING_MACRLC_MIN_GRANT_MCS,         "Minimal Periodic ULSCH Grant MCS", 0, u8ptr:NULL, defintval:9, TYPE_UINT8, 0} \
+{CONFIG_STRING_MACRLC_MIN_GRANT_MCS,         "Minimal Periodic ULSCH Grant MCS", 0, u8ptr:NULL, defintval:9, TYPE_UINT8, 0}, \
 }
 #define MACRLC_CC_IDX                                          0
 #define MACRLC_TRANSPORT_N_PREFERENCE_IDX                      1
@@ -123,14 +132,55 @@
 #define MACRLC_ULSCH_MAX_FRAME_INACTIVITY                      17
 #define MACRLC_PUSCHTARGETSNRX10_IDX                           18
 #define MACRLC_PUCCHTARGETSNRX10_IDX                           19
-#define MACRLC_PUCCHFAILURETHRES_IDX                           20 
-#define MACRLC_PUSCHFAILURETHRES_IDX                           21
-#define MACRLC_DL_BLER_TARGET_UPPER_IDX                        22
-#define MACRLC_DL_BLER_TARGET_LOWER_IDX                        23
-#define MACRLC_DL_RD2_BLER_THRESHOLD_IDX                       24
+#define MACRLC_UL_PRBBLACK_SNR_THRESHOLD_IDX                   20
+#define MACRLC_PUCCHFAILURETHRES_IDX                           21
+#define MACRLC_PUSCHFAILURETHRES_IDX                           22
+#define MACRLC_DL_BLER_TARGET_UPPER_IDX                        23
+#define MACRLC_DL_BLER_TARGET_LOWER_IDX                        24
 #define MACRLC_DL_MAX_MCS_IDX                                  25
-#define MACRLC_HARQ_ROUND_MAX_IDX                              26
-#define MACRLC_MIN_GRANT_PRB_IDX                               27
-#define MACRLC_MIN_GRANT_MCS_IDX                               28
+#define MACRLC_UL_BLER_TARGET_UPPER_IDX                        26
+#define MACRLC_UL_BLER_TARGET_LOWER_IDX                        27
+#define MACRLC_UL_MAX_MCS_IDX                                  28
+#define MACRLC_DL_HARQ_ROUND_MAX_IDX                           29
+#define MACRLC_UL_HARQ_ROUND_MAX_IDX                           30
+#define MACRLC_MIN_GRANT_PRB_IDX                               31
+#define MACRLC_MIN_GRANT_MCS_IDX                               32
+
+#define MACRLCPARAMS_CHECK { \
+  { .s5 = { NULL } }, \
+  { .s5 = { NULL } }, \
+  { .s5 = { NULL } }, \
+  { .s5 = { NULL } }, \
+  { .s5 = { NULL } }, \
+  { .s5 = { NULL } }, \
+  { .s5 = { NULL } }, \
+  { .s5 = { NULL } }, \
+  { .s5 = { NULL } }, \
+  { .s5 = { NULL } }, \
+  { .s5 = { NULL } }, \
+  { .s5 = { NULL } }, \
+  { .s5 = { NULL } }, \
+  { .s5 = { NULL } }, \
+  { .s5 = { NULL } }, \
+  { .s5 = { NULL } }, \
+  { .s5 = { NULL } }, \
+  { .s5 = { NULL } }, \
+  { .s5 = { NULL } }, \
+  { .s5 = { NULL } }, \
+  { .s5 = { NULL } }, \
+  { .s5 = { NULL } }, \
+  { .s5 = { NULL } }, \
+  { .s5 = { NULL } }, \
+  { .s5 = { NULL } }, \
+  { .s5 = { NULL } }, \
+  { .s5 = { NULL } }, \
+  { .s5 = { NULL } }, \
+  { .s5 = { NULL } }, \
+  { .s2 = { config_check_intrange, {1, 8} } }, /* DL max HARQ rounds */ \
+  { .s2 = { config_check_intrange, {1, 8} } }, /* UL max HARQ rounds */ \
+  { .s5 = { NULL } }, \
+  { .s5 = { NULL } }, \
+}
+
 /*---------------------------------------------------------------------------------------------------------------------------------------------------------*/
 #endif
diff --git a/openair2/GNB_APP/RRC_nr_paramsvalues.h b/openair2/GNB_APP/RRC_nr_paramsvalues.h
index 8a7ce64d91cdb969471630225e10b11a58042011..089569f84e64735828b424b425ff71ba490c39b2 100644
--- a/openair2/GNB_APP/RRC_nr_paramsvalues.h
+++ b/openair2/GNB_APP/RRC_nr_paramsvalues.h
@@ -132,6 +132,34 @@
 #define GNB_CONFIG_STRING_ULPTRSMAXPORTS_0                               "ul_ptrsMaxPorts_0"
 #define GNB_CONFIG_STRING_ULPTRSPOWER_0                                  "ul_ptrsPower_0"
 
+#define GNB_CONFIG_STRING_DLBWP1_ID                                      "dl_bwp-Id_1"
+#define GNB_CONFIG_STRING_DLBWP2_ID                                      "dl_bwp-Id_2"
+#define GNB_CONFIG_STRING_DLBWP3_ID                                      "dl_bwp-Id_3"
+#define GNB_CONFIG_STRING_DLBWP4_ID                                      "dl_bwp-Id_4"
+#define GNB_CONFIG_STRING_LOCATIONANDBANDWIDTH_DLBWP1                    "dl_bwp1_locationAndBandwidth"
+#define GNB_CONFIG_STRING_LOCATIONANDBANDWIDTH_DLBWP2                    "dl_bwp2_locationAndBandwidth"
+#define GNB_CONFIG_STRING_LOCATIONANDBANDWIDTH_DLBWP3                    "dl_bwp3_locationAndBandwidth"
+#define GNB_CONFIG_STRING_LOCATIONANDBANDWIDTH_DLBWP4                    "dl_bwp4_locationAndBandwidth"
+#define GNB_CONFIG_STRING_SCS_DLBWP1                                     "dl_bwp1_subcarrierSpacing"
+#define GNB_CONFIG_STRING_SCS_DLBWP2                                     "dl_bwp2_subcarrierSpacing"
+#define GNB_CONFIG_STRING_SCS_DLBWP3                                     "dl_bwp3_subcarrierSpacing"
+#define GNB_CONFIG_STRING_SCS_DLBWP4                                     "dl_bwp4_subcarrierSpacing"
+#define GNB_CONFIG_STRING_FIRSTACTIVEDLBWP_ID                            "firstActiveDownlinkBWP-Id"
+#define GNB_CONFIG_STRING_DEFAULTDLBWP_ID                                "defaultDownlinkBWP-Id"
+#define GNB_CONFIG_STRING_ULBWP1_ID                                      "ul_bwp-Id_1"
+#define GNB_CONFIG_STRING_ULBWP2_ID                                      "ul_bwp-Id_2"
+#define GNB_CONFIG_STRING_ULBWP3_ID                                      "ul_bwp-Id_3"
+#define GNB_CONFIG_STRING_ULBWP4_ID                                      "ul_bwp-Id_4"
+#define GNB_CONFIG_STRING_LOCATIONANDBANDWIDTH_ULBWP1                    "ul_bwp1_locationAndBandwidth"
+#define GNB_CONFIG_STRING_LOCATIONANDBANDWIDTH_ULBWP2                    "ul_bwp2_locationAndBandwidth"
+#define GNB_CONFIG_STRING_LOCATIONANDBANDWIDTH_ULBWP3                    "ul_bwp3_locationAndBandwidth"
+#define GNB_CONFIG_STRING_LOCATIONANDBANDWIDTH_ULBWP4                    "ul_bwp4_locationAndBandwidth"
+#define GNB_CONFIG_STRING_SCS_ULBWP1                                     "ul_bwp1_subcarrierSpacing"
+#define GNB_CONFIG_STRING_SCS_ULBWP2                                     "ul_bwp2_subcarrierSpacing"
+#define GNB_CONFIG_STRING_SCS_ULBWP3                                     "ul_bwp3_subcarrierSpacing"
+#define GNB_CONFIG_STRING_SCS_ULBWP4                                     "ul_bwp4_subcarrierSpacing"
+#define GNB_CONFIG_STRING_FIRSTACTIVEULBWP_ID                            "firstActiveUplinkBWP-Id"
+
 /*--------------------------------------------------------------------------------------------------------------------*/
 /*                                            pdcch_ConfigSIB1 parameters                                             */
 /*--------------------------------------------------------------------------------------------------------------------*/
@@ -240,10 +268,33 @@
 {GNB_CONFIG_STRING_ULPTRSTIMEDENSITY2_0,NULL,0,i64ptr:scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->timeDensity->list.array[2],defint64val:-1,TYPE_INT64,0}, \
 {GNB_CONFIG_STRING_ULPTRSREOFFSET_0,NULL,0,i64ptr:scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->resourceElementOffset,defint64val:-1,TYPE_INT64,0}, \
 {GNB_CONFIG_STRING_ULPTRSMAXPORTS_0,NULL,0,i64ptr:&scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->maxNrofPorts,defint64val:0,TYPE_INT64,0}, \
-{GNB_CONFIG_STRING_ULPTRSPOWER_0,NULL,0,i64ptr:&scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->ptrs_Power,defint64val:0,TYPE_INT64,0}}
-
-
-
-
+{GNB_CONFIG_STRING_ULPTRSPOWER_0,NULL,0,i64ptr:&scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->ptrs_Power,defint64val:0,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_FIRSTACTIVEDLBWP_ID,NULL,0,i64ptr:scd->firstActiveDownlinkBWP_Id,defint64val:1,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_FIRSTACTIVEULBWP_ID,NULL,0,i64ptr:scd->uplinkConfig->firstActiveUplinkBWP_Id,defint64val:1,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_DLBWP1_ID,NULL,0,i64ptr:&scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Id,defint64val:1,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_DLBWP2_ID,NULL,0,i64ptr:&scd->downlinkBWP_ToAddModList->list.array[1]->bwp_Id,defint64val:2,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_DLBWP3_ID,NULL,0,i64ptr:&scd->downlinkBWP_ToAddModList->list.array[2]->bwp_Id,defint64val:3,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_DLBWP4_ID,NULL,0,i64ptr:&scd->downlinkBWP_ToAddModList->list.array[3]->bwp_Id,defint64val:4,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_SCS_DLBWP1,NULL,0,i64ptr:&scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Common->genericParameters.subcarrierSpacing,defint64val:1,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_SCS_DLBWP2,NULL,0,i64ptr:&scd->downlinkBWP_ToAddModList->list.array[1]->bwp_Common->genericParameters.subcarrierSpacing,defint64val:1,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_SCS_DLBWP3,NULL,0,i64ptr:&scd->downlinkBWP_ToAddModList->list.array[2]->bwp_Common->genericParameters.subcarrierSpacing,defint64val:1,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_SCS_DLBWP4,NULL,0,i64ptr:&scd->downlinkBWP_ToAddModList->list.array[3]->bwp_Common->genericParameters.subcarrierSpacing,defint64val:1,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_LOCATIONANDBANDWIDTH_DLBWP1,NULL,0,i64ptr:&scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Common->genericParameters.locationAndBandwidth,defint64val:0,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_LOCATIONANDBANDWIDTH_DLBWP2,NULL,0,i64ptr:&scd->downlinkBWP_ToAddModList->list.array[1]->bwp_Common->genericParameters.locationAndBandwidth,defint64val:0,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_LOCATIONANDBANDWIDTH_DLBWP3,NULL,0,i64ptr:&scd->downlinkBWP_ToAddModList->list.array[2]->bwp_Common->genericParameters.locationAndBandwidth,defint64val:0,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_LOCATIONANDBANDWIDTH_DLBWP4,NULL,0,i64ptr:&scd->downlinkBWP_ToAddModList->list.array[3]->bwp_Common->genericParameters.locationAndBandwidth,defint64val:0,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_ULBWP1_ID,NULL,0,i64ptr:&scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Id,defint64val:1,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_ULBWP2_ID,NULL,0,i64ptr:&scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[1]->bwp_Id,defint64val:2,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_ULBWP3_ID,NULL,0,i64ptr:&scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[2]->bwp_Id,defint64val:3,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_ULBWP4_ID,NULL,0,i64ptr:&scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[3]->bwp_Id,defint64val:4,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_SCS_ULBWP1,NULL,0,i64ptr:&scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Common->genericParameters.subcarrierSpacing,defint64val:1,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_SCS_ULBWP2,NULL,0,i64ptr:&scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[1]->bwp_Common->genericParameters.subcarrierSpacing,defint64val:1,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_SCS_ULBWP3,NULL,0,i64ptr:&scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[2]->bwp_Common->genericParameters.subcarrierSpacing,defint64val:1,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_SCS_ULBWP4,NULL,0,i64ptr:&scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[3]->bwp_Common->genericParameters.subcarrierSpacing,defint64val:1,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_LOCATIONANDBANDWIDTH_ULBWP1,NULL,0,i64ptr:&scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Common->genericParameters.locationAndBandwidth,defint64val:0,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_LOCATIONANDBANDWIDTH_ULBWP2,NULL,0,i64ptr:&scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[1]->bwp_Common->genericParameters.locationAndBandwidth,defint64val:0,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_LOCATIONANDBANDWIDTH_ULBWP3,NULL,0,i64ptr:&scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[2]->bwp_Common->genericParameters.locationAndBandwidth,defint64val:0,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_LOCATIONANDBANDWIDTH_ULBWP4,NULL,0,i64ptr:&scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[3]->bwp_Common->genericParameters.locationAndBandwidth,defint64val:0,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_DEFAULTDLBWP_ID,NULL,0,i64ptr:scd->defaultDownlinkBWP_Id,defint64val:0,TYPE_INT64,0}}
 
 #endif
diff --git a/openair2/GNB_APP/gnb_config.c b/openair2/GNB_APP/gnb_config.c
index 8ea0cfe5d99b9becfc8ba6ab01226ec09c4e9874..2dce0f315d4610337d0f30467ca4066bf59674f5 100644
--- a/openair2/GNB_APP/gnb_config.c
+++ b/openair2/GNB_APP/gnb_config.c
@@ -214,15 +214,20 @@ void fill_scc_sim(NR_ServingCellConfigCommon_t *scc,uint64_t *ssb_bitmap,int N_R
   //  *scc->n_TimingAdvanceOffset=NR_ServingCellConfigCommon__n_TimingAdvanceOffset_n0;
   *scc->ssb_periodicityServingCell=NR_ServingCellConfigCommon__ssb_periodicityServingCell_ms20;
   scc->dmrs_TypeA_Position=NR_ServingCellConfigCommon__dmrs_TypeA_Position_pos2;
-  *scc->ssbSubcarrierSpacing=NR_SubcarrierSpacing_kHz30;
-  *scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB=641032;
-  *scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0]=78;
-  scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA=640000;
+  *scc->ssbSubcarrierSpacing=mu_dl;
+  if (mu_dl == 0) {
+    *scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB=520432;
+    *scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0]=38;
+    scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA=520000;
+  } else {
+    *scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB=641032;
+    *scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0]=78;
+    scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA=640000;
+  }
   scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->offsetToCarrier=0;
-  scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing=NR_SubcarrierSpacing_kHz30;
-
+  scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing=mu_dl;
   scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth=N_RB_DL;
-  scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth=13036;
+  scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth=275*(N_RB_DL-1);
   scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.subcarrierSpacing=mu_dl;//NR_SubcarrierSpacing_kHz30;
   *scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->controlResourceSetZero=12;
   *scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->searchSpaceZero=0;
@@ -236,13 +241,13 @@ void fill_scc_sim(NR_ServingCellConfigCommon_t *scc,uint64_t *ssb_bitmap,int N_R
   timedomainresourceallocation1->startSymbolAndLength=57;
   ASN_SEQUENCE_ADD(&scc->downlinkConfigCommon->initialDownlinkBWP->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list,
                    timedomainresourceallocation1);
-  *scc->uplinkConfigCommon->frequencyInfoUL->frequencyBandList->list.array[0]=78;
+  *scc->uplinkConfigCommon->frequencyInfoUL->frequencyBandList->list.array[0]=mu_ul?78:38;
   *scc->uplinkConfigCommon->frequencyInfoUL->absoluteFrequencyPointA=-1;
   scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->offsetToCarrier=0;
-  scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing=NR_SubcarrierSpacing_kHz30;
+  scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing=mu_ul;
   scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth=N_RB_UL;
   *scc->uplinkConfigCommon->frequencyInfoUL->p_Max=20;
-  scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth=13036;
+  scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth=275*(N_RB_UL-1);
   scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.subcarrierSpacing=mu_ul;//NR_SubcarrierSpacing_kHz30;
   scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.prach_ConfigurationIndex=98;
   scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.msg1_FDM=NR_RACH_ConfigGeneric__msg1_FDM_one;
@@ -278,8 +283,11 @@ void fill_scc_sim(NR_ServingCellConfigCommon_t *scc,uint64_t *ssb_bitmap,int N_R
  *scc->uplinkConfigCommon->initialUplinkBWP->pucch_ConfigCommon->choice.setup->p0_nominal=-90;
  scc->ssb_PositionsInBurst->present=NR_ServingCellConfigCommon__ssb_PositionsInBurst_PR_mediumBitmap;
  *ssb_bitmap=0xff;
- scc->tdd_UL_DL_ConfigurationCommon->referenceSubcarrierSpacing=NR_SubcarrierSpacing_kHz30;
- scc->tdd_UL_DL_ConfigurationCommon->pattern1.dl_UL_TransmissionPeriodicity=NR_TDD_UL_DL_Pattern__dl_UL_TransmissionPeriodicity_ms5;
+ scc->tdd_UL_DL_ConfigurationCommon->referenceSubcarrierSpacing=mu_dl;
+ if (mu_dl == 0)
+   scc->tdd_UL_DL_ConfigurationCommon->pattern1.dl_UL_TransmissionPeriodicity=NR_TDD_UL_DL_Pattern__dl_UL_TransmissionPeriodicity_ms10;
+ else
+   scc->tdd_UL_DL_ConfigurationCommon->pattern1.dl_UL_TransmissionPeriodicity=NR_TDD_UL_DL_Pattern__dl_UL_TransmissionPeriodicity_ms5;
  scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofDownlinkSlots=7;
  scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofDownlinkSymbols=6;
  scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofUplinkSlots=2;
@@ -344,8 +352,10 @@ void fix_scc(NR_ServingCellConfigCommon_t *scc,uint64_t ssbmap) {
   if (*scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg3_transformPrecoder!=0)
     scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg3_transformPrecoder = NULL;
 
-  // prepare DL Allocation lists
-  nr_rrc_config_dl_tda(scc);
+  // Prepare PDSCH-TimeDomainResourceAllocation list
+  nr_rrc_config_dl_tda(scc,
+                       scc->downlinkConfigCommon->initialDownlinkBWP->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList,
+                       scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth);
 
   frame_type_t frame_type = get_frame_type((int)*scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0], *scc->ssbSubcarrierSpacing);
   if (frame_type == FDD) {
@@ -372,157 +382,204 @@ void fix_scc(NR_ServingCellConfigCommon_t *scc,uint64_t ssbmap) {
 /* Function to allocate dedicated serving cell config strutures */
 void prepare_scd(NR_ServingCellConfig_t *scd) {
   // Allocate downlink structures
-
   scd->downlinkBWP_ToAddModList = CALLOC(1, sizeof(*scd->downlinkBWP_ToAddModList));
-
-  // Downlink bandwidth part
-  NR_BWP_Downlink_t *bwp = calloc(1, sizeof(*bwp));
-  bwp->bwp_Id = 1;
-
-  // Allocate downlink dedicated bandwidth part and PDSCH structures
-  bwp->bwp_Dedicated = calloc(1, sizeof(*bwp->bwp_Dedicated));
-  bwp->bwp_Dedicated->pdsch_Config = calloc(1, sizeof(*bwp->bwp_Dedicated->pdsch_Config));
-  bwp->bwp_Dedicated->pdsch_Config->present = NR_SetupRelease_PDSCH_Config_PR_setup;
-  bwp->bwp_Dedicated->pdsch_Config->choice.setup = calloc(1, sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup));
-  bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA = calloc(1, sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA));
-  bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->present = NR_SetupRelease_DMRS_DownlinkConfig_PR_setup;
-
-  // Allocate DL DMRS and PTRS configuration
-  bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup = calloc(1, sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup));
-  NR_DMRS_DownlinkConfig_t *NR_DMRS_DownlinkCfg = bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup;
-  NR_DMRS_DownlinkCfg->phaseTrackingRS=CALLOC(1, sizeof(*NR_DMRS_DownlinkCfg->phaseTrackingRS));
-  NR_DMRS_DownlinkCfg->phaseTrackingRS->present = NR_SetupRelease_PTRS_DownlinkConfig_PR_setup;
-  NR_DMRS_DownlinkCfg->phaseTrackingRS->choice.setup = CALLOC(1, sizeof(*NR_DMRS_DownlinkCfg->phaseTrackingRS->choice.setup));
-  NR_PTRS_DownlinkConfig_t *NR_PTRS_DownlinkCfg = NR_DMRS_DownlinkCfg->phaseTrackingRS->choice.setup;
-  NR_PTRS_DownlinkCfg->frequencyDensity = CALLOC(1, sizeof(*NR_PTRS_DownlinkCfg->frequencyDensity));
-  long *dl_rbs = CALLOC(2, sizeof(long));
-  for (int i=0;i<2;i++) {
-    ASN_SEQUENCE_ADD(&NR_PTRS_DownlinkCfg->frequencyDensity->list, &dl_rbs[i]);
-  }
-  NR_PTRS_DownlinkCfg->timeDensity = CALLOC(1, sizeof(*NR_PTRS_DownlinkCfg->timeDensity));
-  long *dl_mcs = CALLOC(3, sizeof(long));
-  for (int i=0;i<3;i++) {
-    ASN_SEQUENCE_ADD(&NR_PTRS_DownlinkCfg->timeDensity->list, &dl_mcs[i]);
-  }
-  NR_PTRS_DownlinkCfg->epre_Ratio = CALLOC(1, sizeof(*NR_PTRS_DownlinkCfg->epre_Ratio));
-  NR_PTRS_DownlinkCfg->resourceElementOffset = CALLOC(1, sizeof(*NR_PTRS_DownlinkCfg->resourceElementOffset));
-  *NR_PTRS_DownlinkCfg->resourceElementOffset = 0;
-  ASN_SEQUENCE_ADD(&scd->downlinkBWP_ToAddModList->list,bwp);
-
-  // Allocate uplink structures
-
   scd->uplinkConfig = CALLOC(1, sizeof(*scd->uplinkConfig));
   scd->uplinkConfig->uplinkBWP_ToAddModList = CALLOC(1, sizeof(*scd->uplinkConfig->uplinkBWP_ToAddModList));
+  scd->bwp_InactivityTimer = CALLOC(1, sizeof(*scd->bwp_InactivityTimer));
+  scd->uplinkConfig->firstActiveUplinkBWP_Id  = CALLOC(1, sizeof(*scd->uplinkConfig->firstActiveUplinkBWP_Id));
+  scd->firstActiveDownlinkBWP_Id = CALLOC(1, sizeof(*scd->firstActiveDownlinkBWP_Id));
+  *scd->firstActiveDownlinkBWP_Id = 1;
+  *scd->uplinkConfig->firstActiveUplinkBWP_Id = 1;
+  scd->defaultDownlinkBWP_Id = CALLOC(1, sizeof(*scd->defaultDownlinkBWP_Id));
+  *scd->defaultDownlinkBWP_Id = 0;
+
+  for (int j = 0; j < NR_MAX_NUM_BWP; j++) {
+
+    // Downlink bandwidth part
+    NR_BWP_Downlink_t *bwp = calloc(1, sizeof(*bwp));
+    bwp->bwp_Id = j+1;
+
+    // Allocate downlink dedicated bandwidth part and PDSCH structures
+    bwp->bwp_Common = calloc(1, sizeof(*bwp->bwp_Common));
+    bwp->bwp_Common->pdcch_ConfigCommon = calloc(1, sizeof(*bwp->bwp_Common->pdcch_ConfigCommon));
+    bwp->bwp_Common->pdsch_ConfigCommon = calloc(1, sizeof(*bwp->bwp_Common->pdsch_ConfigCommon));
+    bwp->bwp_Dedicated = calloc(1, sizeof(*bwp->bwp_Dedicated));
+    bwp->bwp_Dedicated->pdsch_Config = calloc(1, sizeof(*bwp->bwp_Dedicated->pdsch_Config));
+    bwp->bwp_Dedicated->pdsch_Config->present = NR_SetupRelease_PDSCH_Config_PR_setup;
+    bwp->bwp_Dedicated->pdsch_Config->choice.setup = calloc(1, sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup));
+    bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA = calloc(1, sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA));
+    bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->present = NR_SetupRelease_DMRS_DownlinkConfig_PR_setup;
+
+    // Allocate DL DMRS and PTRS configuration
+    bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup = calloc(1, sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup));
+    NR_DMRS_DownlinkConfig_t *NR_DMRS_DownlinkCfg = bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup;
+    NR_DMRS_DownlinkCfg->phaseTrackingRS=CALLOC(1, sizeof(*NR_DMRS_DownlinkCfg->phaseTrackingRS));
+    NR_DMRS_DownlinkCfg->phaseTrackingRS->present = NR_SetupRelease_PTRS_DownlinkConfig_PR_setup;
+    NR_DMRS_DownlinkCfg->phaseTrackingRS->choice.setup = CALLOC(1, sizeof(*NR_DMRS_DownlinkCfg->phaseTrackingRS->choice.setup));
+    NR_PTRS_DownlinkConfig_t *NR_PTRS_DownlinkCfg = NR_DMRS_DownlinkCfg->phaseTrackingRS->choice.setup;
+    NR_PTRS_DownlinkCfg->frequencyDensity = CALLOC(1, sizeof(*NR_PTRS_DownlinkCfg->frequencyDensity));
+    long *dl_rbs = CALLOC(2, sizeof(long));
+    for (int i=0;i<2;i++) {
+      ASN_SEQUENCE_ADD(&NR_PTRS_DownlinkCfg->frequencyDensity->list, &dl_rbs[i]);
+    }
+    NR_PTRS_DownlinkCfg->timeDensity = CALLOC(1, sizeof(*NR_PTRS_DownlinkCfg->timeDensity));
+    long *dl_mcs = CALLOC(3, sizeof(long));
+    for (int i=0;i<3;i++) {
+      ASN_SEQUENCE_ADD(&NR_PTRS_DownlinkCfg->timeDensity->list, &dl_mcs[i]);
+    }
+    NR_PTRS_DownlinkCfg->epre_Ratio = CALLOC(1, sizeof(*NR_PTRS_DownlinkCfg->epre_Ratio));
+    NR_PTRS_DownlinkCfg->resourceElementOffset = CALLOC(1, sizeof(*NR_PTRS_DownlinkCfg->resourceElementOffset));
+    *NR_PTRS_DownlinkCfg->resourceElementOffset = 0;
+    ASN_SEQUENCE_ADD(&scd->downlinkBWP_ToAddModList->list,bwp);
+
+    // Allocate uplink structures
+
+    NR_PUSCH_Config_t *pusch_Config = CALLOC(1, sizeof(*pusch_Config));
+
+    // Allocate UL DMRS and PTRS structures
+    pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB = CALLOC(1, sizeof(*pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB));
+    pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->present = NR_SetupRelease_DMRS_UplinkConfig_PR_setup;
+    pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup = CALLOC(1, sizeof(*pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup));
+    NR_DMRS_UplinkConfig_t *NR_DMRS_UplinkConfig = pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup;
+    NR_DMRS_UplinkConfig->phaseTrackingRS = CALLOC(1, sizeof(*NR_DMRS_UplinkConfig->phaseTrackingRS));
+    NR_DMRS_UplinkConfig->phaseTrackingRS->present = NR_SetupRelease_PTRS_UplinkConfig_PR_setup;
+    NR_DMRS_UplinkConfig->phaseTrackingRS->choice.setup = CALLOC(1, sizeof(*NR_DMRS_UplinkConfig->phaseTrackingRS->choice.setup));
+    NR_PTRS_UplinkConfig_t *NR_PTRS_UplinkConfig = NR_DMRS_UplinkConfig->phaseTrackingRS->choice.setup;
+    NR_PTRS_UplinkConfig->transformPrecoderDisabled = CALLOC(1, sizeof(*NR_PTRS_UplinkConfig->transformPrecoderDisabled));
+    NR_PTRS_UplinkConfig->transformPrecoderDisabled->frequencyDensity = CALLOC(1, sizeof(*NR_PTRS_UplinkConfig->transformPrecoderDisabled->frequencyDensity));
+    long *n_rbs = CALLOC(2, sizeof(long));
+    for (int i=0;i<2;i++) {
+      ASN_SEQUENCE_ADD(&NR_PTRS_UplinkConfig->transformPrecoderDisabled->frequencyDensity->list, &n_rbs[i]);
+    }
+    NR_PTRS_UplinkConfig->transformPrecoderDisabled->timeDensity = CALLOC(1, sizeof(*NR_PTRS_UplinkConfig->transformPrecoderDisabled->timeDensity));
+    long *ptrs_mcs = CALLOC(3, sizeof(long));
+    for (int i = 0; i < 3; i++) {
+      ASN_SEQUENCE_ADD(&NR_PTRS_UplinkConfig->transformPrecoderDisabled->timeDensity->list, &ptrs_mcs[i]);
+    }
+    NR_PTRS_UplinkConfig->transformPrecoderDisabled->resourceElementOffset = CALLOC(1, sizeof(*NR_PTRS_UplinkConfig->transformPrecoderDisabled->resourceElementOffset));
+    *NR_PTRS_UplinkConfig->transformPrecoderDisabled->resourceElementOffset = 0;
 
-  NR_PUSCH_Config_t *pusch_Config = CALLOC(1, sizeof(*pusch_Config));
-
-  // Allocate UL DMRS and PTRS structures
-  pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB = CALLOC(1, sizeof(*pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB));
-  pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->present = NR_SetupRelease_DMRS_UplinkConfig_PR_setup;
-  pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup = CALLOC(1, sizeof(*pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup));
-  NR_DMRS_UplinkConfig_t *NR_DMRS_UplinkConfig = pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup;
-  NR_DMRS_UplinkConfig->phaseTrackingRS = CALLOC(1, sizeof(*NR_DMRS_UplinkConfig->phaseTrackingRS));
-  NR_DMRS_UplinkConfig->phaseTrackingRS->present = NR_SetupRelease_PTRS_UplinkConfig_PR_setup;
-  NR_DMRS_UplinkConfig->phaseTrackingRS->choice.setup = CALLOC(1, sizeof(*NR_DMRS_UplinkConfig->phaseTrackingRS->choice.setup));
-  NR_PTRS_UplinkConfig_t *NR_PTRS_UplinkConfig = NR_DMRS_UplinkConfig->phaseTrackingRS->choice.setup;
-  NR_PTRS_UplinkConfig->transformPrecoderDisabled = CALLOC(1, sizeof(*NR_PTRS_UplinkConfig->transformPrecoderDisabled));
-  NR_PTRS_UplinkConfig->transformPrecoderDisabled->frequencyDensity = CALLOC(1, sizeof(*NR_PTRS_UplinkConfig->transformPrecoderDisabled->frequencyDensity));
-  long *n_rbs = CALLOC(2, sizeof(long));
-  for (int i=0;i<2;i++) {
-    ASN_SEQUENCE_ADD(&NR_PTRS_UplinkConfig->transformPrecoderDisabled->frequencyDensity->list, &n_rbs[i]);
-  }
-  NR_PTRS_UplinkConfig->transformPrecoderDisabled->timeDensity = CALLOC(1, sizeof(*NR_PTRS_UplinkConfig->transformPrecoderDisabled->timeDensity));
-  long *ptrs_mcs = CALLOC(3, sizeof(long));
-  for (int i = 0; i < 3; i++) {
-    ASN_SEQUENCE_ADD(&NR_PTRS_UplinkConfig->transformPrecoderDisabled->timeDensity->list, &ptrs_mcs[i]);
-  }
-  NR_PTRS_UplinkConfig->transformPrecoderDisabled->resourceElementOffset = CALLOC(1, sizeof(*NR_PTRS_UplinkConfig->transformPrecoderDisabled->resourceElementOffset));
-  *NR_PTRS_UplinkConfig->transformPrecoderDisabled->resourceElementOffset = 0;
-
-  // UL bandwidth part
-  NR_BWP_Uplink_t *ubwp = CALLOC(1, sizeof(*ubwp));
-  ubwp->bwp_Id = 1;
-  ubwp->bwp_Dedicated = CALLOC(1, sizeof(*ubwp->bwp_Dedicated));
+    // UL bandwidth part
+    NR_BWP_Uplink_t *ubwp = CALLOC(1, sizeof(*ubwp));
+    ubwp->bwp_Id = j+1;
+    ubwp->bwp_Common = CALLOC(1, sizeof(*ubwp->bwp_Common));
+    ubwp->bwp_Dedicated = CALLOC(1, sizeof(*ubwp->bwp_Dedicated));
 
-  ubwp->bwp_Dedicated->pusch_Config = CALLOC(1, sizeof(*ubwp->bwp_Dedicated->pusch_Config));
-  ubwp->bwp_Dedicated->pusch_Config->present = NR_SetupRelease_PUSCH_Config_PR_setup;
-  ubwp->bwp_Dedicated->pusch_Config->choice.setup = pusch_Config;
+    ubwp->bwp_Dedicated->pusch_Config = CALLOC(1, sizeof(*ubwp->bwp_Dedicated->pusch_Config));
+    ubwp->bwp_Dedicated->pusch_Config->present = NR_SetupRelease_PUSCH_Config_PR_setup;
+    ubwp->bwp_Dedicated->pusch_Config->choice.setup = pusch_Config;
 
-  ASN_SEQUENCE_ADD(&scd->uplinkConfig->uplinkBWP_ToAddModList->list,ubwp);
+    ASN_SEQUENCE_ADD(&scd->uplinkConfig->uplinkBWP_ToAddModList->list,ubwp);
+  }
 }
 
-/* This function checks dedicated serving cell configuration and performs fixes as needed */ 
+/* This function checks dedicated serving cell configuration and performs fixes as needed */
 void fix_scd(NR_ServingCellConfig_t *scd) {
-  // Check for DL PTRS parameters validity
-  if (scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS) {
-    // If any of the frequencyDensity values are not set or are out of bounds, PTRS is assumed to be not present
-    for (int i = scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->frequencyDensity->list.count-1; i >= 0; i--) {
-      if ((*scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->frequencyDensity->list.array[i] < 1)
-          || (*scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->frequencyDensity->list.array[i] > 276)) {
-        LOG_I(NR_RRC, "DL PTRS frequencyDensity %d not set. Assuming PTRS not present! \n", i);
-        free(scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS);
-        scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS = NULL;
-        break;
-      }
+
+  // Remove unused BWPs
+  int b = 0;
+  while (b<scd->downlinkBWP_ToAddModList->list.count) {
+    if (scd->downlinkBWP_ToAddModList->list.array[b]->bwp_Common->genericParameters.locationAndBandwidth == 0) {
+      asn_sequence_del(&scd->downlinkBWP_ToAddModList->list,b,1);
+    } else {
+      b++;
     }
   }
-  if (scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS) {
-    // If any of the timeDensity values are not set or are out of bounds, PTRS is assumed to be not present
-    for (int i = scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->timeDensity->list.count-1; i >= 0; i--) {
-      if ((*scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->timeDensity->list.array[i] < 0)
-          || (*scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->timeDensity->list.array[i] > 29)) {
-        LOG_I(RRC, "DL PTRS timeDensity %d not set. Assuming PTRS not present! \n", i);
-        free(scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS);
-        scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS = NULL;
-        break;
-      }
+
+  b = 0;
+  while (b<scd->uplinkConfig->uplinkBWP_ToAddModList->list.count) {
+    if (scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[b]->bwp_Common->genericParameters.locationAndBandwidth == 0) {
+      asn_sequence_del(&scd->uplinkConfig->uplinkBWP_ToAddModList->list,b,1);
+    } else {
+      b++;
     }
   }
-  if (scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS) {
-    if (*scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->resourceElementOffset > 2) {
-      LOG_I(RRC, "Freeing DL PTRS resourceElementOffset \n");
-      free(scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->resourceElementOffset);
-      scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->resourceElementOffset = NULL;
+
+  // Check for DL PTRS parameters validity
+  for (int bwp_i = 0 ; bwp_i<scd->downlinkBWP_ToAddModList->list.count; bwp_i++) {
+
+    NR_DMRS_DownlinkConfig_t *dmrs_dl_config = scd->downlinkBWP_ToAddModList->list.array[bwp_i]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup;
+    
+    if (dmrs_dl_config->phaseTrackingRS) {
+      // If any of the frequencyDensity values are not set or are out of bounds, PTRS is assumed to be not present
+      for (int i = dmrs_dl_config->phaseTrackingRS->choice.setup->frequencyDensity->list.count - 1; i >= 0; i--) {
+        if ((*dmrs_dl_config->phaseTrackingRS->choice.setup->frequencyDensity->list.array[i] < 1)
+            || (*dmrs_dl_config->phaseTrackingRS->choice.setup->frequencyDensity->list.array[i] > 276)) {
+          LOG_I(GNB_APP, "DL PTRS frequencyDensity %d not set. Assuming PTRS not present! \n", i);
+          free(dmrs_dl_config->phaseTrackingRS);
+          dmrs_dl_config->phaseTrackingRS = NULL;
+          break;
+        }
+      }
     }
-    if (*scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->epre_Ratio > 1) {
-      LOG_I(RRC, "Freeing DL PTRS epre_Ratio \n");
-      free(scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->epre_Ratio);
-      scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->epre_Ratio = NULL;
+
+    if (dmrs_dl_config->phaseTrackingRS) {
+      // If any of the timeDensity values are not set or are out of bounds, PTRS is assumed to be not present
+      for (int i = dmrs_dl_config->phaseTrackingRS->choice.setup->timeDensity->list.count - 1; i >= 0; i--) {
+        if ((*dmrs_dl_config->phaseTrackingRS->choice.setup->timeDensity->list.array[i] < 0)
+            || (*dmrs_dl_config->phaseTrackingRS->choice.setup->timeDensity->list.array[i] > 29)) {
+          LOG_I(GNB_APP, "DL PTRS timeDensity %d not set. Assuming PTRS not present! \n", i);
+          free(dmrs_dl_config->phaseTrackingRS);
+          dmrs_dl_config->phaseTrackingRS = NULL;
+          break;
+        }
+      }
     }
-  }
 
-  if (scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS) {
-    // If any of the frequencyDensity values are not set or are out of bounds, PTRS is assumed to be not present
-    for (int i = scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->frequencyDensity->list.count-1; i >= 0; i--) {
-      if ((*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->frequencyDensity->list.array[i] < 1) 
-          || (*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->frequencyDensity->list.array[i] > 276)) {
-        LOG_I(RRC, "UL PTRS frequencyDensity %d not set. Assuming PTRS not present! \n", i);
-        free(scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS);
-        scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS = NULL;
-        break;
+    if (dmrs_dl_config->phaseTrackingRS) {
+      if (*dmrs_dl_config->phaseTrackingRS->choice.setup->resourceElementOffset > 2) {
+        LOG_I(GNB_APP, "Freeing DL PTRS resourceElementOffset \n");
+        free(dmrs_dl_config->phaseTrackingRS->choice.setup->resourceElementOffset);
+        dmrs_dl_config->phaseTrackingRS->choice.setup->resourceElementOffset = NULL;
+      }
+      if (*dmrs_dl_config->phaseTrackingRS->choice.setup->epre_Ratio > 1) {
+        LOG_I(GNB_APP, "Freeing DL PTRS epre_Ratio \n");
+        free(dmrs_dl_config->phaseTrackingRS->choice.setup->epre_Ratio);
+        dmrs_dl_config->phaseTrackingRS->choice.setup->epre_Ratio = NULL;
       }
     }
   }
 
-  if (scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS) {
-    // If any of the timeDensity values are not set or are out of bounds, PTRS is assumed to be not present
-    for (int i = scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->timeDensity->list.count-1; i >= 0; i--) {
-      if ((*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->timeDensity->list.array[i] < 0)
-          || (*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->timeDensity->list.array[i] > 29)) {
-        LOG_I(RRC, "UL PTRS timeDensity %d not set. Assuming PTRS not present! \n", i);
-        free(scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS);
-        scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS = NULL;
-        break;
+  // Check for UL PTRS parameters validity
+  for (int bwp_i = 0 ; bwp_i<scd->uplinkConfig->uplinkBWP_ToAddModList->list.count; bwp_i++) {
+
+    NR_DMRS_UplinkConfig_t *dmrs_ul_config = scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[bwp_i]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup;
+    
+    if (dmrs_ul_config->phaseTrackingRS) {
+      // If any of the frequencyDensity values are not set or are out of bounds, PTRS is assumed to be not present
+      for (int i = dmrs_ul_config->phaseTrackingRS->choice.setup->transformPrecoderDisabled->frequencyDensity->list.count-1; i >= 0; i--) {
+        if ((*dmrs_ul_config->phaseTrackingRS->choice.setup->transformPrecoderDisabled->frequencyDensity->list.array[i] < 1)
+            || (*dmrs_ul_config->phaseTrackingRS->choice.setup->transformPrecoderDisabled->frequencyDensity->list.array[i] > 276)) {
+          LOG_I(GNB_APP, "UL PTRS frequencyDensity %d not set. Assuming PTRS not present! \n", i);
+          free(dmrs_ul_config->phaseTrackingRS);
+          dmrs_ul_config->phaseTrackingRS = NULL;
+          break;
+        }
       }
     }
-  }
-  if (scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS) {
-    // Check for UL PTRS parameters validity
-    if (*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->resourceElementOffset > 2) {
-      LOG_I(RRC, "Freeing UL PTRS resourceElementOffset \n");
-      free(scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->resourceElementOffset);
-      scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->resourceElementOffset = NULL;
+
+    if (dmrs_ul_config->phaseTrackingRS) {
+      // If any of the timeDensity values are not set or are out of bounds, PTRS is assumed to be not present
+      for (int i = dmrs_ul_config->phaseTrackingRS->choice.setup->transformPrecoderDisabled->timeDensity->list.count-1; i >= 0; i--) {
+        if ((*dmrs_ul_config->phaseTrackingRS->choice.setup->transformPrecoderDisabled->timeDensity->list.array[i] < 0)
+            || (*dmrs_ul_config->phaseTrackingRS->choice.setup->transformPrecoderDisabled->timeDensity->list.array[i] > 29)) {
+          LOG_I(GNB_APP, "UL PTRS timeDensity %d not set. Assuming PTRS not present! \n", i);
+          free(dmrs_ul_config->phaseTrackingRS);
+          dmrs_ul_config->phaseTrackingRS = NULL;
+          break;
+        }
+      }
     }
+
+    if (dmrs_ul_config->phaseTrackingRS) {
+      // Check for UL PTRS parameters validity
+      if (*dmrs_ul_config->phaseTrackingRS->choice.setup->transformPrecoderDisabled->resourceElementOffset > 2) {
+        LOG_I(GNB_APP, "Freeing UL PTRS resourceElementOffset \n");
+        free(dmrs_ul_config->phaseTrackingRS->choice.setup->transformPrecoderDisabled->resourceElementOffset);
+        dmrs_ul_config->phaseTrackingRS->choice.setup->transformPrecoderDisabled->resourceElementOffset = NULL;
+      }
+    }
+
   }
 }
 
@@ -770,6 +827,7 @@ void RCconfig_NR_L1(void) {
       RC.gNB[j]->pucch0_thres       = *(L1_ParamList.paramarray[j][L1_PUCCH0_DTX_THRESHOLD].uptr);
       RC.gNB[j]->prach_thres        = *(L1_ParamList.paramarray[j][L1_PRACH_DTX_THRESHOLD].uptr);
       RC.gNB[j]->pusch_thres        = *(L1_ParamList.paramarray[j][L1_PUSCH_DTX_THRESHOLD].uptr);
+      RC.gNB[j]->max_ldpc_iterations = *(L1_ParamList.paramarray[j][L1_MAX_LDPC_ITERATIONS].uptr);
       RC.gNB[j]->num_ulprbbl        = num_prbbl;
       RC.gNB[j]->ap_N1              = N1;
       RC.gNB[j]->ap_N2              = N2;
@@ -858,6 +916,10 @@ void RCconfig_nr_macrlc() {
   }
   paramdef_t MacRLC_Params[] = MACRLCPARAMS_DESC;
   paramlist_def_t MacRLC_ParamList = {CONFIG_STRING_MACRLC_LIST,NULL,0};
+  /* map parameter checking array instances to parameter definition array instances */
+  checkedparam_t config_check_MacRLCParams [] = MACRLCPARAMS_CHECK;
+  for (int i = 0; i < sizeof(MacRLC_Params) / sizeof(paramdef_t); ++i)
+    MacRLC_Params[i].chkPptr = &(config_check_MacRLCParams[i]);
   config_getlist( &MacRLC_ParamList,MacRLC_Params,sizeof(MacRLC_Params)/sizeof(paramdef_t), NULL);    
   
   if ( MacRLC_ParamList.numelt > 0) {
@@ -870,6 +932,7 @@ void RCconfig_nr_macrlc() {
       RC.nb_nr_mac_CC[j] = *(MacRLC_ParamList.paramarray[j][MACRLC_CC_IDX].iptr);
       RC.nrmac[j]->pusch_target_snrx10                   = *(MacRLC_ParamList.paramarray[j][MACRLC_PUSCHTARGETSNRX10_IDX].iptr);
       RC.nrmac[j]->pucch_target_snrx10                   = *(MacRLC_ParamList.paramarray[j][MACRLC_PUCCHTARGETSNRX10_IDX].iptr);
+      RC.nrmac[j]->ul_prbblack_SNR_threshold             = *(MacRLC_ParamList.paramarray[j][MACRLC_UL_PRBBLACK_SNR_THRESHOLD_IDX].iptr);
       RC.nrmac[j]->pucch_failure_thres                   = *(MacRLC_ParamList.paramarray[j][MACRLC_PUCCHFAILURETHRES_IDX].iptr);
       RC.nrmac[j]->pusch_failure_thres                   = *(MacRLC_ParamList.paramarray[j][MACRLC_PUSCHFAILURETHRES_IDX].iptr);
      
@@ -924,11 +987,16 @@ void RCconfig_nr_macrlc() {
         AssertFatal(1==0,"MACRLC %d: %s unknown southbound midhaul\n",j,*(MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_S_PREFERENCE_IDX].strptr));
       } 
       RC.nrmac[j]->ulsch_max_frame_inactivity = *(MacRLC_ParamList.paramarray[j][MACRLC_ULSCH_MAX_FRAME_INACTIVITY].uptr);
-      RC.nrmac[j]->dl_bler_target_upper = *(MacRLC_ParamList.paramarray[j][MACRLC_DL_BLER_TARGET_UPPER_IDX].dblptr);
-      RC.nrmac[j]->dl_bler_target_lower = *(MacRLC_ParamList.paramarray[j][MACRLC_DL_BLER_TARGET_LOWER_IDX].dblptr);
-      RC.nrmac[j]->dl_rd2_bler_threshold = *(MacRLC_ParamList.paramarray[j][MACRLC_DL_RD2_BLER_THRESHOLD_IDX].dblptr);
-      RC.nrmac[j]->dl_max_mcs = *(MacRLC_ParamList.paramarray[j][MACRLC_DL_MAX_MCS_IDX].u8ptr);
-      RC.nrmac[j]->harq_round_max = *(MacRLC_ParamList.paramarray[j][MACRLC_HARQ_ROUND_MAX_IDX].u8ptr);
+      NR_bler_options_t *dl_bler_options = &RC.nrmac[j]->dl_bler;
+      dl_bler_options->upper = *(MacRLC_ParamList.paramarray[j][MACRLC_DL_BLER_TARGET_UPPER_IDX].dblptr);
+      dl_bler_options->lower = *(MacRLC_ParamList.paramarray[j][MACRLC_DL_BLER_TARGET_LOWER_IDX].dblptr);
+      dl_bler_options->max_mcs = *(MacRLC_ParamList.paramarray[j][MACRLC_DL_MAX_MCS_IDX].u8ptr);
+      dl_bler_options->harq_round_max = *(MacRLC_ParamList.paramarray[j][MACRLC_DL_HARQ_ROUND_MAX_IDX].u8ptr);
+      NR_bler_options_t *ul_bler_options = &RC.nrmac[j]->ul_bler;
+      ul_bler_options->upper = *(MacRLC_ParamList.paramarray[j][MACRLC_UL_BLER_TARGET_UPPER_IDX].dblptr);
+      ul_bler_options->lower = *(MacRLC_ParamList.paramarray[j][MACRLC_UL_BLER_TARGET_LOWER_IDX].dblptr);
+      ul_bler_options->max_mcs = *(MacRLC_ParamList.paramarray[j][MACRLC_UL_MAX_MCS_IDX].u8ptr);
+      ul_bler_options->harq_round_max = *(MacRLC_ParamList.paramarray[j][MACRLC_UL_HARQ_ROUND_MAX_IDX].u8ptr);
       RC.nrmac[j]->min_grant_prb = *(MacRLC_ParamList.paramarray[j][MACRLC_MIN_GRANT_PRB_IDX].u8ptr);
       RC.nrmac[j]->min_grant_mcs = *(MacRLC_ParamList.paramarray[j][MACRLC_MIN_GRANT_MCS_IDX].u8ptr);
       RC.nrmac[j]->num_ulprbbl = num_prbbl;
@@ -1084,8 +1152,8 @@ void RCconfig_NRRRC(MessageDef *msg_p, uint32_t i, gNB_RRC_INST *rrc) {
   prepare_scd(scd);
   paramdef_t SCDsParams[] = SCDPARAMS_DESC(scd);
   paramlist_def_t SCDsParamList = {GNB_CONFIG_STRING_SERVINGCELLCONFIGDEDICATED, NULL, 0};
-   ////////// Physical parameters
 
+   ////////// Physical parameters
 
   /* get global parameters, defined outside any section in the config file */
  
@@ -1162,13 +1230,17 @@ void RCconfig_NRRRC(MessageDef *msg_p, uint32_t i, gNB_RRC_INST *rrc) {
     if (SCDsParamList.numelt > 0) {    
       sprintf(aprefix, "%s.[%i].%s.[%i]", GNB_CONFIG_STRING_GNB_LIST,0,GNB_CONFIG_STRING_SERVINGCELLCONFIGDEDICATED, 0);
       config_get( SCDsParams,sizeof(SCDsParams)/sizeof(paramdef_t),aprefix);  
-      LOG_I(RRC,"Read in ServingCellConfigDedicated UL (FreqDensity_0 %d, FreqDensity_1 %d, TimeDensity_0 %d, TimeDensity_1 %d, TimeDensity_2 %d, RE offset %d \n",
+      LOG_I(RRC,"Read in ServingCellConfigDedicated UL (FreqDensity_0 %d, FreqDensity_1 %d, TimeDensity_0 %d, TimeDensity_1 %d, TimeDensity_2 %d, RE offset %d, First_active_BWP_ID %d SCS %d, LocationandBW %d \n",
       (int)*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->frequencyDensity->list.array[0],
       (int)*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->frequencyDensity->list.array[1],
       (int)*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->timeDensity->list.array[0],
       (int)*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->timeDensity->list.array[1],
       (int)*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->timeDensity->list.array[2],
-      (int)*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->resourceElementOffset);
+      (int)*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->resourceElementOffset,
+      (int)*scd->firstActiveDownlinkBWP_Id,
+      (int)scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Common->genericParameters.subcarrierSpacing,
+      (int)scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Common->genericParameters.locationAndBandwidth
+      );
     }
     fix_scd(scd);
 
@@ -1269,31 +1341,29 @@ void RCconfig_NRRRC(MessageDef *msg_p, uint32_t i, gNB_RRC_INST *rrc) {
 		      (NRRRC_CONFIGURATION_REQ (msg_p).mnc_digit_length[l] == 3),"BAD MNC DIGIT LENGTH %d",
 		      NRRRC_CONFIGURATION_REQ (msg_p).mnc_digit_length[l]);
 	}
-        LOG_I(GNB_APP,"SSB SCO %d\n",*GNBParamList.paramarray[i][GNB_SSB_SUBCARRIEROFFSET_IDX].iptr);
-        NRRRC_CONFIGURATION_REQ (msg_p).ssb_SubcarrierOffset = *GNBParamList.paramarray[i][GNB_SSB_SUBCARRIEROFFSET_IDX].iptr;
-        LOG_I(RRC,"pdsch_AntennaPorts N1 %d\n",*GNBParamList.paramarray[i][GNB_PDSCH_ANTENNAPORTS_N1_IDX].iptr);
+        LOG_I(GNB_APP,"pdsch_AntennaPorts N1 %d\n",*GNBParamList.paramarray[i][GNB_PDSCH_ANTENNAPORTS_N1_IDX].iptr);
         NRRRC_CONFIGURATION_REQ (msg_p).pdsch_AntennaPorts.N1 = *GNBParamList.paramarray[i][GNB_PDSCH_ANTENNAPORTS_N1_IDX].iptr;
-        LOG_I(RRC,"pdsch_AntennaPorts N2 %d\n",*GNBParamList.paramarray[i][GNB_PDSCH_ANTENNAPORTS_N2_IDX].iptr);
+        LOG_I(GNB_APP,"pdsch_AntennaPorts N2 %d\n",*GNBParamList.paramarray[i][GNB_PDSCH_ANTENNAPORTS_N2_IDX].iptr);
         NRRRC_CONFIGURATION_REQ (msg_p).pdsch_AntennaPorts.N2 = *GNBParamList.paramarray[i][GNB_PDSCH_ANTENNAPORTS_N2_IDX].iptr;
-        LOG_I(RRC,"pdsch_AntennaPorts XP %d\n",*GNBParamList.paramarray[i][GNB_PDSCH_ANTENNAPORTS_XP_IDX].iptr);
+        LOG_I(GNB_APP,"pdsch_AntennaPorts XP %d\n",*GNBParamList.paramarray[i][GNB_PDSCH_ANTENNAPORTS_XP_IDX].iptr);
         NRRRC_CONFIGURATION_REQ (msg_p).pdsch_AntennaPorts.XP = *GNBParamList.paramarray[i][GNB_PDSCH_ANTENNAPORTS_XP_IDX].iptr;
-        LOG_I(RRC,"pusch_AntennaPorts %d\n",*GNBParamList.paramarray[i][GNB_PUSCH_ANTENNAPORTS_IDX].iptr);
+        LOG_I(GNB_APP,"pusch_AntennaPorts %d\n",*GNBParamList.paramarray[i][GNB_PUSCH_ANTENNAPORTS_IDX].iptr);
         NRRRC_CONFIGURATION_REQ (msg_p).pusch_AntennaPorts = *GNBParamList.paramarray[i][GNB_PUSCH_ANTENNAPORTS_IDX].iptr;
         LOG_I(GNB_APP,"minTXRXTIME %d\n",*GNBParamList.paramarray[i][GNB_MINRXTXTIME_IDX].iptr);
         NRRRC_CONFIGURATION_REQ (msg_p).minRXTXTIME = *GNBParamList.paramarray[i][GNB_MINRXTXTIME_IDX].iptr;
-        LOG_I(RRC,"SIB1 TDA %d\n",*GNBParamList.paramarray[i][GNB_SIB1_TDA_IDX].iptr);
+        LOG_I(GNB_APP,"SIB1 TDA %d\n",*GNBParamList.paramarray[i][GNB_SIB1_TDA_IDX].iptr);
         NRRRC_CONFIGURATION_REQ (msg_p).sib1_tda = *GNBParamList.paramarray[i][GNB_SIB1_TDA_IDX].iptr;
         LOG_I(GNB_APP,"Do CSI-RS %d\n",*GNBParamList.paramarray[i][GNB_DO_CSIRS_IDX].iptr);
         NRRRC_CONFIGURATION_REQ (msg_p).do_CSIRS = *GNBParamList.paramarray[i][GNB_DO_CSIRS_IDX].iptr;
-        LOG_I(RRC, "Do SRS %d\n",*GNBParamList.paramarray[i][GNB_DO_SRS_IDX].iptr);
+        LOG_I(GNB_APP, "Do SRS %d\n",*GNBParamList.paramarray[i][GNB_DO_SRS_IDX].iptr);
         NRRRC_CONFIGURATION_REQ (msg_p).do_SRS = *GNBParamList.paramarray[i][GNB_DO_SRS_IDX].iptr;
         NRRRC_CONFIGURATION_REQ (msg_p).force_256qam_off = *GNBParamList.paramarray[i][GNB_FORCE256QAMOFF_IDX].iptr;
-        LOG_I(RRC, "256 QAM: %s\n", NRRRC_CONFIGURATION_REQ (msg_p).force_256qam_off ? "force off" : "may be on");
+        LOG_I(GNB_APP, "256 QAM: %s\n", NRRRC_CONFIGURATION_REQ (msg_p).force_256qam_off ? "force off" : "may be on");
         NRRRC_CONFIGURATION_REQ (msg_p).scc = scc;
         NRRRC_CONFIGURATION_REQ (msg_p).scd = scd;
-	    NRRRC_CONFIGURATION_REQ (msg_p).enable_sdap = *GNBParamList.paramarray[i][GNB_ENABLE_SDAP_IDX].iptr;
+        NRRRC_CONFIGURATION_REQ (msg_p).enable_sdap = *GNBParamList.paramarray[i][GNB_ENABLE_SDAP_IDX].iptr;
         LOG_I(GNB_APP, "SDAP layer is %s\n", NRRRC_CONFIGURATION_REQ (msg_p).enable_sdap ? "enabled" : "disabled");
-        
+
       }//
     }//End for (k=0; k <num_gnbs ; k++)
     memcpy(&rrc->configuration, &NRRRC_CONFIGURATION_REQ(msg_p), sizeof(NRRRC_CONFIGURATION_REQ(msg_p)));
@@ -1991,9 +2061,38 @@ int RCconfig_NR_DU_F1(MessageDef *msg_p, uint32_t i) {
         f1Setup->measurement_timing_information[k]             = "0";
         f1Setup->ranac[k]                                      = 0;
         f1Setup->mib[k]                                        = rrc->carrier.MIB;
-        f1Setup->sib1[k]                                       = rrc->carrier.SIB1;
         f1Setup->mib_length[k]                                 = rrc->carrier.sizeof_MIB;
-        f1Setup->sib1_length[k]                                = rrc->carrier.sizeof_SIB1;
+
+        NR_BCCH_DL_SCH_Message_t *bcch_message = NULL;
+
+        asn_dec_rval_t dec_rval = uper_decode_complete( NULL,
+            &asn_DEF_NR_BCCH_DL_SCH_Message,
+            (void **)&bcch_message,
+            (const void *)rrc->carrier.SIB1,
+            rrc->carrier.sizeof_SIB1);
+
+        if ((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)) {
+          LOG_E(RRC,"SIB1 decode error\n");
+          // free the memory
+          SEQUENCE_free( &asn_DEF_NR_BCCH_DL_SCH_Message, bcch_message, 1 );
+          exit(1);
+        }
+       
+        NR_SIB1_t *bcch_SIB1 = bcch_message->message.choice.c1->choice.systemInformationBlockType1;
+        f1Setup->sib1[k] = calloc(1,rrc->carrier.sizeof_SIB1);
+        asn_enc_rval_t enc_rval = uper_encode_to_buffer(&asn_DEF_NR_SIB1,
+            NULL,
+            (void *)bcch_SIB1,
+            f1Setup->sib1[k],
+            NR_MAX_SIB_LENGTH/8);
+        AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n",
+            enc_rval.failed_type->name, enc_rval.encoded);
+
+        //if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
+          LOG_I(NR_RRC, "SIB1 container to be integrated in F1 Setup request:\n");
+          xer_fprint(stdout, &asn_DEF_NR_SIB1,(void *)bcch_message->message.choice.c1->choice.systemInformationBlockType1 );
+        //}
+        f1Setup->sib1_length[k]                                = (enc_rval.encoded+7)/8;
         break;
       }
     }
@@ -2155,7 +2254,6 @@ void configure_gnb_du_mac(int inst) {
   // LOG_I(GNB_APP,"Configuring MAC/L1 %d, carrier->sib2 %p\n", inst, &carrier->sib2->radioResourceConfigCommon);
   LOG_I(GNB_APP,"Configuring gNB DU MAC/L1 %d \n", inst);
   rrc_mac_config_req_gNB(rrc->module_id,
-                        rrc->configuration.ssb_SubcarrierOffset,
                         rrc->configuration.pdsch_AntennaPorts,
                         rrc->configuration.pusch_AntennaPorts,
                         rrc->configuration.sib1_tda,
diff --git a/openair2/GNB_APP/gnb_paramdef.h b/openair2/GNB_APP/gnb_paramdef.h
index 4f6c9e1a68d8b033bb3261077c71c1b0a5cf31ea..ef28dea80fd200ff364b85cb181a31479f45c696 100644
--- a/openair2/GNB_APP/gnb_paramdef.h
+++ b/openair2/GNB_APP/gnb_paramdef.h
@@ -113,7 +113,6 @@ typedef enum {
 #define GNB_CONFIG_STRING_REMOTE_S_PORTC                "remote_s_portc"
 #define GNB_CONFIG_STRING_LOCAL_S_PORTD                 "local_s_portd"
 #define GNB_CONFIG_STRING_REMOTE_S_PORTD                "remote_s_portd"
-#define GNB_CONFIG_STRING_SSBSUBCARRIEROFFSET           "ssb_SubcarrierOffset"
 #define GNB_CONFIG_STRING_PDSCHANTENNAPORTS_N1          "pdsch_AntennaPorts_N1"
 #define GNB_CONFIG_STRING_PDSCHANTENNAPORTS_N2          "pdsch_AntennaPorts_N2"
 #define GNB_CONFIG_STRING_PDSCHANTENNAPORTS_XP          "pdsch_AntennaPorts_XP"
@@ -149,7 +148,6 @@ typedef enum {
 {GNB_CONFIG_STRING_REMOTE_S_PORTC,               NULL,   0,            uptr:NULL,   defuintval:50000,            TYPE_UINT,      0},  \
 {GNB_CONFIG_STRING_LOCAL_S_PORTD,                NULL,   0,            uptr:NULL,   defuintval:50001,            TYPE_UINT,      0},  \
 {GNB_CONFIG_STRING_REMOTE_S_PORTD,               NULL,   0,            uptr:NULL,   defuintval:50001,            TYPE_UINT,      0},  \
-{GNB_CONFIG_STRING_SSBSUBCARRIEROFFSET,          NULL,   0,            iptr:NULL,   defintval:31,                TYPE_INT,       0},  \
 {GNB_CONFIG_STRING_PDSCHANTENNAPORTS_N1, "horiz. log. antenna ports", 0, iptr:NULL, defintval:1,                 TYPE_INT,       0},  \
 {GNB_CONFIG_STRING_PDSCHANTENNAPORTS_N2, "vert. log. antenna ports", 0, iptr:NULL,  defintval:1,                 TYPE_INT,       0},  \
 {GNB_CONFIG_STRING_PDSCHANTENNAPORTS_XP, "XP log. antenna ports",   0, iptr:NULL,   defintval:1,                 TYPE_INT,       0},  \
@@ -160,9 +158,9 @@ typedef enum {
 {GNB_CONFIG_STRING_NRCELLID,                     NULL,   0,            u64ptr:NULL, defint64val:1,               TYPE_UINT64,    0},  \
 {GNB_CONFIG_STRING_MINRXTXTIME,                  NULL,   0,            iptr:NULL,   defintval:2,                 TYPE_INT,       0},  \
 {GNB_CONFIG_STRING_ULPRBBLACKLIST,               NULL,   0,            strptr:NULL, defstrval:"",                TYPE_STRING,    0},  \
-{GNB_CONFIG_STRING_UMONDEFAULTDRB,               NULL,   0,            uptr:NULL,   defuintval:0,                 TYPE_UINT,   0},   \
+{GNB_CONFIG_STRING_UMONDEFAULTDRB,               NULL,   0,            uptr:NULL,   defuintval:0,                TYPE_UINT,      0},  \
 {GNB_CONFIG_STRING_FORCE256QAMOFF, GNB_CONFIG_HLP_FORCE256QAMOFF, PARAMFLAG_BOOL, iptr:NULL, defintval:0,        TYPE_INT,       0},  \
-{GNB_CONFIG_STRING_ENABLE_SDAP, GNB_CONFIG_HLP_STRING_ENABLE_SDAP, PARAMFLAG_BOOL, iptr:NULL, defintval:0,       TYPE_INT,       0}  \
+{GNB_CONFIG_STRING_ENABLE_SDAP, GNB_CONFIG_HLP_STRING_ENABLE_SDAP, PARAMFLAG_BOOL, iptr:NULL, defintval:0,       TYPE_INT,       0},  \
 }
 
 #define GNB_GNB_ID_IDX                  0
@@ -179,20 +177,19 @@ typedef enum {
 #define GNB_REMOTE_S_PORTC_IDX          11
 #define GNB_LOCAL_S_PORTD_IDX           12
 #define GNB_REMOTE_S_PORTD_IDX          13
-#define GNB_SSB_SUBCARRIEROFFSET_IDX    14
-#define GNB_PDSCH_ANTENNAPORTS_N1_IDX   15
-#define GNB_PDSCH_ANTENNAPORTS_N2_IDX   16
-#define GNB_PDSCH_ANTENNAPORTS_XP_IDX   17
-#define GNB_PUSCH_ANTENNAPORTS_IDX      18
-#define GNB_SIB1_TDA_IDX                19
-#define GNB_DO_CSIRS_IDX                20
-#define GNB_DO_SRS_IDX                  21
-#define GNB_NRCELLID_IDX                22
-#define GNB_MINRXTXTIME_IDX             23
-#define GNB_ULPRBBLACKLIST_IDX          24
-#define GNB_UMONDEFAULTDRB_IDX          25
-#define GNB_FORCE256QAMOFF_IDX          26
-#define GNB_ENABLE_SDAP_IDX             27
+#define GNB_PDSCH_ANTENNAPORTS_N1_IDX   14
+#define GNB_PDSCH_ANTENNAPORTS_N2_IDX   15
+#define GNB_PDSCH_ANTENNAPORTS_XP_IDX   16
+#define GNB_PUSCH_ANTENNAPORTS_IDX      17
+#define GNB_SIB1_TDA_IDX                18
+#define GNB_DO_CSIRS_IDX                19
+#define GNB_DO_SRS_IDX                  20
+#define GNB_NRCELLID_IDX                21
+#define GNB_MINRXTXTIME_IDX             22
+#define GNB_ULPRBBLACKLIST_IDX          23
+#define GNB_UMONDEFAULTDRB_IDX          24
+#define GNB_FORCE256QAMOFF_IDX          25
+#define GNB_ENABLE_SDAP_IDX             26
 
 #define TRACKING_AREA_CODE_OKRANGE {0x0001,0xFFFD}
 #define GNBPARAMS_CHECK {                                         \
diff --git a/openair2/LAYER2/MAC/config.c b/openair2/LAYER2/MAC/config.c
index d22485d23f261823d8b028c90a46b056273eb9eb..52a9048cd07624006261e4fc9118207b2778160c 100644
--- a/openair2/LAYER2/MAC/config.c
+++ b/openair2/LAYER2/MAC/config.c
@@ -1104,7 +1104,7 @@ void eNB_Config_Local_DRX(instance_t Mod_id,
 
   /* Get struct to modify */
   UE_scheduling_control = &(UE_info_mac->UE_sched_ctrl[UE_id]);
-  UE_scheduling_control->cdrx_configured = FALSE; // will be set to true when no error
+  UE_scheduling_control->cdrx_configured = false; // will be set to true when no error
 
   /* Check drx_Configuration */
   if (drx_Configuration == NULL) {
@@ -1119,9 +1119,9 @@ void eNB_Config_Local_DRX(instance_t Mod_id,
   }
 
   /* Modify scheduling control structure according to DRX configuration: doesn't support every configurations! */  
-  UE_scheduling_control->cdrx_configured = FALSE; // will be set to true when receiving RRC Reconfiguration Complete
-  UE_scheduling_control->cdrx_waiting_ack = TRUE; // waiting for RRC Reconfiguration Complete message
-  UE_scheduling_control->in_active_time = FALSE;
+  UE_scheduling_control->cdrx_configured = false; // will be set to true when receiving RRC Reconfiguration Complete
+  UE_scheduling_control->cdrx_waiting_ack = true; // waiting for RRC Reconfiguration Complete message
+  UE_scheduling_control->in_active_time = false;
   UE_scheduling_control->dci0_ongoing_timer = 0;
   UE_scheduling_control->on_duration_timer = 0;
   struct LTE_DRX_Config__setup *choiceSetup = &drx_Configuration->choice.setup;
@@ -1297,13 +1297,13 @@ void eNB_Config_Local_DRX(instance_t Mod_id,
   }
 
   if (choiceSetup->shortDRX == NULL) {
-    UE_scheduling_control->in_short_drx_cycle = FALSE;
+    UE_scheduling_control->in_short_drx_cycle = false;
     UE_scheduling_control->drx_shortCycle_timer_value = 0;
     UE_scheduling_control->short_drx_cycle_duration = 0;
     UE_scheduling_control->drx_shortCycle_timer = 0;
     UE_scheduling_control->drx_shortCycle_timer_thres = -1;
   } else {
-    UE_scheduling_control->in_short_drx_cycle = FALSE;
+    UE_scheduling_control->in_short_drx_cycle = false;
     UE_scheduling_control->drx_shortCycle_timer_value = (uint8_t) choiceSetup->shortDRX->drxShortCycleTimer;
 
     switch (choiceSetup->shortDRX->shortDRX_Cycle) {
@@ -1380,7 +1380,7 @@ void eNB_Config_Local_DRX(instance_t Mod_id,
     UE_scheduling_control->drx_shortCycle_timer_thres = UE_scheduling_control->drx_shortCycle_timer_value * UE_scheduling_control->short_drx_cycle_duration;
   }
 
-  UE_scheduling_control->in_long_drx_cycle = FALSE;
+  UE_scheduling_control->in_long_drx_cycle = false;
   UE_scheduling_control->drx_longCycle_timer = 0;
 
   switch (choiceSetup->longDRX_CycleStartOffset.present) {
diff --git a/openair2/LAYER2/MAC/defs_NB_IoT.h b/openair2/LAYER2/MAC/defs_NB_IoT.h
index d4945f0182d5b3ddfd0bbb81b554a27b59d75b20..abe780741c05c225f30758cfc5b622644e6da58d 100644
--- a/openair2/LAYER2/MAC/defs_NB_IoT.h
+++ b/openair2/LAYER2/MAC/defs_NB_IoT.h
@@ -243,7 +243,6 @@ typedef struct {
   // -1:No UE in list
   int tail;
   int num_UEs;
-  //boolean_t active[MAX_MAX_MOBILES_PER_ENB_NB_IoT];
 
 } UE_list_NB_IoT_t;
 
@@ -403,7 +402,7 @@ typedef struct schedule_result{
   // pointer to DCI
   void *DCI_pdu;
   // when all the procedure related to this DCI, enable this flag
-  boolean_t DCI_release;
+  bool DCI_release;
   // Indicate the channel which to transmit
   channel_NB_IoT_t channel;
   // rnti
@@ -452,7 +451,7 @@ typedef enum ce_level_e{
 /*! \brief eNB template for the Random access information */
 typedef struct RA_TEMPLATE_NB_IoT_s{
 
-  boolean_t active;
+  bool active;
   uint32_t msg3_retransmit_count;
   uint32_t msg4_retransmit_count;
   uint16_t ta;
@@ -461,8 +460,8 @@ typedef struct RA_TEMPLATE_NB_IoT_s{
   rnti_t ue_rnti;
   rnti_t ra_rnti;
   struct RA_TEMPLATE_NB_IoT_s *next, *prev;
-  boolean_t wait_msg4_ack;
-  boolean_t wait_msg3_ack;
+  bool wait_msg4_ack;
+  bool wait_msg3_ack;
   uint8_t rar_buffer[7];
 
 } RA_TEMPLATE_NB_IoT;
@@ -530,7 +529,7 @@ typedef  struct {
   uint32_t       pdus_in_buffer;  /*!< \brief Number of PDUs buffered in RLC protocol instance (OBSOLETE). */
   uint32_t       head_sdu_creation_time;           /*!< \brief Head SDU creation time. */
   uint32_t       head_sdu_remaining_size_to_send;  /*!< \brief remaining size of sdu: could be the total size or the remaining size of already segmented sdu */
-  boolean_t      head_sdu_is_segmented;     /*!< \brief 0 if head SDU has not been segmented, 1 if already segmented */
+  bool           head_sdu_is_segmented;     /*!< \brief 0 if head SDU has not been segmented, 1 if already segmented */
 } mac_rlc_status_resp_NB_IoT_t;
 
 // global variables
diff --git a/openair2/LAYER2/MAC/eNB_scheduler.c b/openair2/LAYER2/MAC/eNB_scheduler.c
index d647eff7cbe7800c5fe49d24cca69885a9c7314a..53ab98a33fb9f87bc45429384206a4e8c03c170b 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler.c
@@ -135,7 +135,7 @@ void schedule_SRS(module_id_t module_idP,
           UE_scheduling_control = &(UE_info->UE_sched_ctrl[UE_id]);
 
           /* Test if Active Time not running since 6+ subframes */
-          if (UE_scheduling_control->cdrx_configured == TRUE && UE_scheduling_control->in_active_time == FALSE) {
+          if (UE_scheduling_control->cdrx_configured == true && UE_scheduling_control->in_active_time == false) {
             /*
              * TODO: 6+ subframes condition not checked here
              */
@@ -204,7 +204,7 @@ void schedule_CSI(module_id_t module_idP,
     cc = &eNB->common_channels[CC_id];
 
     for (UE_id = 0; UE_id < MAX_MOBILES_PER_ENB; UE_id++) {
-      if (UE_info->active[UE_id] == FALSE) {
+      if (UE_info->active[UE_id] == false) {
         continue;
       }
 
@@ -223,9 +223,9 @@ void schedule_CSI(module_id_t module_idP,
       */
       UE_scheduling_control = &(UE_info->UE_sched_ctrl[UE_id]);
 
-      if (UE_scheduling_control->cdrx_configured == TRUE) {
+      if (UE_scheduling_control->cdrx_configured == true) {
         /* Test if CQI masking activated */
-        if (UE_scheduling_control->cqi_mask_boolean == TRUE) {
+        if (UE_scheduling_control->cqi_mask_boolean == true) {
           // CQI masking => test if onDurationTime not running since 6+ subframe
           if (UE_scheduling_control->on_duration_timer == 0) {
             /*
@@ -234,7 +234,7 @@ void schedule_CSI(module_id_t module_idP,
             continue;
           }
         } else { // No CQI masking => test if Active Time not running since 6+ subframe
-          if (UE_scheduling_control->in_active_time == FALSE) {
+          if (UE_scheduling_control->in_active_time == false) {
             /*
              * TODO: 6+ subframes condition not checked here
              */
@@ -677,8 +677,8 @@ eNB_dlsch_ulsch_scheduler(module_id_t module_idP,
       }
 
       /* Set and increment CDRX related timers */
-      if (UE_scheduling_control->cdrx_configured == TRUE) {
-        boolean_t harq_active_time_condition = FALSE;
+      if (UE_scheduling_control->cdrx_configured == true) {
+        bool harq_active_time_condition = false;
         UE_TEMPLATE *UE_template = NULL;
         unsigned long active_time_condition = 0; // variable used only for tracing purpose
 
@@ -721,7 +721,7 @@ eNB_dlsch_ulsch_scheduler(module_id_t module_idP,
             UE_scheduling_control->ul_synchronous_harq_timer[CC_id][harq_process_id]++;
 
             if (UE_scheduling_control->ul_synchronous_harq_timer[CC_id][harq_process_id] > 5) {
-              harq_active_time_condition = TRUE;
+              harq_active_time_condition = true;
               UE_scheduling_control->ul_synchronous_harq_timer[CC_id][harq_process_id] = 0;
               active_time_condition = 5; // for tracing purpose
             }
@@ -747,24 +747,24 @@ eNB_dlsch_ulsch_scheduler(module_id_t module_idP,
 
             /* When timer expires switch into short or long DRX cycle */
             if (UE_scheduling_control->drx_shortCycle_timer_thres > 0) {
-              UE_scheduling_control->in_short_drx_cycle = TRUE;
+              UE_scheduling_control->in_short_drx_cycle = true;
               UE_scheduling_control->drx_shortCycle_timer = 0;
-              UE_scheduling_control->in_long_drx_cycle = FALSE;
+              UE_scheduling_control->in_long_drx_cycle = false;
             } else {
-              UE_scheduling_control->in_long_drx_cycle = TRUE;
+              UE_scheduling_control->in_long_drx_cycle = true;
             }
           }
         }
 
         /* Short DRX Cycle */
-        if (UE_scheduling_control->in_short_drx_cycle == TRUE) {
+        if (UE_scheduling_control->in_short_drx_cycle == true) {
           UE_scheduling_control->drx_shortCycle_timer++;
 
           /* When the Short DRX cycles are over, switch to long DRX cycle */
           if (UE_scheduling_control->drx_shortCycle_timer > UE_scheduling_control->drx_shortCycle_timer_thres) {
             UE_scheduling_control->drx_shortCycle_timer = 0;
-            UE_scheduling_control->in_short_drx_cycle = FALSE;
-            UE_scheduling_control->in_long_drx_cycle = TRUE;
+            UE_scheduling_control->in_short_drx_cycle = false;
+            UE_scheduling_control->in_long_drx_cycle = true;
             UE_scheduling_control->drx_longCycle_timer = 0;
           }
         } else {
@@ -772,7 +772,7 @@ eNB_dlsch_ulsch_scheduler(module_id_t module_idP,
         }
 
         /* Long DRX Cycle */
-        if (UE_scheduling_control->in_long_drx_cycle == TRUE) {
+        if (UE_scheduling_control->in_long_drx_cycle == true) {
           UE_scheduling_control->drx_longCycle_timer++;
 
           if (UE_scheduling_control->drx_longCycle_timer > UE_scheduling_control->drx_longCycle_timer_thres) {
@@ -783,18 +783,18 @@ eNB_dlsch_ulsch_scheduler(module_id_t module_idP,
         }
 
         /* Check for error cases */
-        if ((UE_scheduling_control->in_short_drx_cycle == TRUE) && (UE_scheduling_control->in_long_drx_cycle == TRUE)) {
+        if ((UE_scheduling_control->in_short_drx_cycle == true) && (UE_scheduling_control->in_long_drx_cycle == true)) {
           LOG_E(MAC, "Error in C-DRX: UE id %d is in both short and long DRX cycle. Should not happen. Back it to long cycle only\n", UE_id);
-          UE_scheduling_control->in_short_drx_cycle = FALSE;
+          UE_scheduling_control->in_short_drx_cycle = false;
         }
 
         /* Condition to start On Duration Timer */
-        if (UE_scheduling_control->in_short_drx_cycle == TRUE && UE_scheduling_control->on_duration_timer == 0) {
+        if (UE_scheduling_control->in_short_drx_cycle == true && UE_scheduling_control->on_duration_timer == 0) {
           if (((frameP * 10) + subframeP) % (UE_scheduling_control->short_drx_cycle_duration) ==
               (UE_scheduling_control->drx_start_offset) % (UE_scheduling_control->short_drx_cycle_duration)) {
             UE_scheduling_control->on_duration_timer = 1;
           }
-        } else if (UE_scheduling_control->in_long_drx_cycle == TRUE && UE_scheduling_control->on_duration_timer == 0) {
+        } else if (UE_scheduling_control->in_long_drx_cycle == true && UE_scheduling_control->on_duration_timer == 0) {
           if (((frameP * 10) + subframeP) % (UE_scheduling_control->drx_longCycle_timer_thres) ==
               (UE_scheduling_control->drx_start_offset)) {
             UE_scheduling_control->on_duration_timer = 1;
@@ -811,7 +811,7 @@ eNB_dlsch_ulsch_scheduler(module_id_t module_idP,
         /* (a)synchronous HARQ processes handling for Active Time */
         for (int harq_process_id = 0; harq_process_id < 8; harq_process_id++) {
           if (UE_scheduling_control->drx_retransmission_timer[harq_process_id] > 0) {
-            harq_active_time_condition = TRUE;
+            harq_active_time_condition = true;
             active_time_condition = 2; // for tracing purpose
             break;
           }
@@ -822,9 +822,9 @@ eNB_dlsch_ulsch_scheduler(module_id_t module_idP,
             UE_scheduling_control->drx_inactivity_timer > 1 ||
             harq_active_time_condition ||
             UE_template->ul_SR > 0) {
-          UE_scheduling_control->in_active_time = TRUE;
+          UE_scheduling_control->in_active_time = true;
         } else {
-          UE_scheduling_control->in_active_time = FALSE;
+          UE_scheduling_control->in_active_time = false;
         }
 
         /* BEGIN VCD */
diff --git a/openair2/LAYER2/MAC/eNB_scheduler_RA.c b/openair2/LAYER2/MAC/eNB_scheduler_RA.c
index e5b95a7f470db7fb9422a2543bb3b53a0c9396cf..c659df8d31a6fabdcddcd658f9c4fae85fdf5f0b 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler_RA.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler_RA.c
@@ -1225,7 +1225,7 @@ check_Msg4_retransmission(module_id_t module_idP, int CC_idP,
     LOG_D(MAC,"[eNB %d][RAPROC] Frame %d, Subframe %d: state:IDLE\n", module_idP, frameP, subframeP);
     UE_id = find_UE_id(module_idP, ra->rnti);
     DevAssert(UE_id != -1);
-    mac->UE_info.UE_template[UE_PCCID(module_idP, UE_id)][UE_id].configured = TRUE;
+    mac->UE_info.UE_template[UE_PCCID(module_idP, UE_id)][UE_id].configured = true;
     mac->UE_info.UE_template[UE_PCCID(module_idP, UE_id)][UE_id].pusch_repetition_levels=ra->pusch_repetition_levels;
     cancel_ra_proc(module_idP, CC_idP, frameP, ra->rnti);
   }
diff --git a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c
index 596d978a98900184c5ea0840ba701858ae11a84e..08986221154e0bc82053d9cfe958be90778dc75e 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c
@@ -2075,7 +2075,7 @@ schedule_PCH(module_id_t module_idP,
     for (uint16_t i = 0; i < MAX_MOBILES_PER_ENB; i++) {
       ue_pf_po = &UE_PF_PO[CC_id][i];
 
-      if (ue_pf_po->enable_flag != TRUE) {
+      if (ue_pf_po->enable_flag != true) {
         continue;
       }
 
diff --git a/openair2/LAYER2/MAC/eNB_scheduler_fairRR.c b/openair2/LAYER2/MAC/eNB_scheduler_fairRR.c
index 6c9ffabd4f7e6b18aa173e30f040c0659d12e895..9836b643d4109b956b53fa2cc8769b11bf6afb46 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler_fairRR.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler_fairRR.c
@@ -69,7 +69,7 @@ int last_ulsch_ue_id_volte[MAX_NUM_CCs] = {-1};
   uint16_t pre_nb_rbs_required[2][MAX_NUM_CCs][NUMBER_OF_UE_MAX];
   uint8_t dlsch_ue_select_tbl_in_use;
   uint8_t new_dlsch_ue_select_tbl_in_use;
-  boolean_t pre_scd_activeUE[NUMBER_OF_UE_MAX];
+  bool pre_scd_activeUE[NUMBER_OF_UE_MAX];
   eNB_UE_STATS pre_scd_eNB_UE_stats[MAX_NUM_CCs][NUMBER_OF_UE_MAX];
 #endif
 
@@ -125,7 +125,7 @@ void pre_scd_nb_rbs_required(    module_id_t     module_idP,
   UE_info_t *UE_info = &RC.mac[module_idP]->UE_info;
 
   for (UE_id = 0; UE_id <NUMBER_OF_UE_MAX; UE_id++) {
-    if (pre_scd_activeUE[UE_id] != TRUE)
+    if (pre_scd_activeUE[UE_id] != true)
       continue;
 
     // store dlsch buffer
@@ -210,7 +210,7 @@ void dlsch_scheduler_pre_ue_select_fairRR(
     DL_req          = &eNB->DL_req[CC_id].dl_config_request_body;
 
     for (UE_id = 0; UE_id < NUMBER_OF_UE_MAX; UE_id++) {
-      if (UE_info->active[UE_id] == FALSE) {
+      if (UE_info->active[UE_id] == false) {
         continue;
       }
 
@@ -331,7 +331,7 @@ void dlsch_scheduler_pre_ue_select_fairRR(
         break;
       }
 
-      if (UE_info->active[UE_id] == FALSE) {
+      if (UE_info->active[UE_id] == false) {
         continue;
       }
 
@@ -459,7 +459,7 @@ void dlsch_scheduler_pre_ue_select_fairRR(
         break;
       }
 
-      if (UE_info->active[UE_id] == FALSE) {
+      if (UE_info->active[UE_id] == false) {
         continue;
       }
 
@@ -607,7 +607,7 @@ static void dlsch_scheduler_pre_processor_reset_fairRR(
       if (rnti == NOT_A_RNTI)
         continue;
 
-      if (UE_info->active[UE_id] != TRUE)
+      if (UE_info->active[UE_id] != true)
         continue;
 
       LOG_D(MAC, "Running preprocessor for UE %d (%x)\n", UE_id, rnti);
@@ -755,7 +755,7 @@ static void assign_rbs_required_fairRR(
 
   // clear rb allocations across all CC_id
   for (UE_id = 0; UE_id < MAX_MOBILES_PER_ENB; UE_id++) {
-    if (UE_info->active[UE_id] != TRUE)
+    if (UE_info->active[UE_id] != true)
       continue;
 
     pCCid = UE_PCCID(Mod_id, UE_id);
@@ -945,7 +945,7 @@ void dlsch_scheduler_pre_processor_fairRR (module_id_t   Mod_id,
     min_rb_unit[CC_id] = get_min_rb_unit(Mod_id, CC_id);
 
     for (i = 0; i < NUMBER_OF_UE_MAX; i++) {
-      if (UE_info->active[i] != TRUE)
+      if (UE_info->active[i] != true)
         continue;
 
       UE_id = i;
@@ -2241,7 +2241,7 @@ void ulsch_scheduler_pre_ue_select_fairRR(
 
   // UE round >0
   for ( UE_id = 0; UE_id < NUMBER_OF_UE_MAX; UE_id++ ) {
-    if (UE_info->active[UE_id] == FALSE)
+    if (UE_info->active[UE_id] == false)
       continue;
 
     rnti = UE_RNTI(module_idP,UE_id);
@@ -2251,7 +2251,7 @@ void ulsch_scheduler_pre_ue_select_fairRR(
 
     CC_id = UE_PCCID(module_idP,UE_id);
 
-    if (UE_info->UE_template[CC_id][UE_id].configured == FALSE)
+    if (UE_info->UE_template[CC_id][UE_id].configured == false)
       continue;
 
     if (UE_info->UE_sched_ctrl[UE_id].ul_failure_timer > 0
@@ -2401,7 +2401,7 @@ void ulsch_scheduler_pre_ue_select_fairRR(
   }
 
   for ( UE_id = 0; UE_id < NUMBER_OF_UE_MAX; UE_id++ ) {
-    if (UE_info->active[UE_id] == FALSE)
+    if (UE_info->active[UE_id] == false)
       continue;
 
     rnti = UE_RNTI(module_idP,UE_id);
@@ -2414,7 +2414,7 @@ void ulsch_scheduler_pre_ue_select_fairRR(
     if (UE_id > last_ulsch_ue_id[CC_id])
       continue;
 
-    if (UE_info->UE_template[CC_id][UE_id].configured == FALSE)
+    if (UE_info->UE_template[CC_id][UE_id].configured == false)
       continue;
 
     if (UE_info->UE_sched_ctrl[UE_id].ul_failure_timer > 0
diff --git a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c
index d53e0cadd3fa5db23506c815ef4c3bb32ed373c1..58abbd7a478010ea71fec429026637a9a0238577 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c
@@ -1989,7 +1989,7 @@ find_UE_id(module_id_t mod_idP,
     return -1;
 
   for (UE_id = 0; UE_id < MAX_MOBILES_PER_ENB; UE_id++) {
-    if (UE_info->active[UE_id] == TRUE) {
+    if (UE_info->active[UE_id] == true) {
       int CC_id = UE_PCCID(mod_idP, UE_id);
       if (CC_id>=0 && CC_id<NFAPI_CC_MAX && UE_info->UE_template[CC_id][UE_id].rnti == rntiP) {
         return UE_id;
@@ -2063,7 +2063,7 @@ UE_RNTI(module_id_t mod_idP,
 }
 
 //------------------------------------------------------------------------------
-boolean_t
+bool
 is_UE_active(module_id_t mod_idP,
              int ue_idP)
 //------------------------------------------------------------------------------
@@ -2187,20 +2187,20 @@ add_new_ue(module_id_t mod_idP,
         UE_info->num_UEs);
 
   for (i = 0; i < MAX_MOBILES_PER_ENB; i++) {
-    if (UE_info->active[i] == TRUE)
+    if (UE_info->active[i] == true)
       continue;
 
     UE_id = i;
     memset(&UE_info->UE_template[cc_idP][UE_id], 0, sizeof(UE_TEMPLATE));
     UE_info->UE_template[cc_idP][UE_id].rnti = rntiP;
-    UE_info->UE_template[cc_idP][UE_id].configured = FALSE;
+    UE_info->UE_template[cc_idP][UE_id].configured = false;
     UE_info->numactiveCCs[UE_id] = 1;
     UE_info->numactiveULCCs[UE_id] = 1;
     UE_info->pCC_id[UE_id] = cc_idP;
     UE_info->ordered_CCids[0][UE_id] = cc_idP;
     UE_info->ordered_ULCCids[0][UE_id] = cc_idP;
     UE_info->num_UEs++;
-    UE_info->active[UE_id] = TRUE;
+    UE_info->active[UE_id] = true;
     add_ue_list(&UE_info->list, UE_id);
     dump_ue_list(&UE_info->list);
     pp_impl_param_t* dl = &RC.mac[mod_idP]->pre_processor_dl;
@@ -2280,7 +2280,7 @@ rrc_mac_remove_ue(module_id_t mod_idP,
         UE_id,
         pCC_id,
         rntiP);
-  UE_info->active[UE_id] = FALSE;
+  UE_info->active[UE_id] = false;
   UE_info->num_UEs--;
 
   remove_ue_list(&UE_info->list, UE_id);
@@ -2366,22 +2366,6 @@ rrc_mac_remove_ue(module_id_t mod_idP,
   return 0;
 }
 
-//------------------------------------------------------------------------------
-/*
- * Returns the previous UE_id in the scheduling list in UL or DL
- */
-inline int prev(UE_list_t *listP, int nodeP) {
-  if (nodeP == listP->head)
-      return -1; /* there is no previous of the head */
-
-  for (int j = listP->head; j >= 0; j = listP->next[j])
-    if (listP->next[j] == nodeP)
-      return j;
-
-  LOG_E(MAC, "%s(): could not find previous to %d in UE_list\n", __func__, nodeP);
-  dump_ue_list(listP);
-  return -1;
-}
 
 // This has to be updated to include BSR information
 //------------------------------------------------------------------------------
@@ -3488,7 +3472,7 @@ has_ul_grant(module_id_t module_idP,
 }
 
 //------------------------------------------------------------------------------
-boolean_t
+bool
 CCE_allocation_infeasible(int module_idP,
                           int CC_idP,
                           int format_flag,
@@ -3501,7 +3485,7 @@ CCE_allocation_infeasible(int module_idP,
   nfapi_dl_config_request_pdu_t *dl_config_pdu = &DL_req->dl_config_pdu_list[DL_req->number_pdu];
   nfapi_hi_dci0_request_body_t *HI_DCI0_req    = &RC.mac[module_idP]->HI_DCI0_req[CC_idP][subframe].hi_dci0_request_body;
   nfapi_hi_dci0_request_pdu_t *hi_dci0_pdu     = &HI_DCI0_req->hi_dci0_pdu_list[HI_DCI0_req->number_of_dci + HI_DCI0_req->number_of_hi];
-  boolean_t res = TRUE;
+  bool res = true;
 
   if (format_flag != 2) { // DL DCI
     if (DL_req->number_pdu == MAX_NUM_DL_PDU) {
@@ -3517,7 +3501,7 @@ CCE_allocation_infeasible(int module_idP,
             subframe, format_flag, rnti, aggregation);
 
       if (allocate_CCEs(module_idP, CC_idP, 0, subframe, 0) != -1)
-        res = FALSE;
+        res = false;
 
       DL_req->number_pdu--;
     }
@@ -3532,7 +3516,7 @@ CCE_allocation_infeasible(int module_idP,
       HI_DCI0_req->number_of_dci++;
 
       if (allocate_CCEs(module_idP, CC_idP, 0, subframe, 0) != -1)
-        res = FALSE;
+        res = false;
 
       HI_DCI0_req->number_of_dci--;
     }
@@ -5029,7 +5013,7 @@ SR_indication(module_id_t mod_idP,
   if (UE_id != -1) {
     UE_scheduling_ctrl = &(UE_info->UE_sched_ctrl[UE_id]);
 
-    if ((UE_scheduling_ctrl->cdrx_configured == TRUE) &&
+    if ((UE_scheduling_ctrl->cdrx_configured == true) &&
         (UE_scheduling_ctrl->dci0_ongoing_timer > 0)  &&
         (UE_scheduling_ctrl->dci0_ongoing_timer < 8)) {
       LOG_D(MAC, "[eNB %d][SR %x] Frame %d subframeP %d Signaling SR for UE %d on CC_id %d.  \
@@ -5052,7 +5036,7 @@ SR_indication(module_id_t mod_idP,
       }
 
       UE_info->UE_template[cc_idP][UE_id].ul_SR = 1;
-      UE_info->UE_template[cc_idP][UE_id].ul_active = TRUE;
+      UE_info->UE_template[cc_idP][UE_id].ul_active = true;
       VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_SR_INDICATION, 1);
       VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_SR_INDICATION, 0);
     }
diff --git a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
index d4f486f76162e683fd5f2c327767eddbc4e769b6..f9218d85116670ada5b0f1dfcd32cb7aeb897e04 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
@@ -242,7 +242,7 @@ rx_sdu(const module_id_t enb_mod_idP,
       }
 
       /* CDRX UL HARQ timers */
-      if (UE_scheduling_control->cdrx_configured == TRUE) {
+      if (UE_scheduling_control->cdrx_configured == true) {
         /* Synchronous UL HARQ */
         UE_scheduling_control->ul_synchronous_harq_timer[CC_idP][harq_pid] = 5;
         /*
@@ -329,17 +329,7 @@ rx_sdu(const module_id_t enb_mod_idP,
       if (ra->msg3_round >= mac->common_channels[CC_idP].radioResourceConfigCommon->rach_ConfigCommon.maxHARQ_Msg3Tx - 1) {
 
         // Release RNTI of LTE PHY when RA does not succeed
-        UE_free_list_t *free_list = NULL;
-        pthread_mutex_lock(&lock_ue_freelist);
-        free_list = &mac->UE_free_list;
-        free_list->UE_free_ctrl[free_list->tail_freelist].rnti = current_rnti;
-        free_list->UE_free_ctrl[free_list->tail_freelist].removeContextFlg = 1;
-        free_list->UE_free_ctrl[free_list->tail_freelist].raFlag = 1;
-        free_list->num_UEs++;
-        mac->UE_release_req.ue_release_request_body.ue_release_request_TLVs_list[mac->UE_release_req.ue_release_request_body.number_of_TLVs].rnti = current_rnti;
-        mac->UE_release_req.ue_release_request_body.number_of_TLVs++;
-        free_list->tail_freelist = (free_list->tail_freelist + 1) % (NUMBER_OF_UE_MAX+1);
-        pthread_mutex_unlock(&lock_ue_freelist);
+	put_UE_in_freelist(enb_mod_idP, current_rnti, true);
 
         cancel_ra_proc(enb_mod_idP, CC_idP, frameP, current_rnti);
         nfapi_hi_dci0_request_t *hi_dci0_req = NULL;
@@ -1003,7 +993,7 @@ rx_sdu(const module_id_t enb_mod_idP,
 
   /* CDRX UL HARQ timers */
   if (UE_id != -1) {
-    if (UE_scheduling_control->cdrx_configured == TRUE) {
+    if (UE_scheduling_control->cdrx_configured == true) {
       /* Synchronous UL HARQ */
       UE_scheduling_control->ul_synchronous_harq_timer[CC_idP][harq_pid] = 5;
       /*
@@ -1447,7 +1437,7 @@ schedule_ulsch_rnti(module_id_t   module_idP,
       continue;
 
     // don't schedule if Msg5 is not received yet
-    if (UE_info->UE_template[CC_id][UE_id].configured == FALSE) {
+    if (UE_info->UE_template[CC_id][UE_id].configured == false) {
       LOG_D(MAC,
             "[eNB %d] frame %d, subframe %d, UE %d: not configured, skipping "
             "UE scheduling \n",
@@ -2033,7 +2023,7 @@ void schedule_ulsch_rnti_emtc(module_id_t   module_idP,
     }
 
     /* Don't schedule if Msg4 is not received yet */
-    if (UE_template->configured == FALSE) {
+    if (UE_template->configured == false) {
       LOG_D(MAC,"[eNB %d] frame %d subframe %d, UE %d: not configured, skipping UE scheduling \n",
             module_idP,
             frameP,
diff --git a/openair2/LAYER2/MAC/mac.h b/openair2/LAYER2/MAC/mac.h
index 6637d05a8afacc5f18e117058d36e0936f2f4b2a..1fd7182c6f9d5ab0b4affc4eb50a71cea2044ceb 100644
--- a/openair2/LAYER2/MAC/mac.h
+++ b/openair2/LAYER2/MAC/mac.h
@@ -811,9 +811,9 @@ typedef struct {
   /// TBS from last UL scheduling
   int TBS_UL[8];
   /// Flag to indicate UL has been scheduled at least once
-  boolean_t ul_active;
+  bool ul_active;
   /// Flag to indicate UE has been configured (ACK from RRCConnectionSetup received)
-  boolean_t configured;
+  bool configured;
 
   /// MCS from last scheduling
   uint8_t mcs[8];
@@ -1026,16 +1026,16 @@ typedef struct {
 
   /* C-DRX related timers */
   /* Note: only valid for FDD and LTE UE when this comment is written (11-01-19)*/
-  /// is TRUE if the cqi mask feature is activated by RRC configuration
-  boolean_t cqi_mask_boolean;
-  /// is TRUE if the following drx parameters are configured for UE
-  boolean_t cdrx_configured;
+  /// is true if the cqi mask feature is activated by RRC configuration
+  bool cqi_mask_boolean;
+  /// is true if the following drx parameters are configured for UE
+  bool cdrx_configured;
   /*
-   * if TRUE, the eNB has configured the CDRX locally, but is waiting for the UE to acknowledge
+   * if true, the eNB has configured the CDRX locally, but is waiting for the UE to acknowledge
    * the activation. This is needed, during the RRC configuration process, when the context is
    * configured on the eNB side, but not yet on the UE side...
    */
-  boolean_t cdrx_waiting_ack;
+  bool cdrx_waiting_ack;
   /*
    * Is set when a ULSCH scheduling is done and run until the first corresponding transmission is done (4 subframes).
    * When set, SR cannot be set for the UE. This allows OAI to avoid concidering a SR as uncompleted if the UE sends
@@ -1043,16 +1043,16 @@ typedef struct {
    * create a lost in timers synchronization.
    */
   uint8_t dci0_ongoing_timer;
-  /// is TRUE if the UE is in "Active Time", hence listening to PDCCH
-  boolean_t in_active_time;
+  /// is true if the UE is in "Active Time", hence listening to PDCCH
+  bool in_active_time;
   /// OnDurationTimer
   uint16_t  on_duration_timer;
   uint16_t  on_duration_timer_thres;
   /// drx-InactivityTimer
   uint16_t  drx_inactivity_timer;
   uint16_t  drx_inactivity_timer_thres;
-  /// is TRUE if UE is currently in short DRX cycle
-  boolean_t in_short_drx_cycle;
+  /// is true if UE is currently in short DRX cycle
+  bool in_short_drx_cycle;
   /// drxShortCycleTimer int (1..16) (number of short DRX cycles duration before long DRX cycles)
   uint8_t  drx_shortCycle_timer_value;
   /// shortDRX-Cycle (duration of one short DRX cycle)
@@ -1060,8 +1060,8 @@ typedef struct {
   /// DRX short cycle timer before switching to long DRX cycle = drx_shortCycle_timer_value * short_drx_cycle_duration
   uint16_t  drx_shortCycle_timer;
   uint16_t  drx_shortCycle_timer_thres;
-  /// is TRUE if UE is currently in long DRX cycle
-  boolean_t in_long_drx_cycle;
+  /// is true if UE is currently in long DRX cycle
+  bool in_long_drx_cycle;
   /// longDRX-CycleStartOffset (long DRX cycle timer)
   uint16_t  drx_longCycle_timer;
   uint16_t  drx_longCycle_timer_thres;
@@ -1183,7 +1183,7 @@ typedef struct {
   UE_sched_ctrl_t UE_sched_ctrl[MAX_MOBILES_PER_ENB];
   UE_list_t list;
   int num_UEs;
-  boolean_t active[MAX_MOBILES_PER_ENB];
+  bool active[MAX_MOBILES_PER_ENB];
 } UE_info_t;
 
 /*! \brief deleting control information*/
@@ -1191,18 +1191,10 @@ typedef struct {
   ///rnti of UE
   rnti_t rnti;
   ///remove UE context flag
-  boolean_t removeContextFlg;
+  bool removeContextFlg;
   ///remove RA flag
-  boolean_t raFlag;
+  bool raFlag;
 } UE_free_ctrl_t;
-/*! \brief REMOVE UE list used by eNB to order UEs/CC for deleting*/
-typedef struct {
-  /// deleting control info
-  UE_free_ctrl_t UE_free_ctrl[NUMBER_OF_UE_MAX+1];
-  int num_UEs;
-  int head_freelist; ///the head position of the delete list
-  int tail_freelist; ///the tail position of the delete list
-} UE_free_list_t;
 
 /**
  * describes contiguous RBs
@@ -1443,7 +1435,7 @@ typedef struct eNB_MAC_INST_s {
   /// processing time of eNB PCH scheduler
   time_stats_t schedule_pch;
 
-  UE_free_list_t UE_free_list;
+  UE_free_ctrl_t UE_free_ctrl[NUMBER_OF_UE_MAX+1];
   /// for scheduling selection
   SCHEDULER_MODES scheduler_mode;
   /// Default scheduler: Pre-processor implementation. Algorithms for UL/DL
diff --git a/openair2/LAYER2/MAC/mac_extern.h b/openair2/LAYER2/MAC/mac_extern.h
index 522dc2721ff0674ba4cb4d29a431a43f7f40458d..212422898be33c72f7cf149e5259ef5f12cad99d 100644
--- a/openair2/LAYER2/MAC/mac_extern.h
+++ b/openair2/LAYER2/MAC/mac_extern.h
@@ -71,7 +71,7 @@ extern rb_id_t mbms_rab_id;
 extern uint16_t pre_nb_rbs_required[2][MAX_NUM_CCs][NUMBER_OF_UE_MAX];
 extern uint8_t dlsch_ue_select_tbl_in_use;
 extern uint8_t new_dlsch_ue_select_tbl_in_use;
-extern boolean_t pre_scd_activeUE[NUMBER_OF_UE_MAX];
+extern bool pre_scd_activeUE[NUMBER_OF_UE_MAX];
 extern eNB_UE_STATS pre_scd_eNB_UE_stats[MAX_NUM_CCs][NUMBER_OF_UE_MAX];
 #endif
 
diff --git a/openair2/LAYER2/MAC/mac_proto.h b/openair2/LAYER2/MAC/mac_proto.h
index b92ce85608fa726952fad9574589ac1ef3dde6e1..889c727fdd5a98ca560e52ff01180e17720e5fb0 100644
--- a/openair2/LAYER2/MAC/mac_proto.h
+++ b/openair2/LAYER2/MAC/mac_proto.h
@@ -400,7 +400,7 @@ int find_RA_id(module_id_t mod_idP, int CC_idP, rnti_t rntiP);
 rnti_t UE_RNTI(module_id_t module_idP, int UE_id);
 int UE_PCCID(module_id_t module_idP, int UE_id);
 uint8_t find_active_UEs(module_id_t module_idP);
-boolean_t is_UE_active(module_id_t module_idP, int UE_id);
+bool is_UE_active(module_id_t module_idP, int UE_id);
 uint8_t get_aggregation(uint8_t bw_index, uint8_t cqi, uint8_t dci_fmt);
 
 int8_t find_active_UEs_with_traffic(module_id_t module_idP);
@@ -416,11 +416,11 @@ int get_nCCE_offset(int *CCE_table,
 
 int allocate_CCEs(int module_idP, int CC_idP, frame_t frameP, sub_frame_t subframeP, int test_only);
 
-boolean_t CCE_allocation_infeasible(int module_idP,
-                                    int CC_idP,
-                                    int common_flag,
-                                    int subframe,
-                                    int aggregation, int rnti);
+bool CCE_allocation_infeasible(int module_idP,
+                               int CC_idP,
+                               int common_flag,
+                               int subframe,
+                               int aggregation, int rnti);
 /* tries to allocate a CCE. If it succeeds, reserves NFAPI DCI and DLSCH config */
 int CCE_try_allocate_dlsch(int module_id,
                            int CC_id,
@@ -741,13 +741,12 @@ BSR_SHORT *get_bsr_short(module_id_t module_idP, uint8_t bsr_len);
 */
 BSR_LONG *get_bsr_long(module_id_t module_idP, uint8_t bsr_len);
 
-/*! \fn  boolean_t update_bsr(module_id_t module_idP, frame_t frameP,sub_frame_t subframeP)
+/*! \fn  bool update_bsr(module_id_t module_idP, frame_t frameP,sub_frame_t subframeP)
    \brief get the rlc stats and update the bsr level for each lcid
 \param[in] Mod_id instance of the UE
 \param[in] frame Frame index
 */
-boolean_t update_bsr(module_id_t module_idP, frame_t frameP,
-                     sub_frame_t subframeP, eNB_index_t eNB_index);
+bool update_bsr(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP, eNB_index_t eNB_index);
 
 /*! \fn  locate_BsrIndexByBufferSize (int *table, int size, int value)
    \brief locate the BSR level in the table as defined in 36.321. This function requires that he values in table to be monotonic, either increasing or decreasing. The returned value is not less than 0, nor greater than n-1, where n is the size of table.
diff --git a/openair2/LAYER2/MAC/pre_processor.c b/openair2/LAYER2/MAC/pre_processor.c
index bb969668d6b32bf3cfdd44e9f0809bfc220bc28a..db4d51a92f8efabb3e9b102ca053a9467a3ddb9f 100644
--- a/openair2/LAYER2/MAC/pre_processor.c
+++ b/openair2/LAYER2/MAC/pre_processor.c
@@ -638,7 +638,7 @@ dlsch_scheduler_pre_processor(module_id_t Mod_id,
       LOG_E(MAC, "UE %d has RNTI NOT_A_RNTI!\n", UE_id);
       continue;
     }
-    if (UE_info->active[UE_id] != TRUE) {
+    if (UE_info->active[UE_id] != true) {
       LOG_E(MAC, "UE %d RNTI %x is NOT active!\n", UE_id, rnti);
       continue;
     }
diff --git a/openair2/LAYER2/MAC/ue_procedures.c b/openair2/LAYER2/MAC/ue_procedures.c
index 926c44381cbefccd38c6a35a798c48d5dc8ac59b..d7796d1d40437c037ea218d9d4579bc5bb1f812d 100644
--- a/openair2/LAYER2/MAC/ue_procedures.c
+++ b/openair2/LAYER2/MAC/ue_procedures.c
@@ -2325,8 +2325,8 @@ ue_get_sdu(module_id_t module_idP, int CC_id, frame_t frameP,
   uint8_t bsr_len = 0, bsr_ce_len = 0, bsr_header_len = 0;
   uint8_t phr_header_len = 0, phr_ce_len = 0, phr_len = 0;
   uint8_t lcid = 0, lcid_rlc_pdu_count = 0;
-  boolean_t is_lcid_processed = FALSE;
-  boolean_t is_all_lcid_processed = FALSE;
+  bool is_lcid_processed = false;
+  bool is_all_lcid_processed = false;
   uint16_t sdu_lengths[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
   uint8_t sdu_lcids[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
   uint8_t payload_offset = 0, num_sdus = 0;
@@ -2444,11 +2444,11 @@ ue_get_sdu(module_id_t module_idP, int CC_id, frame_t frameP,
   // Check for DCCH first
   // TO DO: Multiplex in the order defined by the logical channel prioritization
   for (lcid = DCCH;
-       (lcid < MAX_NUM_LCID) && (is_all_lcid_processed == FALSE); lcid++) {
+       (lcid < MAX_NUM_LCID) && (is_all_lcid_processed == false); lcid++) {
     if (UE_mac_inst[module_idP].scheduling_info.LCID_status[lcid] ==
         LCID_NOT_EMPTY) {
       lcid_rlc_pdu_count = 0;
-      is_lcid_processed = FALSE;
+      is_lcid_processed = false;
       lcid_buffer_occupancy_old =
         mac_rlc_get_buffer_occupancy_ind(module_idP,
                                          UE_mac_inst[module_idP].
@@ -2536,8 +2536,8 @@ ue_get_sdu(module_id_t module_idP, int CC_id, frame_t frameP,
             //No more remaining TBS after this PDU
             //exit the function
             rlc_pdu_header_len_last = 1;
-            is_lcid_processed = TRUE;
-            is_all_lcid_processed = TRUE;
+            is_lcid_processed = true;
+            is_all_lcid_processed = true;
           } else {
             rlc_pdu_header_len_last =
               (sdu_lengths[num_sdus] > 128) ? 3 : 2;
@@ -2547,8 +2547,8 @@ ue_get_sdu(module_id_t module_idP, int CC_id, frame_t frameP,
                 (bsr_len + phr_len + total_rlc_pdu_header_len +
                  rlc_pdu_header_len_last + sdu_length_total)) {
               rlc_pdu_header_len_last = 1;
-              is_lcid_processed = TRUE;
-              is_all_lcid_processed = TRUE;
+              is_lcid_processed = true;
+              is_all_lcid_processed = true;
             }
           }
 
@@ -2559,7 +2559,7 @@ ue_get_sdu(module_id_t module_idP, int CC_id, frame_t frameP,
           lcid_rlc_pdu_count++;
         } else {
           /* avoid infinite loop ... */
-          is_lcid_processed = TRUE;
+          is_lcid_processed = true;
         }
 
         /* Get updated BO after multiplexing this PDU */
@@ -3164,7 +3164,7 @@ ue_scheduler(const module_id_t module_idP,
   }
 
   //Check whether Regular BSR is triggered
-  if (update_bsr(module_idP, txFrameP, txSubframeP, eNB_indexP) == TRUE) {
+  if (update_bsr(module_idP, txFrameP, txSubframeP, eNB_indexP) == true) {
     // call SR procedure to generate pending SR and BSR for next PUCCH/PUSCH TxOp.  This should implement the procedures
     // outlined in Sections 5.4.4 an 5.4.5 of 36.321
     UE_mac_inst[module_idP].scheduling_info.SR_pending = 1;
@@ -3251,11 +3251,11 @@ ue_scheduler(const module_id_t module_idP,
 // to be improved
 
 
-boolean_t
+bool
 update_bsr(module_id_t module_idP, frame_t frameP,
            sub_frame_t subframeP, eNB_index_t eNB_index) {
   mac_rlc_status_resp_t rlc_status;
-  boolean_t bsr_regular_triggered = FALSE;
+  bool bsr_regular_triggered = false;
   uint8_t lcid;
   uint8_t lcgid;
   uint8_t num_lcid_with_data = 0; // for LCID with data only if LCGID is defined
@@ -3352,7 +3352,7 @@ update_bsr(module_id_t module_idP, frame_t frameP,
           (lcgid_buffer_remain
            [UE_mac_inst[module_idP].scheduling_info.LCGID[lcid]] ==
            0)) {
-        bsr_regular_triggered = TRUE;
+        bsr_regular_triggered = true;
         LOG_D(MAC,
               "[UE %d] PDCCH Tick : MAC BSR Triggered LCID%d LCGID%d data become available at frame %d subframe %d\n",
               module_idP, lcid,
@@ -3364,7 +3364,7 @@ update_bsr(module_id_t module_idP, frame_t frameP,
 
     // Trigger Regular BSR if ReTxBSR Timer has expired and UE has data for transmission
     if (UE_mac_inst[module_idP].scheduling_info.retxBSR_SF == 0) {
-      bsr_regular_triggered = TRUE;
+      bsr_regular_triggered = true;
 
       if ((UE_mac_inst[module_idP].BSR_reporting_active &
            BSR_TRIGGER_REGULAR) == 0) {
diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_compute_tbs_common.c b/openair2/LAYER2/NR_MAC_COMMON/nr_compute_tbs_common.c
index c33946fa5ac781a95c795e122cb498d765de373b..1acf23197c73509102f5450adffefe45ccc5eece 100644
--- a/openair2/LAYER2/NR_MAC_COMMON/nr_compute_tbs_common.c
+++ b/openair2/LAYER2/NR_MAC_COMMON/nr_compute_tbs_common.c
@@ -49,16 +49,15 @@ uint32_t nr_compute_tbs(uint16_t Qm,
   uint16_t nbp_re, nb_re;
   uint32_t nr_tbs=0;
   uint32_t Ninfo, Np_info, C;
-  uint8_t n, scale;
+  uint8_t n;
 
   LOG_D(NR_MAC, "In %s: nb_symb_sch %d, nb_dmrs_prb %d, nb_rb %d, nb_rb_oh %d, tb_scaling %d Nl %d\n", __FUNCTION__, nb_symb_sch, nb_dmrs_prb, nb_rb, nb_rb_oh, tb_scaling, Nl);
 
   nbp_re = NR_NB_SC_PER_RB * nb_symb_sch - nb_dmrs_prb - nb_rb_oh;
   nb_re = min(156, nbp_re) * nb_rb;
-  scale = (R>1024)?11:10;
   // Intermediate number of information bits
-  Ninfo = ((nb_re * R * Qm * Nl)>>scale)>>tb_scaling;
-
+  // R is tabulated as 10 times the actual code rate
+  Ninfo = ((nb_re * R * Qm * Nl / 10)>>10)>>tb_scaling;
 
   if (Ninfo <=3824) {
     n = max(3, floor(log2(Ninfo)) - 6);
@@ -73,7 +72,7 @@ uint32_t nr_compute_tbs(uint16_t Qm,
     n = log2(Ninfo-24)-5;
     Np_info = max(3840, (ROUNDIDIV((Ninfo-24),(1<<n)))<<n);
 
-    if (R <= 256) {
+    if (R <= 2560) {
         C = CEILIDIV((Np_info+24),3816);
         nr_tbs = (C<<3)*CEILIDIV((Np_info+24),(C<<3)) - 24;
     } else {
@@ -92,12 +91,10 @@ uint32_t nr_compute_tbs(uint16_t Qm,
 
 }
 
-
 //tbslbrm calculation according to 5.4.2.1 of 38.212
 uint32_t nr_compute_tbslbrm(uint16_t table,
 			    uint16_t nb_rb,
-		            uint8_t Nl)
-{
+		            uint8_t Nl) {
 
   uint16_t R, nb_re;
   uint16_t nb_rb_lbrm=0;
@@ -122,34 +119,31 @@ uint32_t nr_compute_tbslbrm(uint16_t table,
   Ninfo = (nb_re * R * Qm * Nl)>>10;
 
   if (Ninfo <=3824) {
-    	n = max(3, floor(log2(Ninfo)) - 6);
-        Np_info = max(24, (Ninfo>>n)<<n);
-        for (int i=0; i<INDEX_MAX_TBS_TABLE; i++) {
-        	if (Tbstable_nr[i] >= Np_info){
-        		nr_tbs = Tbstable_nr[i];
-        		break;
-        	}
-        }
+    n = max(3, floor(log2(Ninfo)) - 6);
+    Np_info = max(24, (Ninfo>>n)<<n);
+    for (int i=0; i<INDEX_MAX_TBS_TABLE; i++) {
+      if (Tbstable_nr[i] >= Np_info){
+        nr_tbs = Tbstable_nr[i];
+        break;
+      }
+    }
   }
   else {
-    	n = log2(Ninfo-24)-5;
-        Np_info = max(3840, (ROUNDIDIV((Ninfo-24),(1<<n)))<<n);
-
-        if (R <= 256) { 
-            C = CEILIDIV((Np_info+24),3816);
-            nr_tbs = (C<<3)*CEILIDIV((Np_info+24),(C<<3)) - 24;
-        }
-        else {
-            if (Np_info > 8424){
-                C = CEILIDIV((Np_info+24),8424);
-                nr_tbs = (C<<3)*CEILIDIV((Np_info+24),(C<<3)) - 24;
-            }
-            else {
-            	nr_tbs = ((CEILIDIV((Np_info+24),8))<<3) - 24;
-            }
-
-        }
+    n = log2(Ninfo-24)-5;
+    Np_info = max(3840, (ROUNDIDIV((Ninfo-24),(1<<n)))<<n);
 
+    if (R <= 256) {
+      C = CEILIDIV((Np_info+24),3816);
+      nr_tbs = (C<<3)*CEILIDIV((Np_info+24),(C<<3)) - 24;
+    }
+    else {
+      if (Np_info > 8424){
+        C = CEILIDIV((Np_info+24),8424);
+        nr_tbs = (C<<3)*CEILIDIV((Np_info+24),(C<<3)) - 24;
+      }
+      else
+        nr_tbs = ((CEILIDIV((Np_info+24),8))<<3) - 24;
+    }
   }
   return nr_tbs;
 }
diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h b/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h
index 9123afd3248bb6f750f2c43ffd66a00f9bab113b..58e435f3f15aecfefb749dd61e6455b5b95fd962 100644
--- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h
+++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h
@@ -39,6 +39,7 @@
 #include <stdbool.h>
 
 #include "NR_SubcarrierSpacing.h"
+#include "NR_CSI-ReportConfig.h"
 #include "openair1/SCHED_NR_UE/harq_nr.h"
 
 #define NR_SHORT_BSR_TABLE_SIZE 32
@@ -63,6 +64,7 @@
 #define CCCH_PAYLOAD_SIZE_MAX 512 
 #define RAR_PAYLOAD_SIZE_MAX  128
 #define MAX_BWP_SIZE          275
+#define MAX_CSI_REPORTCONFIG  48
 
 typedef enum frequency_range_e {
   FR1 = 0,
@@ -512,5 +514,37 @@ typedef struct Type0_PDCCH_CSS_config_s {
   bool active;
 } NR_Type0_PDCCH_CSS_config_t;
 
+typedef struct {
+  uint8_t nb_ssbri_cri;
+  uint8_t cri_ssbri_bitlen;
+  uint8_t rsrp_bitlen;
+  uint8_t diff_rsrp_bitlen;
+} L1_RSRP_bitlen_t;
+
+typedef struct{
+  uint8_t ri_restriction;
+  uint8_t cri_bitlen;
+  uint8_t ri_bitlen;
+  uint8_t li_bitlen[8];
+  uint8_t pmi_x1_bitlen[8];
+  uint8_t pmi_x2_bitlen[8];
+  uint8_t cqi_bitlen[8];
+} CSI_Meas_bitlen_t;
+
+typedef struct nr_csi_report {
+  NR_CSI_ReportConfig__reportQuantity_PR reportQuantity_type;
+  long periodicity;
+  uint16_t offset;
+  long ** SSB_Index_list;
+  long ** CSI_Index_list;
+//  uint8_t nb_of_nzp_csi_report;
+  uint8_t nb_of_csi_ssb_report;
+  L1_RSRP_bitlen_t CSI_report_bitlen;
+  CSI_Meas_bitlen_t csi_meas_bitlen;
+  int codebook_mode;
+  int N1;
+  int N2;
+} nr_csi_report_t;
+
 #endif /*__LAYER2_MAC_H__ */
 
diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
index 20002431b0ab39ddd3733e9621f850ba1e040794..e2a7efcaa0559f5f15b10e5703455b9e1b8662cb 100644
--- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
+++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
@@ -33,6 +33,7 @@
 #include "LAYER2/NR_MAC_gNB/mac_proto.h"
 #include "common/utils/nr/nr_common.h"
 #include <limits.h>
+#include <executables/softmodem-common.h>
 
 #define reserved 0xffff
 
@@ -1685,7 +1686,7 @@ int get_nr_prach_info_from_index(uint8_t index,
         }
         if ( (s_map>>subframe)&0x01 ) {
          *N_RA_slot = table_6_3_3_2_3_prachConfig_Index[index][6]; // Number of RACH slots within a subframe
-          if (mu == 1) {
+          if (mu == 1 && index >= 67) {
             if ( (*N_RA_slot <= 1) && (slot%2 == 0) )
               return 0; // no prach in even slots @ 30kHz for 1 prach per subframe 
           } 
@@ -2094,17 +2095,15 @@ void nr_get_tbs_dl(nfapi_nr_dl_tti_pdsch_pdu *pdsch_pdu,
   uint16_t N_RE_prime = NR_NB_SC_PER_RB*N_sh_symb - N_PRB_DMRS*dmrs_length - N_PRB_oh;
   LOG_D(MAC, "N_RE_prime %d for %d symbols %d DMRS per PRB and %d overhead\n", N_RE_prime, N_sh_symb, N_PRB_DMRS, N_PRB_oh);
 
-  uint16_t R;
   uint32_t TBS=0;
-  uint8_t table_idx, Qm;
 
   /*uint8_t mcs_table = config.pdsch_config.mcs_table.value;
   uint8_t ss_type = params_rel15.search_space_type;
   uint8_t dci_format = params_rel15.dci_format;
   get_table_idx(mcs_table, dci_format, rnti_type, ss_type);*/
-  table_idx = 0;
-  R = nr_get_code_rate_dl(Imcs, table_idx);
-  Qm = nr_get_Qm_dl(Imcs, table_idx);
+  uint8_t table_idx = 0;
+  uint16_t R = nr_get_code_rate_dl(Imcs, table_idx);
+  uint8_t Qm = nr_get_Qm_dl(Imcs, table_idx);
 
   TBS = nr_compute_tbs(Qm,
                        R,
@@ -2125,25 +2124,25 @@ void nr_get_tbs_dl(nfapi_nr_dl_tti_pdsch_pdu *pdsch_pdu,
   TBS, N_PRB_DMRS, N_sh_symb, N_PRB_oh, R, Qm, table_idx,N_RE_prime*pdsch_rel15->rbSize*pdsch_rel15->NrOfCodewords );
 }
 
+// the following tables contain 10 times the value reported in 214 (in line with SCF specification and to avoid fractional values)
 //Table 5.1.3.1-1 of 38.214
-uint16_t Table_51311[29][2] = {{2,120},{2,157},{2,193},{2,251},{2,308},{2,379},{2,449},{2,526},{2,602},{2,679},{4,340},{4,378},{4,434},{4,490},{4,553},{4,616},
-		{4,658},{6,438},{6,466},{6,517},{6,567},{6,616},{6,666},{6,719},{6,772},{6,822},{6,873}, {6,910}, {6,948}};
+uint16_t Table_51311[29][2] = {{2,1200},{2,1570},{2,1930},{2,2510},{2,3080},{2,3790},{2,4490},{2,5260},{2,6020},{2,6790},{4,3400},{4,3780},{4,4340},{4,4900},{4,5530},{4,6160},
+                               {4,6580},{6,4380},{6,4660},{6,5170},{6,5670},{6,6160},{6,6660},{6,7190},{6,7720},{6,8220},{6,8730}, {6,9100}, {6,9480}};
 
 //Table 5.1.3.1-2 of 38.214
 // Imcs values 20 and 26 have been multiplied by 2 to avoid the floating point
-uint16_t Table_51312[28][2] = {{2,120},{2,193},{2,308},{2,449},{2,602},{4,378},{4,434},{4,490},{4,553},{4,616},{4,658},{6,466},{6,517},{6,567},{6,616},{6,666},
-		{6,719},{6,772},{6,822},{6,873},{8,1365},{8,711},{8,754},{8,797},{8,841},{8,885},{8,1833},{8,948}};
+uint16_t Table_51312[28][2] = {{2,1200},{2,1930},{2,3080},{2,4490},{2,6020},{4,3780},{4,4340},{4,4900},{4,5530},{4,6160},{4,6580},{6,4660},{6,5170},{6,5670},{6,6160},{6,6660},
+                               {6,7190},{6,7720},{6,8220},{6,8730},{8,6825},{8,7110},{8,7540},{8,7970},{8,8410},{8,8850},{8,9165},{8,9480}};
 
 //Table 5.1.3.1-3 of 38.214
-uint16_t Table_51313[29][2] = {{2,30},{2,40},{2,50},{2,64},{2,78},{2,99},{2,120},{2,157},{2,193},{2,251},{2,308},{2,379},{2,449},{2,526},{2,602},{4,340},
-		{4,378},{4,434},{4,490},{4,553},{4,616},{6,438},{6,466},{6,517},{6,567},{6,616},{6,666}, {6,719}, {6,772}};
-
-uint16_t Table_61411[28][2] = {{2,120},{2,157},{2,193},{2,251},{2,308},{2,379},{2,449},{2,526},{2,602},{2,679},{4,340},{4,378},{4,434},{4,490},{4,553},{4,616},
-		{4,658},{6,466},{6,517},{6,567},{6,616},{6,666},{6,719},{6,772},{6,822},{6,873}, {6,910}, {6,948}};
+uint16_t Table_51313[29][2] = {{2,300},{2,400},{2,500},{2,640},{2,780},{2,990},{2,1200},{2,1570},{2,1930},{2,2510},{2,3080},{2,3790},{2,4490},{2,5260},{2,6020},{4,3400},
+                              {4,3780},{4,4340},{4,4900},{4,5530},{4,6160},{6,4380},{6,4660},{6,5170},{6,5670},{6,6160},{6,6660},{6,7190},{6,7720}};
 
-uint16_t Table_61412[28][2] = {{2,30},{2,40},{2,50},{2,64},{2,78},{2,99},{2,120},{2,157},{2,193},{2,251},{2,308},{2,379},{2,449},{2,526},{2,602},{2,679},
-		{4,378},{4,434},{4,490},{4,553},{4,616},{4,658},{4,699},{4,772},{6,567},{6,616},{6,666}, {6,772}};
+uint16_t Table_61411[28][2] = {{2,1200},{2,1570},{2,1930},{2,2510},{2,3080},{2,3790},{2,4490},{2,5260},{2,6020},{2,6790},{4,3400},{4,3780},{4,4340},{4,4900},{4,5530},{4,6160},
+                               {4,6580},{6,4660},{6,5170},{6,5670},{6,6160},{6,6660},{6,7190},{6,7720},{6,8220},{6,8730},{6,9100},{6,9480}};
 
+uint16_t Table_61412[28][2] = {{2,300},{2,400},{2,500},{2,640},{2,780},{2,990},{2,1200},{2,1570},{2,1930},{2,2510},{2,3080},{2,3790},{2,4490},{2,5260},{2,6020},{2,6790},
+                               {4,3780},{4,4340},{4,4900},{4,5530},{4,6160},{4,6580},{4,6990},{4,7720},{6,5670},{6,6160},{6,6660},{6,7720}};
 
 
 uint8_t nr_get_Qm_dl(uint8_t Imcs, uint8_t table_idx) {
@@ -2590,6 +2589,30 @@ uint8_t get_transformPrecoding(const NR_BWP_UplinkCommon_t *initialUplinkBWP,
   return -1;
 }
 
+uint8_t get_pusch_nb_antenna_ports(NR_PUSCH_Config_t *pusch_Config,
+                                   NR_SRS_Config_t *srs_config,
+                                   dci_field_t srs_resource_indicator) {
+
+  uint8_t n_antenna_port = 1;
+  if (get_softmodem_params()->phy_test == 1) {
+    // temporary hack to allow UL-MIMO in phy-test mode without SRS
+    n_antenna_port = *pusch_Config->maxRank;
+  }
+  else {
+    if(srs_config != NULL && srs_resource_indicator.nbits > 0) {
+      for(int rs = 0; rs < srs_config->srs_ResourceSetToAddModList->list.count; rs++) {
+        NR_SRS_ResourceSet_t *srs_resource_set = srs_config->srs_ResourceSetToAddModList->list.array[rs];
+        if(srs_resource_set->usage == NR_SRS_ResourceSet__usage_codebook) {
+          NR_SRS_Resource_t *srs_resource = srs_config->srs_ResourceToAddModList->list.array[srs_resource_indicator.val];
+          AssertFatal(srs_resource != NULL,"SRS resource indicated by DCI does not exist\n");
+          n_antenna_port = 1<<srs_resource->nrofSRS_Ports;
+        }
+      }
+    }
+  }
+  return n_antenna_port;
+}
+
 uint16_t nr_dci_size(const NR_BWP_DownlinkCommon_t *initialDownlinkBWP,
                      const NR_BWP_UplinkCommon_t *initialUplinkBWP,
                      const NR_CellGroupConfig_t *cg,
@@ -2598,23 +2621,23 @@ uint16_t nr_dci_size(const NR_BWP_DownlinkCommon_t *initialDownlinkBWP,
                      nr_rnti_type_t rnti_type,
                      uint16_t N_RB,
                      int bwp_id,
+                     NR_ControlResourceSetId_t coreset_id,
                      uint16_t cset0_bwp_size) {
 
   uint16_t size = 0;
   uint16_t numRBG = 0;
   long rbg_size_config;
   int num_entries = 0;
-  int pusch_antenna_ports = 1; // TODO hardcoded number of antenna ports for pusch
 
   const NR_BWP_DownlinkDedicated_t *bwpd = NULL;
   const NR_BWP_UplinkDedicated_t *ubwpd = NULL;
   const NR_BWP_DownlinkCommon_t *bwpc = NULL;
   const NR_BWP_UplinkCommon_t *ubwpc = NULL;
-  const NR_PDSCH_Config_t *pdsch_Config = NULL;
-  const NR_PUSCH_Config_t *pusch_Config = NULL;
-  const NR_PUCCH_Config_t *pucch_Config = NULL;
-  const NR_PDCCH_Config_t *pdcch_Config = NULL;
-  const NR_SRS_Config_t *srs_config = NULL;
+  NR_PDSCH_Config_t *pdsch_Config = NULL;
+  NR_PUSCH_Config_t *pusch_Config = NULL;
+  NR_PUCCH_Config_t *pucch_Config = NULL;
+  NR_PDCCH_Config_t *pdcch_Config = NULL;
+  NR_SRS_Config_t *srs_config = NULL;
   if(bwp_id > 0) {
     AssertFatal(cg!=NULL,"Cellgroup is null and bwp_id!=0");
     bwpd=cg->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[bwp_id-1]->bwp_Dedicated;
@@ -2648,7 +2671,7 @@ uint16_t nr_dci_size(const NR_BWP_DownlinkCommon_t *initialDownlinkBWP,
       /// fixed: Format identifier 1, Hop flag 1, MCS 5, NDI 1, RV 2, HARQ PID 4, PUSCH TPC 2 Time Domain assgnmt 4 --20
       size += 20;
       size += (uint8_t)ceil( log2( (N_RB*(N_RB+1))>>1 ) ); // Freq domain assignment -- hopping scenario to be updated
-      int dci_10_size = nr_dci_size(initialDownlinkBWP,initialUplinkBWP,cg,dci_pdu,NR_DL_DCI_FORMAT_1_0, rnti_type, N_RB, bwp_id, cset0_bwp_size);
+      int dci_10_size = nr_dci_size(initialDownlinkBWP,initialUplinkBWP,cg,dci_pdu,NR_DL_DCI_FORMAT_1_0, rnti_type, N_RB, bwp_id, coreset_id, cset0_bwp_size);
       AssertFatal(dci_10_size >= size, "NR_UL_DCI_FORMAT_0_0 size is bigger than NR_DL_DCI_FORMAT_1_0! 3GPP TS 38.212 Section 7.3.1.0: DCI size alignment is not fully implemented");
       size += dci_10_size - size; // Padding to match 1_0 size
       // UL/SUL indicator assumed to be 0
@@ -2773,6 +2796,9 @@ uint16_t nr_dci_size(const NR_BWP_DownlinkCommon_t *initialDownlinkBWP,
       LOG_D(NR_MAC,"dci_pdu->srs_resource_indicator.nbits %d\n",dci_pdu->srs_resource_indicator.nbits);
       // Precoding info and number of layers
       long transformPrecoder = get_transformPrecoding(initialUplinkBWP, pusch_Config, ubwpd, (uint8_t*)&format, rnti_type, 0);
+       
+      uint8_t pusch_antenna_ports = get_pusch_nb_antenna_ports(pusch_Config, srs_config, dci_pdu->srs_resource_indicator);
+	   
       dci_pdu->precoding_information.nbits=0;
       if (pusch_Config && 
           pusch_Config->txConfig != NULL){
@@ -2992,10 +3018,15 @@ uint16_t nr_dci_size(const NR_BWP_DownlinkCommon_t *initialDownlinkBWP,
       size += dci_pdu->antenna_ports.nbits;
       LOG_D(NR_MAC,"dci_pdu->antenna_ports.nbits %d\n",dci_pdu->antenna_ports.nbits);
       // Tx Config Indication
-      long *isTciEnable = pdcch_Config->controlResourceSetToAddModList->list.array[0]->tci_PresentInDCI;
-      if (isTciEnable != NULL) {
-        dci_pdu->transmission_configuration_indication.nbits = 3;
-        size += dci_pdu->transmission_configuration_indication.nbits;
+      for (int i = 0; i < pdcch_Config->controlResourceSetToAddModList->list.count; i++) {
+        if (pdcch_Config->controlResourceSetToAddModList->list.array[i]->controlResourceSetId == coreset_id) {
+          long *isTciEnable = pdcch_Config->controlResourceSetToAddModList->list.array[i]->tci_PresentInDCI;
+          if (isTciEnable != NULL) {
+            dci_pdu->transmission_configuration_indication.nbits = 3;
+            size += dci_pdu->transmission_configuration_indication.nbits;
+          }
+          break;
+        }
       }
       // SRS request
       if (cg->spCellConfig->spCellConfigDedicated->supplementaryUplink==NULL)
@@ -3467,6 +3498,22 @@ void csi_period_offset(NR_CSI_ReportConfig_t *csirep,
   }
 }
 
+uint32_t get_Y(NR_SearchSpace_t *ss, int slot, rnti_t rnti) {
+
+  if(ss->searchSpaceType->present == NR_SearchSpace__searchSpaceType_PR_common)
+    return 0;
+
+  const int cid = *ss->controlResourceSetId%3;
+  const uint32_t A[3] = {39827, 39829, 39839};
+  const uint32_t D = 65537;
+  uint32_t Y;
+
+  Y = (A[cid] * rnti) % D;
+  for (int s = 0; s < slot; s++)
+    Y = (A[cid] * Y) % D;
+
+  return Y;
+}
 
 void get_type0_PDCCH_CSS_config_parameters(NR_Type0_PDCCH_CSS_config_t *type0_PDCCH_CSS_config,
                                            frame_t frameP,
@@ -3907,25 +3954,17 @@ void fill_searchSpaceZero(NR_SearchSpace_t *ss0, NR_Type0_PDCCH_CSS_config_t *ty
   if(ss0->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0 == NULL)
     ss0->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0 = calloc(1,sizeof(*ss0->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0));
 
-  uint32_t duration,periodicity,offset;
-  uint16_t symbols,max_agg;
-
   AssertFatal(type0_PDCCH_CSS_config!=NULL,"No type0 CSS configuration\n");
 
-  max_agg = (type0_PDCCH_CSS_config->num_symbols*type0_PDCCH_CSS_config->num_rbs)/6;
-
-  symbols = (1-(1<<type0_PDCCH_CSS_config->num_symbols))<<type0_PDCCH_CSS_config->first_symbol_index;
-  duration = type0_PDCCH_CSS_config->search_space_duration;
-  periodicity = type0_PDCCH_CSS_config->search_space_frame_period;
-  if (type0_PDCCH_CSS_config->type0_pdcch_ss_mux_pattern == 1)
-    offset = type0_PDCCH_CSS_config->n_0;
-  else
-    offset = type0_PDCCH_CSS_config->n_c;
+  const uint32_t periodicity = type0_PDCCH_CSS_config->search_space_frame_period;
+  const uint32_t offset = type0_PDCCH_CSS_config->type0_pdcch_ss_mux_pattern == 1
+      ? type0_PDCCH_CSS_config->n_0 : type0_PDCCH_CSS_config->n_c;
 
   ss0->searchSpaceId = 0;
   *ss0->controlResourceSetId = 0;
   ss0->monitoringSlotPeriodicityAndOffset = calloc(1,sizeof(*ss0->monitoringSlotPeriodicityAndOffset));
   set_monitoring_periodicity_offset(ss0,periodicity,offset);
+  const uint32_t duration = type0_PDCCH_CSS_config->search_space_duration;
   if (duration==1)
     ss0->duration = NULL;
   else{
@@ -3933,6 +3972,7 @@ void fill_searchSpaceZero(NR_SearchSpace_t *ss0, NR_Type0_PDCCH_CSS_config_t *ty
     *ss0->duration = duration;
   }
 
+  const uint16_t symbols = SL_to_bitmap(type0_PDCCH_CSS_config->first_symbol_index, type0_PDCCH_CSS_config->num_symbols);
   ss0->monitoringSymbolsWithinSlot->size = 2;
   ss0->monitoringSymbolsWithinSlot->bits_unused = 2;
   ss0->monitoringSymbolsWithinSlot->buf[1] = 0;
@@ -3942,6 +3982,7 @@ void fill_searchSpaceZero(NR_SearchSpace_t *ss0, NR_Type0_PDCCH_CSS_config_t *ty
     ss0->monitoringSymbolsWithinSlot->buf[0] |= ((symbols>>i)&0x01)<<(7-i);
   }
 
+  const uint16_t max_agg = (type0_PDCCH_CSS_config->num_symbols*type0_PDCCH_CSS_config->num_rbs)/6;
   // max values are set according to TS38.213 Section 10.1 Table 10.1-1
   ss0->nrofCandidates->aggregationLevel1 = NR_SearchSpace__nrofCandidates__aggregationLevel1_n0;
   ss0->nrofCandidates->aggregationLevel2 = NR_SearchSpace__nrofCandidates__aggregationLevel2_n0;
@@ -4087,6 +4128,25 @@ uint16_t compute_pucch_prb_size(uint8_t format,
   }
 }
 
+int get_bw_tbslbrm(NR_BWP_t *genericParameters,
+                   NR_CellGroupConfig_t *cg) {
+
+  int bw = 0;
+  if (cg && cg->spCellConfig && cg->spCellConfig->spCellConfigDedicated &&
+      cg->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList) {
+    struct NR_ServingCellConfig__downlinkBWP_ToAddModList *BWP_list = cg->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList;
+    for (int i=0; i<BWP_list->list.count; i++) {
+      genericParameters = &BWP_list->list.array[i]->bwp_Common->genericParameters;
+      int curr_bw = NRRIV2BW(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);
+      if (curr_bw > bw)
+        bw = curr_bw;
+    }
+  }
+  else
+    bw = NRRIV2BW(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);
+  return bw;
+}
+
 /* extract UL PTRS values from RRC and validate it based upon 38.214 6.2.3 */
 bool set_ul_ptrs_values(NR_PTRS_UplinkConfig_t *ul_ptrs_config,
                         uint16_t rbSize,uint8_t mcsIndex, uint8_t mcsTable,
@@ -4161,3 +4221,521 @@ bool set_ul_ptrs_values(NR_PTRS_UplinkConfig_t *ul_ptrs_config,
   }
   return valid;
 }
+
+//! Calculating number of bits set
+uint8_t number_of_bits_set(uint8_t buf) {
+  uint8_t nb_of_bits_set = 0;
+  uint8_t mask = 0xff;
+  uint8_t index = 0;
+
+  for (index=7; (buf & mask) && (index>=0)  ; index--){
+    if (buf & (1<<index))
+      nb_of_bits_set++;
+
+    mask>>=1;
+  }
+  return nb_of_bits_set;
+}
+
+void compute_rsrp_bitlen(struct NR_CSI_ReportConfig *csi_reportconfig,
+                         uint8_t nb_resources,
+                         nr_csi_report_t *csi_report) {
+
+  if (NR_CSI_ReportConfig__groupBasedBeamReporting_PR_disabled == csi_reportconfig->groupBasedBeamReporting.present) {
+    if (NULL != csi_reportconfig->groupBasedBeamReporting.choice.disabled->nrofReportedRS)
+      csi_report->CSI_report_bitlen.nb_ssbri_cri = *(csi_reportconfig->groupBasedBeamReporting.choice.disabled->nrofReportedRS)+1;
+    else
+      /*! From Spec 38.331
+       * nrofReportedRS
+       * The number (N) of measured RS resources to be reported per report setting in a non-group-based report. N <= N_max, where N_max is either 2 or 4 depending on UE
+       * capability. FFS: The signaling mechanism for the gNB to select a subset of N beams for the UE to measure and report.
+       * When the field is absent the UE applies the value 1
+       */
+      csi_report->CSI_report_bitlen.nb_ssbri_cri= 1;
+  } else
+    csi_report->CSI_report_bitlen.nb_ssbri_cri= 2;
+
+  if (nb_resources) {
+    csi_report->CSI_report_bitlen.cri_ssbri_bitlen =ceil(log2 (nb_resources));
+    csi_report->CSI_report_bitlen.rsrp_bitlen = 7; //From spec 38.212 Table 6.3.1.1.2-6: CRI, SSBRI, and RSRP
+    csi_report->CSI_report_bitlen.diff_rsrp_bitlen =4; //From spec 38.212 Table 6.3.1.1.2-6: CRI, SSBRI, and RSRP
+  } else {
+    csi_report->CSI_report_bitlen.cri_ssbri_bitlen =0;
+    csi_report->CSI_report_bitlen.rsrp_bitlen = 0;
+    csi_report->CSI_report_bitlen.diff_rsrp_bitlen =0;
+  }
+}
+
+uint8_t compute_ri_bitlen(struct NR_CSI_ReportConfig *csi_reportconfig,
+                          nr_csi_report_t *csi_report) {
+
+  struct NR_CodebookConfig *codebookConfig = csi_reportconfig->codebookConfig;
+  uint8_t nb_allowed_ri, ri_bitlen;
+  uint8_t ri_restriction = 0;
+
+  if (codebookConfig == NULL) {
+    csi_report->csi_meas_bitlen.ri_bitlen=0;
+    return ri_restriction;
+  }
+
+  // codebook type1 single panel
+  if (NR_CodebookConfig__codebookType__type1__subType_PR_typeI_SinglePanel==codebookConfig->codebookType.choice.type1->subType.present){
+    struct NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel *type1single = codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel;
+    if (type1single->nrOfAntennaPorts.present == NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts_PR_two){
+
+      ri_restriction = csi_reportconfig->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->typeI_SinglePanel_ri_Restriction.buf[0];
+
+      nb_allowed_ri = number_of_bits_set(ri_restriction);
+      ri_bitlen = ceil(log2(nb_allowed_ri));
+
+      ri_bitlen = ri_bitlen<1?ri_bitlen:1; //from the spec 38.212 and table  6.3.1.1.2-3: RI, LI, CQI, and CRI of codebookType=typeI-SinglePanel
+      csi_report->csi_meas_bitlen.ri_bitlen=ri_bitlen;
+    }
+    if (type1single->nrOfAntennaPorts.present == NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts_PR_moreThanTwo){
+      if (type1single->nrOfAntennaPorts.choice.moreThanTwo->n1_n2.present ==
+          NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_two_one_TypeI_SinglePanel_Restriction) {
+        // 4 ports
+
+        ri_restriction = csi_reportconfig->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->typeI_SinglePanel_ri_Restriction.buf[0];
+
+        nb_allowed_ri = number_of_bits_set(ri_restriction);
+        ri_bitlen = ceil(log2(nb_allowed_ri));
+
+        ri_bitlen = ri_bitlen<2?ri_bitlen:2; //from the spec 38.212 and table  6.3.1.1.2-3: RI, LI, CQI, and CRI of codebookType=typeI-SinglePanel
+        csi_report->csi_meas_bitlen.ri_bitlen=ri_bitlen;
+      }
+      else {
+        // more than 4 ports
+
+        ri_restriction = csi_reportconfig->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->typeI_SinglePanel_ri_Restriction.buf[0];
+
+        nb_allowed_ri = number_of_bits_set(ri_restriction);
+        ri_bitlen = ceil(log2(nb_allowed_ri));
+
+        csi_report->csi_meas_bitlen.ri_bitlen=ri_bitlen;
+      }
+    }
+    return ri_restriction;
+  }
+  else
+    AssertFatal(1==0,"Other configurations not yet implemented\n");
+  return -1;
+}
+
+void compute_li_bitlen(struct NR_CSI_ReportConfig *csi_reportconfig,
+                       uint8_t ri_restriction,
+                       nr_csi_report_t *csi_report) {
+
+  struct NR_CodebookConfig *codebookConfig = csi_reportconfig->codebookConfig;
+  for(int i=0; i<8; i++) {
+    if (codebookConfig == NULL || ((ri_restriction>>i)&0x01) == 0)
+      csi_report->csi_meas_bitlen.li_bitlen[i]=0;
+    else {
+      // codebook type1 single panel
+      if (NR_CodebookConfig__codebookType__type1__subType_PR_typeI_SinglePanel==codebookConfig->codebookType.choice.type1->subType.present)
+        csi_report->csi_meas_bitlen.li_bitlen[i]=ceil(log2(i+1))<2?ceil(log2(i+1)):2;
+      else
+        AssertFatal(1==0,"Other configurations not yet implemented\n");
+    }
+  }
+}
+
+void get_n1n2_o1o2_singlepanel(int *n1, int *n2, int *o1, int *o2,
+                               struct NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo *morethantwo) {
+
+  // Table 5.2.2.2.1-2 in 38.214 for supported configurations
+  switch(morethantwo->n1_n2.present){
+    case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_two_one_TypeI_SinglePanel_Restriction):
+      *n1 = 2;
+      *n2 = 1;
+      *o1 = 4;
+      *o2 = 1;
+      break;
+    case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_two_two_TypeI_SinglePanel_Restriction):
+      *n1 = 2;
+      *n2 = 2;
+      *o1 = 4;
+      *o2 = 4;
+      break;
+    case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_four_one_TypeI_SinglePanel_Restriction):
+      *n1 = 4;
+      *n2 = 1;
+      *o1 = 4;
+      *o2 = 1;
+      break;
+    case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_three_two_TypeI_SinglePanel_Restriction):
+      *n1 = 3;
+      *n2 = 2;
+      *o1 = 4;
+      *o2 = 4;
+      break;
+    case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_six_one_TypeI_SinglePanel_Restriction):
+      *n1 = 6;
+      *n2 = 1;
+      *o1 = 4;
+      *o2 = 1;
+      break;
+    case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_four_two_TypeI_SinglePanel_Restriction):
+      *n1 = 4;
+      *n2 = 2;
+      *o1 = 4;
+      *o2 = 4;
+      break;
+    case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_eight_one_TypeI_SinglePanel_Restriction):
+      *n1 = 8;
+      *n2 = 1;
+      *o1 = 4;
+      *o2 = 1;
+      break;
+    case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_four_three_TypeI_SinglePanel_Restriction):
+      *n1 = 4;
+      *n2 = 3;
+      *o1 = 4;
+      *o2 = 4;
+      break;
+    case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_six_two_TypeI_SinglePanel_Restriction):
+      *n1 = 4;
+      *n2 = 2;
+      *o1 = 4;
+      *o2 = 4;
+      break;
+    case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_twelve_one_TypeI_SinglePanel_Restriction):
+      *n1 = 12;
+      *n2 = 1;
+      *o1 = 4;
+      *o2 = 1;
+      break;
+    case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_four_four_TypeI_SinglePanel_Restriction):
+      *n1 = 4;
+      *n2 = 4;
+      *o1 = 4;
+      *o2 = 4;
+      break;
+    case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_eight_two_TypeI_SinglePanel_Restriction):
+      *n1 = 8;
+      *n2 = 2;
+      *o1 = 4;
+      *o2 = 4;
+      break;
+    case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_sixteen_one_TypeI_SinglePanel_Restriction):
+      *n1 = 16;
+      *n2 = 1;
+      *o1 = 4;
+      *o2 = 1;
+      break;
+    default:
+      AssertFatal(1==0,"Not supported configuration for n1_n2 in codebook configuration");
+  }
+}
+
+void get_x1x2_bitlen_singlepanel(int n1, int n2, int o1, int o2,
+                                 int *x1, int *x2, int rank, int codebook_mode) {
+
+  // Table 6.3.1.1.2-1 in 38.212
+  switch(rank){
+    case 1:
+      if(n2>1) {
+        if (codebook_mode == 1) {
+          *x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2));
+          *x2 = 2;
+        }
+        else {
+          *x1 = ceil(log2(n1*o1/2)) + ceil(log2(n2*o2/2));
+          *x2 = 4;
+        }
+      }
+      else{
+        if (codebook_mode == 1) {
+          *x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2));
+          *x2 = 2;
+        }
+        else {
+          *x1 = ceil(log2(n1*o1/2));
+          *x2 = 4;
+        }
+      }
+      break;
+    case 2:
+      if(n1*n2 == 2) {
+        if (codebook_mode == 1) {
+          *x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2));
+          *x2 = 1;
+        }
+        else {
+          *x1 = ceil(log2(n1*o1/2));
+          *x2 = 3;
+        }
+        *x1 += 1;
+      }
+      else {
+        if(n2>1) {
+          if (codebook_mode == 1) {
+            *x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2));
+            *x2 = 3;
+          }
+          else {
+            *x1 = ceil(log2(n1*o1/2)) + ceil(log2(n2*o2/2));
+            *x2 = 3;
+          }
+        }
+        else{
+          if (codebook_mode == 1) {
+            *x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2));
+            *x2 = 1;
+          }
+          else {
+            *x1 = ceil(log2(n1*o1/2));
+            *x2 = 3;
+          }
+        }
+        *x1 += 2;
+      }
+      break;
+    case 3:
+    case 4:
+      if(n1*n2 == 2) {
+        *x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2));
+        *x2 = 1;
+      }
+      else {
+        if(n1*n2 >= 8) {
+          *x1 = ceil(log2(n1*o1/2)) + ceil(log2(n2*o2)) + 2;
+          *x2 = 1;
+        }
+        else {
+          *x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2)) + 2;
+          *x2 = 1;
+        }
+      }
+      break;
+    case 5:
+    case 6:
+      *x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2));
+      *x2 = 1;
+      break;
+    case 7:
+    case 8:
+      if(n1 == 4 && n2 == 1) {
+        *x1 = ceil(log2(n1*o1/2)) + ceil(log2(n2*o2));
+        *x2 = 1;
+      }
+      else {
+        if(n1 > 2 && n2 == 2) {
+          *x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2/2));
+          *x2 = 1;
+        }
+        else {
+          *x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2));
+          *x2 = 1;
+        }
+      }
+      break;
+    default:
+      AssertFatal(1==0,"Invalid rank in x1 x2 bit length computation\n");
+  }
+}
+
+
+void compute_pmi_bitlen(struct NR_CSI_ReportConfig *csi_reportconfig,
+                        uint8_t ri_restriction,
+                        nr_csi_report_t *csi_report) {
+
+  struct NR_CodebookConfig *codebookConfig = csi_reportconfig->codebookConfig;
+  for(int i=0; i<8; i++) {
+    csi_report->csi_meas_bitlen.pmi_x1_bitlen[i]=0;
+    csi_report->csi_meas_bitlen.pmi_x2_bitlen[i]=0;
+    if (codebookConfig == NULL || ((ri_restriction>>i)&0x01) == 0)
+      return;
+    else {
+      if(codebookConfig->codebookType.present == NR_CodebookConfig__codebookType_PR_type1) {
+        if(codebookConfig->codebookType.choice.type1->subType.present == NR_CodebookConfig__codebookType__type1__subType_PR_typeI_SinglePanel) {
+          if(codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.present ==
+             NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts_PR_two) {
+            csi_report->N1 = 1;
+            csi_report->N2 = 1;
+            if (i==0)
+              csi_report->csi_meas_bitlen.pmi_x2_bitlen[i]=2;
+            if (i==1)
+              csi_report->csi_meas_bitlen.pmi_x2_bitlen[i]=1;
+          }
+          else {  // more than two
+            int n1,n2,o1,o2,x1,x2;
+            get_n1n2_o1o2_singlepanel(&n1,&n2,&o1,&o2,codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.choice.moreThanTwo);
+            get_x1x2_bitlen_singlepanel(n1,n2,o1,o2,&x1,&x2,i+1,codebookConfig->codebookType.choice.type1->codebookMode);
+            csi_report->N1 = n1;
+            csi_report->N2 = n2;
+            csi_report->codebook_mode = codebookConfig->codebookType.choice.type1->codebookMode;
+            csi_report->csi_meas_bitlen.pmi_x1_bitlen[i]=x1;
+            csi_report->csi_meas_bitlen.pmi_x2_bitlen[i]=x2;
+          }
+        }
+        else
+          AssertFatal(1==0,"Type1 Multi-panel Codebook Config not yet implemented\n");
+      }
+      else
+        AssertFatal(1==0,"Type2 Codebook Config not yet implemented\n");
+    }
+  }
+}
+
+void compute_cqi_bitlen(struct NR_CSI_ReportConfig *csi_reportconfig,
+                        uint8_t ri_restriction,
+                        nr_csi_report_t *csi_report) {
+
+  struct NR_CodebookConfig *codebookConfig = csi_reportconfig->codebookConfig;
+  struct NR_CSI_ReportConfig__reportFreqConfiguration *freq_config = csi_reportconfig->reportFreqConfiguration;
+
+  if (*freq_config->cqi_FormatIndicator == NR_CSI_ReportConfig__reportFreqConfiguration__cqi_FormatIndicator_widebandCQI) {
+    for(int i=0; i<8; i++) {
+      if ((ri_restriction>>i)&0x01) {
+        csi_report->csi_meas_bitlen.cqi_bitlen[i] = 4;
+        if(codebookConfig != NULL) {
+          if (NR_CodebookConfig__codebookType__type1__subType_PR_typeI_SinglePanel == codebookConfig->codebookType.choice.type1->subType.present){
+            struct NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel *type1single = codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel;
+            if (type1single->nrOfAntennaPorts.present == NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts_PR_moreThanTwo) {
+              if (type1single->nrOfAntennaPorts.choice.moreThanTwo->n1_n2.present >
+                  NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_two_one_TypeI_SinglePanel_Restriction) {
+                // more than 4 antenna ports
+                if (i > 4)
+                  csi_report->csi_meas_bitlen.cqi_bitlen[i] += 4; // CQI for second TB
+              }
+            }
+          }
+        }
+      }
+      else
+        csi_report->csi_meas_bitlen.cqi_bitlen[i] = 0;
+    }
+  }
+  else
+    AssertFatal(1==0,"Sub-band CQI reporting not yet supported");
+}
+
+//!TODO : same function can be written to handle csi_resources
+void compute_csi_bitlen(NR_CSI_MeasConfig_t *csi_MeasConfig, nr_csi_report_t *csi_report_template) {
+  uint8_t csi_report_id = 0;
+  uint8_t nb_resources = 0;
+  NR_CSI_ReportConfig__reportQuantity_PR reportQuantity_type;
+  NR_CSI_ResourceConfigId_t csi_ResourceConfigId;
+  struct NR_CSI_ResourceConfig *csi_resourceconfig;
+
+  // for each CSI measurement report configuration (list of CSI-ReportConfig)
+  LOG_D(NR_MAC,"Searching %d csi_reports\n",csi_MeasConfig->csi_ReportConfigToAddModList->list.count);
+  for (csi_report_id=0; csi_report_id < csi_MeasConfig->csi_ReportConfigToAddModList->list.count; csi_report_id++){
+    struct NR_CSI_ReportConfig *csi_reportconfig = csi_MeasConfig->csi_ReportConfigToAddModList->list.array[csi_report_id];
+    // MAC structure for CSI measurement reports (per UE and per report)
+    nr_csi_report_t *csi_report = &csi_report_template[csi_report_id];
+    // csi-ResourceConfigId of a CSI-ResourceConfig included in the configuration
+    // (either CSI-RS or SSB)
+    csi_ResourceConfigId = csi_reportconfig->resourcesForChannelMeasurement;
+    // looking for CSI-ResourceConfig
+    int found_resource = 0;
+    int csi_resourceidx = 0;
+    while (found_resource == 0 && csi_resourceidx < csi_MeasConfig->csi_ResourceConfigToAddModList->list.count) {
+      csi_resourceconfig = csi_MeasConfig->csi_ResourceConfigToAddModList->list.array[csi_resourceidx];
+      if ( csi_resourceconfig->csi_ResourceConfigId == csi_ResourceConfigId)
+        found_resource = 1;
+      csi_resourceidx++;
+    }
+    AssertFatal(found_resource==1,"Not able to found any CSI-ResourceConfig with csi-ResourceConfigId %ld\n",
+                csi_ResourceConfigId);
+
+    long resourceType = csi_resourceconfig->resourceType;
+
+    reportQuantity_type = csi_reportconfig->reportQuantity.present;
+    csi_report->reportQuantity_type = reportQuantity_type;
+
+    // setting the CSI or SSB index list
+    if (NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP == csi_report->reportQuantity_type) {
+      for (int csi_idx = 0; csi_idx < csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.count; csi_idx++) {
+        if (csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.array[csi_idx]->csi_SSB_ResourceSetId ==
+            *(csi_resourceconfig->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList->list.array[0])){
+          //We can configure only one SSB resource set from spec 38.331 IE CSI-ResourceConfig
+          nb_resources=  csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.array[csi_idx]->csi_SSB_ResourceList.list.count;
+          csi_report->SSB_Index_list = csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.array[csi_idx]->csi_SSB_ResourceList.list.array;
+          csi_report->CSI_Index_list = NULL;
+          break;
+        }
+      }
+    }
+    else {
+      if (resourceType == NR_CSI_ResourceConfig__resourceType_periodic) {
+        AssertFatal(csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList != NULL,
+                    "Wrong settings! Report quantity requires CSI-RS but csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList is NULL\n");
+        for (int csi_idx = 0; csi_idx < csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.count; csi_idx++) {
+          if (csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.array[csi_idx]->nzp_CSI_ResourceSetId ==
+              *(csi_resourceconfig->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList->list.array[0])) {
+            //For periodic and semi-persistent CSI Resource Settings, the number of CSI-RS Resource Sets configured is limited to S=1 for spec 38.212
+            nb_resources = csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.array[csi_idx]->nzp_CSI_RS_Resources.list.count;
+            csi_report->CSI_Index_list = csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.array[csi_idx]->nzp_CSI_RS_Resources.list.array;
+            csi_report->SSB_Index_list = NULL;
+            break;
+          }
+        }
+      }
+      else AssertFatal(1==0,"Only periodic resource configuration currently supported\n");
+    }
+    LOG_D(NR_MAC,"nb_resources %d\n",nb_resources);
+    // computation of bit length depending on the report type
+    switch(reportQuantity_type){
+      case (NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP):
+        compute_rsrp_bitlen(csi_reportconfig, nb_resources, csi_report);
+        break;
+      case (NR_CSI_ReportConfig__reportQuantity_PR_cri_RSRP):
+        compute_rsrp_bitlen(csi_reportconfig, nb_resources, csi_report);
+        break;
+      case (NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_CQI):
+        csi_report->csi_meas_bitlen.cri_bitlen=ceil(log2(nb_resources));
+        csi_report->csi_meas_bitlen.ri_restriction = compute_ri_bitlen(csi_reportconfig, csi_report);
+        compute_cqi_bitlen(csi_reportconfig, csi_report->csi_meas_bitlen.ri_restriction, csi_report);
+        break;
+      case (NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_PMI_CQI):
+        csi_report->csi_meas_bitlen.cri_bitlen=ceil(log2(nb_resources));
+        csi_report->csi_meas_bitlen.ri_restriction = compute_ri_bitlen(csi_reportconfig, csi_report);
+        compute_cqi_bitlen(csi_reportconfig, csi_report->csi_meas_bitlen.ri_restriction, csi_report);
+        compute_pmi_bitlen(csi_reportconfig, csi_report->csi_meas_bitlen.ri_restriction, csi_report);
+        break;
+      case (NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_LI_PMI_CQI):
+        csi_report->csi_meas_bitlen.cri_bitlen=ceil(log2(nb_resources));
+        csi_report->csi_meas_bitlen.ri_restriction = compute_ri_bitlen(csi_reportconfig, csi_report);
+        compute_li_bitlen(csi_reportconfig, csi_report->csi_meas_bitlen.ri_restriction, csi_report);
+        compute_cqi_bitlen(csi_reportconfig, csi_report->csi_meas_bitlen.ri_restriction, csi_report);
+        compute_pmi_bitlen(csi_reportconfig, csi_report->csi_meas_bitlen.ri_restriction, csi_report);
+        break;
+      default:
+        AssertFatal(1==0,"Not yet supported CSI report quantity type");
+    }
+  }
+}
+
+uint16_t nr_get_csi_bitlen(nr_csi_report_t *csi_report_template, uint8_t csi_report_id) {
+
+  uint16_t csi_bitlen = 0;
+  uint16_t max_bitlen = 0;
+  L1_RSRP_bitlen_t *CSI_report_bitlen = NULL;
+  CSI_Meas_bitlen_t *csi_meas_bitlen = NULL;
+
+  if (csi_report_template[csi_report_id].reportQuantity_type == NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP ||
+      csi_report_template[csi_report_id].reportQuantity_type == NR_CSI_ReportConfig__reportQuantity_PR_cri_RSRP) {
+    CSI_report_bitlen = &(csi_report_template[csi_report_id].CSI_report_bitlen); // This might need to be moodif for Aperiodic CSI-RS measurements
+    csi_bitlen += ((CSI_report_bitlen->cri_ssbri_bitlen * CSI_report_bitlen->nb_ssbri_cri) +
+                   CSI_report_bitlen->rsrp_bitlen +(CSI_report_bitlen->diff_rsrp_bitlen *
+                                                    (CSI_report_bitlen->nb_ssbri_cri -1 )));
+  } else {
+    csi_meas_bitlen = &(csi_report_template[csi_report_id].csi_meas_bitlen); //This might need to be moodif for Aperiodic CSI-RS measurements
+    uint16_t temp_bitlen;
+    for (int i=0; i<8; i++) {
+      temp_bitlen = (csi_meas_bitlen->cri_bitlen+
+                     csi_meas_bitlen->ri_bitlen+
+                     csi_meas_bitlen->li_bitlen[i]+
+                     csi_meas_bitlen->cqi_bitlen[i]+
+                     csi_meas_bitlen->pmi_x1_bitlen[i]+
+                     csi_meas_bitlen->pmi_x2_bitlen[i]);
+      if(temp_bitlen>max_bitlen)
+        max_bitlen = temp_bitlen;
+    }
+    csi_bitlen += max_bitlen;
+  }
+
+  return csi_bitlen;
+}
\ No newline at end of file
diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h
index e8a3af249813d8a812a2ff8fba05eaa26fea6d1c..2b8d3c6652770bb5df056a1d3c77319f096d2b91 100644
--- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h
+++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h
@@ -37,6 +37,8 @@
 #include "nr_mac.h"
 #include "openair1/PHY/impl_defs_nr.h"
 
+uint32_t get_Y(NR_SearchSpace_t *ss, int slot, rnti_t rnti);
+
 uint64_t from_nrarfcn(int nr_bandP, uint8_t scs_index, uint32_t dl_nrarfcn);
 
 uint32_t to_nrarfcn(int nr_bandP, uint64_t dl_CarrierFreq, uint8_t scs_index, uint32_t bw);
@@ -55,6 +57,7 @@ uint16_t nr_dci_size(const NR_BWP_DownlinkCommon_t *initialDLBWP,
                      nr_rnti_type_t rnti_type,
                      uint16_t N_RB,
                      int bwp_id,
+                     NR_ControlResourceSetId_t coreset_id,
                      uint16_t cset0_bwp_size);
 
 void find_aggregation_candidates(uint8_t *aggregation_level,
@@ -102,7 +105,7 @@ uint8_t get_pusch_mcs_table(long *mcs_Table,
 uint8_t compute_nr_root_seq(NR_RACH_ConfigCommon_t *rach_config,
                             uint8_t nb_preambles,
                             uint8_t unpaired,
-			    frequency_range_t);
+                            frequency_range_t);
 
 int ul_ant_bits(NR_DMRS_UplinkConfig_t *NR_DMRS_UplinkConfig,long transformPrecoder);
 
@@ -120,8 +123,32 @@ int32_t get_l_prime(uint8_t duration_in_symbols, uint8_t mapping_type, pusch_dmr
 uint8_t get_L_ptrs(uint8_t mcs1, uint8_t mcs2, uint8_t mcs3, uint8_t I_mcs, uint8_t mcs_table);
 uint8_t get_K_ptrs(uint16_t nrb0, uint16_t nrb1, uint16_t N_RB);
 
+uint32_t nr_compute_tbs(uint16_t Qm,
+                        uint16_t R,
+			uint16_t nb_rb,
+			uint16_t nb_symb_sch,
+			uint16_t nb_dmrs_prb,
+                        uint16_t nb_rb_oh,
+                        uint8_t tb_scaling,
+			uint8_t Nl);
+
+/** \brief Computes Q based on I_MCS PDSCH and table_idx for downlink. Implements MCS Tables from 38.214. */
+uint8_t nr_get_Qm_dl(uint8_t Imcs, uint8_t table_idx);
+uint32_t nr_get_code_rate_dl(uint8_t Imcs, uint8_t table_idx);
+
+/** \brief Computes Q based on I_MCS PDSCH and table_idx for uplink. Implements MCS Tables from 38.214. */
+uint8_t nr_get_Qm_ul(uint8_t Imcs, uint8_t table_idx);
+uint32_t nr_get_code_rate_ul(uint8_t Imcs, uint8_t table_idx);
+
 uint16_t get_nr_srs_offset(NR_SRS_PeriodicityAndOffset_t periodicityAndOffset);
 
+int get_bw_tbslbrm(NR_BWP_t *genericParameters,
+                   NR_CellGroupConfig_t *cg);
+
+uint32_t nr_compute_tbslbrm(uint16_t table,
+			    uint16_t nb_rb,
+		            uint8_t Nl);
+
 void get_type0_PDCCH_CSS_config_parameters(NR_Type0_PDCCH_CSS_config_t *type0_PDCCH_CSS_config,
                                            frame_t frameP,
                                            NR_MIB_t *mib,
@@ -148,6 +175,10 @@ void get_info_from_tda_tables(int default_abc,
 void fill_coresetZero(NR_ControlResourceSet_t *coreset0, NR_Type0_PDCCH_CSS_config_t *type0_PDCCH_CSS_config);
 void fill_searchSpaceZero(NR_SearchSpace_t *ss0, NR_Type0_PDCCH_CSS_config_t *type0_PDCCH_CSS_config);
 
+uint8_t get_pusch_nb_antenna_ports(NR_PUSCH_Config_t *pusch_Config,
+                                   NR_SRS_Config_t *srs_config,
+                                   dci_field_t srs_resource_indicator);
+
 uint16_t compute_pucch_prb_size(uint8_t format,
                                 uint8_t nr_prbs,
                                 uint16_t O_tot,
@@ -203,4 +234,36 @@ void nr_mac_gNB_rrc_ul_failure_reset(const module_id_t Mod_instP,
                                      const frame_t frameP,
                                      const sub_frame_t subframeP,
                                      const rnti_t rntiP);
+
+uint8_t number_of_bits_set(uint8_t buf);
+
+void compute_rsrp_bitlen(struct NR_CSI_ReportConfig *csi_reportconfig,
+                         uint8_t nb_resources,
+                         nr_csi_report_t *csi_report);
+
+uint8_t compute_ri_bitlen(struct NR_CSI_ReportConfig *csi_reportconfig,
+                          nr_csi_report_t *csi_report);
+
+void compute_li_bitlen(struct NR_CSI_ReportConfig *csi_reportconfig,
+                       uint8_t ri_restriction,
+                       nr_csi_report_t *csi_report);
+
+void get_n1n2_o1o2_singlepanel(int *n1, int *n2, int *o1, int *o2,
+                               struct NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo *morethantwo);
+
+void get_x1x2_bitlen_singlepanel(int n1, int n2, int o1, int o2,
+                                 int *x1, int *x2, int rank, int codebook_mode);
+
+void compute_pmi_bitlen(struct NR_CSI_ReportConfig *csi_reportconfig,
+                        uint8_t ri_restriction,
+                        nr_csi_report_t *csi_report);
+
+void compute_cqi_bitlen(struct NR_CSI_ReportConfig *csi_reportconfig,
+                        uint8_t ri_restriction,
+                        nr_csi_report_t *csi_report);
+
+void compute_csi_bitlen(NR_CSI_MeasConfig_t *csi_MeasConfig, nr_csi_report_t *csi_report_template);
+
+uint16_t nr_get_csi_bitlen(nr_csi_report_t *csi_report_template, uint8_t csi_report_id);
+
 #endif
diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_extern.h b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_extern.h
index 4b37c19dff25bdb6208aea2233338af8f61ac2fc..7bbe8d68a751c4cb9ce36b10be00332bc53b14a3 100644
--- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_extern.h
+++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_extern.h
@@ -74,7 +74,7 @@ extern uint8_t rb_table[34];
 extern uint16_t pre_nb_rbs_required[2][MAX_NUM_CCs][NUMBER_OF_UE_MAX];
 extern uint8_t dlsch_ue_select_tbl_in_use;
 extern uint8_t new_dlsch_ue_select_tbl_in_use;
-extern boolean_t pre_scd_activeUE[NUMBER_OF_UE_MAX];
+extern bool pre_scd_activeUE[NUMBER_OF_UE_MAX];
 extern eNB_UE_STATS pre_scd_eNB_UE_stats[MAX_NUM_CCs][NUMBER_OF_UE_MAX];
 #endif*/
 
diff --git a/openair2/LAYER2/NR_MAC_UE/config_ue.c b/openair2/LAYER2/NR_MAC_UE/config_ue.c
index bd693e4d888d15be8b1ae42d91b76efea1f123b4..2804a9ec1e6eae746b7d530b6593b08b17f6e65b 100644
--- a/openair2/LAYER2/NR_MAC_UE/config_ue.c
+++ b/openair2/LAYER2/NR_MAC_UE/config_ue.c
@@ -190,7 +190,7 @@ void config_common_ue_sa(NR_UE_MAC_INST_t *mac,
   cfg->ssb_table.ssb_subcarrier_offset = mac->ssb_subcarrier_offset;
 
   if (mac->frequency_range == FR1){
-    cfg->ssb_table.ssb_mask_list[0].ssb_mask = scc->ssb_PositionsInBurst.inOneGroup.buf[0]<<24;
+    cfg->ssb_table.ssb_mask_list[0].ssb_mask = ((uint32_t) scc->ssb_PositionsInBurst.inOneGroup.buf[0]) << 24;
     cfg->ssb_table.ssb_mask_list[1].ssb_mask = 0;
   }
   else{
@@ -343,7 +343,9 @@ void config_common_ue(NR_UE_MAC_INST_t *mac,
     uint32_t absolute_diff = (*scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB - scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA);
     cfg->ssb_table.ssb_offset_point_a = absolute_diff/(12*scs_scaling) - 10;
     cfg->ssb_table.ssb_period = *scc->ssb_periodicityServingCell;
-    cfg->ssb_table.ssb_subcarrier_offset = mac->ssb_subcarrier_offset;
+
+    // NSA -> take ssb offset from SCS
+    cfg->ssb_table.ssb_subcarrier_offset = absolute_diff%(12*scs_scaling);
     
     switch (scc->ssb_PositionsInBurst->present) {
     case 1 :
@@ -351,7 +353,7 @@ void config_common_ue(NR_UE_MAC_INST_t *mac,
       cfg->ssb_table.ssb_mask_list[1].ssb_mask = 0;
       break;
     case 2 :
-      cfg->ssb_table.ssb_mask_list[0].ssb_mask = scc->ssb_PositionsInBurst->choice.mediumBitmap.buf[0]<<24;
+      cfg->ssb_table.ssb_mask_list[0].ssb_mask = ((uint32_t) scc->ssb_PositionsInBurst->choice.mediumBitmap.buf[0]) << 24;
       cfg->ssb_table.ssb_mask_list[1].ssb_mask = 0;
       break;
     case 3 :
@@ -434,19 +436,24 @@ void config_bwp_ue(NR_UE_MAC_INST_t *mac, uint16_t *bwp_ind, uint8_t *dci_format
 
   NR_ServingCellConfig_t *scd = mac->cg->spCellConfig->spCellConfigDedicated;
 
-  if (bwp_ind && dci_format){
+  int n_ubwp = 0;
+  if (scd && scd->uplinkConfig &&
+      scd->uplinkConfig->uplinkBWP_ToAddModList)
+    n_ubwp = scd->uplinkConfig->uplinkBWP_ToAddModList->list.count;
 
+  if (bwp_ind && dci_format){
     switch(*dci_format){
     case NR_UL_DCI_FORMAT_0_1:
-      mac->UL_BWP_Id = *bwp_ind;
+      mac->UL_BWP_Id = n_ubwp < 4 ? *bwp_ind : *bwp_ind + 1;
       break;
     case NR_DL_DCI_FORMAT_1_1:
-      mac->DL_BWP_Id = *bwp_ind;
+      mac->DL_BWP_Id = n_ubwp < 4 ? *bwp_ind : *bwp_ind + 1;
       break;
     default:
       LOG_E(MAC, "In %s: failed to configure BWP Id from DCI with format %d \n", __FUNCTION__, *dci_format);
     }
-
+    // configure ss coreset after switching BWP
+    configure_ss_coreset(mac, scd, mac->DL_BWP_Id);
   } else {
 
     if (scd->firstActiveDownlinkBWP_Id)
@@ -474,82 +481,96 @@ void config_bwp_ue(NR_UE_MAC_INST_t *mac, uint16_t *bwp_ind, uint8_t *dci_format
     */
 void config_control_ue(NR_UE_MAC_INST_t *mac){
 
-  uint8_t coreset_id = 1, ss_id;
-  NR_BWP_Id_t dl_bwp_id = mac->DL_BWP_Id;
-  NR_BWP_Id_t ul_bwp_id = mac->UL_BWP_Id;
+  int bwp_id;
   NR_ServingCellConfig_t *scd = mac->cg->spCellConfig->spCellConfigDedicated;
-  if (dl_bwp_id==0) AssertFatal(mac->scc_SIB,"dl_bwp_id 0 (DL %d,UL %d) means mac->scc_SIB should exist here!\n",(int)mac->DL_BWP_Id,(int)mac->UL_BWP_Id);
-  NR_BWP_DownlinkCommon_t *bwp_Common = dl_bwp_id>0 ? scd->downlinkBWP_ToAddModList->list.array[dl_bwp_id - 1]->bwp_Common :
-                                                      &mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP;
+  config_bwp_ue(mac, NULL, NULL);
+  NR_BWP_Id_t dl_bwp_id = mac->DL_BWP_Id;
 
+  // configure DLbwp
+  if (scd->downlinkBWP_ToAddModList) {
+    for (int i = 0; i < scd->downlinkBWP_ToAddModList->list.count; i++) {
+      bwp_id = scd->downlinkBWP_ToAddModList->list.array[i]->bwp_Id;
+      mac->DLbwp[bwp_id-1] = scd->downlinkBWP_ToAddModList->list.array[i];
+    }
+  }
 
-  if (dl_bwp_id > 0 ) {
-    AssertFatal(scd->downlinkBWP_ToAddModList != NULL, "downlinkBWP_ToAddModList is null\n");
-    AssertFatal(scd->downlinkBWP_ToAddModList->list.count == 1, "downlinkBWP_ToAddModList->list->count is %d\n", scd->downlinkBWP_ToAddModList->list.count);
+  // configure ULbwp
+  if (scd->uplinkConfig->uplinkBWP_ToAddModList) {
+    for (int i = 0; i < scd->uplinkConfig->uplinkBWP_ToAddModList->list.count; i++) {
+      bwp_id = scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[i]->bwp_Id;
+      mac->ULbwp[bwp_id-1] = scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[i];
+    }
   }
+
+  configure_ss_coreset(mac, scd, dl_bwp_id);
+}
+
+
+void configure_ss_coreset(NR_UE_MAC_INST_t *mac,
+                          NR_ServingCellConfig_t *scd,
+                          NR_BWP_Id_t dl_bwp_id) {
+
+  NR_BWP_DownlinkCommon_t *bwp_Common = get_bwp_downlink_common(mac, dl_bwp_id);
+  AssertFatal(bwp_Common != NULL, "bwp_Common is null\n");
+
+  NR_SetupRelease_PDCCH_ConfigCommon_t *pdcch_ConfigCommon = bwp_Common->pdcch_ConfigCommon;
+  AssertFatal(pdcch_ConfigCommon != NULL, "pdcch_ConfigCommon is null\n");
+
+  // configuring eventual common coreset
+  NR_ControlResourceSet_t *coreset = pdcch_ConfigCommon->choice.setup->commonControlResourceSet;
+  if (coreset)
+    mac->coreset[dl_bwp_id][coreset->controlResourceSetId - 1] = coreset;
+
   NR_BWP_DownlinkDedicated_t *dl_bwp_Dedicated = dl_bwp_id>0 ? scd->downlinkBWP_ToAddModList->list.array[dl_bwp_id - 1]->bwp_Dedicated:
                                                                scd->initialDownlinkBWP;
+
   AssertFatal(dl_bwp_Dedicated != NULL, "dl_bwp_Dedicated is null\n");
-  config_bwp_ue(mac, NULL, NULL);
 
   NR_SetupRelease_PDCCH_Config_t *pdcch_Config = dl_bwp_Dedicated->pdcch_Config;
   AssertFatal(pdcch_Config != NULL, "pdcch_Config is null\n");
 
-  NR_SetupRelease_PDCCH_ConfigCommon_t *pdcch_ConfigCommon = bwp_Common->pdcch_ConfigCommon;
-  AssertFatal(pdcch_ConfigCommon != NULL, "pdcch_ConfigCommon is null\n");
-  AssertFatal(pdcch_ConfigCommon->choice.setup->ra_SearchSpace != NULL, "ra_SearchSpace must be available in DL BWP\n");
-
-  struct NR_PDCCH_ConfigCommon__commonSearchSpaceList *commonSearchSpaceList = pdcch_ConfigCommon->choice.setup->commonSearchSpaceList;
-  AssertFatal(commonSearchSpaceList != NULL, "commonSearchSpaceList is null\n");
-  AssertFatal(commonSearchSpaceList->list.count > 0, "PDCCH CSS list has 0 elements\n");
-
   struct NR_PDCCH_Config__controlResourceSetToAddModList *controlResourceSetToAddModList = pdcch_Config->choice.setup->controlResourceSetToAddModList;
   AssertFatal(controlResourceSetToAddModList != NULL, "controlResourceSetToAddModList is null\n");
-  AssertFatal(controlResourceSetToAddModList->list.count == 1, "controlResourceSetToAddModList->list.count=%d\n", controlResourceSetToAddModList->list.count);
-  AssertFatal(controlResourceSetToAddModList->list.array[0] != NULL, "coreset[0][0] is null\n");
+
+  // configuring dedicated coreset
+  // In case network reconfigures control resource set with the same ControlResourceSetId as used for commonControlResourceSet configured via PDCCH-ConfigCommon,
+  // the configuration from PDCCH-Config always takes precedence
+  for (int i=0; i<controlResourceSetToAddModList->list.count; i++) {
+    coreset = controlResourceSetToAddModList->list.array[i];
+    mac->coreset[dl_bwp_id][coreset->controlResourceSetId - 1] = coreset;
+  }
 
   struct NR_PDCCH_Config__searchSpacesToAddModList *searchSpacesToAddModList = pdcch_Config->choice.setup->searchSpacesToAddModList;
   AssertFatal(searchSpacesToAddModList != NULL, "searchSpacesToAddModList is null\n");
   AssertFatal(searchSpacesToAddModList->list.count > 0, "list of UE specifically configured Search Spaces is empty\n");
-  AssertFatal(searchSpacesToAddModList->list.count < FAPI_NR_MAX_SS, "too many searchpaces per coreset %d\n", searchSpacesToAddModList->list.count);
-
-  struct NR_UplinkConfig__uplinkBWP_ToAddModList *uplinkBWP_ToAddModList = scd->uplinkConfig->uplinkBWP_ToAddModList;
-  if (ul_bwp_id > 0) {
-     AssertFatal(uplinkBWP_ToAddModList != NULL, "uplinkBWP_ToAddModList is null\n");
-     AssertFatal(uplinkBWP_ToAddModList->list.count == 1, "uplinkBWP_ToAddModList->list->count is %d\n", uplinkBWP_ToAddModList->list.count);
-  }
-  // check pdcch_Config, pdcch_ConfigCommon and DL BWP
-  mac->DLbwp[0] = dl_bwp_id>0?scd->downlinkBWP_ToAddModList->list.array[dl_bwp_id - 1]:NULL;
-  mac->coreset[dl_bwp_id][coreset_id - 1] = controlResourceSetToAddModList->list.array[0];
-
-  // Check dedicated UL BWP and pass to MAC
-  mac->ULbwp[0] = ul_bwp_id>0?uplinkBWP_ToAddModList->list.array[0]:NULL;
-  if (mac->ULbwp[0]) AssertFatal(mac->ULbwp[0]->bwp_Dedicated != NULL, "UL bwp_Dedicated is null\n");
+  AssertFatal(searchSpacesToAddModList->list.count < FAPI_NR_MAX_SS_PER_BWP, "too many searchpaces per coreset %d\n", searchSpacesToAddModList->list.count);
 
   // check available Search Spaces in the searchSpacesToAddModList and pass to MAC
   // note: the network configures at most 10 Search Spaces per BWP per cell (including UE-specific and common Search Spaces).
-  for (ss_id = 0; ss_id < searchSpacesToAddModList->list.count; ss_id++) {
+  for (int ss_id = 0; ss_id < searchSpacesToAddModList->list.count; ss_id++) {
     NR_SearchSpace_t *ss = searchSpacesToAddModList->list.array[ss_id];
     AssertFatal(ss->controlResourceSetId != NULL, "ss->controlResourceSetId is null\n");
     AssertFatal(ss->searchSpaceType != NULL, "ss->searchSpaceType is null\n");
-    AssertFatal(*ss->controlResourceSetId == mac->coreset[dl_bwp_id][coreset_id - 1]->controlResourceSetId, "ss->controlResourceSetId is unknown\n");
     AssertFatal(ss->monitoringSymbolsWithinSlot != NULL, "NR_SearchSpace->monitoringSymbolsWithinSlot is null\n");
     AssertFatal(ss->monitoringSymbolsWithinSlot->buf != NULL, "NR_SearchSpace->monitoringSymbolsWithinSlot->buf is null\n");
-    mac->SSpace[dl_bwp_id][ss_id] = ss;
+    AssertFatal(ss->searchSpaceId <= FAPI_NR_MAX_SS, "Invalid searchSpaceId\n");
+    mac->SSpace[dl_bwp_id][ss->searchSpaceId - 1] = ss;
   }
 
+  struct NR_PDCCH_ConfigCommon__commonSearchSpaceList *commonSearchSpaceList = pdcch_ConfigCommon->choice.setup->commonSearchSpaceList;
+  AssertFatal(commonSearchSpaceList != NULL, "commonSearchSpaceList is null\n");
+  AssertFatal(commonSearchSpaceList->list.count > 0, "PDCCH CSS list has 0 elements\n");
+
   // Check available CSSs in the commonSearchSpaceList (list of additional common search spaces)
   // note: commonSearchSpaceList SIZE(1..4)
   for (int css_id = 0; css_id < commonSearchSpaceList->list.count; css_id++) {
     NR_SearchSpace_t *css = commonSearchSpaceList->list.array[css_id];
     AssertFatal(css->controlResourceSetId != NULL, "ss->controlResourceSetId is null\n");
-    AssertFatal(*css->controlResourceSetId == 0 || *css->controlResourceSetId == mac->coreset[dl_bwp_id][coreset_id - 1]->controlResourceSetId, "css->controlResourceSetId %ld is unknown, mac->coreset[%ld][%d]->controlResourceSetId %ld\n",*css->controlResourceSetId,dl_bwp_id,coreset_id-1,mac->coreset[dl_bwp_id][coreset_id - 1]->controlResourceSetId);
- 
     AssertFatal(css->searchSpaceType != NULL, "css->searchSpaceType is null\n");
     AssertFatal(css->monitoringSymbolsWithinSlot != NULL, "css->monitoringSymbolsWithinSlot is null\n");
     AssertFatal(css->monitoringSymbolsWithinSlot->buf != NULL, "css->monitoringSymbolsWithinSlot->buf is null\n");
-    mac->SSpace[dl_bwp_id][ss_id] = css;
-    ss_id++;
+    AssertFatal(css->searchSpaceId <= FAPI_NR_MAX_SS, "Invalid searchSpaceId\n");
+    mac->SSpace[dl_bwp_id][css->searchSpaceId - 1] = css;
   }
 }
 
@@ -559,7 +580,7 @@ int nr_rrc_mac_config_req_ue_logicalChannelBearer(
     int                             cc_idP,
     uint8_t                         gNB_index,
     long                            logicalChannelIdentity,
-    boolean_t                       status){
+    bool                            status){
     NR_UE_MAC_INST_t *mac = get_mac_inst(module_id);
     mac->logicalChannelBearer_exist[logicalChannelIdentity] = status;
     return 0;
diff --git a/openair2/LAYER2/NR_MAC_UE/mac_defs.h b/openair2/LAYER2/NR_MAC_UE/mac_defs.h
index 99cbdf32927e44e5d2211370296454d4bca87fd0..35302eaafba9562134574c3b317b22c9b3a3dc26 100644
--- a/openair2/LAYER2/NR_MAC_UE/mac_defs.h
+++ b/openair2/LAYER2/NR_MAC_UE/mac_defs.h
@@ -74,7 +74,7 @@
 // ==========
 
 #define NB_NR_UE_MAC_INST 1
-#define MAX_NUM_BWP       2
+#define MAX_NUM_BWP_UE       4
 #define NUM_SLOT_FRAME    10
 
 /*!\brief value for indicating BSR Timer is not running */
@@ -364,10 +364,10 @@ typedef struct {
   NR_RNTI_Value_t                 *cs_RNTI;
   NR_MIB_t                        *mib;
 
-  NR_BWP_Downlink_t               *DLbwp[MAX_NUM_BWP];
-  NR_BWP_Uplink_t                 *ULbwp[MAX_NUM_BWP];
-  NR_ControlResourceSet_t         *coreset[MAX_NUM_BWP][FAPI_NR_MAX_CORESET_PER_BWP];
-  NR_SearchSpace_t                *SSpace[MAX_NUM_BWP][FAPI_NR_MAX_SS];
+  NR_BWP_Downlink_t               *DLbwp[MAX_NUM_BWP_UE];
+  NR_BWP_Uplink_t                 *ULbwp[MAX_NUM_BWP_UE];
+  NR_ControlResourceSet_t         *coreset[MAX_NUM_BWP_UE][FAPI_NR_MAX_CORESET_PER_BWP];
+  NR_SearchSpace_t                *SSpace[MAX_NUM_BWP_UE][FAPI_NR_MAX_SS];
 
   frame_type_t frame_type;
 
@@ -399,6 +399,11 @@ typedef struct {
   /// measured SSB RSRP in dBm
   short ssb_rsrp_dBm;
 
+  nr_csi_report_t csi_report_template[MAX_CSI_REPORTCONFIG];
+
+  /// measurements from CSI-RS
+  fapi_nr_csirs_measurements_t csirs_measurements;
+
   /// Last NDI of UL HARQ processes
   uint8_t UL_ndi[NR_MAX_HARQ_PROCESSES];
   /// first ULTX of UL HARQ processes
@@ -415,7 +420,7 @@ typedef struct {
   uint8_t BSR_reporting_active;
 
   /// LogicalChannelConfig has bearer.
-  boolean_t logicalChannelBearer_exist[NR_MAX_NUM_LCID];
+  bool logicalChannelBearer_exist[NR_MAX_NUM_LCID];
   NR_UE_SCHEDULING_INFO   scheduling_info;
 
   /// PHR
@@ -546,7 +551,7 @@ typedef struct prach_association_pattern {
 
 // SSB details
 typedef struct ssb_info {
-  boolean_t transmitted; // True if the SSB index is transmitted according to the SSB positions map configuration
+  bool transmitted; // True if the SSB index is transmitted according to the SSB positions map configuration
   prach_occasion_info_t *mapped_ro[MAX_NB_RO_PER_SSB_IN_ASSOCIATION_PATTERN]; // List of mapped RACH Occasions to this SSB index
   uint16_t nb_mapped_ro; // Total number of mapped ROs to this SSB index
 } ssb_info_t;
@@ -558,7 +563,6 @@ typedef struct ssb_list_info {
 } ssb_list_info_t;
 
 void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15, fapi_nr_dl_config_request_t *dl_config, int rnti_type, int ss_id);
-void fill_dci_search_candidates(NR_SearchSpace_t *ss,fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15);
 
 /*@}*/
 #endif /*__LAYER2_MAC_DEFS_H__ */
diff --git a/openair2/LAYER2/NR_MAC_UE/mac_proto.h b/openair2/LAYER2/NR_MAC_UE/mac_proto.h
index 7ed99b92b5131d76740fb7b61b714a4759e05422..161799fb6677c94a132cc6ac647683be26b0592e 100644
--- a/openair2/LAYER2/NR_MAC_UE/mac_proto.h
+++ b/openair2/LAYER2/NR_MAC_UE/mac_proto.h
@@ -85,14 +85,12 @@ int8_t nr_ue_decode_BCCH_DL_SCH(module_id_t module_id,
    \param cc_id                     component carrier id
    \param gNB_index                 gNB index
    \param long                      logicalChannelIdentity
-   \param boolean_t                 status*/
-int nr_rrc_mac_config_req_ue_logicalChannelBearer(
-	    module_id_t                 module_id,
-	    int                         cc_idP,
-	    uint8_t                     gNB_index,
-	    long                        logicalChannelIdentity,
-	    boolean_t                   status
-);
+   \param bool                      status*/
+int nr_rrc_mac_config_req_ue_logicalChannelBearer(module_id_t module_id,
+                                                  int         cc_idP,
+                                                  uint8_t     gNB_index,
+                                                  long        logicalChannelIdentity,
+                                                  bool        status);
 
 /**\brief primitive from RRC layer to MAC layer for configuration L1/L2, now supported 4 rrc messages: MIB, cell_group_config for MAC/PHY, spcell_config(serving cell config)
    \param module_id                 module id
@@ -154,14 +152,14 @@ void fill_scheduled_response(nr_scheduled_response_t *scheduled_response,
 */
 int8_t nr_ue_get_SR(module_id_t module_idP, frame_t frameP, slot_t slotP);
 
-/*! \fn  boolean_t update_bsr(module_id_t module_idP, frame_t frameP, slot_t slotP, uint8_t gNB_index)
+/*! \fn  bool update_bsr(module_id_t module_idP, frame_t frameP, slot_t slotP, uint8_t gNB_index)
    \brief get the rlc stats and update the bsr level for each lcid
 \param[in] Mod_id instance of the UE
 \param[in] frameP Frame index
 \param[in] slot slotP number
 \param[in] uint8_t gNB_index
 */
-boolean_t nr_update_bsr(module_id_t module_idP, frame_t frameP, slot_t slotP, uint8_t gNB_index);
+bool nr_update_bsr(module_id_t module_idP, frame_t frameP, slot_t slotP, uint8_t gNB_index);
 
 /*! \fn  nr_locate_BsrIndexByBufferSize (int *table, int size, int value)
    \brief locate the BSR level in the table as defined in 38.321. This function requires that he values in table to be monotonic, either increasing or decreasing. The returned value is not less than 0, nor greater than n-1, where n is the size of table.
@@ -196,6 +194,7 @@ int nr_get_sf_retxBSRTimer(uint8_t retxBSR_Timer);
 
 int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, frame_t frame, int slot, dci_pdu_rel15_t *dci, fapi_nr_dci_indication_pdu_t *dci_ind);
 int nr_ue_process_dci_indication_pdu(module_id_t module_id, int cc_id, int gNB_index, frame_t frame, int slot, fapi_nr_dci_indication_pdu_t *dci);
+int8_t nr_ue_process_csirs_measurements(module_id_t module_id, frame_t frame, int slot, fapi_nr_csirs_measurements_t *csirs_measurements);
 
 uint32_t get_ssb_frame(uint32_t test);
 
@@ -215,6 +214,18 @@ uint8_t get_ssb_rsrp_payload(NR_UE_MAC_INST_t *mac,
                              NR_CSI_ResourceConfigId_t csi_ResourceConfigId,
                              NR_CSI_MeasConfig_t *csi_MeasConfig);
 
+uint8_t get_csirs_RI_PMI_CQI_payload(NR_UE_MAC_INST_t *mac,
+                                     PUCCH_sched_t *pucch,
+                                     struct NR_CSI_ReportConfig *csi_reportconfig,
+                                     NR_CSI_ResourceConfigId_t csi_ResourceConfigId,
+                                     NR_CSI_MeasConfig_t *csi_MeasConfig);
+
+uint8_t get_csirs_RSRP_payload(NR_UE_MAC_INST_t *mac,
+                               PUCCH_sched_t *pucch,
+                               struct NR_CSI_ReportConfig *csi_reportconfig,
+                               NR_CSI_ResourceConfigId_t csi_ResourceConfigId,
+                               NR_CSI_MeasConfig_t *csi_MeasConfig);
+
 uint8_t nr_get_csi_payload(NR_UE_MAC_INST_t *mac,
                            PUCCH_sched_t *pucch,
                            int csi_report_id,
@@ -243,10 +254,7 @@ int nr_write_ce_ulsch_pdu(uint8_t *mac_ce,
                           uint16_t *crnti,
                           NR_BSR_SHORT *truncated_bsr,
                           NR_BSR_SHORT *short_bsr,
-                          NR_BSR_LONG  *long_bsr
-						  );
-
-void fill_dci_search_candidates(NR_SearchSpace_t *ss,fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15);
+                          NR_BSR_LONG  *long_bsr);
 
 void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15, fapi_nr_dl_config_request_t *dl_config, int rnti_type, int ss_id);
 
@@ -260,14 +268,9 @@ void get_bwp_info(NR_UE_MAC_INST_t *mac,
                   NR_BWP_UplinkDedicated_t **ubwpd,
                   NR_BWP_UplinkCommon_t **ubwpc);
 
-uint8_t nr_extract_dci_info(NR_UE_MAC_INST_t *mac,
-                            uint8_t dci_format,
-                            uint8_t dci_length,
-                            uint16_t rnti,
-                            uint64_t *dci_pdu,
-                            dci_pdu_rel15_t *nr_pdci_info_extracted);
+NR_BWP_DownlinkCommon_t *get_bwp_downlink_common(NR_UE_MAC_INST_t *mac, NR_BWP_Id_t dl_bwp_id);
 
-NR_PUSCH_TimeDomainResourceAllocationList_t *choose_ul_tda_list(NR_PUSCH_Config_t *pusch_Config,NR_PUSCH_ConfigCommon_t *pusch_ConfigCommon);
+NR_PUSCH_TimeDomainResourceAllocationList_t *choose_ul_tda_list(const NR_PUSCH_Config_t *pusch_Config,NR_PUSCH_ConfigCommon_t *pusch_ConfigCommon);
 NR_PDSCH_TimeDomainResourceAllocationList_t *choose_dl_tda_list(NR_PDSCH_Config_t *pdsch_Config,NR_PDSCH_ConfigCommon_t *pdsch_ConfigCommon);
 
 int8_t nr_ue_process_dci_time_dom_resource_assignment(NR_UE_MAC_INST_t *mac,
@@ -446,12 +449,16 @@ int8_t nr_ue_process_dci_freq_dom_resource_assignment(nfapi_nr_ue_pusch_pdu_t *p
                                                       uint16_t riv);
 
 void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15, fapi_nr_dl_config_request_t *dl_config, int rnti_type, int ss_id);
-void fill_dci_search_candidates(NR_SearchSpace_t *ss,fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15);
+void fill_dci_search_candidates(NR_SearchSpace_t *ss,fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15, int slot, int rnti);
 
 void build_ssb_to_ro_map(NR_UE_MAC_INST_t *mac);
 
 void config_bwp_ue(NR_UE_MAC_INST_t *mac, uint16_t *bwp_ind, uint8_t *dci_format);
 
+void configure_ss_coreset(NR_UE_MAC_INST_t *mac,
+                          NR_ServingCellConfig_t *scd,
+                          NR_BWP_Id_t dl_bwp_id);
+
 fapi_nr_ul_config_request_t *get_ul_config_request(NR_UE_MAC_INST_t *mac, int slot);
 
 void fill_ul_config(fapi_nr_ul_config_request_t *ul_config, frame_t frame_tx, int slot_tx, uint8_t pdu_type);
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_l1_helpers.h b/openair2/LAYER2/NR_MAC_UE/nr_l1_helpers.h
old mode 100755
new mode 100644
index 8b3f00af43d2db6988d5e717177f49438f1f15ef..3bfeb29e2e046fe5a79679f01853348ff19cf172
--- a/openair2/LAYER2/NR_MAC_UE/nr_l1_helpers.h
+++ b/openair2/LAYER2/NR_MAC_UE/nr_l1_helpers.h
@@ -24,3 +24,4 @@
 */
 long nr_get_Pcmax(module_id_t mod_id);
 /** @}*/
+
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c
index 3851ee011d34e0498b126b7d2465a06172a1fe04..507cdb2661df4f2598189be7611ab9e599e1aca0 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c
@@ -94,10 +94,12 @@ void init_RA(module_id_t mod_id,
       }
     }
     if (ss_id < 0) {
-      ra_ss = mac->DLbwp[0]->bwp_Common->pdcch_ConfigCommon->choice.setup->ra_SearchSpace;
-      if (ra_ss) {
-        commonSearchSpaceList = mac->DLbwp[0]->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList;
-        ss_id = *mac->DLbwp[0]->bwp_Common->pdcch_ConfigCommon->choice.setup->ra_SearchSpace;
+      if (mac->DL_BWP_Id>0) {
+        ra_ss = mac->DLbwp[mac->DL_BWP_Id-1]->bwp_Common->pdcch_ConfigCommon->choice.setup->ra_SearchSpace;
+        if (ra_ss) {
+          commonSearchSpaceList = mac->DLbwp[mac->DL_BWP_Id-1]->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList;
+          ss_id = *mac->DLbwp[mac->DL_BWP_Id-1]->bwp_Common->pdcch_ConfigCommon->choice.setup->ra_SearchSpace;
+        }
       }
     }
   }
@@ -323,7 +325,7 @@ void ssb_rach_config(RA_config_t *ra, NR_PRACH_RESOURCES_t *prach_resources, NR_
   // =======================================
 
   NR_RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR ssb_perRACH_config = nr_rach_ConfigCommon->ssb_perRACH_OccasionAndCB_PreamblesPerSSB->present;
-  boolean_t multiple_ssb_per_ro; // true if more than one or exactly one SSB per RACH occasion, false if more than one RO per SSB
+  bool multiple_ssb_per_ro; // true if more than one or exactly one SSB per RACH occasion, false if more than one RO per SSB
   uint8_t ssb_rach_ratio; // Nb of SSBs per RACH or RACHs per SSB
   int total_preambles_per_ssb;
   uint8_t ssb_nb_in_ro;
@@ -743,7 +745,7 @@ uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources,
 
       } else if (get_softmodem_params()->nsa) {
 
-        uint8_t mac_sdus[MAX_NR_ULSCH_PAYLOAD_BYTES];
+        uint8_t mac_sdus[MAX_NUM_NR_ULSCH_SEGMENTS_PER_LAYER*1056];
         uint16_t sdu_lengths[NB_RB_MAX] = {0};
         int TBS_bytes = 848;
         int mac_ce_len = 0;
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c
index 0ee6f5501c136b64834224657a184e30e53c330d..9b618cdbfb4fda6696a86f305551f2fbb9a56ec1 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c
@@ -49,7 +49,9 @@
 
 //#define DEBUG_DCI
 
-void fill_dci_search_candidates(NR_SearchSpace_t *ss,fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15) {
+void fill_dci_search_candidates(NR_SearchSpace_t *ss,
+                                fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15,
+                                int slot, int rnti) {
 
   LOG_D(NR_MAC,"Filling search candidates for DCI\n");
 
@@ -57,6 +59,9 @@ void fill_dci_search_candidates(NR_SearchSpace_t *ss,fapi_nr_dl_config_dci_dl_pd
   uint8_t number_of_candidates=0;
   rel15->number_of_candidates=0;
   int i=0;
+  uint32_t Y = 0;
+  if (slot >= 0)
+    Y = get_Y(ss, slot, rnti);
   for (int maxL=16;maxL>0;maxL>>=1) {
     find_aggregation_candidates(&aggregation,
                                 &number_of_candidates,
@@ -65,8 +70,17 @@ void fill_dci_search_candidates(NR_SearchSpace_t *ss,fapi_nr_dl_config_dci_dl_pd
     if (number_of_candidates>0) {
       LOG_D(NR_MAC,"L %d, number of candidates %d, aggregation %d\n",maxL,number_of_candidates,aggregation);
       rel15->number_of_candidates += number_of_candidates;
+      int N_cce_sym = 0; // nb of rbs of coreset per symbol
+      for (int i=0;i<6;i++) {
+        for (int t=0;t<8;t++) {
+          N_cce_sym+=((rel15->coreset.frequency_domain_resource[i]>>t)&1);
+        }
+      }
+      int N_cces = N_cce_sym*rel15->coreset.duration;
       for (int j=0; j<number_of_candidates; i++,j++) {
-        rel15->CCE[i] = j*aggregation;
+        int first_cce = aggregation * (( Y + CEILIDIV((j*N_cces),(aggregation*number_of_candidates)) + 0 ) % CEILIDIV(N_cces,aggregation));
+        LOG_D(NR_MAC,"Candidate %d of %d first_cce %d (L %d N_cces %d Y %d)\n", j, number_of_candidates, first_cce, aggregation, N_cces, Y);
+        rel15->CCE[i] = first_cce;
         rel15->L[i] = aggregation;
       }
     }
@@ -80,7 +94,7 @@ void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t
 
   AssertFatal(mac->scc == NULL || mac->scc_SIB == NULL, "both scc and scc_SIB cannot be non-null\n");
 
-  NR_BWP_Id_t bwp_id = mac->DL_BWP_Id;
+  NR_BWP_Id_t dl_bwp_id = mac->DL_BWP_Id;
   NR_ServingCellConfigCommon_t *scc = mac->scc;
   NR_ServingCellConfigCommonSIB_t *scc_SIB = mac->scc_SIB;
   NR_BWP_DownlinkCommon_t *bwp_Common=NULL;
@@ -91,7 +105,7 @@ void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t
     initialDownlinkBWP =  scc!=NULL ? scc->downlinkConfigCommon->initialDownlinkBWP : &scc_SIB->downlinkConfigCommon.initialDownlinkBWP;
     initialUplinkBWP = scc!=NULL ? scc->uplinkConfigCommon->initialUplinkBWP : &scc_SIB->uplinkConfigCommon->initialUplinkBWP;
   }
-  bwp_Common = bwp_id>0 ? mac->DLbwp[bwp_id-1]->bwp_Common : NULL;
+  bwp_Common = dl_bwp_id>0 ? mac->DLbwp[dl_bwp_id-1]->bwp_Common : NULL;
 
   NR_SearchSpace_t *ss;
   NR_ControlResourceSet_t *coreset;
@@ -102,7 +116,7 @@ void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t
                   ss_id,mac->ra.ss->searchSpaceId);
     }
     else
-      ss = mac->SSpace[bwp_id][ss_id];
+      ss = mac->SSpace[dl_bwp_id][ss_id-1];
   }
   else
     ss = mac->search_space_zero;
@@ -110,7 +124,7 @@ void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t
   uint8_t coreset_id = *ss->controlResourceSetId;
 
   if(coreset_id>0) {
-    coreset = mac->coreset[bwp_id][coreset_id - 1];
+    coreset = mac->coreset[dl_bwp_id][coreset_id - 1];
     rel15->coreset.CoreSetType = NFAPI_NR_CSET_CONFIG_PDCCH_CONFIG;
   } else {
     coreset = mac->coreset0;
@@ -169,7 +183,7 @@ void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t
       rel15->SubcarrierSpacing = bwp_Common->genericParameters.subcarrierSpacing;
     }
     for (int i = 0; i < rel15->num_dci_options; i++) {
-      rel15->dci_length_options[i] = nr_dci_size(initialDownlinkBWP,initialUplinkBWP, mac->cg, &mac->def_dci_pdu_rel15[rel15->dci_format_options[i]], rel15->dci_format_options[i], NR_RNTI_C, rel15->BWPSize, bwp_id, mac->type0_PDCCH_CSS_config.num_rbs);
+      rel15->dci_length_options[i] = nr_dci_size(initialDownlinkBWP,initialUplinkBWP, mac->cg, &mac->def_dci_pdu_rel15[rel15->dci_format_options[i]], rel15->dci_format_options[i], NR_RNTI_C, rel15->BWPSize, dl_bwp_id, coreset_id, mac->type0_PDCCH_CSS_config.num_rbs);
     }
     break;
     case NR_RNTI_RA:
@@ -185,7 +199,7 @@ void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t
       rel15->BWPStart = NRRIV2PRBOFFSET(bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
     }
     rel15->SubcarrierSpacing = initialDownlinkBWP->genericParameters.subcarrierSpacing;
-    rel15->dci_length_options[0] = nr_dci_size(initialDownlinkBWP,initialUplinkBWP, mac->cg, &mac->def_dci_pdu_rel15[rel15->dci_format_options[0]], rel15->dci_format_options[0], NR_RNTI_RA, rel15->BWPSize, bwp_id, mac->type0_PDCCH_CSS_config.num_rbs);
+    rel15->dci_length_options[0] = nr_dci_size(initialDownlinkBWP,initialUplinkBWP, mac->cg, &mac->def_dci_pdu_rel15[rel15->dci_format_options[0]], rel15->dci_format_options[0], NR_RNTI_RA, rel15->BWPSize, dl_bwp_id, coreset_id, mac->type0_PDCCH_CSS_config.num_rbs);
     break;
     case NR_RNTI_P:
     break;
@@ -200,7 +214,7 @@ void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t
       rel15->BWPStart = mac->type0_PDCCH_CSS_config.cset_start_rb;
       rel15->SubcarrierSpacing = initialDownlinkBWP->genericParameters.subcarrierSpacing;
       for (int i = 0; i < rel15->num_dci_options; i++) {
-        rel15->dci_length_options[i] = nr_dci_size(initialDownlinkBWP,initialUplinkBWP, mac->cg, &mac->def_dci_pdu_rel15[rel15->dci_format_options[i]], rel15->dci_format_options[i], NR_RNTI_TC, rel15->BWPSize, bwp_id, mac->type0_PDCCH_CSS_config.num_rbs);
+        rel15->dci_length_options[i] = nr_dci_size(initialDownlinkBWP,initialUplinkBWP, mac->cg, &mac->def_dci_pdu_rel15[rel15->dci_format_options[i]], rel15->dci_format_options[i], NR_RNTI_TC, rel15->BWPSize, dl_bwp_id, coreset_id, mac->type0_PDCCH_CSS_config.num_rbs);
       }
     break;
     case NR_RNTI_SP_CSI:
@@ -223,7 +237,7 @@ void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t
         rel15->SubcarrierSpacing = mac->mib->subCarrierSpacingCommon + 2;
 
       for (int i = 0; i < rel15->num_dci_options; i++) {
-        rel15->dci_length_options[i] = nr_dci_size(initialDownlinkBWP,initialUplinkBWP, mac->cg, &mac->def_dci_pdu_rel15[rel15->dci_format_options[i]], rel15->dci_format_options[i], NR_RNTI_SI, rel15->BWPSize, 0, mac->type0_PDCCH_CSS_config.num_rbs);
+        rel15->dci_length_options[i] = nr_dci_size(initialDownlinkBWP,initialUplinkBWP, mac->cg, &mac->def_dci_pdu_rel15[rel15->dci_format_options[i]], rel15->dci_format_options[i], NR_RNTI_SI, rel15->BWPSize, 0, coreset_id, mac->type0_PDCCH_CSS_config.num_rbs);
       }
     break;
     case NR_RNTI_SFI:
@@ -273,11 +287,17 @@ void ue_dci_configuration(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_request_t *dl
 
   LOG_D(NR_MAC, "[DCI_CONFIG] ra_rnti %p (%x) crnti %p (%x) t_crnti %p (%x)\n", &ra->ra_rnti, ra->ra_rnti, &mac->crnti, mac->crnti, &ra->t_crnti, ra->t_crnti);
 
-    // loop over all available SS for CORESET ID 1
+  // loop over all available SS for bwp_id
   if (bwpd) {
-      for (ss_id = 0; ss_id < FAPI_NR_MAX_SS && mac->SSpace[bwp_id][ss_id] != NULL; ss_id++){
+      for (ss_id = 1; ss_id <= FAPI_NR_MAX_SS; ss_id++){
+
+        if(mac->SSpace[bwp_id][ss_id-1]==NULL) {
+          continue;
+        }
+
 	LOG_D(NR_MAC, "[DCI_CONFIG] ss_id %d\n",ss_id);
-	NR_SearchSpace_t *ss = mac->SSpace[bwp_id][ss_id];
+	NR_SearchSpace_t *ss = mac->SSpace[bwp_id][ss_id-1];
+        AssertFatal(ss_id == ss->searchSpaceId,"SS IDs don't correspond\n");
 	fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15 = &dl_config->dl_config_list[dl_config->number_pdus].dci_config_pdu.dci_config_rel15;
 	NR_SetupRelease_PDCCH_ConfigCommon_t *pdcch_ConfigCommon = bwp_Common->pdcch_ConfigCommon;
 	struct NR_PhysicalCellGroupConfig *phy_cgc = mac->cg->physicalCellGroupConfig;
@@ -285,15 +305,6 @@ void ue_dci_configuration(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_request_t *dl
 	case NR_SearchSpace__searchSpaceType_PR_common:
 	  // this is for CSSs, we use BWP common and pdcch_ConfigCommon
 
-	  // Fetch configuration for searchSpaceZero
-	  // note: The search space with the SearchSpaceId = 0 identifies the search space configured via PBCH (MIB) and in ServingCellConfigCommon (searchSpaceZero).
-	  if (pdcch_ConfigCommon->choice.setup->searchSpaceZero){
-	    if (pdcch_ConfigCommon->choice.setup->searchSpaceSIB1 == NULL){
-	      pdcch_ConfigCommon->choice.setup->searchSpaceSIB1=calloc(1,sizeof(*pdcch_ConfigCommon->choice.setup->searchSpaceSIB1));
-	    }
-	    *pdcch_ConfigCommon->choice.setup->searchSpaceSIB1 = 0;
-	    LOG_D(NR_MAC, "[DCI_CONFIG] Configure SearchSpace#0 of the initial BWP\n");
-	  }
 	  if (ss->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0){
 	    // check available SS IDs
 	    if (pdcch_ConfigCommon->choice.setup->ra_SearchSpace){
@@ -308,14 +319,14 @@ void ue_dci_configuration(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_request_t *dl
 		  } else {
 		    config_dci_pdu(mac, rel15, dl_config, NR_RNTI_RA, ss_id);
 		  }
-		  fill_dci_search_candidates(ss, rel15);
+		  fill_dci_search_candidates(ss, rel15, -1, -1);
 		  break;
 		case WAIT_CONTENTION_RESOLUTION:
 		  LOG_D(NR_MAC, "[DCI_CONFIG] Configure monitoring of PDCCH candidates in Type1-PDCCH common random access search space (RA-Msg4)\n");
 		  rel15->num_dci_options = 1;
 		  rel15->dci_format_options[0] = NR_DL_DCI_FORMAT_1_0;
 		  config_dci_pdu(mac, rel15, dl_config, NR_RNTI_TC, -1);
-		  fill_dci_search_candidates(ss, rel15);
+		  fill_dci_search_candidates(ss, rel15, -1, -1);
 		  break;
 		default:
 		  break;
@@ -387,7 +398,7 @@ void ue_dci_configuration(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_request_t *dl
             rel15->dci_format_options[0] = NR_DL_DCI_FORMAT_1_1;
             rel15->dci_format_options[1] = NR_UL_DCI_FORMAT_0_1;
             config_dci_pdu(mac, rel15, dl_config, NR_RNTI_C, ss_id);
-            fill_dci_search_candidates(ss, rel15);
+            fill_dci_search_candidates(ss, rel15, slot, mac->crnti);
 
 //#ifdef DEBUG_DCI
 		LOG_D(NR_MAC, "[DCI_CONFIG] ss %d ue_Specific %p searchSpaceType->present %d dci_Formats %d\n",
@@ -423,35 +434,4 @@ void ue_dci_configuration(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_request_t *dl
 
     AssertFatal(1==0,"Handle DCI searching when CellGroup without dedicated BWP\n");
   }
-  // Search space 0, CORESET ID 0
-
-  NR_SetupRelease_PDCCH_ConfigCommon_t *pdcch_ConfigCommon = bwp_Common->pdcch_ConfigCommon;
-
-  if (pdcch_ConfigCommon &&
-      pdcch_ConfigCommon->choice.setup->searchSpaceSIB1 &&
-      !get_softmodem_params()->nsa) {
-
-    NR_SearchSpace_t *ss0 = mac->search_space_zero;
-    fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15 = &dl_config->dl_config_list[dl_config->number_pdus].dci_config_pdu.dci_config_rel15;
-
-    if (ss0->searchSpaceId == *pdcch_ConfigCommon->choice.setup->searchSpaceSIB1){
-      if( (frame%2 == mac->type0_PDCCH_CSS_config.sfn_c) && (slot == mac->type0_PDCCH_CSS_config.n_0) ){
-        rel15->num_dci_options = 1;
-        rel15->dci_format_options[0] = NR_DL_DCI_FORMAT_1_0;
-        config_dci_pdu(mac, rel15, dl_config, NR_RNTI_SI, -1);
-        fill_dci_search_candidates(ss0, rel15);
-      }
-    }
-  }
-  else if (!get_softmodem_params()->nsa) { // use coreset0/ss0
-    NR_SearchSpace_t *ss0 = mac->search_space_zero;
-    if(ss0) {
-      fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15 = &dl_config->dl_config_list[0].dci_config_pdu.dci_config_rel15;
-      rel15->num_dci_options = 1;
-      rel15->dci_format_options[0] = NR_DL_DCI_FORMAT_1_0;
-      config_dci_pdu(mac, rel15, dl_config, NR_RNTI_C , -1);
-      fill_dci_search_candidates(ss0, rel15);
-      dl_config->number_pdus = 1;
-    }
-  }
 }
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
index 8e9442d00c1c7930f2ac474ee7a2a0b85f6b1cac..67df66b66daf768136d9dd7a4d4895ffdf37535a 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
@@ -134,6 +134,13 @@ const initial_pucch_resource_t initial_pucch_resource[16] = {
 };
 
 
+static uint8_t nr_extract_dci_info(NR_UE_MAC_INST_t *mac,
+                            uint8_t dci_format,
+                            uint8_t dci_length,
+                            uint16_t rnti,
+                            uint64_t *dci_pdu,
+                            dci_pdu_rel15_t *nr_pdci_info_extracted);
+
 void nr_ue_init_mac(module_id_t module_idP) {
   int i;
 
@@ -191,32 +198,27 @@ void get_bwp_info(NR_UE_MAC_INST_t *mac,
                   NR_BWP_UplinkDedicated_t **ubwpd,
                   NR_BWP_UplinkCommon_t **ubwpc) {
 
-    if (dl_bwp_id > 0) {
-       AssertFatal(mac->DLbwp[dl_bwp_id-1]!=NULL,"mac->DLbwp[%d] is null, shouldn't be\n",
-                    (int)dl_bwp_id-1);
-       *bwpd = mac->DLbwp[dl_bwp_id-1]->bwp_Dedicated;
-       if (mac->DLbwp[dl_bwp_id-1]->bwp_Common) *bwpc = mac->DLbwp[dl_bwp_id-1]->bwp_Common;
-       else if (mac->scc_SIB) *bwpc = &mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP;
-       else if (mac->scc) *bwpc = mac->scc->downlinkConfigCommon->initialDownlinkBWP;
-       AssertFatal(*bwpc!=NULL,"bwpc shouldn't be null\n");
-    } else {
-       if (mac->cg &&
-           mac->cg->spCellConfig &&
-           mac->cg->spCellConfig->spCellConfigDedicated &&
-           mac->cg->spCellConfig->spCellConfigDedicated->initialDownlinkBWP)
-          *bwpd = mac->cg->spCellConfig->spCellConfigDedicated->initialDownlinkBWP;
-       if (mac->scc_SIB) *bwpc = &mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP;
-       else if (mac->scc) *bwpc = mac->scc->downlinkConfigCommon->initialDownlinkBWP;
-       AssertFatal(*bwpc!=NULL,"bwpc shouldn't be null\n");
-    }
+  if (dl_bwp_id > 0) {
+    AssertFatal(mac->DLbwp[dl_bwp_id-1]!=NULL,"mac->DLbwp[%d] is null, shouldn't be\n", (int)dl_bwp_id-1);
+    *bwpd = mac->DLbwp[dl_bwp_id-1]->bwp_Dedicated;
+  } else {
+    if (mac->cg &&
+        mac->cg->spCellConfig &&
+        mac->cg->spCellConfig->spCellConfigDedicated &&
+        mac->cg->spCellConfig->spCellConfigDedicated->initialDownlinkBWP)
+      *bwpd = mac->cg->spCellConfig->spCellConfigDedicated->initialDownlinkBWP;
+  }
+
+  *bwpc = get_bwp_downlink_common(mac, dl_bwp_id);
+  AssertFatal(*bwpc!=NULL,"bwpc shouldn't be null\n");
 
     if (ul_bwp_id > 0) {
        AssertFatal(mac->ULbwp[ul_bwp_id-1]!=NULL,"mac->ULbwp[%d] is null, shouldn't be\n",
                    ul_bwp_id-1);
        *ubwpd = mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated;
        if (mac->ULbwp[ul_bwp_id-1]->bwp_Common) *ubwpc = mac->ULbwp[ul_bwp_id-1]->bwp_Common;
-       else if (mac->scc_SIB) *ubwpc = &mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP;
        else if (mac->scc) *ubwpc = mac->scc->uplinkConfigCommon->initialUplinkBWP;
+       else if (mac->scc_SIB) *ubwpc = &mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP;
        AssertFatal(*bwpc!=NULL,"bwpc shouldn't be null\n");
 
     }
@@ -227,12 +229,24 @@ void get_bwp_info(NR_UE_MAC_INST_t *mac,
            mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
            mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP)
           *ubwpd = mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP;
-       if (mac->scc_SIB) *ubwpc = &mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP;
-       else if (mac->scc) *ubwpc = mac->scc->uplinkConfigCommon->initialUplinkBWP;
+       if (mac->scc) *ubwpc = mac->scc->uplinkConfigCommon->initialUplinkBWP;
+       else if (mac->scc_SIB) *ubwpc = &mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP;
        AssertFatal(*ubwpc!=NULL,"ubwpc shouldn't be null\n");
     }
 }
 
+NR_BWP_DownlinkCommon_t *get_bwp_downlink_common(NR_UE_MAC_INST_t *mac, NR_BWP_Id_t dl_bwp_id) {
+  NR_BWP_DownlinkCommon_t *bwp_Common = NULL;
+  if (dl_bwp_id > 0 && mac->cg->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList) {
+    bwp_Common = mac->cg->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[dl_bwp_id-1]->bwp_Common;
+  } else if (mac->scc) {
+    bwp_Common = mac->scc->downlinkConfigCommon->initialDownlinkBWP;
+  } else if (mac->scc_SIB) {
+    bwp_Common = &mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP;
+  }
+  return bwp_Common;
+}
+
 NR_PDSCH_TimeDomainResourceAllocationList_t *choose_dl_tda_list(NR_PDSCH_Config_t *pdsch_Config,NR_PDSCH_ConfigCommon_t *pdsch_ConfigCommon) {
 
     NR_PDSCH_TimeDomainResourceAllocationList_t *pdsch_TimeDomainAllocationList=NULL;
@@ -246,7 +260,7 @@ NR_PDSCH_TimeDomainResourceAllocationList_t *choose_dl_tda_list(NR_PDSCH_Config_
     return(pdsch_TimeDomainAllocationList);
 }
 
-NR_PUSCH_TimeDomainResourceAllocationList_t *choose_ul_tda_list(NR_PUSCH_Config_t *pusch_Config,NR_PUSCH_ConfigCommon_t *pusch_ConfigCommon) {
+NR_PUSCH_TimeDomainResourceAllocationList_t *choose_ul_tda_list(const NR_PUSCH_Config_t *pusch_Config,NR_PUSCH_ConfigCommon_t *pusch_ConfigCommon) {
 
     NR_PUSCH_TimeDomainResourceAllocationList_t *pusch_TimeDomainAllocationList=NULL;
 
@@ -572,7 +586,7 @@ int8_t nr_ue_process_dci_time_dom_resource_assignment(NR_UE_MAC_INST_t *mac,
   if(pusch_config_pdu != NULL){
     if (pusch_TimeDomainAllocationList && use_default==false) {
       if (time_domain_ind >= pusch_TimeDomainAllocationList->list.count) {
-        LOG_E(MAC, "time_domain_ind %d >= pusch->TimeDomainAllocationList->list.count %d\n",
+        LOG_E(NR_MAC, "time_domain_ind %d >= pusch->TimeDomainAllocationList->list.count %d\n",
               time_domain_ind, pusch_TimeDomainAllocationList->list.count);
         pusch_config_pdu->start_symbol_index=0;
         pusch_config_pdu->nr_of_symbols=0;
@@ -633,10 +647,13 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
   RA_config_t *ra = &mac->ra;
   fapi_nr_dl_config_request_t *dl_config = &mac->dl_config_request;
   uint8_t is_Msg3 = 0;
+  NR_BWP_Id_t dl_bwp_id = mac->DL_BWP_Id;
+  NR_BWP_Id_t ul_bwp_id = mac->UL_BWP_Id;
   int default_abc = 1;
 
   uint16_t n_RB_DLBWP;
-  if (mac->DLbwp[0]) n_RB_DLBWP = NRRIV2BW(mac->DLbwp[0]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
+  if (dl_bwp_id>0 && mac->DLbwp[dl_bwp_id-1]) n_RB_DLBWP = NRRIV2BW(mac->DLbwp[dl_bwp_id-1]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
+  else if (mac->scc) n_RB_DLBWP =  NRRIV2BW(mac->scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth,MAX_BWP_SIZE);
   else if (mac->scc_SIB) n_RB_DLBWP =  NRRIV2BW(mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.genericParameters.locationAndBandwidth,MAX_BWP_SIZE);
   else n_RB_DLBWP = mac->type0_PDCCH_CSS_config.num_rbs;
 
@@ -806,7 +823,7 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
     dl_config->dl_config_list[dl_config->number_pdus].dlsch_config_pdu.rnti = rnti;
     fapi_nr_dl_config_dlsch_pdu_rel15_t *dlsch_config_pdu_1_0 = &dl_config->dl_config_list[dl_config->number_pdus].dlsch_config_pdu.dlsch_config_rel15;
 
-    NR_PDSCH_Config_t *pdsch_config= (mac->DLbwp[0]) ? mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup : NULL;
+    NR_PDSCH_Config_t *pdsch_config= (dl_bwp_id>0 && mac->DLbwp[dl_bwp_id-1]) ? mac->DLbwp[dl_bwp_id-1]->bwp_Dedicated->pdsch_Config->choice.setup : NULL;
     int is_common=0;
     if(rnti == SI_RNTI) {
       NR_Type0_PDCCH_CSS_config_t type0_PDCCH_CSS_config = mac->type0_PDCCH_CSS_config;
@@ -833,14 +850,19 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
           dlsch_config_pdu_1_0->BWPStart = NRRIV2PRBOFFSET(mac->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
         }
         if (!get_softmodem_params()->sa) { // NSA mode is not using the Initial BWP
-          dlsch_config_pdu_1_0->BWPStart = NRRIV2PRBOFFSET(mac->DLbwp[0]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
-          pdsch_config = mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup;
+          dlsch_config_pdu_1_0->BWPStart = NRRIV2PRBOFFSET(mac->DLbwp[dl_bwp_id-1]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
+          pdsch_config = mac->DLbwp[dl_bwp_id-1]->bwp_Dedicated->pdsch_Config->choice.setup;
         }
-      } else if (mac->DLbwp[0]) {
-        dlsch_config_pdu_1_0->BWPSize = NRRIV2BW(mac->DLbwp[0]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
-        dlsch_config_pdu_1_0->BWPStart = NRRIV2PRBOFFSET(mac->DLbwp[0]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
-        dlsch_config_pdu_1_0->SubcarrierSpacing = mac->DLbwp[0]->bwp_Common->genericParameters.subcarrierSpacing;
-        pdsch_config = mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup;
+      } else if (dl_bwp_id>0 && mac->DLbwp[dl_bwp_id-1]) {
+        dlsch_config_pdu_1_0->BWPSize = NRRIV2BW(mac->DLbwp[dl_bwp_id-1]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
+        dlsch_config_pdu_1_0->BWPStart = NRRIV2PRBOFFSET(mac->DLbwp[dl_bwp_id-1]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
+        dlsch_config_pdu_1_0->SubcarrierSpacing = mac->DLbwp[dl_bwp_id-1]->bwp_Common->genericParameters.subcarrierSpacing;
+        pdsch_config = mac->DLbwp[dl_bwp_id-1]->bwp_Dedicated->pdsch_Config->choice.setup;
+      } else if (mac->scc) {
+        dlsch_config_pdu_1_0->BWPSize = NRRIV2BW(mac->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
+        dlsch_config_pdu_1_0->BWPStart = NRRIV2PRBOFFSET(mac->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
+        dlsch_config_pdu_1_0->SubcarrierSpacing = mac->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.subcarrierSpacing;
+        pdsch_config = NULL;
       } else if (mac->scc_SIB) {
         dlsch_config_pdu_1_0->BWPSize = NRRIV2BW(mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
         dlsch_config_pdu_1_0->BWPStart = NRRIV2PRBOFFSET(mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
@@ -858,13 +880,14 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
 
 
     NR_PDSCH_TimeDomainResourceAllocationList_t *pdsch_TimeDomainAllocationList = NULL;
-    if (mac->DLbwp[0] &&
-        mac->DLbwp[0]->bwp_Dedicated &&
-        mac->DLbwp[0]->bwp_Dedicated->pdsch_Config &&
-        mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup->pdsch_TimeDomainAllocationList)
-      pdsch_TimeDomainAllocationList = mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup->pdsch_TimeDomainAllocationList->choice.setup;
-    else if (mac->DLbwp[0] && mac->DLbwp[0]->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList)
-      pdsch_TimeDomainAllocationList = mac->DLbwp[0]->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList;
+    if (dl_bwp_id>0 &&
+        mac->DLbwp[dl_bwp_id-1] &&
+        mac->DLbwp[dl_bwp_id-1]->bwp_Dedicated &&
+        mac->DLbwp[dl_bwp_id-1]->bwp_Dedicated->pdsch_Config &&
+        mac->DLbwp[dl_bwp_id-1]->bwp_Dedicated->pdsch_Config->choice.setup->pdsch_TimeDomainAllocationList)
+      pdsch_TimeDomainAllocationList = mac->DLbwp[dl_bwp_id-1]->bwp_Dedicated->pdsch_Config->choice.setup->pdsch_TimeDomainAllocationList->choice.setup;
+    else if (dl_bwp_id>0 && mac->DLbwp[dl_bwp_id-1] && mac->DLbwp[dl_bwp_id-1]->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList)
+      pdsch_TimeDomainAllocationList = mac->DLbwp[dl_bwp_id-1]->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList;
     else if (mac->scc_SIB && mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.pdsch_ConfigCommon->choice.setup)
       pdsch_TimeDomainAllocationList = mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList;
 
@@ -881,10 +904,10 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
       mappingtype = pdsch_TimeDomainAllocationList->list.array[dci->time_domain_assignment.val]->mappingType;
 
     struct NR_DMRS_DownlinkConfig *dl_dmrs_config = NULL;
-    if(mac->DLbwp[0])
+    if(dl_bwp_id>0 && mac->DLbwp[dl_bwp_id-1] != NULL)
       dl_dmrs_config = (mappingtype == typeA) ?
-                       mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup :
-                       mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeB->choice.setup;
+                       mac->DLbwp[dl_bwp_id-1]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup :
+                       mac->DLbwp[dl_bwp_id-1]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeB->choice.setup;
 
     dlsch_config_pdu_1_0->nscid = 0;
     if(dl_dmrs_config && dl_dmrs_config->scramblingID0)
@@ -897,7 +920,8 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
                                                          (get_softmodem_params()->nsa) ? mac->scc->dmrs_TypeA_Position : mac->mib->dmrs_TypeA_Position,
                                                          dlsch_config_pdu_1_0->number_symbols,
                                                          dlsch_config_pdu_1_0->start_symbol,
-                                                         mappingtype, 1);
+                                                         mappingtype,
+                                                         1);
     dlsch_config_pdu_1_0->dmrsConfigType = (dl_dmrs_config != NULL) ?
                                            (dl_dmrs_config->dmrs_Type == NULL ? 0 : 1) : 0;
 
@@ -918,6 +942,36 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
       LOG_W(MAC, "[%d.%d] MCS value %d out of bounds! Possibly due to false DCI. Ignoring DCI!\n", frame, slot, dlsch_config_pdu_1_0->mcs);
       return -1;
     }
+
+    dlsch_config_pdu_1_0->qamModOrder = nr_get_Qm_dl(dlsch_config_pdu_1_0->mcs, dlsch_config_pdu_1_0->mcs_table);
+    int R = nr_get_code_rate_dl(dlsch_config_pdu_1_0->mcs, dlsch_config_pdu_1_0->mcs_table);
+    dlsch_config_pdu_1_0->targetCodeRate = R;
+    if (dlsch_config_pdu_1_0->targetCodeRate == 0 || dlsch_config_pdu_1_0->qamModOrder == 0) {
+      LOG_W(MAC, "Invalid code rate or Mod order, likely due to unexpected DL DCI.\n");
+      return -1;
+    }
+
+    int nb_rb_oh = 0; // it was not computed at UE side even before and set to 0 in nr_compute_tbs
+    int nb_re_dmrs = ((dlsch_config_pdu_1_0->dmrsConfigType == NFAPI_NR_DMRS_TYPE1) ? 6:4)*dlsch_config_pdu_1_0->n_dmrs_cdm_groups;
+    dlsch_config_pdu_1_0->TBS = nr_compute_tbs(dlsch_config_pdu_1_0->qamModOrder,
+                                               R,
+                                               dlsch_config_pdu_1_0->number_rbs,
+                                               dlsch_config_pdu_1_0->number_symbols,
+                                               nb_re_dmrs*get_num_dmrs(dlsch_config_pdu_1_0->dlDmrsSymbPos),
+                                               nb_rb_oh, 0, 1);
+
+    int bw_tbslbrm;
+    if (mac->scc || mac->scc_SIB || mac->cg) {
+      NR_BWP_t genericParameters = mac->scc ? mac->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters :
+                                              mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.genericParameters;
+      bw_tbslbrm = get_bw_tbslbrm(&genericParameters, mac->cg);
+    }
+    else
+      bw_tbslbrm = dlsch_config_pdu_1_0->BWPSize;
+    dlsch_config_pdu_1_0->tbslbrm = nr_compute_tbslbrm(dlsch_config_pdu_1_0->mcs_table,
+			                               bw_tbslbrm,
+		                                       1);
+
     /* NDI (only if CRC scrambled by C-RNTI or CS-RNTI or new-RNTI or TC-RNTI)*/
     dlsch_config_pdu_1_0->ndi = dci->ndi;
     /* RV (only if CRC scrambled by C-RNTI or CS-RNTI or new-RNTI or TC-RNTI)*/
@@ -938,14 +992,15 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
     if (dci->tpc == 3) dlsch_config_pdu_1_0->accumulated_delta_PUCCH = 3;
     // Sanity check for pucch_resource_indicator value received to check for false DCI.
     valid = 0;
-    if (mac->ULbwp[0] &&
-        mac->ULbwp[0]->bwp_Dedicated &&
-        mac->ULbwp[0]->bwp_Dedicated->pucch_Config &&
-        mac->ULbwp[0]->bwp_Dedicated->pucch_Config->choice.setup&&
-        mac->ULbwp[0]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList) {
-      pucch_res_set_cnt = mac->ULbwp[0]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList->list.count;
+    if (ul_bwp_id > 0 &&
+        mac->ULbwp[ul_bwp_id-1] &&
+        mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated &&
+        mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pucch_Config &&
+        mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup&&
+        mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList) {
+      pucch_res_set_cnt = mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList->list.count;
       for (int id = 0; id < pucch_res_set_cnt; id++) {
-	if (dci->pucch_resource_indicator < mac->ULbwp[0]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList->list.array[id]->resourceList.list.count) {
+	if (dci->pucch_resource_indicator < mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList->list.array[id]->resourceList.list.count) {
 	  valid = 1;
 	  break;
 	}
@@ -1048,8 +1103,8 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
      *    47 DMRS_SEQ_INI:
      */
 
-    if (dci->bwp_indicator.val > 1) {
-      LOG_W(NR_MAC,"[%d.%d] bwp_indicator %d > 1  Possibly due to false DCI. Ignoring DCI!\n", frame, slot,dci->bwp_indicator.val);
+    if (dci->bwp_indicator.val > NR_MAX_NUM_BWP) {
+      LOG_W(NR_MAC,"[%d.%d] bwp_indicator %d > NR_MAX_NUM_BWP Possibly due to false DCI. Ignoring DCI!\n", frame, slot,dci->bwp_indicator.val);
       return -1;
     }
     config_bwp_ue(mac, &dci->bwp_indicator.val, &dci_format);
@@ -1276,8 +1331,8 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
 
     /* dmrs symbol positions*/
     dlsch_config_pdu_1_1->dlDmrsSymbPos = fill_dmrs_mask(pdsch_Config,
-							 mac->scc? mac->scc->dmrs_TypeA_Position:mac->mib->dmrs_TypeA_Position,
-							 dlsch_config_pdu_1_1->number_symbols,
+                                                         mac->scc? mac->scc->dmrs_TypeA_Position:mac->mib->dmrs_TypeA_Position,
+                                                         dlsch_config_pdu_1_1->number_symbols,
                                                          dlsch_config_pdu_1_1->start_symbol,
                                                          mappingtype,
                                                          dlsch_config_pdu_1_1->n_front_load_symb);
@@ -1323,6 +1378,36 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
     dl_config->number_pdus = dl_config->number_pdus + 1;
     /* TODO same calculation for MCS table as done in UL */
     dlsch_config_pdu_1_1->mcs_table = (pdsch_Config->mcs_Table) ? (*pdsch_Config->mcs_Table + 1) : 0;
+    dlsch_config_pdu_1_1->qamModOrder = nr_get_Qm_dl(dlsch_config_pdu_1_1->mcs, dlsch_config_pdu_1_1->mcs_table);
+    int R = nr_get_code_rate_dl(dlsch_config_pdu_1_1->mcs, dlsch_config_pdu_1_1->mcs_table);
+    dlsch_config_pdu_1_1->targetCodeRate = R;
+    if (dlsch_config_pdu_1_1->targetCodeRate == 0 || dlsch_config_pdu_1_1->qamModOrder == 0) {
+      LOG_W(MAC, "Invalid code rate or Mod order, likely due to unexpected DL DCI.\n");
+      return -1;
+    }
+    uint8_t Nl = 0;
+    for (int i = 0; i < 12; i++) { // max 12 ports
+      if ((dlsch_config_pdu_1_1->dmrs_ports>>i)&0x01) Nl += 1;
+    }
+    int nb_rb_oh = 0; // it was not computed at UE side even before and set to 0 in nr_compute_tbs
+    int nb_re_dmrs = ((dmrs_type == NULL) ? 6:4)*dlsch_config_pdu_1_1->n_dmrs_cdm_groups;
+    dlsch_config_pdu_1_1->TBS = nr_compute_tbs(dlsch_config_pdu_1_1->qamModOrder,
+                                               R,
+                                               dlsch_config_pdu_1_1->number_rbs,
+                                               dlsch_config_pdu_1_1->number_symbols,
+                                               nb_re_dmrs*get_num_dmrs(dlsch_config_pdu_1_1->dlDmrsSymbPos),
+                                               nb_rb_oh, 0, Nl);
+
+    // TBS_LBRM according to section 5.4.2.1 of 38.212
+    long *maxMIMO_Layers = mac->cg->spCellConfig->spCellConfigDedicated->pdsch_ServingCellConfig->choice.setup->ext1->maxMIMO_Layers;
+    AssertFatal (maxMIMO_Layers != NULL,"Option with max MIMO layers not configured is not supported\n");
+    int nl_tbslbrm = *maxMIMO_Layers < 4 ? *maxMIMO_Layers : 4;
+    NR_BWP_t genericParameters = mac->scc ? mac->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters :
+                                            mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.genericParameters;
+    int bw_tbslbrm = get_bw_tbslbrm(&genericParameters, mac->cg);
+    dlsch_config_pdu_1_1->tbslbrm = nr_compute_tbslbrm(dlsch_config_pdu_1_1->mcs_table,
+			                               bw_tbslbrm,
+		                                       nl_tbslbrm);
     /*PTRS configuration */
     dlsch_config_pdu_1_1->pduBitmap = 0;
     if(pdsch_Config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS != NULL) {
@@ -1377,6 +1462,16 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
 
 }
 
+int8_t nr_ue_process_csirs_measurements(module_id_t module_id,
+                                        frame_t frame,
+                                        int slot,
+                                        fapi_nr_csirs_measurements_t *csirs_measurements) {
+  LOG_D(NR_MAC,"(%d.%d) Received CSI-RS measurements\n", frame, slot);
+  NR_UE_MAC_INST_t *mac = get_mac_inst(module_id);
+  memcpy(&mac->csirs_measurements, csirs_measurements, sizeof(*csirs_measurements));
+  return 0;
+}
+
 void set_harq_status(NR_UE_MAC_INST_t *mac,
                      uint8_t pucch_id,
                      uint8_t harq_id,
@@ -1435,13 +1530,12 @@ void nr_ue_configure_pucch(NR_UE_MAC_INST_t *mac,
   NR_BWP_UplinkCommon_t *initialUplinkBWP;
   if (mac->scc) initialUplinkBWP = mac->scc->uplinkConfigCommon->initialUplinkBWP;
   else          initialUplinkBWP = &mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP;
-  NR_BWP_Uplink_t *ubwp = mac->ULbwp[0];
-  if (mac->cg && ubwp &&
+  if (mac->cg && bwp_id > 1 && mac->ULbwp[bwp_id - 1] &&
       mac->cg->spCellConfig &&
       mac->cg->spCellConfig->spCellConfigDedicated &&
       mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
       mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP) {
-    scs = ubwp->bwp_Common->genericParameters.subcarrierSpacing;
+    scs = mac->ULbwp[bwp_id - 1]->bwp_Common->genericParameters.subcarrierSpacing;
   }
   else
     scs = initialUplinkBWP->genericParameters.subcarrierSpacing;
@@ -1925,7 +2019,7 @@ int find_pucch_resource_set(NR_UE_MAC_INST_t *mac, int uci_size) {
 *                processing slots of reception/transmission
 *                gNB_id identifier
 *
-* RETURN :       TRUE a valid resource has been found
+* RETURN :       true a valid resource has been found
 *
 * DESCRIPTION :  return tx harq process identifier for given transmission slot
 *                TS 38.213 9.2.1  PUCCH Resource Sets
@@ -2055,7 +2149,7 @@ uint8_t get_downlink_ack(NR_UE_MAC_INST_t *mac,
   int number_harq_feedback = 0;
   uint32_t dai_current = 0;
   uint32_t dai_max = 0;
-  bool two_transport_blocks = FALSE;
+  bool two_transport_blocks = false;
   int number_of_code_word = 1;
   int U_DAI_c = 0;
   int N_m_c_rx = 0;
@@ -2077,7 +2171,7 @@ uint8_t get_downlink_ack(NR_UE_MAC_INST_t *mac,
       bwpd->pdsch_Config->choice.setup &&
       bwpd->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI &&
       bwpd->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI[0] == 2) {
-    two_transport_blocks = TRUE;
+    two_transport_blocks = true;
     number_of_code_word = 2;
   }
 
@@ -2177,7 +2271,7 @@ uint8_t get_downlink_ack(NR_UE_MAC_INST_t *mac,
   * For a monitoring occasion of a PDCCH with DCI format 1_0 or DCI format 1_1 in at least one serving cell,
   * when a UE receives a PDSCH with one transport block and the value of higher layer parameter maxNrofCodeWordsScheduledByDCI is 2,
   * the HARQ-ACK response is associated with the first transport block and the UE generates a NACK for the second transport block
-  * if spatial bundling is not applied (HARQ-ACK-spatial-bundling-PUCCH = FALSE) and generates HARQ-ACK value of ACK for the second
+  * if spatial bundling is not applied (HARQ-ACK-spatial-bundling-PUCCH = false) and generates HARQ-ACK value of ACK for the second
   * transport block if spatial bundling is applied.
   */
 
@@ -2188,7 +2282,7 @@ uint8_t get_downlink_ack(NR_UE_MAC_INST_t *mac,
         ack_data[code_word][i] = 0;     /* nack data transport block which has been missed */
         number_harq_feedback++;
       }
-      if (two_transport_blocks == TRUE) {
+      if (two_transport_blocks == true) {
         dai_total[code_word][i] = dai[code_word][i]; /* for a single cell, dai_total is the same as dai of first cell */
       }
     }
@@ -2219,7 +2313,7 @@ uint8_t get_downlink_ack(NR_UE_MAC_INST_t *mac,
       o_ACK = o_ACK | (ack_data[1][m] << O_bit_number_cw1);
     }
 
-    if (two_transport_blocks == TRUE) {
+    if (two_transport_blocks == true) {
       O_bit_number_cw0 = (8 * j) + 2*(V_temp - 1);
     }
     else {
@@ -2234,7 +2328,7 @@ uint8_t get_downlink_ack(NR_UE_MAC_INST_t *mac,
     j = j + 1;
   }
 
-  if (two_transport_blocks == TRUE) {
+  if (two_transport_blocks == true) {
     O_ACK = 2 * ( 4 * j + V_temp2);  /* for two transport blocks */
   }
   else {
@@ -2263,17 +2357,16 @@ bool trigger_periodic_scheduling_request(NR_UE_MAC_INST_t *mac,
   NR_BWP_Id_t bwp_id = mac->UL_BWP_Id;
   NR_PUCCH_Config_t *pucch_Config = NULL;
   int scs;
-  NR_BWP_Uplink_t *ubwp = mac->ULbwp[0];
   NR_BWP_UplinkCommon_t *initialUplinkBWP;
   if (mac->scc) initialUplinkBWP = mac->scc->uplinkConfigCommon->initialUplinkBWP;
   else          initialUplinkBWP = &mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP;
 
-  if (mac->cg && ubwp &&
+  if (mac->cg && bwp_id && mac->ULbwp[bwp_id - 1] &&
       mac->cg->spCellConfig &&
       mac->cg->spCellConfig->spCellConfigDedicated &&
       mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
       mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP) {
-    scs = ubwp->bwp_Common->genericParameters.subcarrierSpacing;
+    scs = mac->ULbwp[bwp_id - 1]->bwp_Common->genericParameters.subcarrierSpacing;
   }
   else
     scs = initialUplinkBWP->genericParameters.subcarrierSpacing;
@@ -2356,11 +2449,9 @@ int8_t nr_ue_get_SR(module_id_t module_idP, frame_t frameP, slot_t slot){
     // start the sr-prohibittimer : rel 9 and above
     if (mac->scheduling_info.sr_ProhibitTimer > 0) { // timer configured
       mac->scheduling_info.sr_ProhibitTimer--;
-      mac->scheduling_info.
-      sr_ProhibitTimer_Running = 1;
+      mac->scheduling_info.sr_ProhibitTimer_Running = 1;
     } else {
-      mac->scheduling_info.
-      sr_ProhibitTimer_Running = 0;
+      mac->scheduling_info.sr_ProhibitTimer_Running = 0;
     }
     //mac->ul_active =1;
     return (1);   //instruct phy to signal SR
@@ -2408,7 +2499,7 @@ uint8_t nr_get_csi_measurements(NR_UE_MAC_INST_t *mac,
         csi_period_offset(csirep, NULL, &period, &offset);
 
         int scs;
-        NR_BWP_Uplink_t *ubwp = mac->ULbwp[0];
+        NR_BWP_Uplink_t *ubwp = mac->ULbwp[bwp_id-1];
         NR_BWP_UplinkCommon_t *initialUplinkBWP;
         if (mac->scc) initialUplinkBWP = mac->scc->uplinkConfigCommon->initialUplinkBWP;
         else          initialUplinkBWP = &mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP;
@@ -2483,13 +2574,18 @@ uint8_t nr_get_csi_payload(NR_UE_MAC_INST_t *mac,
     case NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP:
       n_csi_bits = get_ssb_rsrp_payload(mac,pucch,csi_reportconfig,csi_ResourceConfigId,csi_MeasConfig);
       break;
-    case NR_CSI_ReportConfig__reportQuantity_PR_cri_RSRP:
     case NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_PMI_CQI:
+      n_csi_bits = get_csirs_RI_PMI_CQI_payload(mac,pucch,csi_reportconfig,csi_ResourceConfigId,csi_MeasConfig);
+      break;
+    case NR_CSI_ReportConfig__reportQuantity_PR_cri_RSRP:
+      n_csi_bits = get_csirs_RSRP_payload(mac,pucch,csi_reportconfig,csi_ResourceConfigId,csi_MeasConfig);
+      break;
     case NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_i1:
     case NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_i1_CQI:
     case NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_CQI:
     case NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_LI_PMI_CQI:
-      AssertFatal(1==0,"Measurement report based on CSI-RS not availalble\n");
+      LOG_E(NR_MAC,"Measurement report %d based on CSI-RS is not available\n", csi_reportconfig->reportQuantity.present);
+      break;
     default:
       AssertFatal(1==0,"Invalid CSI report quantity type %d\n",csi_reportconfig->reportQuantity.present);
   }
@@ -2576,6 +2672,122 @@ uint8_t get_ssb_rsrp_payload(NR_UE_MAC_INST_t *mac,
   return bits;
 }
 
+uint8_t get_csirs_RI_PMI_CQI_payload(NR_UE_MAC_INST_t *mac,
+                                     PUCCH_sched_t *pucch,
+                                     struct NR_CSI_ReportConfig *csi_reportconfig,
+                                     NR_CSI_ResourceConfigId_t csi_ResourceConfigId,
+                                     NR_CSI_MeasConfig_t *csi_MeasConfig) {
+
+  int n_bits = 0;
+  uint32_t temp_payload = 0;
+
+  for (int csi_resourceidx = 0; csi_resourceidx < csi_MeasConfig->csi_ResourceConfigToAddModList->list.count; csi_resourceidx++) {
+
+    struct NR_CSI_ResourceConfig *csi_resourceconfig = csi_MeasConfig->csi_ResourceConfigToAddModList->list.array[csi_resourceidx];
+    if (csi_resourceconfig->csi_ResourceConfigId == csi_ResourceConfigId) {
+
+      for (int csi_idx = 0; csi_idx < csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.count; csi_idx++) {
+        if (csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.array[csi_idx]->nzp_CSI_ResourceSetId ==
+            *(csi_resourceconfig->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList->list.array[0])) {
+
+          nr_csi_report_t *csi_report = &mac->csi_report_template[csi_reportconfig->reportConfigId];
+          compute_csi_bitlen(csi_MeasConfig, mac->csi_report_template);
+          n_bits = nr_get_csi_bitlen(mac->csi_report_template, csi_reportconfig->reportConfigId);
+
+          int cri_bitlen = csi_report->csi_meas_bitlen.cri_bitlen;
+          int ri_bitlen = csi_report->csi_meas_bitlen.ri_bitlen;
+          int pmi_x1_bitlen = csi_report->csi_meas_bitlen.pmi_x1_bitlen[mac->csirs_measurements.rank_indicator];
+          int pmi_x2_bitlen = csi_report->csi_meas_bitlen.pmi_x2_bitlen[mac->csirs_measurements.rank_indicator];
+          int cqi_bitlen = csi_report->csi_meas_bitlen.cqi_bitlen[mac->csirs_measurements.rank_indicator];
+          int padding_bitlen = n_bits - (cri_bitlen + ri_bitlen + pmi_x1_bitlen + pmi_x2_bitlen + cqi_bitlen);
+
+          // TODO: Improvements will be needed to cri_bitlen>0 and pmi_x1_bitlen>0
+          temp_payload = (mac->csirs_measurements.rank_indicator<<(cri_bitlen+cqi_bitlen+pmi_x2_bitlen+padding_bitlen+pmi_x1_bitlen)) |
+                         (mac->csirs_measurements.i1<<(cri_bitlen+cqi_bitlen+pmi_x2_bitlen)) |
+                         (mac->csirs_measurements.i2<<(cri_bitlen+cqi_bitlen)) |
+                         (mac->csirs_measurements.cqi<<cri_bitlen) |
+                         0;
+
+          reverse_n_bits((uint8_t *)&temp_payload, n_bits);
+
+          LOG_D(NR_MAC, "cri_bitlen = %d\n", cri_bitlen);
+          LOG_D(NR_MAC, "ri_bitlen = %d\n", ri_bitlen);
+          LOG_D(NR_MAC, "pmi_x1_bitlen = %d\n", pmi_x1_bitlen);
+          LOG_D(NR_MAC, "pmi_x2_bitlen = %d\n", pmi_x2_bitlen);
+          LOG_D(NR_MAC, "cqi_bitlen = %d\n", cqi_bitlen);
+          LOG_D(NR_MAC, "csi_part1_payload = 0x%x\n", temp_payload);
+
+          LOG_D(NR_MAC, "n_bits = %d\n", n_bits);
+          LOG_D(NR_MAC, "csi_part1_payload = 0x%x\n", temp_payload);
+
+          break;
+        }
+      }
+    }
+  }
+  pucch->csi_part1_payload = temp_payload;
+  return n_bits;
+}
+
+uint8_t get_csirs_RSRP_payload(NR_UE_MAC_INST_t *mac,
+                               PUCCH_sched_t *pucch,
+                               struct NR_CSI_ReportConfig *csi_reportconfig,
+                               NR_CSI_ResourceConfigId_t csi_ResourceConfigId,
+                               NR_CSI_MeasConfig_t *csi_MeasConfig) {
+
+  int n_bits = 0;
+  uint32_t temp_payload = 0;
+
+  for (int csi_resourceidx = 0; csi_resourceidx < csi_MeasConfig->csi_ResourceConfigToAddModList->list.count; csi_resourceidx++) {
+
+    struct NR_CSI_ResourceConfig *csi_resourceconfig = csi_MeasConfig->csi_ResourceConfigToAddModList->list.array[csi_resourceidx];
+    if (csi_resourceconfig->csi_ResourceConfigId == csi_ResourceConfigId) {
+
+      for (int csi_idx = 0; csi_idx < csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.count; csi_idx++) {
+        if (csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.array[csi_idx]->nzp_CSI_ResourceSetId ==
+            *(csi_resourceconfig->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList->list.array[0])) {
+
+          nr_csi_report_t *csi_report = &mac->csi_report_template[csi_reportconfig->reportConfigId];
+          compute_csi_bitlen(csi_MeasConfig, mac->csi_report_template);
+          n_bits = nr_get_csi_bitlen(mac->csi_report_template, csi_reportconfig->reportConfigId);
+
+          int cri_ssbri_bitlen = csi_report->CSI_report_bitlen.cri_ssbri_bitlen;
+          int rsrp_bitlen = csi_report->CSI_report_bitlen.rsrp_bitlen;
+          int diff_rsrp_bitlen = csi_report->CSI_report_bitlen.diff_rsrp_bitlen;
+
+          if (cri_ssbri_bitlen > 0) {
+            LOG_E(NR_MAC, "Implementation for cri_ssbri_bitlen>0 is not supported yet!\n");;
+          }
+
+          // TODO: Improvements will be needed to cri_ssbri_bitlen>0
+          // TS 38.133 - Table 10.1.6.1-1
+          int rsrp_dBm = mac->csirs_measurements.rsrp_dBm;
+          if (rsrp_dBm < -140) {
+            temp_payload = 16;
+          } else if (rsrp_dBm > -44) {
+            temp_payload = 113;
+          } else {
+            temp_payload = mac->csirs_measurements.rsrp_dBm + 157;
+          }
+
+          reverse_n_bits((uint8_t *)&temp_payload, n_bits);
+
+          LOG_D(NR_MAC, "cri_ssbri_bitlen = %d\n", cri_ssbri_bitlen);
+          LOG_D(NR_MAC, "rsrp_bitlen = %d\n", rsrp_bitlen);
+          LOG_D(NR_MAC, "diff_rsrp_bitlen = %d\n", diff_rsrp_bitlen);
+
+          LOG_D(NR_MAC, "n_bits = %d\n", n_bits);
+          LOG_D(NR_MAC, "csi_part1_payload = 0x%x\n", temp_payload);
+
+          break;
+        }
+      }
+    }
+  }
+
+  pucch->csi_part1_payload = temp_payload;
+  return n_bits;
+}
 
 // returns index from RSRP
 // according to Table 10.1.6.1-1 in 38.133
@@ -2631,14 +2843,14 @@ void nr_ue_send_sdu(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_t *u
 int get_n_rb(NR_UE_MAC_INST_t *mac, int rnti_type){
 
   int N_RB = 0, start_RB;
+  NR_BWP_Id_t dl_bwp_id = mac->DL_BWP_Id;
   switch(rnti_type) {
     case NR_RNTI_RA:
     case NR_RNTI_TC:
     case NR_RNTI_P: {
-      NR_BWP_Id_t dl_bwp_id = mac->DL_BWP_Id;
       if (mac->DLbwp[dl_bwp_id-1]->bwp_Common->pdcch_ConfigCommon->choice.setup->controlResourceSetZero) {
         uint8_t coreset_id = 0; // assuming controlResourceSetId is 0 for controlResourceSetZero
-        NR_ControlResourceSet_t *coreset = mac->coreset[dl_bwp_id-1][coreset_id];
+        NR_ControlResourceSet_t *coreset = mac->coreset[dl_bwp_id][coreset_id];
         get_coreset_rballoc(coreset->frequencyDomainResources.buf,&N_RB,&start_RB);
       } else {
         N_RB = NRRIV2BW(mac->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
@@ -2649,14 +2861,14 @@ int get_n_rb(NR_UE_MAC_INST_t *mac, int rnti_type){
       N_RB = mac->type0_PDCCH_CSS_config.num_rbs;
       break;
     case NR_RNTI_C:
-      N_RB = NRRIV2BW(mac->DLbwp[0]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
+      N_RB = NRRIV2BW(mac->DLbwp[dl_bwp_id-1]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
       break;
   }
   return N_RB;
 
 }
 
-uint8_t nr_extract_dci_info(NR_UE_MAC_INST_t *mac,
+static uint8_t nr_extract_dci_info(NR_UE_MAC_INST_t *mac,
                             uint8_t dci_format,
                             uint8_t dci_size,
                             uint16_t rnti,
@@ -2668,14 +2880,16 @@ uint8_t nr_extract_dci_info(NR_UE_MAC_INST_t *mac,
   int fsize = 0;
 
   int rnti_type = get_rnti_type(mac, rnti);
+  NR_BWP_Id_t dl_bwp_id =  mac->DL_BWP_Id ;
+  NR_BWP_Id_t ul_bwp_id =  mac->UL_BWP_Id ;
 
   int N_RB_UL = 0;
-  if(mac->scc_SIB) {
-    N_RB_UL = NRRIV2BW(mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
-  } else if(mac->ULbwp[0]) {
-    N_RB_UL = NRRIV2BW(mac->ULbwp[0]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
+  if(ul_bwp_id > 0 && mac->ULbwp[ul_bwp_id-1]) {
+    N_RB_UL = NRRIV2BW(mac->ULbwp[ul_bwp_id - 1]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
   } else if(mac->scc) {
     N_RB_UL = NRRIV2BW(mac->scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
+  } else if(mac->scc_SIB) {
+    N_RB_UL = NRRIV2BW(mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
   }
 
   LOG_D(MAC,"nr_extract_dci_info : dci_pdu %lx, size %d\n",*dci_pdu,dci_size);
@@ -2739,7 +2953,7 @@ uint8_t nr_extract_dci_info(NR_UE_MAC_INST_t *mac,
 #endif
 
       // check BWP id
-      if (mac->DLbwp[0]) N_RB=NRRIV2BW(mac->DLbwp[0]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
+      if (dl_bwp_id>0 && mac->DLbwp[dl_bwp_id-1]) N_RB=NRRIV2BW(mac->DLbwp[dl_bwp_id-1]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
       else         N_RB=NRRIV2BW(mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
 
       // Freq domain assignment (275rb >> fsize = 16)
@@ -2922,7 +3136,7 @@ uint8_t nr_extract_dci_info(NR_UE_MAC_INST_t *mac,
     case NR_RNTI_TC:
 
       // check BWP id
-      if (mac->DLbwp[0]) N_RB=NRRIV2BW(mac->DLbwp[0]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
+      if (dl_bwp_id>0 && mac->DLbwp[dl_bwp_id-1]) N_RB=NRRIV2BW(mac->DLbwp[dl_bwp_id-1]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
       else         N_RB=mac->type0_PDCCH_CSS_config.num_rbs;
 
 
@@ -3004,7 +3218,7 @@ uint8_t nr_extract_dci_info(NR_UE_MAC_INST_t *mac,
     break;
   
   case NR_UL_DCI_FORMAT_0_0:
-    if (mac->ULbwp[0]) N_RB_UL=NRRIV2BW(mac->ULbwp[0]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
+    if (mac->ULbwp[ul_bwp_id-1]) N_RB_UL=NRRIV2BW(mac->ULbwp[ul_bwp_id-1]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
     else         N_RB_UL=NRRIV2BW(mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
 
     switch(rnti_type)
@@ -3502,7 +3716,7 @@ void nr_ue_process_mac_pdu(nr_downlink_indication_t *dl_info,
         #endif
         */
 
-                LOG_I(NR_MAC, "[%d.%d] Received TA_COMMAND %u TAGID %u CC_id %d\n", frameP, slot, ul_time_alignment->ta_command, ul_time_alignment->tag_id, CC_id);
+        LOG_I(NR_MAC, "[%d.%d] Received TA_COMMAND %u TAGID %u CC_id %d\n", frameP, slot, ul_time_alignment->ta_command, ul_time_alignment->tag_id, CC_id);
 
         break;
       case DL_SCH_LCID_CON_RES_ID:
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
index 0afad893d750a4cc7a2c05ecf43ca9ba2e58004d..8605550593ec5adf42e3628d4ab05e7fd2496bb9 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
@@ -44,6 +44,7 @@
 
 /* MAC */
 #include "NR_MAC_COMMON/nr_mac.h"
+#include "NR_MAC_COMMON/nr_mac_common.h"
 #include "NR_MAC_UE/mac_proto.h"
 #include "NR_MAC_UE/mac_extern.h"
 
@@ -114,18 +115,21 @@ void fill_scheduled_response(nr_scheduled_response_t *scheduled_response,
  */
 long get_k2(NR_UE_MAC_INST_t *mac, uint8_t time_domain_ind) {
   long k2 = -1;
+
+  NR_BWP_Id_t ul_bwp_id = mac->UL_BWP_Id;
   // Get K2 from RRC configuration
-  NR_PUSCH_Config_t *pusch_config=mac->ULbwp[0] ? mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup : NULL;
+  NR_PUSCH_Config_t *pusch_config= ul_bwp_id > 0 && mac->ULbwp[ul_bwp_id-1] ? mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pusch_Config->choice.setup : NULL;
   NR_PUSCH_TimeDomainResourceAllocationList_t *pusch_TimeDomainAllocationList = NULL;
   if (pusch_config && pusch_config->pusch_TimeDomainAllocationList) {
     pusch_TimeDomainAllocationList = pusch_config->pusch_TimeDomainAllocationList->choice.setup;
   }
-  else if (mac->ULbwp[0] &&
-	   mac->ULbwp[0]->bwp_Common&&
-	   mac->ULbwp[0]->bwp_Common->pusch_ConfigCommon&&
-	   mac->ULbwp[0]->bwp_Common->pusch_ConfigCommon->choice.setup &&
-	   mac->ULbwp[0]->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList) {
-    pusch_TimeDomainAllocationList = mac->ULbwp[0]->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
+  else if (ul_bwp_id > 0 &&
+	   mac->ULbwp[ul_bwp_id-1] &&
+	   mac->ULbwp[ul_bwp_id-1]->bwp_Common&&
+	   mac->ULbwp[ul_bwp_id-1]->bwp_Common->pusch_ConfigCommon&&
+	   mac->ULbwp[ul_bwp_id-1]->bwp_Common->pusch_ConfigCommon->choice.setup &&
+	   mac->ULbwp[ul_bwp_id-1]->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList) {
+    pusch_TimeDomainAllocationList = mac->ULbwp[ul_bwp_id-1]->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
   }
   else if (mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList)
     pusch_TimeDomainAllocationList=mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
@@ -154,6 +158,7 @@ long get_k2(NR_UE_MAC_INST_t *mac, uint8_t time_domain_ind) {
  */
 fapi_nr_ul_config_request_t *get_ul_config_request(NR_UE_MAC_INST_t *mac, int slot)
 {
+  NR_BWP_Id_t ul_bwp_id = mac->UL_BWP_Id;
   NR_TDD_UL_DL_ConfigCommon_t *tdd_config = mac->scc==NULL ? mac->scc_SIB->tdd_UL_DL_ConfigurationCommon : mac->scc->tdd_UL_DL_ConfigurationCommon;
 
   //Check if request to access ul_config is for a UL slot
@@ -165,8 +170,8 @@ fapi_nr_ul_config_request_t *get_ul_config_request(NR_UE_MAC_INST_t *mac, int sl
   // Calculate the index of the UL slot in mac->ul_config_request list. This is
   // based on the TDD pattern (slot configuration period) and number of UL+mixed
   // slots in the period. TS 38.213 Sec 11.1
-  int mu = mac->ULbwp[0] ?
-    mac->ULbwp[0]->bwp_Common->genericParameters.subcarrierSpacing :
+  int mu = ul_bwp_id > 0 && mac->ULbwp[ul_bwp_id-1] ?
+    mac->ULbwp[ul_bwp_id-1]->bwp_Common->genericParameters.subcarrierSpacing :
     mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.genericParameters.subcarrierSpacing;
   const int n = nr_slots_per_frame[mu];
   const int num_slots_per_tdd = tdd_config ? (n >> (7 - tdd_config->pattern1.dl_UL_TransmissionPeriodicity)) : n;
@@ -188,17 +193,21 @@ fapi_nr_ul_config_request_t *get_ul_config_request(NR_UE_MAC_INST_t *mac, int sl
 void ul_layers_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_config_pdu, dci_pdu_rel15_t *dci) {
 
   NR_ServingCellConfigCommon_t *scc = mac->scc;
+  NR_BWP_Id_t ul_bwp_id = mac->UL_BWP_Id;
   NR_BWP_UplinkDedicated_t *ubwpd=NULL;
+  NR_SRS_Config_t *srs_config = NULL;
 
   if (mac->cg &&
       mac->cg->spCellConfig &&
       mac->cg->spCellConfig->spCellConfigDedicated &&
       mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
-      mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP)
+      mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP) {
     ubwpd = mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP;
+    srs_config = mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->srs_Config->choice.setup;
+  }
 
-  NR_PUSCH_Config_t *pusch_Config = mac->ULbwp[0] ?
-    mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup :
+  NR_PUSCH_Config_t *pusch_Config = ul_bwp_id > 0 && mac->ULbwp[ul_bwp_id-1] ?
+    mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pusch_Config->choice.setup :
     (ubwpd?
      ubwpd->pusch_Config->choice.setup:
      NULL);
@@ -212,7 +221,7 @@ void ul_layers_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_con
     else
       transformPrecoder = NR_PUSCH_Config__transformPrecoder_disabled;
   }
-
+  pusch_config_pdu->transform_precoding = transformPrecoder;
 
   /* PRECOD_NBR_LAYERS */
   if ((*pusch_Config->txConfig == NR_PUSCH_Config__txConfig_nonCodebook));
@@ -220,11 +229,14 @@ void ul_layers_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_con
 
   if ((*pusch_Config->txConfig == NR_PUSCH_Config__txConfig_codebook)){
 
-    uint8_t n_antenna_port = 0; //FIXME!!!
+    // The UE shall transmit PUSCH using the same antenna port(s) as the SRS port(s) in the SRS resource indicated by the DCI format 0_1
+    // 38.214  Section 6.1.1
+
+    uint8_t n_antenna_port = get_pusch_nb_antenna_ports(pusch_Config, srs_config, dci->srs_resource_indicator);
 
     if (n_antenna_port == 1); // 1 antenna port and the higher layer parameter txConfig = codebook 0 bits
 
-    if (n_antenna_port == 4){ // 4 antenna port and the higher layer parameter txConfig = codebook
+    if (n_antenna_port == 4) { // 4 antenna port and the higher layer parameter txConfig = codebook
 
       // Table 7.3.1.1.2-2: transformPrecoder=disabled and maxRank = 2 or 3 or 4
       if ((transformPrecoder == NR_PUSCH_Config__transformPrecoder_disabled)
@@ -234,54 +246,54 @@ void ul_layers_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_con
 
         if (*pusch_Config->codebookSubset == NR_PUSCH_Config__codebookSubset_fullyAndPartialAndNonCoherent) {
           pusch_config_pdu->nrOfLayers = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][0];
-          pusch_config_pdu->transform_precoding = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][1];
+          pusch_config_pdu->Tpmi = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][1];
         }
 
         if (*pusch_Config->codebookSubset == NR_PUSCH_Config__codebookSubset_partialAndNonCoherent){
           pusch_config_pdu->nrOfLayers = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][2];
-          pusch_config_pdu->transform_precoding = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][3];
+          pusch_config_pdu->Tpmi = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][3];
         }
 
         if (*pusch_Config->codebookSubset == NR_PUSCH_Config__codebookSubset_nonCoherent){
           pusch_config_pdu->nrOfLayers = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][4];
-          pusch_config_pdu->transform_precoding = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][5];
+          pusch_config_pdu->Tpmi = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][5];
         }
       }
 
       // Table 7.3.1.1.2-3: transformPrecoder= enabled, or transformPrecoder=disabled and maxRank = 1
       if (((transformPrecoder == NR_PUSCH_Config__transformPrecoder_enabled)
         || (transformPrecoder == NR_PUSCH_Config__transformPrecoder_disabled))
-        && (*pusch_Config->maxRank == 1)){
+        && (*pusch_Config->maxRank == 1)) {
 
         if (*pusch_Config->codebookSubset == NR_PUSCH_Config__codebookSubset_fullyAndPartialAndNonCoherent) {
           pusch_config_pdu->nrOfLayers = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][6];
-          pusch_config_pdu->transform_precoding = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][7];
+          pusch_config_pdu->Tpmi = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][7];
         }
 
         if (*pusch_Config->codebookSubset == NR_PUSCH_Config__codebookSubset_partialAndNonCoherent){
           pusch_config_pdu->nrOfLayers = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][8];
-          pusch_config_pdu->transform_precoding = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][9];
+          pusch_config_pdu->Tpmi = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][9];
         }
 
         if (*pusch_Config->codebookSubset == NR_PUSCH_Config__codebookSubset_nonCoherent){
           pusch_config_pdu->nrOfLayers = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][10];
-          pusch_config_pdu->transform_precoding = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][11];
+          pusch_config_pdu->Tpmi = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][11];
         }
       }
     }
 
-    if (n_antenna_port == 4){ // 2 antenna port and the higher layer parameter txConfig = codebook
+    if (n_antenna_port == 2) {
+      // 2 antenna port and the higher layer parameter txConfig = codebook
       // Table 7.3.1.1.2-4: transformPrecoder=disabled and maxRank = 2
-      if ((transformPrecoder == NR_PUSCH_Config__transformPrecoder_disabled) && (*pusch_Config->maxRank == 2)){
-
+      if ((transformPrecoder == NR_PUSCH_Config__transformPrecoder_disabled) && (*pusch_Config->maxRank == 2)) {
         if (*pusch_Config->codebookSubset == NR_PUSCH_Config__codebookSubset_fullyAndPartialAndNonCoherent) {
           pusch_config_pdu->nrOfLayers = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][12];
-          pusch_config_pdu->transform_precoding = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][13];
+          pusch_config_pdu->Tpmi = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][13];
         }
 
         if (*pusch_Config->codebookSubset == NR_PUSCH_Config__codebookSubset_nonCoherent){
           pusch_config_pdu->nrOfLayers = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][14];
-          pusch_config_pdu->transform_precoding = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][15];
+          pusch_config_pdu->Tpmi = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][15];
         }
 
       }
@@ -289,16 +301,16 @@ void ul_layers_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_con
       // Table 7.3.1.1.2-5: transformPrecoder= enabled, or transformPrecoder= disabled and maxRank = 1
       if (((transformPrecoder == NR_PUSCH_Config__transformPrecoder_enabled)
         || (transformPrecoder == NR_PUSCH_Config__transformPrecoder_disabled))
-        && (*pusch_Config->maxRank == 1)){
+        && (*pusch_Config->maxRank == 1)) {
 
         if (*pusch_Config->codebookSubset == NR_PUSCH_Config__codebookSubset_fullyAndPartialAndNonCoherent) {
           pusch_config_pdu->nrOfLayers = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][16];
-          pusch_config_pdu->transform_precoding = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][17];
+          pusch_config_pdu->Tpmi = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][17];
         }
 
         if (*pusch_Config->codebookSubset == NR_PUSCH_Config__codebookSubset_nonCoherent){
           pusch_config_pdu->nrOfLayers = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][18];
-          pusch_config_pdu->transform_precoding = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][19];
+          pusch_config_pdu->Tpmi = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][19];
         }
 
       }
@@ -307,9 +319,9 @@ void ul_layers_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_con
 
   /*-------------------- Changed to enable Transform precoding in RF SIM------------------------------------------------*/
 
- /*if (pusch_config_pdu->transform_precoding == transform_precoder_enabled) {
+ /*if (pusch_config_pdu->transformPrecoder == transformPrecoder_enabled) {
 
-    pusch_config_dedicated->transform_precoder = transform_precoder_enabled;
+    pusch_config_dedicated->transform_precoder = transformPrecoder_enabled;
 
     if(pusch_Config->dmrs_UplinkForPUSCH_MappingTypeA != NULL) {
 
@@ -331,15 +343,15 @@ void ul_layers_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_con
 
     }
   } else
-    pusch_config_dedicated->transform_precoder = transform_precoder_disabled;*/
+    pusch_config_dedicated->transformPrecoder = ttransformPrecoder_disabled;*/
 }
 
 // todo: this function shall be reviewed completely because of the many comments left by the author
-void ul_ports_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_config_pdu, dci_pdu_rel15_t *dci) {
+void ul_ports_config(NR_UE_MAC_INST_t *mac, int *n_front_load_symb, nfapi_nr_ue_pusch_pdu_t *pusch_config_pdu, dci_pdu_rel15_t *dci) {
 
-  /* ANTENNA_PORTS */
-  uint8_t rank = 1; // We need to initialize rank FIXME!!!
+  uint8_t rank = pusch_config_pdu->nrOfLayers;
 
+  NR_BWP_Id_t ul_bwp_id = mac->UL_BWP_Id;
   NR_ServingCellConfigCommon_t *scc = mac->scc;
   NR_BWP_UplinkDedicated_t *ubwpd=NULL;
 
@@ -350,7 +362,7 @@ void ul_ports_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_conf
       mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP)
     ubwpd = mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP;
 
-  NR_PUSCH_Config_t *pusch_Config = mac->ULbwp[0] ? mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup : (ubwpd?ubwpd->pusch_Config->choice.setup:NULL);
+  NR_PUSCH_Config_t *pusch_Config = ul_bwp_id > 0 && mac->ULbwp[ul_bwp_id-1] ? mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pusch_Config->choice.setup : (ubwpd?ubwpd->pusch_Config->choice.setup:NULL);
   AssertFatal(pusch_Config!=NULL,"pusch_Config shouldn't be null\n");
 
   long	transformPrecoder;
@@ -375,51 +387,44 @@ void ul_ports_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_conf
     dmrs_type = pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->dmrs_Type;
   }
 
-  LOG_D(NR_MAC,"MappingType%s max_length %s, dmrs_type %s, antenna_ports %d\n",pusch_Config->dmrs_UplinkForPUSCH_MappingTypeA?"A":"B",max_length?"len2":"len1",dmrs_type?"type2":"type1",dci->antenna_ports.val);
+  LOG_D(NR_MAC,"MappingType%s max_length %s, dmrs_type %s, antenna_ports %d\n",
+        pusch_Config->dmrs_UplinkForPUSCH_MappingTypeA?"A":"B",max_length?"len2":"len1",dmrs_type?"type2":"type1",dci->antenna_ports.val);
+
   if ((transformPrecoder == NR_PUSCH_Config__transformPrecoder_enabled) &&
-    (dmrs_type == NULL) && (max_length == NULL)) { // tables 7.3.1.1.2-6
-      pusch_config_pdu->num_dmrs_cdm_grps_no_data = 2; //TBC
-      pusch_config_pdu->dmrs_ports = dci->antenna_ports.val; //TBC
+      (dmrs_type == NULL) && (max_length == NULL)) { // tables 7.3.1.1.2-6
+      pusch_config_pdu->num_dmrs_cdm_grps_no_data = 2;
+      pusch_config_pdu->dmrs_ports = 1<<dci->antenna_ports.val;
   }
 
   if ((transformPrecoder == NR_PUSCH_Config__transformPrecoder_enabled) &&
-    (dmrs_type == NULL) && (max_length != NULL)) { // tables 7.3.1.1.2-7
+      (dmrs_type == NULL) && (max_length != NULL)) { // tables 7.3.1.1.2-7
 
     pusch_config_pdu->num_dmrs_cdm_grps_no_data = 2; //TBC
-    pusch_config_pdu->dmrs_ports = (dci->antenna_ports.val > 3)?(dci->antenna_ports.val-4):(dci->antenna_ports.val); //TBC
-    //pusch_config_pdu->n_front_load_symb = (dci->antenna_ports > 3)?2:1; //FIXME
+    pusch_config_pdu->dmrs_ports = 1<<((dci->antenna_ports.val > 3)?(dci->antenna_ports.val-4):(dci->antenna_ports.val));
+    *n_front_load_symb = (dci->antenna_ports.val > 3)?2:1;
   }
 
   if ((transformPrecoder == NR_PUSCH_Config__transformPrecoder_disabled) &&
     (dmrs_type == NULL) && (max_length == NULL)) { // tables 7.3.1.1.2-8/9/10/11
 
     if (rank == 1) {
-      pusch_config_pdu->num_dmrs_cdm_grps_no_data = (dci->antenna_ports.val > 1)?2:1; //TBC
-      pusch_config_pdu->dmrs_ports = (dci->antenna_ports.val > 1)?(dci->antenna_ports.val-2):(dci->antenna_ports.val); //TBC
+      pusch_config_pdu->num_dmrs_cdm_grps_no_data = (dci->antenna_ports.val > 1)?2:1;
+      pusch_config_pdu->dmrs_ports =1<<((dci->antenna_ports.val > 1)?(dci->antenna_ports.val-2):(dci->antenna_ports.val));
     }
 
     if (rank == 2){
-      pusch_config_pdu->num_dmrs_cdm_grps_no_data = (dci->antenna_ports.val > 0)?2:1; //TBC
-      pusch_config_pdu->dmrs_ports = 0; //FIXME
-      //pusch_config_pdu->dmrs_ports[0] = (dci->antenna_ports > 1)?(dci->antenna_ports > 2 ?0:2):0;
-      //pusch_config_pdu->dmrs_ports[1] = (dci->antenna_ports > 1)?(dci->antenna_ports > 2 ?2:3):1;
+      pusch_config_pdu->num_dmrs_cdm_grps_no_data = (dci->antenna_ports.val > 0)?2:1;
+      pusch_config_pdu->dmrs_ports = (dci->antenna_ports.val > 1)?((dci->antenna_ports.val> 2)?0x5:0xc):0x3;
     }
 
     if (rank == 3){
-      pusch_config_pdu->num_dmrs_cdm_grps_no_data = 2; //TBC
-      pusch_config_pdu->dmrs_ports = 0; //FIXME
-      //pusch_config_pdu->dmrs_ports[0] = 0;
-      //pusch_config_pdu->dmrs_ports[1] = 1;
-      //pusch_config_pdu->dmrs_ports[2] = 2;
+      pusch_config_pdu->num_dmrs_cdm_grps_no_data = 2;
+      pusch_config_pdu->dmrs_ports = 0x7;  // ports 0-2
     }
 
     if (rank == 4){
-      pusch_config_pdu->num_dmrs_cdm_grps_no_data = 2; //TBC
-      pusch_config_pdu->dmrs_ports = 0; //FIXME
-      //pusch_config_pdu->dmrs_ports[0] = 0;
-      //pusch_config_pdu->dmrs_ports[1] = 1;
-      //pusch_config_pdu->dmrs_ports[2] = 2;
-      //pusch_config_pdu->dmrs_ports[3] = 3;
+      pusch_config_pdu->num_dmrs_cdm_grps_no_data = 2;
+      pusch_config_pdu->dmrs_ports = 0xf;  // ports 0-3
     }
   }
 
@@ -428,8 +433,8 @@ void ul_ports_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_conf
 
     if (rank == 1){
       pusch_config_pdu->num_dmrs_cdm_grps_no_data = (dci->antenna_ports.val > 1)?2:1; //TBC
-      pusch_config_pdu->dmrs_ports = (dci->antenna_ports.val > 1)?(dci->antenna_ports.val > 5 ?(dci->antenna_ports.val-6):(dci->antenna_ports.val-2)):dci->antenna_ports.val; //TBC
-      //pusch_config_pdu->n_front_load_symb = (dci->antenna_ports.val > 6)?2:1; //FIXME
+      pusch_config_pdu->dmrs_ports = 1<<((dci->antenna_ports.val > 1)?(dci->antenna_ports.val > 5 ?(dci->antenna_ports.val-6):(dci->antenna_ports.val-2)):dci->antenna_ports.val);
+      *n_front_load_symb = (dci->antenna_ports.val > 6)?2:1;
     }
 
     if (rank == 2){
@@ -437,7 +442,7 @@ void ul_ports_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_conf
       pusch_config_pdu->dmrs_ports = 0; //FIXME
       //pusch_config_pdu->dmrs_ports[0] = table_7_3_1_1_2_13[dci->antenna_ports.val][1];
       //pusch_config_pdu->dmrs_ports[1] = table_7_3_1_1_2_13[dci->antenna_ports.val][2];
-      //pusch_config_pdu->n_front_load_symb = (dci->antenna_ports.val > 3)?2:1; // FIXME
+      //n_front_load_symb = (dci->antenna_ports.val > 3)?2:1; // FIXME
     }
 
     if (rank == 3){
@@ -446,7 +451,7 @@ void ul_ports_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_conf
       //pusch_config_pdu->dmrs_ports[0] = table_7_3_1_1_2_14[dci->antenna_ports.val][1];
       //pusch_config_pdu->dmrs_ports[1] = table_7_3_1_1_2_14[dci->antenna_ports.val][2];
       //pusch_config_pdu->dmrs_ports[2] = table_7_3_1_1_2_14[dci->antenna_ports.val][3];
-      //pusch_config_pdu->n_front_load_symb = (dci->antenna_ports.val > 1)?2:1; //FIXME
+      //n_front_load_symb = (dci->antenna_ports.val > 1)?2:1; //FIXME
     }
 
     if (rank == 4){
@@ -456,7 +461,7 @@ void ul_ports_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_conf
       //pusch_config_pdu->dmrs_ports[1] = table_7_3_1_1_2_15[dci->antenna_ports.val][2];
       //pusch_config_pdu->dmrs_ports[2] = table_7_3_1_1_2_15[dci->antenna_ports.val][3];
       //pusch_config_pdu->dmrs_ports[3] = table_7_3_1_1_2_15[dci->antenna_ports.val][4];
-      //pusch_config_pdu->n_front_load_symb = (dci->antenna_ports.val > 1)?2:1; //FIXME
+      //n_front_load_symb = (dci->antenna_ports.val > 1)?2:1; //FIXME
     }
   }
 
@@ -500,7 +505,7 @@ void ul_ports_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_conf
     if (rank == 1){
       pusch_config_pdu->num_dmrs_cdm_grps_no_data = table_7_3_1_1_2_20[dci->antenna_ports.val][0]; //TBC
       pusch_config_pdu->dmrs_ports = table_7_3_1_1_2_20[dci->antenna_ports.val][1]; //TBC
-      //pusch_config_pdu->n_front_load_symb = table_7_3_1_1_2_20[dci->antenna_ports.val][2]; //FIXME
+      //n_front_load_symb = table_7_3_1_1_2_20[dci->antenna_ports.val][2]; //FIXME
     }
 
     if (rank == 2){
@@ -508,7 +513,7 @@ void ul_ports_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_conf
       pusch_config_pdu->dmrs_ports = 0; //FIXME
       //pusch_config_pdu->dmrs_ports[0] = table_7_3_1_1_2_21[dci->antenna_ports.val][1];
       //pusch_config_pdu->dmrs_ports[1] = table_7_3_1_1_2_21[dci->antenna_ports.val][2];
-      //pusch_config_pdu->n_front_load_symb = table_7_3_1_1_2_21[dci->antenna_ports.val][3]; //FIXME
+      //n_front_load_symb = table_7_3_1_1_2_21[dci->antenna_ports.val][3]; //FIXME
       }
 
     if (rank == 3){
@@ -517,7 +522,7 @@ void ul_ports_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_conf
       //pusch_config_pdu->dmrs_ports[0] = table_7_3_1_1_2_22[dci->antenna_ports.val][1];
       //pusch_config_pdu->dmrs_ports[1] = table_7_3_1_1_2_22[dci->antenna_ports.val][2];
       //pusch_config_pdu->dmrs_ports[2] = table_7_3_1_1_2_22[dci->antenna_ports.val][3];
-      //pusch_config_pdu->n_front_load_symb = table_7_3_1_1_2_22[dci->antenna_ports.val][4]; //FIXME
+      //n_front_load_symb = table_7_3_1_1_2_22[dci->antenna_ports.val][4]; //FIXME
     }
 
     if (rank == 4){
@@ -527,7 +532,7 @@ void ul_ports_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_conf
       //pusch_config_pdu->dmrs_ports[1] = table_7_3_1_1_2_23[dci->antenna_ports.val][2];
       //pusch_config_pdu->dmrs_ports[2] = table_7_3_1_1_2_23[dci->antenna_ports.val][3];
       //pusch_config_pdu->dmrs_ports[3] = table_7_3_1_1_2_23[dci->antenna_ports.val][4];
-      //pusch_config_pdu->n_front_load_symb = table_7_3_1_1_2_23[dci->antenna_ports.val][5]; //FIXME
+      //n_front_load_symb = table_7_3_1_1_2_23[dci->antenna_ports.val][5]; //FIXME
     }
   }
   LOG_D(NR_MAC,"num_dmrs_cdm_grps_no_data %d, dmrs_ports %d\n",pusch_config_pdu->num_dmrs_cdm_grps_no_data,pusch_config_pdu->dmrs_ports);
@@ -559,23 +564,25 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
   int                N_PRB_oh  = 0;
 
   int rnti_type = get_rnti_type(mac, rnti);
+  NR_BWP_Id_t ul_bwp_id = mac->UL_BWP_Id;
 
   // Common configuration
   pusch_config_pdu->dmrs_config_type = pusch_dmrs_type1;
   pusch_config_pdu->pdu_bit_map      = PUSCH_PDU_BITMAP_PUSCH_DATA;
   pusch_config_pdu->nrOfLayers       = 1;
+  pusch_config_pdu->Tpmi             = 0;
   pusch_config_pdu->rnti             = rnti;
   NR_BWP_UplinkCommon_t *initialUplinkBWP;
   if (mac->scc) initialUplinkBWP = mac->scc->uplinkConfigCommon->initialUplinkBWP;
   else          initialUplinkBWP = &mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP;
 
   pusch_dmrs_AdditionalPosition_t add_pos = pusch_dmrs_pos2;
-  pusch_maxLength_t dmrslength = pusch_len1;
+  int dmrslength = 1;
 
   if (rar_grant) {
 
     // Note: for Msg3 or MsgA PUSCH transmission the N_PRB_oh is always set to 0
-    NR_BWP_Uplink_t *ubwp = mac->ULbwp[0];
+    NR_BWP_Uplink_t *ubwp = ul_bwp_id > 0 ? mac->ULbwp[ul_bwp_id - 1] : NULL;
     NR_BWP_UplinkDedicated_t *ibwp;
     int scs,abwp_start,abwp_size,startSymbolAndLength,mappingtype;
     NR_PUSCH_Config_t *pusch_Config=NULL;
@@ -686,13 +693,12 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
 
     int target_ss;
     bool valid_ptrs_setup = 0;
-    uint16_t n_RB_ULBWP;
-    n_RB_ULBWP = NRRIV2BW(ubwpc->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
+
+    uint16_t n_RB_ULBWP = NRRIV2BW(ubwpc->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
     pusch_config_pdu->bwp_start = NRRIV2PRBOFFSET(ubwpc->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
     pusch_config_pdu->bwp_size = n_RB_ULBWP;
 
-    AssertFatal(ubwpd->pusch_Config != NULL,"pusch_Config shouldn't be null\n");
-    NR_PUSCH_Config_t *pusch_Config = ubwpd->pusch_Config->choice.setup;
+    const NR_PUSCH_Config_t *pusch_Config = ubwpd? ubwpd->pusch_Config->choice.setup : NULL;
 
     // Basic sanity check for MCS value to check for a false or erroneous DCI
     if (dci->mcs > 28) {
@@ -713,11 +719,12 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
     } else if (*dci_format == NR_UL_DCI_FORMAT_0_1) {
 
       config_bwp_ue(mac, &dci->bwp_indicator.val, dci_format);
+
       get_bwp_info(mac,dl_bwp_id,ul_bwp_id,&bwpd,&bwpc,&ubwpd,&ubwpc);
 
       target_ss = NR_SearchSpace__searchSpaceType_PR_ue_Specific;
       ul_layers_config(mac, pusch_config_pdu, dci);
-      ul_ports_config(mac, pusch_config_pdu, dci);
+      ul_ports_config(mac, &dmrslength, pusch_config_pdu, dci);
 
     } else {
 
@@ -725,6 +732,7 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
       return -1;
 
     }
+
     NR_PUSCH_ConfigCommon_t *pusch_ConfigCommon = ubwpc->pusch_ConfigCommon->choice.setup;
     NR_PUSCH_TimeDomainResourceAllocationList_t *pusch_TimeDomainAllocationList = choose_ul_tda_list(pusch_Config,pusch_ConfigCommon);
 
@@ -748,7 +756,8 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
       pusch_config_pdu->num_dmrs_cdm_grps_no_data = 2;
 
       uint32_t n_RS_Id = 0;
-      if (NR_DMRS_ulconfig->transformPrecodingEnabled->nPUSCH_Identity != NULL)
+      if (NR_DMRS_ulconfig->transformPrecodingEnabled &&
+          NR_DMRS_ulconfig->transformPrecodingEnabled->nPUSCH_Identity != NULL)
         n_RS_Id = *NR_DMRS_ulconfig->transformPrecodingEnabled->nPUSCH_Identity;
       else
         n_RS_Id = *mac->scc->physCellId;
@@ -767,10 +776,10 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
                 pusch_config_pdu->dfts_ofdm.low_papr_group_number);
     }
     else {
-      if (pusch_config_pdu->scid == 0 &&
+      if (pusch_config_pdu->scid == 0 && NR_DMRS_ulconfig &&
           NR_DMRS_ulconfig->transformPrecodingDisabled->scramblingID0)
         pusch_config_pdu->ul_dmrs_scrambling_id = *NR_DMRS_ulconfig->transformPrecodingDisabled->scramblingID0;
-      if (pusch_config_pdu->scid == 1 &&
+      if (pusch_config_pdu->scid == 1 && NR_DMRS_ulconfig &&
           NR_DMRS_ulconfig->transformPrecodingDisabled->scramblingID1)
         pusch_config_pdu->ul_dmrs_scrambling_id = *NR_DMRS_ulconfig->transformPrecodingDisabled->scramblingID1;
     }
@@ -823,20 +832,25 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
       pusch_config_pdu->absolute_delta_PUSCH = 4;
     }
 
-    if (NR_DMRS_ulconfig != NULL) {
+    if (NR_DMRS_ulconfig != NULL)
       add_pos = (NR_DMRS_ulconfig->dmrs_AdditionalPosition == NULL) ? 2 : *NR_DMRS_ulconfig->dmrs_AdditionalPosition;
-      dmrslength = NR_DMRS_ulconfig->maxLength == NULL ? pusch_len1 : pusch_len2;
-    }
 
     /* DMRS */
     l_prime_mask = get_l_prime(pusch_config_pdu->nr_of_symbols,
                                mappingtype, add_pos, dmrslength,
                                pusch_config_pdu->start_symbol_index,
                                mac->scc ? mac->scc->dmrs_TypeA_Position : mac->mib->dmrs_TypeA_Position);
-    if ((mac->ULbwp[0] && pusch_config_pdu->transform_precoding == NR_PUSCH_Config__transformPrecoder_disabled))
+    if (ul_bwp_id > 0 &&
+        mac->ULbwp[ul_bwp_id - 1] &&
+        pusch_config_pdu->transform_precoding == NR_PUSCH_Config__transformPrecoder_disabled &&
+        *dci_format != NR_UL_DCI_FORMAT_0_1) {
       pusch_config_pdu->num_dmrs_cdm_grps_no_data = 1;
-    else if (*dci_format == NR_UL_DCI_FORMAT_0_0 || (mac->ULbwp[0] && pusch_config_pdu->transform_precoding == NR_PUSCH_Config__transformPrecoder_enabled))
+    } else if (*dci_format == NR_UL_DCI_FORMAT_0_0 ||
+               (ul_bwp_id > 0 &&
+                mac->ULbwp[ul_bwp_id-1] &&
+                pusch_config_pdu->transform_precoding == NR_PUSCH_Config__transformPrecoder_enabled)) {
       pusch_config_pdu->num_dmrs_cdm_grps_no_data = 2;
+    }
 
     // Num PRB Overhead from PUSCH-ServingCellConfig
     if (mac->cg &&
@@ -850,16 +864,17 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
     else N_PRB_oh = 0;
 
     /* PTRS */
-    if (mac->ULbwp[0] &&
-	mac->ULbwp[0]->bwp_Dedicated &&
-	mac->ULbwp[0]->bwp_Dedicated->pusch_Config &&
-	mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup &&
-	mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB &&
-	mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS) {
+    if (ul_bwp_id > 0 &&
+        mac->ULbwp[ul_bwp_id-1] &&
+        mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated &&
+        mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pusch_Config &&
+        mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pusch_Config->choice.setup &&
+        mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB &&
+        mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS) {
       if (pusch_config_pdu->transform_precoding == NR_PUSCH_Config__transformPrecoder_disabled) {
         nfapi_nr_ue_ptrs_ports_t ptrs_ports_list;
         pusch_config_pdu->pusch_ptrs.ptrs_ports_list = &ptrs_ports_list;
-        valid_ptrs_setup = set_ul_ptrs_values(mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup,
+        valid_ptrs_setup = set_ul_ptrs_values(mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup,
                                               pusch_config_pdu->rb_size, pusch_config_pdu->mcs_index, pusch_config_pdu->mcs_table,
                                               &pusch_config_pdu->pusch_ptrs.ptrs_freq_density,&pusch_config_pdu->pusch_ptrs.ptrs_time_density,
                                               &pusch_config_pdu->pusch_ptrs.ptrs_ports_list->ptrs_re_offset,&pusch_config_pdu->pusch_ptrs.num_ptrs_ports,
@@ -882,7 +897,8 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
     rnti_types[rnti_type]);
 
   pusch_config_pdu->ul_dmrs_symb_pos = l_prime_mask;
-  pusch_config_pdu->target_code_rate = nr_get_code_rate_ul(pusch_config_pdu->mcs_index, pusch_config_pdu->mcs_table);
+  uint16_t R = nr_get_code_rate_ul(pusch_config_pdu->mcs_index, pusch_config_pdu->mcs_table);
+  pusch_config_pdu->target_code_rate = R;
   pusch_config_pdu->qam_mod_order = nr_get_Qm_ul(pusch_config_pdu->mcs_index, pusch_config_pdu->mcs_table);
 
   if (pusch_config_pdu->target_code_rate == 0 || pusch_config_pdu->qam_mod_order == 0) {
@@ -901,14 +917,13 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
 
   // Compute TBS
   pusch_config_pdu->pusch_data.tb_size = nr_compute_tbs(pusch_config_pdu->qam_mod_order,
-                                                        pusch_config_pdu->target_code_rate,
+                                                        R,
                                                         pusch_config_pdu->rb_size,
                                                         pusch_config_pdu->nr_of_symbols,
                                                         nb_dmrs_re_per_rb*number_dmrs_symbols,
                                                         N_PRB_oh,
                                                         0, // TBR to verify tb scaling
-                                                        pusch_config_pdu->nrOfLayers)/8;
-
+                                                        pusch_config_pdu->nrOfLayers)>>3;
   return 0;
 
 }
@@ -919,15 +934,23 @@ bool nr_ue_periodic_srs_scheduling(module_id_t mod_id, frame_t frame, slot_t slo
   bool srs_scheduled = false;
 
   NR_UE_MAC_INST_t *mac = get_mac_inst(mod_id);
+  const NR_BWP_Id_t ul_bwp_id = mac->UL_BWP_Id;
 
   NR_SRS_Config_t *srs_config = NULL;
-  if (mac->cg &&
-      mac->cg->spCellConfig &&
-      mac->cg->spCellConfig->spCellConfigDedicated &&
-      mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
-      mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP) {
+  if (ul_bwp_id > 0 && mac->ULbwp[ul_bwp_id-1]) {
+    if (mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated &&
+        mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->srs_Config) {
+      srs_config = mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->srs_Config->choice.setup;
+    }
+  } else if (mac->cg &&
+             mac->cg->spCellConfig &&
+             mac->cg->spCellConfig->spCellConfigDedicated &&
+             mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
+             mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP) {
     srs_config = mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->srs_Config->choice.setup;
-  } else {
+  }
+
+  if (!srs_config) {
     return false;
   }
 
@@ -955,9 +978,9 @@ bool nr_ue_periodic_srs_scheduling(module_id_t mod_id, frame_t frame, slot_t slo
       continue;
     }
 
-    NR_BWP_t ubwp = mac->ULbwp[0] ?
-                      mac->ULbwp[0]->bwp_Common->genericParameters :
-                      mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.genericParameters;
+    NR_BWP_t ubwp = ul_bwp_id > 0 && mac->ULbwp[ul_bwp_id-1] ?
+                    mac->ULbwp[ul_bwp_id-1]->bwp_Common->genericParameters :
+                    mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.genericParameters;
 
     uint16_t period = srs_period[srs_resource->resourceType.choice.periodic->periodicityAndOffset_p.present];
     uint16_t offset = get_nr_srs_offset(srs_resource->resourceType.choice.periodic->periodicityAndOffset_p);
@@ -1062,9 +1085,6 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in
 
     if(mac->cg != NULL){ // we have a cg
 
-      nr_schedule_csirs_reception(mac, rx_frame, rx_slot);
-      nr_schedule_csi_for_im(mac, rx_frame, rx_slot);
-
       dcireq.module_id = mod_id;
       dcireq.gNB_index = gNB_index;
       dcireq.cc_id     = cc_id;
@@ -1074,9 +1094,15 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in
       nr_ue_dcireq(&dcireq); //to be replaced with function pointer later
       mac->dl_config_request = dcireq.dl_config_req;
 
+      nr_schedule_csirs_reception(mac, rx_frame, rx_slot);
+      nr_schedule_csi_for_im(mac, rx_frame, rx_slot);
+      dcireq.dl_config_req = mac->dl_config_request;
+
       fill_scheduled_response(&scheduled_response, &dcireq.dl_config_req, NULL, NULL, mod_id, cc_id, rx_frame, rx_slot, dl_info->thread_id, dl_info->phy_data);
-      if(mac->if_module != NULL && mac->if_module->scheduled_response != NULL)
+      if(mac->if_module != NULL && mac->if_module->scheduled_response != NULL) {
+        LOG_D(NR_MAC,"1# scheduled_response transmitted, %d, %d\n", rx_frame, rx_slot);
         mac->if_module->scheduled_response(&scheduled_response);
+      }
     }
     else {
       // this is for Msg2/Msg4
@@ -1087,7 +1113,7 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in
         if (mac->ra.ra_state == WAIT_CONTENTION_RESOLUTION)
           rel15->dci_format_options[1] = NR_UL_DCI_FORMAT_0_0; // msg3 retransmission
         config_dci_pdu(mac, rel15, dl_config, mac->ra.ra_state == WAIT_RAR ? NR_RNTI_RA : NR_RNTI_TC , mac->ra.ss->searchSpaceId);
-        fill_dci_search_candidates(mac->ra.ss, rel15);
+        fill_dci_search_candidates(mac->ra.ss, rel15, -1 , -1);
         dl_config->number_pdus = 1;
         LOG_D(MAC,"mac->cg %p: Calling fill_scheduled_response rnti %x, type0_pdcch, num_pdus %d\n",mac->cg,rel15->rnti,dl_config->number_pdus);
         fill_scheduled_response(&scheduled_response, dl_config, NULL, NULL, mod_id, cc_id, rx_frame, rx_slot, dl_info->thread_id, dl_info->phy_data);
@@ -1201,6 +1227,7 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in
 
         fill_scheduled_response(&scheduled_response, NULL, ul_config, &tx_req, mod_id, cc_id, frame_tx, slot_tx, ul_info->thread_id, NULL);
         if(mac->if_module != NULL && mac->if_module->scheduled_response != NULL){
+          LOG_D(NR_MAC,"3# scheduled_response transmitted,%d, %d\n", frame_tx, slot_tx);
           mac->if_module->scheduled_response(&scheduled_response);
         }
         pthread_mutex_lock(&ul_config->mutex_ul_config);
@@ -1234,7 +1261,7 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in
   }
 
   //Check whether Regular BSR is triggered
-  if (nr_update_bsr(mod_id, txFrameP, txSlotP, gNB_indexP) == TRUE) {
+  if (nr_update_bsr(mod_id, txFrameP, txSlotP, gNB_indexP) == true) {
     // call SR procedure to generate pending SR and BSR for next PUCCH/PUSCH TxOp.  This should implement the procedures
     // outlined in Sections 5.4.4 an 5.4.5 of 38.321
     mac->scheduling_info.SR_pending = 1;
@@ -1247,10 +1274,10 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in
 
 }
 
-boolean_t
+bool
 nr_update_bsr(module_id_t module_idP, frame_t frameP, slot_t slotP, uint8_t gNB_index) {
   mac_rlc_status_resp_t rlc_status;
-  boolean_t bsr_regular_triggered = FALSE;
+  bool bsr_regular_triggered = false;
   uint8_t lcid;
   uint8_t lcgid;
   uint8_t num_lcid_with_data = 0; // for LCID with data only if LCGID is defined
@@ -1343,7 +1370,7 @@ nr_update_bsr(module_id_t module_idP, frame_t frameP, slot_t slotP, uint8_t gNB_
          which belong to any LCG and for which data is already available for transmission
        */
       {
-        bsr_regular_triggered = TRUE;
+        bsr_regular_triggered = true;
         LOG_D(NR_MAC, "[UE %d] PDCCH Tick : MAC BSR Triggered LCID%d LCGID%d data become available at frame %d slot %d\n",
               module_idP, lcid,
               mac->scheduling_info.LCGID[lcid],
@@ -1354,7 +1381,7 @@ nr_update_bsr(module_id_t module_idP, frame_t frameP, slot_t slotP, uint8_t gNB_
 
     // Trigger Regular BSR if ReTxBSR Timer has expired and UE has data for transmission
     if (mac->scheduling_info.retxBSR_SF == 0) {
-      bsr_regular_triggered = TRUE;
+      bsr_regular_triggered = true;
 
       if ((mac->BSR_reporting_active & NR_BSR_TRIGGER_REGULAR) == 0) {
         LOG_I(NR_MAC, "[UE %d] PDCCH Tick : MAC BSR Triggered ReTxBSR Timer expiry at frame %d slot %d\n",
@@ -1543,14 +1570,15 @@ int nr_ue_pusch_scheduler(NR_UE_MAC_INST_t *mac,
                           uint8_t tda_id){
 
   int delta = 0;
-  NR_BWP_Uplink_t *ubwp = mac->ULbwp[0];
+  NR_BWP_Id_t ul_bwp_id = mac->UL_BWP_Id;
+
   // Get the numerology to calculate the Tx frame and slot
-  int mu = ubwp ?
-    ubwp->bwp_Common->genericParameters.subcarrierSpacing :
+  int mu = ul_bwp_id > 0 && mac->ULbwp[ul_bwp_id-1] ?
+    mac->ULbwp[ul_bwp_id-1]->bwp_Common->genericParameters.subcarrierSpacing :
     mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.genericParameters.subcarrierSpacing;
 
-  NR_PUSCH_TimeDomainResourceAllocationList_t *pusch_TimeDomainAllocationList = ubwp ?
-    ubwp->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList:
+  NR_PUSCH_TimeDomainResourceAllocationList_t *pusch_TimeDomainAllocationList = ul_bwp_id > 0 && mac->ULbwp[ul_bwp_id-1] ?
+    mac->ULbwp[ul_bwp_id-1]->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList:
     mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
   // k2 as per 3GPP TS 38.214 version 15.9.0 Release 15 ch 6.1.2.1.1
   // PUSCH time domain resource allocation is higher layer configured from uschTimeDomainAllocationList in either pusch-ConfigCommon
@@ -1613,7 +1641,7 @@ static void build_ro_list(NR_UE_MAC_INST_t *mac) {
   int y2;  // PRACH Configuration Index table additional variable used to compute the valid frame numbers
   uint8_t slot_shift_for_map;
   uint8_t map_shift;
-  boolean_t even_slot_invalid;
+  bool even_slot_invalid;
   int64_t s_map;
   uint8_t prach_conf_start_symbol; // Starting symbol of the PRACH occasions in the PRACH slot
   uint8_t N_t_slot; // Number of PRACH occasions in a 14-symbols PRACH slot
@@ -1885,7 +1913,7 @@ static void map_ssb_to_ro(NR_UE_MAC_INST_t *mac) {
     mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup;
   NR_RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR ssb_perRACH_config = setup->ssb_perRACH_OccasionAndCB_PreamblesPerSSB->present;
 
-  boolean_t multiple_ssb_per_ro; // true if more than one or exactly one SSB per RACH occasion, false if more than one RO per SSB
+  bool multiple_ssb_per_ro; // true if more than one or exactly one SSB per RACH occasion, false if more than one RO per SSB
   uint8_t ssb_rach_ratio; // Nb of SSBs per RACH or RACHs per SSB
   uint16_t required_nb_of_prach_occasion; // Nb of RACH occasions required to map all the SSBs
   uint8_t required_nb_of_prach_conf_period; // Nb of PRACH configuration periods required to map all the SSBs
@@ -2381,9 +2409,17 @@ void nr_schedule_csi_for_im(NR_UE_MAC_INST_t *mac, int frame, int slot) {
   NR_CSI_IM_Resource_t *imcsi;
   int period, offset;
   NR_BWP_Id_t dl_bwp_id = mac->DL_BWP_Id;
-  int mu = mac->DLbwp[dl_bwp_id-1] ?
-    mac->DLbwp[dl_bwp_id-1]->bwp_Common->genericParameters.subcarrierSpacing :
-    mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.genericParameters.subcarrierSpacing;
+
+  NR_BWP_t *genericParameters = NULL;
+  if(dl_bwp_id > 0 && mac->DLbwp[dl_bwp_id-1]) {
+    genericParameters = &mac->DLbwp[dl_bwp_id-1]->bwp_Common->genericParameters;
+  } else {
+    genericParameters = &mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.genericParameters;
+  }
+
+  int mu = genericParameters->subcarrierSpacing;
+  uint16_t bwp_size = NRRIV2BW(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);
+  uint16_t bwp_start = NRRIV2PRBOFFSET(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);
 
   for (int id = 0; id < csi_measconfig->csi_IM_ResourceToAddModList->list.count; id++){
     imcsi = csi_measconfig->csi_IM_ResourceToAddModList->list.array[id];
@@ -2391,11 +2427,8 @@ void nr_schedule_csi_for_im(NR_UE_MAC_INST_t *mac, int frame, int slot) {
     if((frame*nr_slots_per_frame[mu]+slot-offset)%period != 0)
       continue;
     fapi_nr_dl_config_csiim_pdu_rel15_t *csiim_config_pdu = &dl_config->dl_config_list[dl_config->number_pdus].csiim_config_pdu.csiim_config_rel15;
-    const NR_BWP_Downlink_t *dlbwp = mac->DLbwp[dl_bwp_id-1];
-    const int locationAndBandwidth = dlbwp != NULL ? dlbwp->bwp_Common->genericParameters.locationAndBandwidth:
-                                     mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.genericParameters.locationAndBandwidth;
-    csiim_config_pdu->bwp_size = NRRIV2BW(locationAndBandwidth, MAX_BWP_SIZE);
-    csiim_config_pdu->bwp_start = NRRIV2PRBOFFSET(locationAndBandwidth, MAX_BWP_SIZE);
+    csiim_config_pdu->bwp_size = bwp_size;
+    csiim_config_pdu->bwp_start = bwp_start;
     csiim_config_pdu->subcarrier_spacing = mu;
     csiim_config_pdu->start_rb = imcsi->freqBand->startingRB;
     csiim_config_pdu->nr_of_rbs = imcsi->freqBand->nrofRBs;
@@ -2417,7 +2450,7 @@ void nr_schedule_csi_for_im(NR_UE_MAC_INST_t *mac, int frame, int slot) {
         AssertFatal(1==0, "Invalid CSI-IM pattern\n");
     }
     dl_config->dl_config_list[dl_config->number_pdus].pdu_type = FAPI_NR_DL_CONFIG_TYPE_CSI_IM;
-    dl_config->number_pdus = dl_config->number_pdus + 1;
+    dl_config->number_pdus += 1;
   }
 }
 
@@ -2441,9 +2474,17 @@ void nr_schedule_csirs_reception(NR_UE_MAC_INST_t *mac, int frame, int slot) {
   NR_NZP_CSI_RS_Resource_t *nzpcsi;
   int period, offset;
   NR_BWP_Id_t dl_bwp_id = mac->DL_BWP_Id;
-  int mu = mac->DLbwp[dl_bwp_id-1] ?
-    mac->DLbwp[dl_bwp_id-1]->bwp_Common->genericParameters.subcarrierSpacing :
-    mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.genericParameters.subcarrierSpacing;
+
+  NR_BWP_t *genericParameters = NULL;
+  if(dl_bwp_id > 0 && mac->DLbwp[dl_bwp_id-1]) {
+    genericParameters = &mac->DLbwp[dl_bwp_id-1]->bwp_Common->genericParameters;
+  } else {
+    genericParameters = &mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.genericParameters;
+  }
+
+  int mu = genericParameters->subcarrierSpacing;
+  uint16_t bwp_size = NRRIV2BW(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);
+  uint16_t bwp_start = NRRIV2PRBOFFSET(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);
 
   for (int id = 0; id < csi_measconfig->nzp_CSI_RS_ResourceToAddModList->list.count; id++){
     nzpcsi = csi_measconfig->nzp_CSI_RS_ResourceToAddModList->list.array[id];
@@ -2452,17 +2493,23 @@ void nr_schedule_csirs_reception(NR_UE_MAC_INST_t *mac, int frame, int slot) {
       continue;
     LOG_D(MAC,"Scheduling reception of CSI-RS in frame %d slot %d\n",frame,slot);
     fapi_nr_dl_config_csirs_pdu_rel15_t *csirs_config_pdu = &dl_config->dl_config_list[dl_config->number_pdus].csirs_config_pdu.csirs_config_rel15;
-
     NR_CSI_RS_ResourceMapping_t  resourceMapping = nzpcsi->resourceMapping;
-
-    const NR_BWP_Downlink_t *dlbwp = mac->DLbwp[dl_bwp_id-1];
-    const int locationAndBandwidth = dlbwp != NULL ? dlbwp->bwp_Common->genericParameters.locationAndBandwidth:
-                                     mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.genericParameters.locationAndBandwidth;
-    csirs_config_pdu->bwp_size = NRRIV2BW(locationAndBandwidth, MAX_BWP_SIZE);
-    csirs_config_pdu->bwp_start = NRRIV2PRBOFFSET(locationAndBandwidth, MAX_BWP_SIZE);
     csirs_config_pdu->subcarrier_spacing = mu;
-    csirs_config_pdu->start_rb = resourceMapping.freqBand.startingRB;
-    csirs_config_pdu->nr_of_rbs = resourceMapping.freqBand.nrofRBs;
+    csirs_config_pdu->cyclic_prefix = genericParameters->cyclicPrefix ? *genericParameters->cyclicPrefix : 0;
+
+    // According to last paragraph of TS 38.214 5.2.2.3.1
+    if (resourceMapping.freqBand.startingRB < bwp_start) {
+      csirs_config_pdu->start_rb = bwp_start;
+    } else {
+      csirs_config_pdu->start_rb = resourceMapping.freqBand.startingRB;
+    }
+    if (resourceMapping.freqBand.nrofRBs > (bwp_start + bwp_size - csirs_config_pdu->start_rb)) {
+      csirs_config_pdu->nr_of_rbs = bwp_start + bwp_size - csirs_config_pdu->start_rb;
+    } else {
+      csirs_config_pdu->nr_of_rbs = resourceMapping.freqBand.nrofRBs;
+    }
+    AssertFatal(csirs_config_pdu->nr_of_rbs >= 24, "CSI-RS has %d RBs, but the minimum is 24\n", csirs_config_pdu->nr_of_rbs);
+
     csirs_config_pdu->csi_type = 1; // NZP-CSI-RS
     csirs_config_pdu->symb_l0 = resourceMapping.firstOFDMSymbolInTimeDomain;
     if (resourceMapping.firstOFDMSymbolInTimeDomain2)
@@ -2473,6 +2520,11 @@ void nr_schedule_csirs_reception(NR_UE_MAC_INST_t *mac, int frame, int slot) {
         && (resourceMapping.density.choice.dot5 == NR_CSI_RS_ResourceMapping__density__dot5_evenPRBs))
       csirs_config_pdu->freq_density--;
     csirs_config_pdu->scramb_id = nzpcsi->scramblingID;
+    csirs_config_pdu->power_control_offset = nzpcsi->powerControlOffset + 8;
+    if (nzpcsi->powerControlOffsetSS)
+      csirs_config_pdu->power_control_offset_ss = *nzpcsi->powerControlOffsetSS;
+    else
+      csirs_config_pdu->power_control_offset_ss = 1; // 0 dB
     switch(resourceMapping.frequencyDomainAllocation.present){
       case NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_row1:
         csirs_config_pdu->row = 1;
@@ -2553,7 +2605,7 @@ void nr_schedule_csirs_reception(NR_UE_MAC_INST_t *mac, int frame, int slot) {
         AssertFatal(1==0,"Invalid freqency domain allocation in CSI-RS resource\n");
     }
     dl_config->dl_config_list[dl_config->number_pdus].pdu_type = FAPI_NR_DL_CONFIG_TYPE_CSI_RS;
-    dl_config->number_pdus = dl_config->number_pdus + 1;
+    dl_config->number_pdus += 1;
   }
 }
 
@@ -2750,7 +2802,7 @@ void nr_ue_sib1_scheduler(module_id_t module_idP,
   rel15->num_dci_options = 1;
   rel15->dci_format_options[0] = NR_DL_DCI_FORMAT_1_0;
   config_dci_pdu(mac, rel15, dl_config, NR_RNTI_SI, -1);
-  fill_dci_search_candidates(mac->search_space_zero, rel15);
+  fill_dci_search_candidates(mac->search_space_zero, rel15, -1, -1);
 
   if(mac->type0_PDCCH_CSS_config.type0_pdcch_ss_mux_pattern == 1){
     // same frame as ssb
diff --git a/openair2/LAYER2/NR_MAC_gNB/config.c b/openair2/LAYER2/NR_MAC_gNB/config.c
index 9dff368cccd60fa2c2f40943cba26fc65d1cabc0..46ea821a87810aab634b82c32e6236a7bbf32d28 100644
--- a/openair2/LAYER2/NR_MAC_gNB/config.c
+++ b/openair2/LAYER2/NR_MAC_gNB/config.c
@@ -160,11 +160,10 @@ void process_CellGroup(NR_CellGroupConfig_t *CellGroup, NR_UE_sched_ctrl_t *sche
 
 }
 
-void config_common(int Mod_idP, int ssb_SubcarrierOffset, rrc_pdsch_AntennaPorts_t dl_antenna_ports_struct, int pusch_AntennaPorts, NR_ServingCellConfigCommon_t *scc) {
+void config_common(int Mod_idP, int pdsch_AntennaPorts, int pusch_AntennaPorts, NR_ServingCellConfigCommon_t *scc) {
 
   nfapi_nr_config_request_scf_t *cfg = &RC.nrmac[Mod_idP]->config[0];
   RC.nrmac[Mod_idP]->common_channels[0].ServingCellConfigCommon = scc;
-  int pdsch_AntennaPorts = dl_antenna_ports_struct.N1 * dl_antenna_ports_struct.N2 * dl_antenna_ports_struct.XP;
 
   // Carrier configuration
 
@@ -336,42 +335,32 @@ void config_common(int Mod_idP, int ssb_SubcarrierOffset, rrc_pdsch_AntennaPorts
   cfg->num_tlv++;
 
   // SSB Table Configuration
-  int scs_scaling = 1<<(cfg->ssb_config.scs_common.value);
-  if (scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA < 600000)
-    scs_scaling = scs_scaling*3;
-  if (scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA > 2016666)
-    scs_scaling = scs_scaling>>2;
   uint32_t absolute_diff = (*scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB - scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA);
-  uint16_t sco = absolute_diff%(12*scs_scaling);
-  // values of subcarrier offset larger than the limit only indicates CORESET for Type0-PDCCH CSS set is not present
-  int ssb_SubcarrierOffset_limit = 0;
-  int offset_scaling = 0;  //15kHz
-  if(frequency_range == FR1) {
-    ssb_SubcarrierOffset_limit = 24;
-    if (ssb_SubcarrierOffset<ssb_SubcarrierOffset_limit)
-      offset_scaling = cfg->ssb_config.scs_common.value;
-  } else
-    ssb_SubcarrierOffset_limit = 12;
-  if (ssb_SubcarrierOffset<ssb_SubcarrierOffset_limit)
-    AssertFatal(sco==(scs_scaling * ssb_SubcarrierOffset),
-                "absoluteFrequencySSB has a subcarrier offset of %d while it should be %d\n",sco/scs_scaling,ssb_SubcarrierOffset);
-  cfg->ssb_table.ssb_offset_point_a.value = absolute_diff/(12*scs_scaling) - 10; //absoluteFrequencySSB is the central frequency of SSB which is made by 20RBs in total
+  const int scaling_5khz = scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA < 600000 ? 3 : 1;
+  int sco = (absolute_diff/scaling_5khz) % 24;
+  if(frequency_range == FR2)
+    sco >>= 1; // this assumes 120kHz SCS for SSB and subCarrierSpacingCommon (only option supported by OAI for
+  const int scs_scaling = frequency_range == FR2 ? 1 << (*scc->ssbSubcarrierSpacing - 2) : 1 << *scc->ssbSubcarrierSpacing;
+  cfg->ssb_table.ssb_offset_point_a.value = absolute_diff/(12*scaling_5khz) - 10*scs_scaling; //absoluteFrequencySSB is the central frequency of SSB which is made by 20RBs in total
   cfg->ssb_table.ssb_offset_point_a.tl.tag = NFAPI_NR_CONFIG_SSB_OFFSET_POINT_A_TAG;
   cfg->num_tlv++;
   cfg->ssb_table.ssb_period.value = *scc->ssb_periodicityServingCell;
   cfg->ssb_table.ssb_period.tl.tag = NFAPI_NR_CONFIG_SSB_PERIOD_TAG;
   cfg->num_tlv++;
-  cfg->ssb_table.ssb_subcarrier_offset.value = ssb_SubcarrierOffset<<offset_scaling;
+  cfg->ssb_table.ssb_subcarrier_offset.value = sco;
   cfg->ssb_table.ssb_subcarrier_offset.tl.tag = NFAPI_NR_CONFIG_SSB_SUBCARRIER_OFFSET_TAG;
   cfg->num_tlv++;
 
+  RC.nrmac[Mod_idP]->ssb_SubcarrierOffset = cfg->ssb_table.ssb_subcarrier_offset.value;
+  RC.nrmac[Mod_idP]->ssb_OffsetPointA = cfg->ssb_table.ssb_offset_point_a.value;
+
   switch (scc->ssb_PositionsInBurst->present) {
     case 1 :
       cfg->ssb_table.ssb_mask_list[0].ssb_mask.value = scc->ssb_PositionsInBurst->choice.shortBitmap.buf[0]<<24;
       cfg->ssb_table.ssb_mask_list[1].ssb_mask.value = 0;
       break;
     case 2 :
-      cfg->ssb_table.ssb_mask_list[0].ssb_mask.value = scc->ssb_PositionsInBurst->choice.mediumBitmap.buf[0]<<24;
+      cfg->ssb_table.ssb_mask_list[0].ssb_mask.value = ((uint32_t) scc->ssb_PositionsInBurst->choice.mediumBitmap.buf[0]) << 24;
       cfg->ssb_table.ssb_mask_list[1].ssb_mask.value = 0;
       break;
     case 3 :
@@ -416,8 +405,8 @@ void config_common(int Mod_idP, int ssb_SubcarrierOffset, rrc_pdsch_AntennaPorts
   cfg->carrier_config.num_rx_ant.value = pusch_AntennaPorts;
   AssertFatal(pusch_AntennaPorts > 0 && pusch_AntennaPorts < 13, "pusch_AntennaPorts in 1...12\n");
   cfg->carrier_config.num_rx_ant.tl.tag = NFAPI_NR_CONFIG_NUM_RX_ANT_TAG;
-  LOG_I(NR_MAC,"Set TX/RX antenna number to %d (num ssb %d: %x,%x)\n",
-        cfg->carrier_config.num_tx_ant.value,num_ssb,cfg->ssb_table.ssb_mask_list[0].ssb_mask.value,cfg->ssb_table.ssb_mask_list[1].ssb_mask.value);
+  LOG_I(NR_MAC,"Set RX antenna number to %d, Set TX antenna number to %d (num ssb %d: %x,%x)\n",
+        cfg->carrier_config.num_tx_ant.value,cfg->carrier_config.num_rx_ant.value,num_ssb,cfg->ssb_table.ssb_mask_list[0].ssb_mask.value,cfg->ssb_table.ssb_mask_list[1].ssb_mask.value);
   AssertFatal(cfg->carrier_config.num_tx_ant.value > 0,"carrier_config.num_tx_ant.value %d !\n",cfg->carrier_config.num_tx_ant.value );
   cfg->num_tlv++;
   cfg->num_tlv++;
@@ -456,24 +445,21 @@ int nr_mac_enable_ue_rrc_processing_timer(module_id_t Mod_idP, rnti_t rnti, NR_S
   if (rrc_reconfiguration_delay == 0) {
     return -1;
   }
-  const int UE_id = find_nr_UE_id(Mod_idP,rnti);
-  if (UE_id < 0) {
+
+  NR_UE_info_t *UE_info = find_nr_UE(&RC.nrmac[Mod_idP]->UE_info,rnti);
+  if (!UE_info) {
     LOG_W(NR_MAC, "Could not find UE for RNTI 0x%04x\n", rnti);
     return -1;
   }
-
-  NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info;
-  NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
-  const uint16_t sf_ahead = 6/(0x01<<subcarrierSpacing) + ((6%(0x01<<subcarrierSpacing))>0);
-  const uint16_t sl_ahead = sf_ahead * (0x01<<subcarrierSpacing);
+  NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl;
+  const uint16_t sl_ahead = RC.nrmac[Mod_idP]->if_inst->sl_ahead;
   sched_ctrl->rrc_processing_timer = (rrc_reconfiguration_delay<<subcarrierSpacing) + sl_ahead;
-  LOG_I(NR_MAC, "Activating RRC processing timer for UE %d\n", UE_id);
+  LOG_I(NR_MAC, "Activating RRC processing timer for UE %04x with %d ms\n", UE_info->rnti, rrc_reconfiguration_delay);
 
   return 0;
 }
 
 int rrc_mac_config_req_gNB(module_id_t Mod_idP,
-                           int ssb_SubcarrierOffset,
                            rrc_pdsch_AntennaPorts_t pdsch_AntennaPorts,
                            int pusch_AntennaPorts,
                            int sib1_tda,
@@ -488,19 +474,7 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP,
   if (scc != NULL ) {
     AssertFatal((scc->ssb_PositionsInBurst->present > 0) && (scc->ssb_PositionsInBurst->present < 4), "SSB Bitmap type %d is not valid\n",scc->ssb_PositionsInBurst->present);
 
-    /* dimension UL_tti_req_ahead for number of slots in frame */
     const int n = nr_slots_per_frame[*scc->ssbSubcarrierSpacing];
-    RC.nrmac[Mod_idP]->UL_tti_req_ahead[0] = calloc(n, sizeof(nfapi_nr_ul_tti_request_t));
-    AssertFatal(RC.nrmac[Mod_idP]->UL_tti_req_ahead[0],
-                "could not allocate memory for RC.nrmac[]->UL_tti_req_ahead[]\n");
-    /* fill in slot/frame numbers: slot is fixed, frame will be updated by scheduler
-     * consider that scheduler runs sl_ahead: the first sl_ahead slots are
-     * already "in the past" and thus we put frame 1 instead of 0! */
-    for (int i = 0; i < n; ++i) {
-      nfapi_nr_ul_tti_request_t *req = &RC.nrmac[Mod_idP]->UL_tti_req_ahead[0][i];
-      req->SFN = i < (RC.nrmac[Mod_idP]->if_inst->sl_ahead-1);
-      req->Slot = i;
-    }
     RC.nrmac[Mod_idP]->common_channels[0].vrb_map_UL =
         calloc(n * MAX_BWP_SIZE, sizeof(uint16_t));
     AssertFatal(RC.nrmac[Mod_idP]->common_channels[0].vrb_map_UL,
@@ -508,9 +482,10 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP,
 
     LOG_I(NR_MAC,"Configuring common parameters from NR ServingCellConfig\n");
 
+    int num_pdsch_antenna_ports = pdsch_AntennaPorts.N1 * pdsch_AntennaPorts.N2 * pdsch_AntennaPorts.XP;
+    RC.nrmac[Mod_idP]->xp_pdsch_antenna_ports = pdsch_AntennaPorts.XP;
     config_common(Mod_idP,
-                  ssb_SubcarrierOffset,
-                  pdsch_AntennaPorts,
+                  num_pdsch_antenna_ports,
                   pusch_AntennaPorts,
 		  scc);
     LOG_D(NR_MAC, "%s() %s:%d RC.nrmac[Mod_idP]->if_inst->NR_PHY_config_req:%p\n", __FUNCTION__, __FILE__, __LINE__, RC.nrmac[Mod_idP]->if_inst->NR_PHY_config_req);
@@ -523,7 +498,6 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP,
         printf("Waiting for PHY_config_req\n");
       }
     }
-    RC.nrmac[Mod_idP]->ssb_SubcarrierOffset = ssb_SubcarrierOffset;
     RC.nrmac[Mod_idP]->minRXTXTIMEpdsch = minRXTXTIMEpdsch;
 
     NR_PHY_Config_t phycfg;
@@ -550,9 +524,7 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP,
       AssertFatal(RC.nrmac[Mod_idP]->common_channels[0].frame_type == FDD,"Dynamic TDD not handled yet\n");
 
     for (int slot = 0; slot < n; ++slot) {
-      if (RC.nrmac[Mod_idP]->common_channels[0].frame_type == FDD ||
-          (slot != 0))
-        RC.nrmac[Mod_idP]->dlsch_slot_bitmap[slot / 64] |= (uint64_t)((slot % nr_slots_period) < nr_dl_slots) << (slot % 64);
+      RC.nrmac[Mod_idP]->dlsch_slot_bitmap[slot / 64] |= (uint64_t)((slot % nr_slots_period) < nr_dl_slots) << (slot % 64);
       RC.nrmac[Mod_idP]->ulsch_slot_bitmap[slot / 64] |= (uint64_t)((slot % nr_slots_period) >= nr_ulstart_slot) << (slot % 64);
 
       LOG_I(NR_MAC, "In %s: slot %d DL %d UL %d\n",
@@ -590,37 +562,15 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP,
 
   if (CellGroup) {
 
-    if (get_softmodem_params()->sa) {
-      calculate_preferred_dl_tda(Mod_idP, NULL);
-    }
-
-    const NR_ServingCellConfig_t *servingCellConfig = NULL;
-    if(CellGroup->spCellConfig && CellGroup->spCellConfig->spCellConfigDedicated) {
-      servingCellConfig = CellGroup->spCellConfig->spCellConfigDedicated;
-      const struct NR_ServingCellConfig__downlinkBWP_ToAddModList *bwpList = servingCellConfig->downlinkBWP_ToAddModList;
-      if(bwpList) {
-        AssertFatal(bwpList->list.count > 0, "downlinkBWP_ToAddModList has no BWPs!\n");
-        for (int i = 0; i < bwpList->list.count; ++i) {
-          const NR_BWP_Downlink_t *bwp = bwpList->list.array[i];
-          calculate_preferred_dl_tda(Mod_idP, bwp);
-        }
-      }
-
-      const struct NR_UplinkConfig__uplinkBWP_ToAddModList *ubwpList = servingCellConfig->uplinkConfig->uplinkBWP_ToAddModList;
-      if(ubwpList) {
-        AssertFatal(ubwpList->list.count > 0, "uplinkBWP_ToAddModList no BWPs!\n");
-        for (int i = 0; i < ubwpList->list.count; ++i) {
-          const NR_BWP_Uplink_t *ubwp = ubwpList->list.array[i];
-          calculate_preferred_ul_tda(Mod_idP, ubwp);
-        }
-      }
-    }
-
-    NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info;
     if (add_ue == 1 && get_softmodem_params()->phy_test) {
-      const int UE_id = add_new_nr_ue(Mod_idP, rnti, CellGroup);
-      LOG_I(NR_MAC,"Added new UE_id %d/%x with initial CellGroup\n",UE_id,rnti);
-      process_CellGroup(CellGroup,&UE_info->UE_sched_ctrl[UE_id]);
+      NR_UE_info_t* UE = add_new_nr_ue(RC.nrmac[Mod_idP], rnti, CellGroup);
+      if (UE) {
+        LOG_I(NR_MAC,"Added new UE %x with initial CellGroup\n", rnti);
+      } else {
+        LOG_E(NR_MAC,"Error adding UE %04x\n", rnti);
+        return -1;
+      }
+      process_CellGroup(CellGroup,&UE->UE_sched_ctrl);
     } else if (add_ue == 1 && !get_softmodem_params()->phy_test) {
       const int CC_id = 0;
       NR_COMMON_channels_t *cc = &RC.nrmac[Mod_idP]->common_channels[CC_id];
@@ -666,49 +616,30 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP,
       ra->msg3_dcch_dtch = false;
       LOG_I(NR_MAC,"Added new RA process for UE RNTI %04x with initial CellGroup\n", rnti);
     } else { // CellGroup has been updated
-      NR_ServingCellConfigCommon_t *scc = RC.nrmac[Mod_idP]->common_channels[0].ServingCellConfigCommon;
-      const int UE_id = find_nr_UE_id(Mod_idP,rnti);
-      int target_ss;
-      UE_info->CellGroup[UE_id] = CellGroup;
-      LOG_I(NR_MAC,"Modified UE_id %d/%x with CellGroup\n",UE_id,rnti);
-      process_CellGroup(CellGroup,&UE_info->UE_sched_ctrl[UE_id]);
-      NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
-      const NR_PDSCH_ServingCellConfig_t *pdsch = servingCellConfig ? servingCellConfig->pdsch_ServingCellConfig->choice.setup : NULL;
-      if (get_softmodem_params()->sa) {
-        // add all available DL HARQ processes for this UE in SA
-        create_dl_harq_list(sched_ctrl, pdsch);
-      }
-      // update coreset/searchspace
-      void *bwpd = NULL;
-      NR_BWP_t *genericParameters = NULL;
-      target_ss = NR_SearchSpace__searchSpaceType_PR_common;
-      if ((sched_ctrl->active_bwp)) {
-        target_ss = NR_SearchSpace__searchSpaceType_PR_ue_Specific;
-        bwpd = (void*)sched_ctrl->active_bwp->bwp_Dedicated;
-        genericParameters = &sched_ctrl->active_bwp->bwp_Common->genericParameters;
+      NR_UE_info_t *UE = find_nr_UE(&RC.nrmac[Mod_idP]->UE_info, rnti);
+      if (!UE) {
+        LOG_E(NR_MAC, "Can't find UE %04x\n", rnti);
+        return -1;
       }
-      else if (CellGroup->spCellConfig &&
-                 CellGroup->spCellConfig->spCellConfigDedicated &&
-                 (CellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP)) {
-        target_ss = NR_SearchSpace__searchSpaceType_PR_ue_Specific;
-        bwpd = (void*)CellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP;
-        genericParameters = &scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters;
+
+      /* copy CellGroup by calling asn1c encode
+         this is a temporary hack to avoid the gNB having
+         a pointer to RRC CellGroup structure
+         (otherwise it would be applied to early)
+         TODO remove once we have a proper implementation */
+      UE->enc_rval = uper_encode_to_buffer(&asn_DEF_NR_CellGroupConfig,
+                                           NULL,
+                                           (void *) CellGroup,
+                                           UE->cg_buf,
+                                           32768);
+
+      if (UE->enc_rval.encoded == -1) {
+        LOG_E(NR_MAC, "ASN1 message CellGroupConfig encoding failed (%s, %lu)!\n",
+              UE->enc_rval.failed_type->name, UE->enc_rval.encoded);
+        exit(1);
       }
-      sched_ctrl->search_space = get_searchspace(sib1 ? sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL, scc, bwpd, target_ss);
-      sched_ctrl->coreset = get_coreset(Mod_idP, scc, bwpd, sched_ctrl->search_space, target_ss);
-      sched_ctrl->sched_pdcch = set_pdcch_structure(RC.nrmac[Mod_idP],
-                                                    sched_ctrl->search_space,
-                                                    sched_ctrl->coreset,
-                                                    scc,
-                                                    genericParameters,
-                                                    RC.nrmac[Mod_idP]->type0_PDCCH_CSS_config);
-      sched_ctrl->maxL = 2;
-      if (CellGroup->spCellConfig &&
-          CellGroup->spCellConfig->spCellConfigDedicated &&
-          CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig &&
-          CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup
-        )
-      compute_csi_bitlen (CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup, UE_info, UE_id, Mod_idP);
+
+      process_CellGroup(CellGroup,&UE->UE_sched_ctrl);
     }
   }
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_MAC_CONFIG, VCD_FUNCTION_OUT);
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
index 6520d7c178bf08f832774c65dc02f1d352ea5e9a..780c47057e0d7f3d957f095994af20c036424fc1 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
@@ -68,6 +68,8 @@ void clear_nr_nfapi_information(gNB_MAC_INST * gNB,
   NR_ServingCellConfigCommon_t *scc = gNB->common_channels->ServingCellConfigCommon;
   const int num_slots = nr_slots_per_frame[*scc->ssbSubcarrierSpacing];
 
+  UL_tti_req_ahead_initialization(gNB, scc, num_slots, CC_idP);
+
   nfapi_nr_dl_tti_request_t    *DL_req = &gNB->DL_req[0];
   nfapi_nr_dl_tti_pdcch_pdu_rel15_t **pdcch = (nfapi_nr_dl_tti_pdcch_pdu_rel15_t **)gNB->pdcch_pdu_idx[CC_idP];
   nfapi_nr_ul_tti_request_t    *future_ul_tti_req =
@@ -104,167 +106,6 @@ void clear_nr_nfapi_information(gNB_MAC_INST * gNB,
   TX_req[CC_idP].Number_of_PDUs                  = 0;
 
 }
-/*
-void check_nr_ul_failure(module_id_t module_idP,
-                         int CC_id,
-                         int UE_id,
-                         frame_t frameP,
-                         sub_frame_t slotP) {
-
-  NR_UE_info_t                 *UE_info  = &RC.nrmac[module_idP]->UE_info;
-  nfapi_nr_dl_dci_request_t  *DL_req   = &RC.nrmac[module_idP]->DL_req[0];
-  uint16_t                      rnti      = UE_RNTI(module_idP, UE_id);
-  NR_COMMON_channels_t          *cc       = RC.nrmac[module_idP]->common_channels;
-
-  // check uplink failure
-  if ((UE_info->UE_sched_ctrl[UE_id].ul_failure_timer > 0) &&
-      (UE_info->UE_sched_ctrl[UE_id].ul_out_of_sync == 0)) {
-    LOG_I(MAC, "UE %d rnti %x: UL Failure timer %d \n", UE_id, rnti,
-    UE_info->UE_sched_ctrl[UE_id].ul_failure_timer);
-    if (UE_info->UE_sched_ctrl[UE_id].ra_pdcch_order_sent == 0) {
-      UE_info->UE_sched_ctrl[UE_id].ra_pdcch_order_sent = 1;
-
-      // add a format 1A dci for this UE to request an RA procedure (only one UE per subframe)
-      nfapi_nr_dl_dci_request_pdu_t *dl_config_pdu                    = &DL_req[CC_id].dl_tti_request_body.dl_config_pdu_list[DL_req[CC_id].dl_tti_request_body.number_pdu];
-      memset((void *) dl_config_pdu, 0,sizeof(nfapi_dl_dci_request_pdu_t));
-      dl_config_pdu->pdu_type                                         = NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE;
-      dl_config_pdu->pdu_size                                         = (uint8_t) (2 + sizeof(nfapi_dl_config_dci_dl_pdu));
-      dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.tl.tag                = NFAPI_DL_DCI_REQUEST_DCI_DL_PDU_REL8_TAG;
-      dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.dci_format            = NFAPI_DL_DCI_FORMAT_1A;
-      dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.aggregation_level     = get_aggregation(get_bw_index(module_idP, CC_id),
-                      UE_info->UE_sched_ctrl[UE_id].
-                      dl_cqi[CC_id], format1A);
-      dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.rnti                  = rnti;
-      dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.rnti_type             = 1;  // CRNTI : see Table 4-10 from SCF082 - nFAPI specifications
-      dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.transmission_power    = 6000; // equal to RS power
-
-      AssertFatal((cc[CC_id].mib->message.dl_Bandwidth >= 0) && (cc[CC_id].mib->message.dl_Bandwidth < 6),
-      "illegal dl_Bandwidth %d\n",
-      (int) cc[CC_id].mib->message.dl_Bandwidth);
-      dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.resource_block_coding = nr_pdcch_order_table[cc[CC_id].mib->message.dl_Bandwidth];
-      DL_req[CC_id].dl_tti_request_body.number_dci++;
-      DL_req[CC_id].dl_tti_request_body.number_pdu++;
-      DL_req[CC_id].dl_tti_request_body.tl.tag                      = NFAPI_DL_TTI_REQUEST_BODY_TAG;
-      LOG_I(MAC,
-      "UE %d rnti %x: sending PDCCH order for RAPROC (failure timer %d), resource_block_coding %d \n",
-      UE_id, rnti,
-      UE_info->UE_sched_ctrl[UE_id].ul_failure_timer,
-      dl_config_pdu->dci_dl_pdu.
-      dci_dl_pdu_rel8.resource_block_coding);
-    } else {    // ra_pdcch_sent==1
-      LOG_I(MAC,
-      "UE %d rnti %x: sent PDCCH order for RAPROC waiting (failure timer %d) \n",
-      UE_id, rnti,
-      UE_info->UE_sched_ctrl[UE_id].ul_failure_timer);
-      if ((UE_info->UE_sched_ctrl[UE_id].ul_failure_timer % 40) == 0) UE_info->UE_sched_ctrl[UE_id].ra_pdcch_order_sent = 0;  // resend every 4 frames
-    }
-
-    UE_info->UE_sched_ctrl[UE_id].ul_failure_timer++;
-    // check threshold
-    if (UE_info->UE_sched_ctrl[UE_id].ul_failure_timer > 20000) {
-      // inform RRC of failure and clear timer
-      LOG_I(MAC,
-      "UE %d rnti %x: UL Failure after repeated PDCCH orders: Triggering RRC \n",
-      UE_id, rnti);
-      mac_eNB_rrc_ul_failure(module_idP, CC_id, frameP, subframeP,rnti);
-      UE_info->UE_sched_ctrl[UE_id].ul_failure_timer = 0;
-      UE_info->UE_sched_ctrl[UE_id].ul_out_of_sync   = 1;
-
-      //Inform the controller about the UE deactivation. Should be moved to RRC agent in the future
-      if (rrc_agent_registered[module_idP]) {
-        LOG_W(MAC, "notify flexran Agent of UE state change\n");
-        agent_rrc_xface[module_idP]->flexran_agent_notify_ue_state_change(module_idP,
-            rnti, PROTOCOL__FLEX_UE_STATE_CHANGE_TYPE__FLUESC_DEACTIVATED);
-      }
-    }
-  }       // ul_failure_timer>0
-
-}
-*/
-/*
-void schedule_nr_SRS(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP)
-{
-  gNB_MAC_INST *gNB = RC.nrmac[module_idP];
-  NR_UE_info_t *UE_info = &gNB->UE_info;
-  nfapi_ul_config_request_body_t *ul_req;
-  int CC_id, UE_id;
-  NR_COMMON_channels_t *cc = RC.nrmac[module_idP]->common_channels;
-  SoundingRS_UL_ConfigCommon_t *soundingRS_UL_ConfigCommon;
-  struct SoundingRS_UL_ConfigDedicated *soundingRS_UL_ConfigDedicated;
-  uint8_t TSFC;
-  uint16_t deltaTSFC;   // bitmap
-  uint8_t srs_SubframeConfig;
-
-  // table for TSFC (Period) and deltaSFC (offset)
-  const uint16_t deltaTSFCTabType1[15][2] = { {1, 1}, {1, 2}, {2, 2}, {1, 5}, {2, 5}, {4, 5}, {8, 5}, {3, 5}, {12, 5}, {1, 10}, {2, 10}, {4, 10}, {8, 10}, {351, 10}, {383, 10} };  // Table 5.5.3.3-2 3GPP 36.211 FDD
-  const uint16_t deltaTSFCTabType2[14][2] = { {2, 5}, {6, 5}, {10, 5}, {18, 5}, {14, 5}, {22, 5}, {26, 5}, {30, 5}, {70, 10}, {74, 10}, {194, 10}, {326, 10}, {586, 10}, {210, 10} }; // Table 5.5.3.3-2 3GPP 36.211 TDD
-
-  uint16_t srsPeriodicity, srsOffset;
-
-  for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) {
-    soundingRS_UL_ConfigCommon = &cc[CC_id].radioResourceConfigCommon->soundingRS_UL_ConfigCommon;
-    // check if SRS is enabled in this frame/subframe
-    if (soundingRS_UL_ConfigCommon) {
-      srs_SubframeConfig = soundingRS_UL_ConfigCommon->choice.setup.srs_SubframeConfig;
-      if (cc[CC_id].tdd_Config == NULL) { // FDD
-  deltaTSFC = deltaTSFCTabType1[srs_SubframeConfig][0];
-  TSFC = deltaTSFCTabType1[srs_SubframeConfig][1];
-      } else {    // TDD
-  deltaTSFC = deltaTSFCTabType2[srs_SubframeConfig][0];
-  TSFC = deltaTSFCTabType2[srs_SubframeConfig][1];
-      }
-      // Sounding reference signal subframes are the subframes satisfying ns/2 mod TSFC (- deltaTSFC
-      uint16_t tmp = (subframeP % TSFC);
-
-      if ((1 << tmp) & deltaTSFC) {
-  // This is an SRS subframe, loop over UEs
-  for (UE_id = 0; UE_id < MAX_MOBILES_PER_GNB; UE_id++) {
-    if (!RC.nrmac[module_idP]->UE_info.active[UE_id]) continue;
-    ul_req = &RC.nrmac[module_idP]->UL_req[CC_id].ul_config_request_body;
-    // drop the allocation if the UE hasn't send RRCConnectionSetupComplete yet
-    if (mac_eNB_get_rrc_status(module_idP,UE_RNTI(module_idP, UE_id)) < RRC_CONNECTED) continue;
-
-    AssertFatal(UE_info->UE_template[CC_id][UE_id].physicalConfigDedicated != NULL,
-          "physicalConfigDedicated is null for UE %d\n",
-          UE_id);
-
-    if ((soundingRS_UL_ConfigDedicated = UE_info->UE_template[CC_id][UE_id].physicalConfigDedicated->soundingRS_UL_ConfigDedicated) != NULL) {
-      if (soundingRS_UL_ConfigDedicated->present == SoundingRS_UL_ConfigDedicated_PR_setup) {
-        get_srs_pos(&cc[CC_id],
-        soundingRS_UL_ConfigDedicated->choice.
-        setup.srs_ConfigIndex,
-        &srsPeriodicity, &srsOffset);
-        if (((10 * frameP + subframeP) % srsPeriodicity) == srsOffset) {
-    // Program SRS
-    ul_req->srs_present = 1;
-    nfapi_ul_config_request_pdu_t * ul_config_pdu = &ul_req->ul_config_pdu_list[ul_req->number_of_pdus];
-    memset((void *) ul_config_pdu, 0, sizeof(nfapi_ul_config_request_pdu_t));
-    ul_config_pdu->pdu_type =  NFAPI_UL_CONFIG_SRS_PDU_TYPE;
-    ul_config_pdu->pdu_size =  2 + (uint8_t) (2 + sizeof(nfapi_ul_config_srs_pdu));
-    ul_config_pdu->srs_pdu.srs_pdu_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL8_TAG;
-    ul_config_pdu->srs_pdu.srs_pdu_rel8.size = (uint8_t)sizeof(nfapi_ul_config_srs_pdu);
-    ul_config_pdu->srs_pdu.srs_pdu_rel8.rnti = UE_info->UE_template[CC_id][UE_id].rnti;
-    ul_config_pdu->srs_pdu.srs_pdu_rel8.srs_bandwidth = soundingRS_UL_ConfigDedicated->choice.setup.srs_Bandwidth;
-    ul_config_pdu->srs_pdu.srs_pdu_rel8.frequency_domain_position = soundingRS_UL_ConfigDedicated->choice.setup.freqDomainPosition;
-    ul_config_pdu->srs_pdu.srs_pdu_rel8.srs_hopping_bandwidth = soundingRS_UL_ConfigDedicated->choice.setup.srs_HoppingBandwidth;;
-    ul_config_pdu->srs_pdu.srs_pdu_rel8.transmission_comb = soundingRS_UL_ConfigDedicated->choice.setup.transmissionComb;
-    ul_config_pdu->srs_pdu.srs_pdu_rel8.i_srs = soundingRS_UL_ConfigDedicated->choice.setup.srs_ConfigIndex;
-    ul_config_pdu->srs_pdu.srs_pdu_rel8.sounding_reference_cyclic_shift = soundingRS_UL_ConfigDedicated->choice.setup.cyclicShift;    //              ul_config_pdu->srs_pdu.srs_pdu_rel10.antenna_port                   = ;//
-    //              ul_config_pdu->srs_pdu.srs_pdu_rel13.number_of_combs                = ;//
-    RC.nrmac[module_idP]->UL_req[CC_id].sfn_sf = (frameP << 4) + subframeP;
-    RC.nrmac[module_idP]->UL_req[CC_id].header.message_id = NFAPI_UL_CONFIG_REQUEST;
-    ul_req->number_of_pdus++;
-        } // if (((10*frameP+subframeP) % srsPeriodicity) == srsOffset)
-      } // if (soundingRS_UL_ConfigDedicated->present == SoundingRS_UL_ConfigDedicated_PR_setup)
-    }   // if ((soundingRS_UL_ConfigDedicated = UE_info->UE_template[CC_id][UE_id].physicalConfigDedicated->soundingRS_UL_ConfigDedicated)!=NULL)
-  }   // for (UE_id ...
-      }     // if((1<<tmp) & deltaTSFC)
-
-    }     // SRS config
-  }
-}
-*/
-
 
 bool is_xlsch_in_slot(uint64_t bitmap, sub_frame_t slot) {
   if (slot>=64) return false; //quickfix for FR2 where there are more than 64 slots (bitmap to be removed)
@@ -278,8 +119,6 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
   protocol_ctxt_t   ctxt={0};
   PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, module_idP, ENB_FLAG_YES, NOT_A_RNTI, frame, slot,module_idP);
 
-  char stats_output[16384];
-
   gNB_MAC_INST *gNB = RC.nrmac[module_idP];
   NR_COMMON_channels_t *cc = gNB->common_channels;
   NR_ServingCellConfigCommon_t        *scc     = cc->ServingCellConfigCommon;
@@ -307,8 +146,6 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
     nr_rrc_trigger(&ctxt, 0 /*CC_id*/, frame, slot >> *scc->ssbSubcarrierSpacing);
   }
 
-  for (int i=0; i<MAX_NUM_CORESET; i++)
-    RC.nrmac[module_idP]->pdcch_cand[i] = 0;
   for (int CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) {
     //mbsfn_status[CC_id] = 0;
 
@@ -341,13 +178,16 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
 
 
   if ((slot == 0) && (frame & 127) == 0) {
-     stats_output[0]='\0';
-     dump_mac_stats(RC.nrmac[module_idP],stats_output,16384,true);
-     LOG_I(NR_MAC,"Frame.Slot %d.%d\n%s\n",frame,slot,stats_output);
+    char stats_output[16384];
+    stats_output[0] = '\0';
+    dump_mac_stats(RC.nrmac[module_idP], stats_output, sizeof(stats_output), true);
+    LOG_I(NR_MAC, "Frame.Slot %d.%d\n%s\n", frame, slot, stats_output);
   }
 
   nr_mac_update_timers(module_idP, frame, slot);
 
+  schedule_nr_bwp_switch(module_idP, frame, slot);
+
   // This schedules MIB
   schedule_nr_mib(module_idP, frame, slot);
 
@@ -370,7 +210,6 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
     schedule_nr_prach(module_idP, f, s);
   }
 
-
   // Schedule CSI-RS transmission
   nr_csirs_scheduling(module_idP, frame, slot, nr_slots_per_frame[*scc->ssbSubcarrierSpacing]);
 
@@ -396,10 +235,10 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
   nr_schedule_ue_spec(module_idP, frame, slot); 
   stop_meas(&gNB->schedule_dlsch);
 
-  nr_schedule_pucch(module_idP, frame, slot);
+  nr_schedule_pucch(RC.nrmac[module_idP], frame, slot);
 
   // This schedule SR after PUCCH for multiplexing
-  nr_sr_reporting(module_idP, frame, slot);
+  nr_sr_reporting(RC.nrmac[module_idP], frame, slot);
 
   stop_meas(&RC.nrmac[module_idP]->eNB_scheduler);
   
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
index a2d56036d48cfc9d849d62d38fc7751951376dfb..ef7c91151b607d191433c6869c503e195afe8679 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
@@ -465,27 +465,24 @@ void nr_schedule_msg2(uint16_t rach_frame, uint16_t rach_slot,
 
   int FR = *scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0] >= 257 ? nr_FR2 : nr_FR1;
 
-  uint8_t start_next_period = (rach_slot-(rach_slot%tdd_period_slot)+tdd_period_slot)%nr_slots_per_frame[mu];
-  *msg2_slot = start_next_period + last_dl_slot_period; // initializing scheduling of slot to next mixed (or last dl) slot
-  *msg2_frame = ((*msg2_slot>(rach_slot))? rach_frame : (rach_frame+1))%1024;
+  uint8_t start_next_period = rach_slot-(rach_slot%tdd_period_slot)+tdd_period_slot;
+  int eff_slot = start_next_period + last_dl_slot_period; // initializing scheduling of slot to next mixed (or last dl) slot
   // we can't schedule msg2 before sl_ahead since prach
-  int eff_slot = *msg2_slot+(*msg2_frame-rach_frame)*nr_slots_per_frame[mu];
   while ((eff_slot-rach_slot)<=sl_ahead) {
-    *msg2_slot = (*msg2_slot+tdd_period_slot)%nr_slots_per_frame[mu];
-    *msg2_frame = ((*msg2_slot>(rach_slot))? rach_frame : (rach_frame+1))%1024;
-    eff_slot = *msg2_slot+(*msg2_frame-rach_frame)*nr_slots_per_frame[mu];
+    eff_slot += tdd_period_slot;
   }
   if (FR==nr_FR2) {
-    int num_tdd_period = *msg2_slot/tdd_period_slot;
+    int num_tdd_period = (eff_slot%nr_slots_per_frame[mu])/tdd_period_slot;
     while((tdd_beam_association[num_tdd_period]!=-1)&&(tdd_beam_association[num_tdd_period]!=beam_index)) {
-      *msg2_slot = (*msg2_slot+tdd_period_slot)%nr_slots_per_frame[mu];
-      *msg2_frame = ((*msg2_slot>(rach_slot))? rach_frame : (rach_frame+1))%1024;
-      num_tdd_period = *msg2_slot/tdd_period_slot;
+      eff_slot += tdd_period_slot;
+      num_tdd_period = (eff_slot % nr_slots_per_frame[mu])/tdd_period_slot;
     }
     if(tdd_beam_association[num_tdd_period] == -1)
       tdd_beam_association[num_tdd_period] = beam_index;
   }
 
+  *msg2_frame=(rach_frame + eff_slot/nr_slots_per_frame[mu])%1024;
+  *msg2_slot=eff_slot%nr_slots_per_frame[mu];
   // go to previous slot if the current scheduled slot is beyond the response window
   // and if the slot is not among the PDCCH monitored ones (38.213 10.1)
   while (*msg2_frame > frame_limit
@@ -540,158 +537,164 @@ void nr_initiate_ra_proc(module_id_t module_idP,
   }
 
   for (int i = 0; i < NR_NB_RA_PROC_MAX; i++) {
+
     NR_RA_t *ra = &cc->ra[i];
-    pr_found = 0;
-    const int UE_id = find_nr_UE_id(module_idP, ra->rnti);
-    if (UE_id != -1) {
+    if (ra->state != RA_IDLE)
       continue;
-    }
-    if (ra->state == RA_IDLE) {
-      for(int j = 0; j < ra->preambles.num_preambles; j++) {
-        //check if the preamble received correspond to one of the listed or configured preambles
-        if (preamble_index == ra->preambles.preamble_list[j]) {
-          if (ra->rnti == 0 && get_softmodem_params()->nsa)
-            continue;
-          pr_found=1;
-          break;
-        }
-      }
-      if (pr_found == 0) {
-         continue;
+
+    pr_found = 0;
+
+    for(int j = 0; j < ra->preambles.num_preambles; j++) {
+      //check if the preamble received correspond to one of the listed or configured preambles
+      if (preamble_index == ra->preambles.preamble_list[j]) {
+        if (ra->rnti == 0 && get_softmodem_params()->nsa)
+          continue;
+        pr_found=1;
+        break;
       }
+    }
+    if (pr_found == 0) {
+       continue;
+    }
 
-      uint16_t ra_rnti;
+    uint16_t ra_rnti;
 
-      // ra_rnti from 5.1.3 in 38.321
-      // FK: in case of long PRACH the phone seems to expect the subframe number instead of the slot number here.
-      if (scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->prach_RootSequenceIndex.present
-          == NR_RACH_ConfigCommon__prach_RootSequenceIndex_PR_l839)
-        ra_rnti = 1 + symbol + (9 /*slotP*/ * 14) + (freq_index * 14 * 80) + (ul_carrier_id * 14 * 80 * 8);
-      else
-        ra_rnti = 1 + symbol + (slotP * 14) + (freq_index * 14 * 80) + (ul_carrier_id * 14 * 80 * 8);
-
-      // This should be handled differently when we use the initialBWP for RA
-      ra->bwp_id = 0;
-      NR_BWP_Downlink_t *bwp=NULL;
-      if (ra->CellGroup && ra->CellGroup->spCellConfig && ra->CellGroup->spCellConfig->spCellConfigDedicated &&
-          ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList) {
-        ra->bwp_id = 1;
-        bwp = ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->bwp_id - 1];
+    // ra_rnti from 5.1.3 in 38.321
+    // FK: in case of long PRACH the phone seems to expect the subframe number instead of the slot number here.
+    if (scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->prach_RootSequenceIndex.present
+        == NR_RACH_ConfigCommon__prach_RootSequenceIndex_PR_l839)
+      ra_rnti = 1 + symbol + (9 /*slotP*/ * 14) + (freq_index * 14 * 80) + (ul_carrier_id * 14 * 80 * 8);
+    else
+      ra_rnti = 1 + symbol + (slotP * 14) + (freq_index * 14 * 80) + (ul_carrier_id * 14 * 80 * 8);
+
+    // This should be handled differently when we use the initialBWP for RA
+    ra->dl_bwp_id = 0;//TODO
+    ra->ul_bwp_id = 0;
+    NR_BWP_Downlink_t *bwp=NULL;
+    if (ra->CellGroup && ra->CellGroup->spCellConfig && ra->CellGroup->spCellConfig->spCellConfigDedicated) {
+      if (ra->CellGroup->spCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id &&
+        ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList) {
+        ra->dl_bwp_id = *ra->CellGroup->spCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id;
+        bwp = ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->dl_bwp_id - 1];
       }
+      if (ra->CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig &&
+          ra->CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->firstActiveUplinkBWP_Id)
+        ra->ul_bwp_id = *ra->CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->firstActiveUplinkBWP_Id;
+   }
 
-      VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_INITIATE_RA_PROC, 1);
+    VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_INITIATE_RA_PROC, 1);
 
-      LOG_D(NR_MAC,
-            "[gNB %d][RAPROC] CC_id %d Frame %d, Slot %d  Initiating RA procedure for preamble index %d\n",
+    LOG_D(NR_MAC,
+          "[gNB %d][RAPROC] CC_id %d Frame %d, Slot %d  Initiating RA procedure for preamble index %d\n",
+          module_idP,
+          CC_id,
+          frameP,
+          slotP,
+          preamble_index);
+
+    uint8_t beam_index = ssb_index_from_prach(module_idP, frameP, slotP, preamble_index, freq_index, symbol);
+
+    // the UE sent a RACH either for starting RA procedure or RA procedure failed and UE retries
+    if (ra->cfra) {
+      // if the preamble received correspond to one of the listed
+      if (!(preamble_index == ra->preambles.preamble_list[beam_index])) {
+        LOG_E(
+            NR_MAC,
+            "[gNB %d][RAPROC] FAILURE: preamble %d does not correspond to any of the ones in rach_ConfigDedicated\n",
             module_idP,
-            CC_id,
-            frameP,
-            slotP,
             preamble_index);
-
-      uint8_t beam_index = ssb_index_from_prach(module_idP, frameP, slotP, preamble_index, freq_index, symbol);
-
-      // the UE sent a RACH either for starting RA procedure or RA procedure failed and UE retries
-      if (ra->cfra) {
-        // if the preamble received correspond to one of the listed
-        if (!(preamble_index == ra->preambles.preamble_list[beam_index])) {
-          LOG_E(
-              NR_MAC,
-              "[gNB %d][RAPROC] FAILURE: preamble %d does not correspond to any of the ones in rach_ConfigDedicated\n",
-              module_idP,
-              preamble_index);
-          continue; // if the PRACH preamble does not correspond to any of the ones sent through RRC abort RA proc
-        }
+        continue; // if the PRACH preamble does not correspond to any of the ones sent through RRC abort RA proc
       }
-      LOG_D(NR_MAC, "Frame %d, Slot %d: Activating RA process \n", frameP, slotP);
-      ra->state = Msg2;
-      ra->timing_offset = timing_offset;
-      ra->preamble_slot = slotP;
-
-      NR_SearchSpaceId_t	ra_SearchSpace = 0;
-      struct NR_PDCCH_ConfigCommon__commonSearchSpaceList *commonSearchSpaceList = NULL;
-      NR_BWP_t *genericParameters = NULL;
-      if(bwp) {
-        commonSearchSpaceList = bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList;
-        ra_SearchSpace = *bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->ra_SearchSpace;
-        genericParameters = &bwp->bwp_Common->genericParameters;
-      } else {
-        commonSearchSpaceList = scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList;
-        ra_SearchSpace = *scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->ra_SearchSpace;
-        genericParameters = &scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters;
-      }
-      AssertFatal(commonSearchSpaceList->list.count > 0, "common SearchSpace list has 0 elements\n");
+    }
+    LOG_D(NR_MAC, "Frame %d, Slot %d: Activating RA process \n", frameP, slotP);
+    ra->state = Msg2;
+    ra->timing_offset = timing_offset;
+    ra->preamble_slot = slotP;
 
-      // Common SearchSpace list
-      for (int i = 0; i < commonSearchSpaceList->list.count; i++) {
-        ss = commonSearchSpaceList->list.array[i];
-        if (ss->searchSpaceId == ra_SearchSpace)
-          ra->ra_ss = ss;
-      }
+    NR_SearchSpaceId_t	ra_SearchSpace = 0;
+    struct NR_PDCCH_ConfigCommon__commonSearchSpaceList *commonSearchSpaceList = NULL;
+    NR_BWP_t *genericParameters = NULL;
+    if(bwp) {
+      commonSearchSpaceList = bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList;
+      ra_SearchSpace = *bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->ra_SearchSpace;
+      genericParameters = &bwp->bwp_Common->genericParameters;
+    } else {
+      commonSearchSpaceList = scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList;
+      ra_SearchSpace = *scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->ra_SearchSpace;
+      genericParameters = &scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters;
+    }
+    AssertFatal(commonSearchSpaceList->list.count > 0, "common SearchSpace list has 0 elements\n");
 
-      AssertFatal(ra->ra_ss!=NULL,"SearchSpace cannot be null for RA\n");
-
-      ra->coreset = get_coreset(module_idP, scc, bwp, ra->ra_ss, NR_SearchSpace__searchSpaceType_PR_common);
-      ra->sched_pdcch = set_pdcch_structure(nr_mac,
-                                            ra->ra_ss,
-                                            ra->coreset,
-                                            scc,
-                                            genericParameters,
-                                            &nr_mac->type0_PDCCH_CSS_config[ra->beam_id]);
-
-      // retrieving ra pdcch monitoring period and offset
-      find_monitoring_periodicity_offset_common(ra->ra_ss, &monitoring_slot_period, &monitoring_offset);
-
-      nr_schedule_msg2(frameP,
-                       slotP,
-                       &msg2_frame,
-                       &msg2_slot,
-                       scc,
-                       frame_type,
-                       monitoring_slot_period,
-                       monitoring_offset,
-                       beam_index,
-                       cc->num_active_ssb,
-                       nr_mac->tdd_beam_association,
-		       nr_mac->if_inst->sl_ahead);
-
-      ra->Msg2_frame = msg2_frame;
-      ra->Msg2_slot = msg2_slot;
-
-      LOG_D(NR_MAC, "%s() Msg2[%04d%d] SFN/SF:%04d%d\n", __FUNCTION__, ra->Msg2_frame, ra->Msg2_slot, frameP, slotP);
-
-      int loop = 0;
-      if (ra->rnti == 0) { // This condition allows for the usage of a preconfigured rnti for the CFRA
-        do {
-          ra->rnti = (taus() % 65518) + 1;
-          loop++;
-        } while (loop != 100
-                 && !((find_nr_UE_id(module_idP, ra->rnti) == -1) && (find_nr_RA_id(module_idP, CC_id, ra->rnti) == -1)
-                      && ra->rnti >= 1 && ra->rnti <= 65519));
-        if (loop == 100) {
-          LOG_E(NR_MAC, "%s:%d:%s: [RAPROC] initialisation random access aborted\n", __FILE__, __LINE__, __FUNCTION__);
-          abort();
-        }
-      }
+    // Common SearchSpace list
+    for (int i = 0; i < commonSearchSpaceList->list.count; i++) {
+      ss = commonSearchSpaceList->list.array[i];
+      if (ss->searchSpaceId == ra_SearchSpace)
+        ra->ra_ss = ss;
+    }
 
-      ra->RA_rnti = ra_rnti;
-      ra->preamble_index = preamble_index;
-      ra->beam_id = beam_index;
+    AssertFatal(ra->ra_ss!=NULL,"SearchSpace cannot be null for RA\n");
+
+    ra->coreset = get_coreset(nr_mac, scc, bwp, ra->ra_ss, NR_SearchSpace__searchSpaceType_PR_common);
+    ra->sched_pdcch = set_pdcch_structure(nr_mac,
+                                          ra->ra_ss,
+                                          ra->coreset,
+                                          scc,
+                                          genericParameters,
+                                          &nr_mac->type0_PDCCH_CSS_config[ra->beam_id]);
+
+    // retrieving ra pdcch monitoring period and offset
+    find_monitoring_periodicity_offset_common(ra->ra_ss, &monitoring_slot_period, &monitoring_offset);
+
+    nr_schedule_msg2(frameP,
+                     slotP,
+                     &msg2_frame,
+                     &msg2_slot,
+                     scc,
+                     frame_type,
+                     monitoring_slot_period,
+                     monitoring_offset,
+                     beam_index,
+                     cc->num_active_ssb,
+                     nr_mac->tdd_beam_association,
+         nr_mac->if_inst->sl_ahead);
+
+    ra->Msg2_frame = msg2_frame;
+    ra->Msg2_slot = msg2_slot;
+
+    LOG_D(NR_MAC, "%s() Msg2[%04d%d] SFN/SF:%04d%d\n", __FUNCTION__, ra->Msg2_frame, ra->Msg2_slot, frameP, slotP);
+
+    int loop = 0;
+    if (ra->rnti == 0) { // This condition allows for the usage of a preconfigured rnti for the CFRA
+      do {
+        ra->rnti = (taus() % 65518) + 1;
+        loop++;
+      } while (loop != 100
+               && !((find_nr_UE(&nr_mac->UE_info, ra->rnti) == NULL) && (find_nr_RA_id(module_idP, CC_id, ra->rnti) == -1)
+                    && ra->rnti >= 1 && ra->rnti <= 65519));
+      if (loop == 100) {
+        LOG_E(NR_MAC, "%s:%d:%s: [RAPROC] initialisation random access aborted\n", __FILE__, __LINE__, __FUNCTION__);
+        abort();
+      }
+    }
 
-      LOG_I(NR_MAC,
-            "[gNB %d][RAPROC] CC_id %d Frame %d Activating Msg2 generation in frame %d, slot %d using RA rnti %x SSB "
-            "index %u RA index %d\n",
-            module_idP,
-            CC_id,
-            frameP,
-            ra->Msg2_frame,
-            ra->Msg2_slot,
-            ra->RA_rnti,
-            cc->ssb_index[beam_index],
-            i);
+    ra->RA_rnti = ra_rnti;
+    ra->preamble_index = preamble_index;
+    ra->beam_id = beam_index;
+
+    LOG_I(NR_MAC,
+          "[gNB %d][RAPROC] CC_id %d Frame %d Activating Msg2 generation in frame %d, slot %d using RA rnti %x SSB, new rnti %04x "
+          "index %u RA index %d\n",
+          module_idP,
+          CC_id,
+          frameP,
+          ra->Msg2_frame,
+          ra->Msg2_slot,
+          ra->RA_rnti,
+    ra->rnti,
+          cc->ssb_index[beam_index],
+          i);
 
-      return;
-    }
+    return;
   }
   LOG_E(NR_MAC, "[gNB %d][RAPROC] FAILURE: CC_id %d Frame %d initiating RA procedure for preamble index %d\n", module_idP, CC_id, frameP, preamble_index);
 
@@ -741,7 +744,7 @@ void nr_generate_Msg3_retransmission(module_id_t module_idP, int CC_id, frame_t
   NR_PUSCH_TimeDomainResourceAllocationList_t *pusch_TimeDomainAllocationList = NULL;
   NR_BWP_t *genericParameters = NULL;
   if(ra->CellGroup) {
-    ubwp = ra->CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[ra->bwp_id-1];
+    ubwp = ra->CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[ra->ul_bwp_id-1];
     ubwpd = ra->CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP;
     genericParameters = &ubwp->bwp_Common->genericParameters;
     pusch_TimeDomainAllocationList = ubwp->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
@@ -781,8 +784,9 @@ void nr_generate_Msg3_retransmission(module_id_t module_idP, int CC_id, frame_t
 
     uint16_t *vrb_map_UL = &RC.nrmac[module_idP]->common_channels[CC_id].vrb_map_UL[sched_slot * MAX_BWP_SIZE];
 
-    int BWPStart = nr_mac->type0_PDCCH_CSS_config[ra->beam_id].cset_start_rb;
-    int BWPSize  = nr_mac->type0_PDCCH_CSS_config[ra->beam_id].num_rbs;
+    const int BWPSize = NRRIV2BW(scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
+    const int BWPStart = NRRIV2PRBOFFSET(scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
+
     int rbStart = 0;
     for (int i = 0; (i < ra->msg3_nb_rb) && (rbStart <= (BWPSize - ra->msg3_nb_rb)); i++) {
       if (vrb_map_UL[rbStart + BWPStart + i]&SL_to_bitmap(StartSymbolIndex, NrOfSymbols)) {
@@ -888,7 +892,7 @@ void nr_generate_Msg3_retransmission(module_id_t module_idP, int CC_id, frame_t
                  ra->Msg3_tda_id,
                  ra->msg3_TPC,
                  0, // not used in format 0_0
-                 ra->bwp_id);
+                 ra->ul_bwp_id);
 
     fill_dci_pdu_rel15(scc,
                        ra->CellGroup,
@@ -897,7 +901,8 @@ void nr_generate_Msg3_retransmission(module_id_t module_idP, int CC_id, frame_t
                        NR_UL_DCI_FORMAT_0_0,
                        NR_RNTI_TC,
                        pusch_pdu->bwp_size,
-                       ra->bwp_id,
+                       ra->ul_bwp_id,
+                       coresetid,
                        nr_mac->cset0_bwp_size);
 
     // Mark the corresponding RBs as used
@@ -1012,9 +1017,7 @@ void nr_get_Msg3alloc(module_id_t module_id,
   int bwpStart = NRRIV2PRBOFFSET(scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
 
   if (ra->CellGroup) {
-    AssertFatal(ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count == 1,
-		"downlinkBWP_ToAddModList has %d BWP!\n", ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count);
-    NR_BWP_Uplink_t *ubwp = ra->CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[ra->bwp_id - 1];
+    NR_BWP_Uplink_t *ubwp = ra->CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[ra->ul_bwp_id - 1];
     int act_bwp_start = NRRIV2PRBOFFSET(ubwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
     int act_bwp_size  = NRRIV2BW(ubwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
     if (!((bwpStart >= act_bwp_start) && ((bwpStart+bwpSize) <= (act_bwp_start+act_bwp_size))))
@@ -1087,13 +1090,16 @@ void fill_msg3_pusch_pdu(nfapi_nr_pusch_pdu_t *pusch_pdu,
   pusch_pdu->vrb_to_prb_mapping = 0;
 
   pusch_pdu->frequency_hopping = fh;
-  //pusch_pdu->tx_direct_current_location;//The uplink Tx Direct Current location for the carrier. Only values in the value range of this field between 0 and 3299, which indicate the subcarrier index within the carrier corresponding 1o the numerology of the corresponding uplink BWP and value 3300, which indicates "Outside the carrier" and value 3301, which indicates "Undetermined position within the carrier" are used. [TS38.331, UplinkTxDirectCurrentBWP IE]
+  //pusch_pdu->tx_direct_current_location;
+  //The uplink Tx Direct Current location for the carrier. Only values in the value range of this field between 0 and 3299,
+  //which indicate the subcarrier index within the carrier corresponding 1o the numerology of the corresponding uplink BWP and value 3300,
+  //which indicates "Outside the carrier" and value 3301, which indicates "Undetermined position within the carrier" are used. [TS38.331, UplinkTxDirectCurrentBWP IE]
   pusch_pdu->uplink_frequency_shift_7p5khz = 0;
   //Resource Allocation in time domain
   pusch_pdu->start_symbol_index = start_symbol_index;
   pusch_pdu->nr_of_symbols = nr_of_symbols;
   //Optional Data only included if indicated in pduBitmap
-  pusch_pdu->pusch_data.rv_index = nr_rv_round_map[round];
+  pusch_pdu->pusch_data.rv_index = nr_rv_round_map[round%4];
   pusch_pdu->pusch_data.harq_process_id = 0;
   pusch_pdu->pusch_data.new_data_indicator = 1;
   pusch_pdu->pusch_data.num_cb = 0;
@@ -1104,10 +1110,11 @@ void fill_msg3_pusch_pdu(nfapi_nr_pusch_pdu_t *pusch_pdu,
   int TBS = 0;
   while(TBS<7) {  // TBS for msg3 is 7 bytes (except for RRCResumeRequest1 currently not implemented)
     mcsindex++;
-    pusch_pdu->target_code_rate = nr_get_code_rate_ul(mcsindex,pusch_pdu->mcs_table);
+    int R = nr_get_code_rate_ul(mcsindex,pusch_pdu->mcs_table);
+    pusch_pdu->target_code_rate = R;
     pusch_pdu->qam_mod_order = nr_get_Qm_ul(mcsindex,pusch_pdu->mcs_table);
     TBS = nr_compute_tbs(pusch_pdu->qam_mod_order,
-                         pusch_pdu->target_code_rate,
+                         R,
                          pusch_pdu->rb_size,
                          pusch_pdu->nr_of_symbols,
                          num_dmrs_symb*12, // nb dmrs set for no data in dmrs symbol
@@ -1164,9 +1171,7 @@ void nr_add_msg3(module_id_t module_idP, int CC_id, frame_t frameP, sub_frame_t
   int mappingtype = scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[ra->Msg3_tda_id]->mappingType;
 
   if (ra->CellGroup) {
-    AssertFatal(ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count == 1,
-		"downlinkBWP_ToAddModList has %d BWP!\n", ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count);
-    NR_BWP_Uplink_t *ubwp = ra->CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[ra->bwp_id - 1];
+    NR_BWP_Uplink_t *ubwp = ra->CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[ra->ul_bwp_id - 1];
 
     startSymbolAndLength = ubwp->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[ra->Msg3_tda_id]->startSymbolAndLength;
     mappingtype = ubwp->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[ra->Msg3_tda_id]->mappingType;
@@ -1197,20 +1202,13 @@ void nr_add_msg3(module_id_t module_idP, int CC_id, frame_t frameP, sub_frame_t
   nr_fill_rar(module_idP, ra, RAR_pdu, pusch_pdu);
 }
 
-void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_frame_t slotP, NR_RA_t *ra)
-{
+void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_frame_t slotP, NR_RA_t *ra) {
 
   gNB_MAC_INST *nr_mac = RC.nrmac[module_idP];
   NR_COMMON_channels_t *cc = &nr_mac->common_channels[CC_id];
 
   if ((ra->Msg2_frame == frameP) && (ra->Msg2_slot == slotP)) {
 
-    //TODO time domain assignment for msg2 needs to be improved
-    uint8_t time_domain_assignment;
-    if(cc->frame_type == TDD)
-      time_domain_assignment = 1;
-    else
-      time_domain_assignment = 0;
     int mcsIndex = -1;  // initialization value
     int rbStart = 0;
     int rbSize = 8;
@@ -1227,8 +1225,8 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
         ra->CellGroup->spCellConfig &&
         ra->CellGroup->spCellConfig->spCellConfigDedicated &&
         ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList &&
-        ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->bwp_id-1]) {
-      bwp = ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->bwp_id-1];
+        ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->dl_bwp_id-1]) {
+      bwp = ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->dl_bwp_id-1];
       genericParameters = &bwp->bwp_Common->genericParameters;
       pdsch_TimeDomainAllocationList = bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList;
     }
@@ -1250,6 +1248,7 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
     }
 
     // Calculate number of symbols
+    int time_domain_assignment = get_dl_tda(nr_mac, scc, slotP);
     int startSymbolIndex, nrOfSymbols;
     const int startSymbolAndLength = pdsch_TimeDomainAllocationList->list.array[time_domain_assignment]->startSymbolAndLength;
     SLIV2SL(startSymbolAndLength, &startSymbolIndex, &nrOfSymbols);
@@ -1328,7 +1327,7 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
     dl_req->nPDUs+=1;
     nfapi_nr_dl_tti_pdsch_pdu_rel15_t *pdsch_pdu_rel15 = &dl_tti_pdsch_pdu->pdsch_pdu.pdsch_pdu_rel15;
 
-    LOG_D(NR_MAC,"[gNB %d][RAPROC] CC_id %d Frame %d, slotP %d: Generating RA-Msg2 DCI, rnti 0x%x, state %d, CoreSetType %d\n",
+    LOG_A(NR_MAC,"[gNB %d][RAPROC] CC_id %d Frame %d, slotP %d: Generating RA-Msg2 DCI, rnti 0x%x, state %d, CoreSetType %d\n",
           module_idP, CC_id, frameP, slotP, ra->RA_rnti, ra->state,pdcch_pdu_rel15->CoreSetType);
 
     // SCF222: PDU index incremented for each PDSCH PDU sent in TX control message. This is used to associate control
@@ -1389,7 +1388,8 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
                                                     nr_mac->common_channels->ServingCellConfigCommon->dmrs_TypeA_Position,
                                                     nrOfSymbols,
                                                     startSymbolIndex,
-                                                    mappingtype, 1);
+                                                    mappingtype,
+                                                    1);
 
     uint8_t tb_scaling = 0;
     int R, Qm;
@@ -1424,6 +1424,11 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
       pdsch_pdu_rel15->TBSize[0] = TBS;
     }
 
+    int bw_tbslbrm = get_bw_tbslbrm(genericParameters, ra->CellGroup);
+    pdsch_pdu_rel15->maintenance_parms_v3.tbSizeLbrmBytes = nr_compute_tbslbrm(mcsTableIdx,
+                                                                               bw_tbslbrm,
+                                                                               1);
+
     // Fill PDCCH DL DCI PDU
     nfapi_nr_dl_dci_pdu_t *dci_pdu = &pdcch_pdu_rel15->dci_pdu[pdcch_pdu_rel15->numDlDci];
     pdcch_pdu_rel15->numDlDci++;
@@ -1477,6 +1482,7 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
                        NR_RNTI_RA,
                        BWPSize,
                        bwpid,
+                       coresetid,
                        nr_mac->cset0_bwp_size);
 
     // DL TX request
@@ -1484,7 +1490,7 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
 
     // Program UL processing for Msg3
     NR_BWP_Uplink_t *ubwp = ra->CellGroup ?
-      ra->CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[ra->bwp_id-1] :
+      ra->CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[ra->dl_bwp_id-1] :
       NULL;
     nr_get_Msg3alloc(module_idP, CC_id, scc, ubwp, slotP, frameP, ra, nr_mac->tdd_beam_association);
     nr_add_msg3(module_idP, CC_id, frameP, slotP, ra, (uint8_t *) &tx_req->TLVs[0].value.direct[0]);
@@ -1516,7 +1522,7 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
     }
 
     ra->state = WAIT_Msg3;
-    LOG_D(NR_MAC,"[gNB %d][RAPROC] Frame %d, Subframe %d: RA state %d\n", module_idP, frameP, slotP, ra->state);
+    LOG_W(NR_MAC,"[gNB %d][RAPROC] Frame %d, Subframe %d: rnti %04x RA state %d\n", module_idP, frameP, slotP, ra->rnti, ra->state);
   }
 }
 
@@ -1541,8 +1547,8 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
         ra->CellGroup->spCellConfig &&
         ra->CellGroup->spCellConfig->spCellConfigDedicated &&
         ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList &&
-        ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->bwp_id-1]) {
-      bwp = ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->bwp_id-1];
+        ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->dl_bwp_id-1]) {
+      bwp = ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->dl_bwp_id-1];
       pdsch_TimeDomainAllocationList = bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList;
     }
     else {
@@ -1559,9 +1565,14 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
       ra->rnti = ra->crnti;
     }
 
-    int UE_id = find_nr_UE_id(module_idP, ra->rnti);
-    NR_UE_info_t *UE_info = &nr_mac->UE_info;
-    NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+    NR_UE_info_t * UE = find_nr_UE(&nr_mac->UE_info, ra->rnti);
+    if (!UE) {
+        LOG_E(NR_MAC,"want to generate Msg4, but rnti %04x not in the table\n", ra->rnti);
+        return;
+    }
+
+    LOG_I(NR_MAC,"Generate msg4, rnti: %04x\n", ra->rnti);
+    NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
 
     NR_BWP_t *genericParameters = bwp ? & bwp->bwp_Common->genericParameters : &scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters;
 
@@ -1594,7 +1605,7 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
 
     // Remove UE associated to TC-RNTI
     if(harq->round==0 && ra->msg3_dcch_dtch) {
-      mac_remove_nr_ue(module_idP, tc_rnti);
+      mac_remove_nr_ue(nr_mac, tc_rnti);
     }
 
     // get CCEindex, needed also for PUCCH and then later for PDCCH
@@ -1625,7 +1636,7 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
 
     LOG_D(NR_MAC,"[RAPROC] Msg4 r_pucch %d (CCEIndex %d, nb_of_candidates %d, delta_PRI %d)\n", r_pucch, CCEIndex, nr_of_candidates, delta_PRI);
 
-    int alloc = nr_acknack_scheduling(module_idP, UE_id, frameP, slotP, r_pucch, 1);
+    int alloc = nr_acknack_scheduling(module_idP, UE, frameP, slotP, r_pucch, 1);
     AssertFatal(alloc>=0,"Couldn't find a pucch allocation for ack nack (msg4)\n");
     NR_sched_pucch_t *pucch = &sched_ctrl->sched_pucch[alloc];
     harq->feedback_slot = pucch->ul_slot;
@@ -1641,13 +1652,25 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
       } else {
         uint16_t mac_pdu_length = nr_write_ce_dlsch_pdu(module_idP, nr_mac->sched_ctrlCommon, buf, 255, ra->cont_res_id);
         LOG_D(NR_MAC,"Encoded contention resolution mac_pdu_length %d\n",mac_pdu_length);
-        uint16_t mac_sdu_length = mac_rrc_nr_data_req(module_idP, CC_id, frameP, CCCH, ra->rnti, 1, &buf[mac_pdu_length+2]);
-        ((NR_MAC_SUBHEADER_SHORT *) &buf[mac_pdu_length])->R = 0;
-        ((NR_MAC_SUBHEADER_SHORT *) &buf[mac_pdu_length])->F = 0;
-        ((NR_MAC_SUBHEADER_SHORT *) &buf[mac_pdu_length])->LCID = DL_SCH_LCID_CCCH;
-        ((NR_MAC_SUBHEADER_SHORT *) &buf[mac_pdu_length])->L = mac_sdu_length;
-        ra->mac_pdu_length = mac_pdu_length + mac_sdu_length + sizeof(NR_MAC_SUBHEADER_SHORT);
-        LOG_D(NR_MAC,"Encoded RRCSetup Piggyback (%d + %d bytes), mac_pdu_length %d\n", mac_sdu_length, (int)sizeof(NR_MAC_SUBHEADER_SHORT), ra->mac_pdu_length);
+        uint8_t buffer[CCCH_SDU_SIZE];
+        uint8_t mac_subheader_len = sizeof(NR_MAC_SUBHEADER_SHORT);
+        uint16_t mac_sdu_length = mac_rrc_nr_data_req(module_idP, CC_id, frameP, CCCH, ra->rnti, 1, buffer);
+        if (mac_sdu_length < 256) {
+          ((NR_MAC_SUBHEADER_SHORT *) &buf[mac_pdu_length])->R = 0;
+          ((NR_MAC_SUBHEADER_SHORT *) &buf[mac_pdu_length])->F = 0;
+          ((NR_MAC_SUBHEADER_SHORT *) &buf[mac_pdu_length])->LCID = DL_SCH_LCID_CCCH;
+          ((NR_MAC_SUBHEADER_SHORT *) &buf[mac_pdu_length])->L = mac_sdu_length;
+          ra->mac_pdu_length = mac_pdu_length + mac_sdu_length + sizeof(NR_MAC_SUBHEADER_SHORT);
+        } else {
+          mac_subheader_len = sizeof(NR_MAC_SUBHEADER_LONG);
+          ((NR_MAC_SUBHEADER_LONG *) &buf[mac_pdu_length])->R = 0;
+          ((NR_MAC_SUBHEADER_LONG *) &buf[mac_pdu_length])->F = 1;
+          ((NR_MAC_SUBHEADER_LONG *) &buf[mac_pdu_length])->LCID = DL_SCH_LCID_CCCH;
+          ((NR_MAC_SUBHEADER_LONG *) &buf[mac_pdu_length])->L = htons(mac_sdu_length);
+          ra->mac_pdu_length = mac_pdu_length + mac_sdu_length + sizeof(NR_MAC_SUBHEADER_LONG);
+        }
+        LOG_I(NR_MAC,"Encoded RRCSetup Piggyback (%d + %d bytes), mac_pdu_length %d\n", mac_sdu_length, mac_subheader_len, ra->mac_pdu_length);
+        memcpy(&buf[mac_pdu_length + mac_subheader_len], buffer, mac_sdu_length);
       }
     }
 
@@ -1663,7 +1686,8 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
                                             scc->dmrs_TypeA_Position,
                                             nrOfSymbols,
                                             startSymbolIndex,
-                                            mappingtype, 1);
+                                            mappingtype,
+                                            1);
 
     uint16_t N_DMRS_SLOT = get_num_dmrs(dlDmrsSymbPos);
 
@@ -1716,6 +1740,8 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
                                      rbSize, nrOfSymbols, N_PRB_DMRS * N_DMRS_SLOT, 0, tb_scaling,1) >> 3;
     } while (harq->tb_size < ra->mac_pdu_length && mcsIndex<=28);
 
+    AssertFatal(harq->tb_size >= ra->mac_pdu_length,"Cannot allocate Msg4\n");
+
     int i = 0;
     while ((i < rbSize) && (rbStart + rbSize <= BWPSize)) {
       if (vrb_map[BWPStart + rbStart + i]&SL_to_bitmap(startSymbolIndex, nrOfSymbols)) {
@@ -1762,7 +1788,7 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
     dl_req->nPDUs+=1;
     nfapi_nr_dl_tti_pdsch_pdu_rel15_t *pdsch_pdu_rel15 = &dl_tti_pdsch_pdu->pdsch_pdu.pdsch_pdu_rel15;
 
-    LOG_D(NR_MAC, "[gNB %d] [RAPROC] CC_id %d Frame %d, slotP %d: Generating RA-Msg4 DCI, state %d\n", module_idP, CC_id, frameP, slotP, ra->state);
+    LOG_A(NR_MAC, "[gNB %d] [RAPROC] CC_id %d Frame %d, slotP %d: Generating RA-Msg4 DCI, state %d\n", module_idP, CC_id, frameP, slotP, ra->state);
 
     // SCF222: PDU index incremented for each PDSCH PDU sent in TX control message. This is used to associate control
     // information to data and is reset every slot.
@@ -1776,11 +1802,12 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
     pdsch_pdu_rel15->SubcarrierSpacing = genericParameters->subcarrierSpacing;
     pdsch_pdu_rel15->CyclicPrefix = 0;
     pdsch_pdu_rel15->NrOfCodewords = 1;
-    pdsch_pdu_rel15->targetCodeRate[0] = nr_get_code_rate_dl(mcsIndex,mcsTableIdx);
+    int R = nr_get_code_rate_dl(mcsIndex,mcsTableIdx);
+    pdsch_pdu_rel15->targetCodeRate[0] = R;
     pdsch_pdu_rel15->qamModOrder[0] = 2;
     pdsch_pdu_rel15->mcsIndex[0] = mcsIndex;
     pdsch_pdu_rel15->mcsTable[0] = mcsTableIdx;
-    pdsch_pdu_rel15->rvIndex[0] = nr_rv_round_map[harq->round];
+    pdsch_pdu_rel15->rvIndex[0] = nr_rv_round_map[harq->round%4];
     pdsch_pdu_rel15->dataScramblingId = *scc->physCellId;
     pdsch_pdu_rel15->nrOfLayers = 1;
     pdsch_pdu_rel15->transmissionScheme = 0;
@@ -1801,6 +1828,11 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
     int x_Overhead = 0;
     nr_get_tbs_dl(&dl_tti_pdsch_pdu->pdsch_pdu, x_Overhead, pdsch_pdu_rel15->numDmrsCdmGrpsNoData, tb_scaling);
 
+    int bw_tbslbrm = get_bw_tbslbrm(genericParameters, ra->CellGroup);
+    pdsch_pdu_rel15->maintenance_parms_v3.tbSizeLbrmBytes = nr_compute_tbslbrm(mcsTableIdx,
+                                                                               bw_tbslbrm,
+                                                                               1);
+
     pdsch_pdu_rel15->precodingAndBeamforming.num_prgs=1;
     pdsch_pdu_rel15->precodingAndBeamforming.prg_size=275;
     pdsch_pdu_rel15->precodingAndBeamforming.dig_bf_interfaces=1;
@@ -1867,6 +1899,7 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
                        NR_RNTI_TC,
                        pdsch_pdu_rel15->BWPSize,
                        bwpid,
+                       coresetid,
                        nr_mac->cset0_bwp_size);
 
     // Add padding header and zero rest out if there is space left
@@ -1920,10 +1953,10 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
 
     if(ra->msg3_dcch_dtch) {
       // If the UE used MSG3 to transfer a DCCH or DTCH message, then contention resolution is successful upon transmission of PDCCH
-      LOG_I(NR_MAC, "(ue %i, rnti 0x%04x) CBRA procedure succeeded!\n", UE_id, ra->rnti);
+      LOG_A(NR_MAC, "(ue rnti 0x%04x) CBRA procedure succeeded!\n", ra->rnti);
       nr_clear_ra_proc(module_idP, CC_id, frameP, ra);
-      UE_info->active[UE_id] = true;
-      UE_info->Msg4_ACKed[UE_id] = true;
+      UE->Msg3_dcch_dtch = true;
+      UE->Msg4_ACKed = true;
 
       remove_front_nr_list(&sched_ctrl->feedback_dl_harq);
       harq->feedback_slot = -1;
@@ -1931,6 +1964,24 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
       add_tail_nr_list(&sched_ctrl->available_dl_harq, current_harq_pid);
       harq->round = 0;
       harq->ndi ^= 1;
+
+      // Pause scheduling according to:
+      // 3GPP TS 38.331 Section 12 Table 12.1-1: UE performance requirements for RRC procedures for UEs
+      const NR_COMMON_channels_t *common_channels = &RC.nrmac[module_idP]->common_channels[0];
+      const NR_SIB1_t *sib1 = common_channels->sib1 ? common_channels->sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL;
+      const NR_ServingCellConfig_t *servingCellConfig = UE->CellGroup ? UE->CellGroup->spCellConfig->spCellConfigDedicated : NULL;
+      NR_BWP_t *genericParameters = get_dl_bwp_genericParameters(sched_ctrl->active_bwp,
+                                                                 common_channels->ServingCellConfigCommon,
+                                                                 sib1);
+      uint32_t delay_ms = servingCellConfig && servingCellConfig->downlinkBWP_ToAddModList ?
+                          NR_RRC_SETUP_DELAY_MS + NR_RRC_BWP_SWITCHING_DELAY_MS : NR_RRC_SETUP_DELAY_MS;
+
+      sched_ctrl->rrc_processing_timer = (delay_ms << genericParameters->subcarrierSpacing);
+      LOG_I(NR_MAC, "(%d.%d) Activating RRC processing timer for UE %04x with %d ms\n", frameP, slotP, UE->rnti, delay_ms);
+
+      // Reset uplink failure flags/counters/timers at MAC so gNB will resume again scheduling resources for this UE
+      UE->UE_sched_ctrl.pusch_consecutive_dtx_cnt = 0;
+      UE->UE_sched_ctrl.ul_failure = 0;
     } else {
       ra->state = WAIT_Msg4_ACK;
       LOG_D(NR_MAC,"[gNB %d][RAPROC] Frame %d, Subframe %d: RA state %d\n", module_idP, frameP, slotP, ra->state);
@@ -1940,41 +1991,45 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
 
 void nr_check_Msg4_Ack(module_id_t module_id, int CC_id, frame_t frame, sub_frame_t slot, NR_RA_t *ra) {
 
-  int UE_id = find_nr_UE_id(module_id, ra->rnti);
+  NR_UE_info_t * UE = find_nr_UE(&RC.nrmac[module_id]->UE_info, ra->rnti);
   const int current_harq_pid = ra->harq_pid;
 
-  NR_UE_info_t *UE_info = &RC.nrmac[module_id]->UE_info;
-  NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+  NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
   NR_UE_harq_t *harq = &sched_ctrl->harq_processes[current_harq_pid];
-  NR_mac_stats_t *stats = &UE_info->mac_stats[UE_id];
+  NR_mac_stats_t *stats = &UE->mac_stats;
 
-  LOG_D(NR_MAC, "ue %d, rnti 0x%04x, harq is waiting %d, round %d, frame %d %d, harq id %d\n", UE_id, ra->rnti, harq->is_waiting, harq->round, frame, slot, current_harq_pid);
+  LOG_D(NR_MAC, "ue rnti 0x%04x, harq is waiting %d, round %d, frame %d %d, harq id %d\n", ra->rnti, harq->is_waiting, harq->round, frame, slot, current_harq_pid);
 
   if (harq->is_waiting == 0) {
     if (harq->round == 0) {
-      if (stats->dlsch_errors == 0) {
-        LOG_I(NR_MAC, "(ue %i, rnti 0x%04x) Received Ack of RA-Msg4. CBRA procedure succeeded!\n", UE_id, ra->rnti);
-        UE_info->active[UE_id] = true;
-        UE_info->Msg4_ACKed[UE_id] = true;
 
-        const NR_SIB1_t *sib1 = RC.nrmac[module_id]->common_channels[0].sib1 ? RC.nrmac[module_id]->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL;
+      if (stats->dl.errors == 0) {
+        LOG_A(NR_MAC, "(UE RNTI 0x%04x) Received Ack of RA-Msg4. CBRA procedure succeeded!\n", ra->rnti);
+        UE->Msg4_ACKed = true;
+
+        // Pause scheduling according to:
+        // 3GPP TS 38.331 Section 12 Table 12.1-1: UE performance requirements for RRC procedures for UEs
+        const NR_COMMON_channels_t *common_channels = &RC.nrmac[module_id]->common_channels[0];
+        const NR_SIB1_t *sib1 = common_channels->sib1 ? common_channels->sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL;
+        const NR_ServingCellConfig_t *servingCellConfig = UE->CellGroup ? UE->CellGroup->spCellConfig->spCellConfigDedicated : NULL;
         NR_BWP_t *genericParameters = get_dl_bwp_genericParameters(sched_ctrl->active_bwp,
-                                                                   RC.nrmac[module_id]->common_channels[0].ServingCellConfigCommon,
+                                                                   common_channels->ServingCellConfigCommon,
                                                                    sib1);
-        // 3GPP TS 38.331 Section 12 Table 12.1-1: UE performance requirements for RRC procedures for UEs
-        sched_ctrl->rrc_processing_timer = (NR_RRC_SETUP_DELAY_MS << genericParameters->subcarrierSpacing); // RRCSetup 10 ms
-      }
-      else {
-        LOG_I(NR_MAC, "(ue %i, rnti 0x%04x) RA Procedure failed at Msg4!\n", UE_id, ra->rnti);
+        uint32_t delay_ms = servingCellConfig && servingCellConfig->downlinkBWP_ToAddModList ?
+            NR_RRC_SETUP_DELAY_MS + NR_RRC_BWP_SWITCHING_DELAY_MS : NR_RRC_SETUP_DELAY_MS;
+
+        sched_ctrl->rrc_processing_timer = (delay_ms << genericParameters->subcarrierSpacing);
+        LOG_I(NR_MAC, "(%d.%d) Activating RRC processing timer for UE %04x with %d ms\n", frame, slot, UE->rnti, delay_ms);
+      } else {
+        LOG_I(NR_MAC, "(ue rnti 0x%04x) RA Procedure failed at Msg4!\n", ra->rnti);
       }
 
       nr_clear_ra_proc(module_id, CC_id, frame, ra);
-      if(sched_ctrl->retrans_dl_harq.head >= 0) {
+      if (sched_ctrl->retrans_dl_harq.head >= 0) {
         remove_nr_list(&sched_ctrl->retrans_dl_harq, current_harq_pid);
       }
-    }
-    else {
-      LOG_D(NR_MAC, "(ue %i, rnti 0x%04x) Received Nack of RA-Msg4. Preparing retransmission!\n", UE_id, ra->rnti);
+    } else {
+      LOG_I(NR_MAC, "(UE %04x) Received Nack of RA-Msg4. Preparing retransmission!\n", ra->rnti);
       ra->Msg4_frame = (frame + 1) % 1024;
       ra->Msg4_slot = 1;
       ra->state = Msg4;
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c
index 9229cfbdbd292f5926f4522ea710f93976ae7da7..a05c782fb0635a5ca7571792abcbad25819e0c8e 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c
@@ -54,52 +54,6 @@
 
 extern RAN_CONTEXT_t RC;
 
-
-uint16_t get_ssboffset_pointa(NR_ServingCellConfigCommon_t *scc,const long band) {
-
-  int ratio;
-  switch (*scc->ssbSubcarrierSpacing) {
-    case NR_SubcarrierSpacing_kHz15:
-      AssertFatal(band <= 95,
-                  "Band %ld is not possible for SSB with 15 kHz SCS\n",
-                  band);
-      // no band available above 3GHz using 15kHz
-      ratio = 3;  // NRARFCN step is 5 kHz
-      break;
-    case NR_SubcarrierSpacing_kHz30:
-      AssertFatal(band <= 96,
-                  "Band %ld is not possible for SSB with 30 kHz SCS\n",
-                  band);
-      if (band == 46 || band == 48 || band == 77 ||
-          band == 78 || band == 79 || band == 96)  // above 3GHz
-        ratio = 2;    // NRARFCN step is 15 kHz
-      else
-        ratio = 6;  // NRARFCN step is 5 kHz
-      break;
-    case NR_SubcarrierSpacing_kHz120:
-      AssertFatal(band >= 257,
-                  "Band %ld is not possible for SSB with 120 kHz SCS\n",
-                  band);
-      ratio = 2;  // NRARFCN step is 15 kHz
-      break;
-    case NR_SubcarrierSpacing_kHz240:
-      AssertFatal(band >= 257,
-                  "Band %ld is not possible for SSB with 240 kHz SCS\n",
-                  band);
-      ratio = 4;  // NRARFCN step is 15 kHz
-      break;
-    default:
-      AssertFatal(1 == 0, "SCS %ld not allowed for SSB \n",
-                  *scc->ssbSubcarrierSpacing);
-  }
-
-  const uint32_t ssb_offset0 = *scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB - scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA;
-
-  return (ssb_offset0/(ratio*12) - 10); // absoluteFrequencySSB is the center of SSB
-
-}
-
-
 void schedule_ssb(frame_t frame, sub_frame_t slot,
                   NR_ServingCellConfigCommon_t *scc,
                   nfapi_nr_dl_tti_request_body_t *dl_req,
@@ -190,7 +144,7 @@ void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP)
 
       NR_SubcarrierSpacing_t scs = *scc->ssbSubcarrierSpacing;
       const long band = *scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0];
-      uint16_t offset_pointa = get_ssboffset_pointa(scc,band);
+      const uint16_t offset_pointa = gNB->ssb_OffsetPointA;
       uint8_t ssbSubcarrierOffset = gNB->ssb_SubcarrierOffset;
 
       const BIT_STRING_t *shortBitmap = &scc->ssb_PositionsInBurst->choice.shortBitmap;
@@ -207,8 +161,9 @@ void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP)
               ssb_start_symbol = get_ssb_start_symbol(band,scs,i_ssb);
               // if start symbol is in current slot, schedule current SSB, fill VRB map and call get_type0_PDCCH_CSS_config_parameters
               if ((ssb_start_symbol/14) == rel_slot){
+                const int prb_offset = offset_pointa >> scs;
                 schedule_ssb(frameP, slotP, scc, dl_req, i_ssb, ssbSubcarrierOffset, offset_pointa, (*(uint32_t*)cc->MIB_pdu.payload) & ((1<<24)-1));
-                fill_ssb_vrb_map(cc, offset_pointa, ssb_start_symbol, CC_id);
+                fill_ssb_vrb_map(cc, prb_offset, ssbSubcarrierOffset, ssb_start_symbol, CC_id);
                 if (get_softmodem_params()->sa == 1) {
                   get_type0_PDCCH_CSS_config_parameters(&gNB->type0_PDCCH_CSS_config[i_ssb],
                                                         frameP,
@@ -221,7 +176,7 @@ void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP)
                                                         band,
                                                         i_ssb,
                                                         ssb_frame_periodicity,
-                                                        offset_pointa);
+                                                        prb_offset);
                   gNB->type0_PDCCH_CSS_config[i_ssb].active = true;
                 }
               }
@@ -235,8 +190,9 @@ void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP)
               ssb_start_symbol = get_ssb_start_symbol(band,scs,i_ssb);
               // if start symbol is in current slot, schedule current SSB, fill VRB map and call get_type0_PDCCH_CSS_config_parameters
               if ((ssb_start_symbol/14) == rel_slot){
+                const int prb_offset = offset_pointa >> scs;
                 schedule_ssb(frameP, slotP, scc, dl_req, i_ssb, ssbSubcarrierOffset, offset_pointa, (*(uint32_t*)cc->MIB_pdu.payload) & ((1<<24)-1));
-                fill_ssb_vrb_map(cc, offset_pointa, ssb_start_symbol, CC_id);
+                fill_ssb_vrb_map(cc, prb_offset, ssbSubcarrierOffset, ssb_start_symbol, CC_id);
                 if (get_softmodem_params()->sa == 1) {
                   get_type0_PDCCH_CSS_config_parameters(&gNB->type0_PDCCH_CSS_config[i_ssb],
                                                         frameP,
@@ -249,7 +205,7 @@ void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP)
                                                         band,
                                                         i_ssb,
                                                         ssb_frame_periodicity,
-                                                        offset_pointa);
+                                                        prb_offset);
                   gNB->type0_PDCCH_CSS_config[i_ssb].active = true;
                 }
               }
@@ -264,8 +220,9 @@ void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP)
               ssb_start_symbol = get_ssb_start_symbol(band,scs,i_ssb);
               // if start symbol is in current slot, schedule current SSB, fill VRB map and call get_type0_PDCCH_CSS_config_parameters
               if ((ssb_start_symbol/14) == rel_slot){
+                const int prb_offset = offset_pointa >> (scs-2); // reference 60kHz
                 schedule_ssb(frameP, slotP, scc, dl_req, i_ssb, ssbSubcarrierOffset, offset_pointa, (*(uint32_t*)cc->MIB_pdu.payload) & ((1<<24)-1));
-                fill_ssb_vrb_map(cc, offset_pointa, ssb_start_symbol, CC_id);
+                fill_ssb_vrb_map(cc, prb_offset, ssbSubcarrierOffset, ssb_start_symbol, CC_id);
                 const NR_TDD_UL_DL_Pattern_t *tdd = &scc->tdd_UL_DL_ConfigurationCommon->pattern1;
                 const int n_slots_frame = nr_slots_per_frame[*scc->ssbSubcarrierSpacing];
                 // FR2 is only TDD, to be fixed for flexible TDD
@@ -286,7 +243,7 @@ void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP)
                                                         band,
                                                         i_ssb,
                                                         ssb_frame_periodicity,
-                                                        offset_pointa);
+                                                        prb_offset);
                   gNB->type0_PDCCH_CSS_config[i_ssb].active = true;
                 }
               }
@@ -306,7 +263,7 @@ void schedule_nr_SI(module_id_t module_idP, frame_t frameP, sub_frame_t subframe
 //----------------------------------------  
 }
 
-void fill_ssb_vrb_map (NR_COMMON_channels_t *cc, int rbStart,  uint16_t symStart, int CC_id) {
+void fill_ssb_vrb_map (NR_COMMON_channels_t *cc, int rbStart, int ssb_subcarrier_offset, uint16_t symStart, int CC_id) {
 
   AssertFatal(*cc->ServingCellConfigCommon->ssbSubcarrierSpacing !=
               NR_SubcarrierSpacing_kHz240,
@@ -314,7 +271,8 @@ void fill_ssb_vrb_map (NR_COMMON_channels_t *cc, int rbStart,  uint16_t symStart
 
   uint16_t *vrb_map = cc[CC_id].vrb_map;
 
-  for (int rb = 0; rb < 20; rb++)
+  const int extra_prb = ssb_subcarrier_offset > 0;
+  for (int rb = 0; rb < 20+extra_prb; rb++)
     vrb_map[rbStart + rb] = SL_to_bitmap(symStart, 4);
 
 }
@@ -327,7 +285,7 @@ uint32_t schedule_control_sib1(module_id_t module_id,
                                int nrOfSymbols,
                                uint16_t dlDmrsSymbPos,
                                uint8_t candidate_idx,
-                               int num_total_bytes) {
+                               uint16_t num_total_bytes) {
 
   gNB_MAC_INST *gNB_mac = RC.nrmac[module_id];
   NR_COMMON_channels_t *cc = &gNB_mac->common_channels[CC_id];
@@ -479,7 +437,7 @@ void nr_fill_nfapi_dl_sib1_pdu(int Mod_idP,
   pdsch_pdu_rel15->qamModOrder[0] = 2;
   pdsch_pdu_rel15->mcsIndex[0] = gNB_mac->sched_ctrlCommon->sched_pdsch.mcs;
   pdsch_pdu_rel15->mcsTable[0] = 0;
-  pdsch_pdu_rel15->rvIndex[0] = nr_rv_round_map[0];
+  pdsch_pdu_rel15->rvIndex[0] = 0;
   pdsch_pdu_rel15->dataScramblingId = *scc->physCellId;
   pdsch_pdu_rel15->nrOfLayers = 1;
   pdsch_pdu_rel15->transmissionScheme = 0;
@@ -504,6 +462,10 @@ void nr_fill_nfapi_dl_sib1_pdu(int Mod_idP,
   LOG_D(NR_MAC,"sib1:rbStart %d, rbSize %d\n",pdsch_pdu_rel15->rbStart,pdsch_pdu_rel15->rbSize);
   LOG_D(NR_MAC,"sib1:dlDmrsSymbPos = 0x%x\n", pdsch_pdu_rel15->dlDmrsSymbPos);
 
+  pdsch_pdu_rel15->maintenance_parms_v3.tbSizeLbrmBytes = nr_compute_tbslbrm(0,
+                                                                             pdsch_pdu_rel15->BWPSize,
+                                                                             1);
+
   /* Fill PDCCH DL DCI PDU */
   nfapi_nr_dl_dci_pdu_t *dci_pdu = &pdcch_pdu_rel15->dci_pdu[pdcch_pdu_rel15->numDlDci];
   pdcch_pdu_rel15->numDlDci++;
@@ -548,6 +510,7 @@ void nr_fill_nfapi_dl_sib1_pdu(int Mod_idP,
                      rnti_type,
                      pdsch_pdu_rel15->BWPSize,
                      0,
+                     0,
                      gNB_mac->cset0_bwp_size);
 
   LOG_D(MAC,"BWPSize: %i\n", pdcch_pdu_rel15->BWPSize);
@@ -607,7 +570,7 @@ void schedule_nr_sib1(module_id_t module_idP, frame_t frameP, sub_frame_t slotP)
 
       // Get SIB1
       uint8_t sib1_payload[NR_MAX_SIB_LENGTH/8];
-      uint8_t sib1_sdu_length = mac_rrc_nr_data_req(module_idP, CC_id, frameP, BCCH, SI_RNTI, 1, sib1_payload);
+      uint16_t sib1_sdu_length = mac_rrc_nr_data_req(module_idP, CC_id, frameP, BCCH, SI_RNTI, 1, sib1_payload);
       LOG_D(NR_MAC,"sib1_sdu_length = %i\n", sib1_sdu_length);
       LOG_D(NR_MAC,"SIB1: \n");
       for (int k=0;k<sib1_sdu_length;k++)
@@ -635,7 +598,8 @@ void schedule_nr_sib1(module_id_t module_idP, frame_t frameP, sub_frame_t slotP)
                                            startSymbolIndex,
                                            nrOfSymbols,
                                            dlDmrsSymbPos,
-                                           candidate_idx, sib1_sdu_length);
+                                           candidate_idx,
+                                           sib1_sdu_length);
 
       nfapi_nr_dl_tti_request_body_t *dl_req = &gNB_mac->DL_req[CC_id].dl_tti_request_body;
       int pdu_index = gNB_mac->pdu_index[0]++;
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
index 3a67b7fca994be71fc580291bb0b9f9bfdd6cfde..3517c124a57ee4b0ec4834b2fd06d8f85ac277ab 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
@@ -53,105 +53,21 @@
 #define WORD 32
 //#define SIZE_OF_POINTER sizeof (void *)
 
-void calculate_preferred_dl_tda(module_id_t module_id, const NR_BWP_Downlink_t *bwp) {
-  gNB_MAC_INST *nrmac = RC.nrmac[module_id];
-  const int bwp_id = bwp ? bwp->bwp_Id : 0;
+const int get_dl_tda(const gNB_MAC_INST *nrmac, const NR_ServingCellConfigCommon_t *scc, int slot) {
 
-  if (nrmac->preferred_dl_tda[bwp_id])
-    return;
+  const NR_TDD_UL_DL_Pattern_t *tdd = scc->tdd_UL_DL_ConfigurationCommon ? &scc->tdd_UL_DL_ConfigurationCommon->pattern1 : NULL;
+  AssertFatal(tdd || nrmac->common_channels->frame_type == FDD, "Dynamic TDD not handled yet\n");
 
-  /* there is a mixed slot only when in TDD */
-  NR_ServingCellConfigCommon_t *scc = nrmac->common_channels->ServingCellConfigCommon;
-  frame_type_t frame_type = nrmac->common_channels->frame_type;
-  const int n = nr_slots_per_frame[*scc->ssbSubcarrierSpacing];
-  const NR_TDD_UL_DL_Pattern_t *tdd =
-    scc->tdd_UL_DL_ConfigurationCommon ? &scc->tdd_UL_DL_ConfigurationCommon->pattern1 : NULL;
-  int symb_dlMixed = 0;
-  int nr_mix_slots = 0;
-  int nr_slots_period = n;
-
-  if (tdd) {
-    symb_dlMixed = (1 << tdd->nrofDownlinkSymbols) - 1;
-    nr_mix_slots = tdd->nrofDownlinkSymbols != 0 || tdd->nrofUplinkSymbols != 0;
-    nr_slots_period /= get_nb_periods_per_frame(tdd->dl_UL_TransmissionPeriodicity);
-  } else
-    // if TDD configuration is not present and the band is not FDD, it means it is a dynamic TDD configuration
-    AssertFatal(nrmac->common_channels->frame_type == FDD,"Dynamic TDD not handled yet\n");
-
-  int target_ss;
-
-  if (bwp) {
-    target_ss = NR_SearchSpace__searchSpaceType_PR_ue_Specific;
-  } else {
-    target_ss = NR_SearchSpace__searchSpaceType_PR_common;
-  }
+  // Use special TDA in case of CSI-RS
+  if(nrmac->UE_info.sched_csirs)
+    return 1;
 
-  const NR_SIB1_t *sib1 = nrmac->common_channels[0].sib1 ? nrmac->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL;
-  NR_SearchSpace_t *search_space = get_searchspace(sib1,
-                                                   scc,
-                                                   bwp ? bwp->bwp_Dedicated : NULL,
-                                                   target_ss);
-
-  NR_ControlResourceSet_t *coreset = get_coreset(module_id, scc, bwp ? bwp->bwp_Dedicated : NULL, search_space, target_ss);
-  // get coreset symbol "map"
-  const uint16_t symb_coreset = (1 << coreset->duration) - 1;
-
-  NR_PDSCH_TimeDomainResourceAllocationList_t *tdaList = get_pdsch_TimeDomainAllocationList(bwp,
-                                                                                            scc,
-                                                                                            sib1);
-  AssertFatal(tdaList->list.count >= 1, "need to have at least one TDA for DL slots\n");
-
-  /* check that TDA index 0 fits into DL and does not overlap CORESET */
-  const NR_PDSCH_TimeDomainResourceAllocation_t *tdaP_DL = tdaList->list.array[0];
-  AssertFatal(!tdaP_DL->k0 || *tdaP_DL->k0 == 0,
-              "TimeDomainAllocation at index 1: non-null k0 (%ld) is not supported by the scheduler\n",
-              *tdaP_DL->k0);
-  int start, len;
-  SLIV2SL(tdaP_DL->startSymbolAndLength, &start, &len);
-  const uint16_t symb_tda = ((1 << len) - 1) << start;
-  // check whether coreset and TDA overlap: then we cannot use it. Note that
-  // here we assume that the coreset is scheduled every slot (which it
-  // currently is) and starting at symbol 0
-  AssertFatal((symb_coreset & symb_tda) == 0, "TDA index 0 for DL overlaps with CORESET\n");
-  /* check that TDA index 1 fits into DL part of mixed slot, if it exists */
-  int tdaMi = -1;
-
-  if (frame_type == TDD && tdaList->list.count > 1) {
-    const NR_PDSCH_TimeDomainResourceAllocation_t *tdaP_Mi = tdaList->list.array[1];
-    AssertFatal(!tdaP_Mi->k0 || *tdaP_Mi->k0 == 0,
-                "TimeDomainAllocation at index 1: non-null k0 (%ld) is not supported by the scheduler\n",
-                *tdaP_Mi->k0);
-    int start, len;
-    SLIV2SL(tdaP_Mi->startSymbolAndLength, &start, &len);
-    const uint16_t symb_tda = ((1 << len) - 1) << start;
-
-    // check whether coreset and TDA overlap: then, we cannot use it. Also,
-    // check whether TDA is entirely within mixed slot DL. Note that
-    // here we assume that the coreset is scheduled every slot (which it
-    // currently is)
-    if ((symb_coreset & symb_tda) == 0 && (symb_dlMixed & symb_tda) == symb_tda) {
-      tdaMi = 1;
-    } else {
-      LOG_E(MAC,
-            "TDA index 1 DL overlaps with CORESET or is not entirely in mixed slot (symb_coreset %x symb_dlMixed %x symb_tda %x), won't schedule DL mixed slot\n",
-            symb_coreset,
-            symb_dlMixed,
-            symb_tda);
-    }
-  }
-
-  nrmac->preferred_dl_tda[bwp_id] = malloc(n * sizeof(*nrmac->preferred_dl_tda[bwp_id]));
-
-  for (int i = 0; i < n; ++i) {
-    nrmac->preferred_dl_tda[bwp_id][i] = -1;
-
-    if (frame_type == FDD || i % nr_slots_period < tdd->nrofDownlinkSlots)
-      nrmac->preferred_dl_tda[bwp_id][i] = 0;
-    else if (nr_mix_slots && i % nr_slots_period == tdd->nrofDownlinkSlots)
-      nrmac->preferred_dl_tda[bwp_id][i] = tdaMi;
-
-    LOG_D(MAC, "slot %d preferred_dl_tda %d\n", i, nrmac->preferred_dl_tda[bwp_id][i]);
+  if (tdd && tdd->nrofDownlinkSymbols > 1) { // if there is a mixed slot where we can transmit DL
+    const int nr_slots_period = tdd->nrofDownlinkSlots + tdd->nrofUplinkSlots + 1;
+    if ((slot%nr_slots_period) == tdd->nrofDownlinkSlots)
+      return 2;
   }
+  return 0; // if FDD or not mixed slot in TDD, for now use default TDA (TODO handle CSI-RS slots)
 }
 
 // Compute and write all MAC CEs and subheaders, and return number of written
@@ -397,88 +313,12 @@ int nr_write_ce_dlsch_pdu(module_id_t module_idP,
   return offset;
 }
 
-#define BLER_UPDATE_FRAME 10
-#define BLER_FILTER 0.9f
-int get_mcs_from_bler(module_id_t mod_id, int CC_id, frame_t frame, sub_frame_t slot, int UE_id, int mcs_table) {
-  gNB_MAC_INST *nrmac = RC.nrmac[mod_id];
-  const NR_ServingCellConfigCommon_t *scc = nrmac->common_channels[CC_id].ServingCellConfigCommon;
-  const int n = nr_slots_per_frame[*scc->ssbSubcarrierSpacing];
-  int max_allowed_mcs = (mcs_table == 1) ? 27 : 28;
-  int max_mcs = nrmac->dl_max_mcs;
-
-  if (nrmac->dl_max_mcs>max_allowed_mcs)
-    max_mcs = max_allowed_mcs;
-
-  NR_DL_bler_stats_t *bler_stats = &nrmac->UE_info.UE_sched_ctrl[UE_id].dl_bler_stats;
-
-  /* first call: everything is zero. Initialize to sensible default */
-  if (bler_stats->last_frame_slot == 0 && bler_stats->mcs == 0) {
-    bler_stats->last_frame_slot = frame * n + slot;
-    bler_stats->mcs = 9;
-    bler_stats->bler = (nrmac->dl_bler_target_lower + nrmac->dl_bler_target_upper) / 2;
-    bler_stats->rd2_bler = nrmac->dl_rd2_bler_threshold;
-  }
-
-  const int now = frame * n + slot;
-  int diff = now - bler_stats->last_frame_slot;
-
-  if (diff < 0) // wrap around
-    diff += 1024 * n;
-
-  const uint8_t old_mcs = bler_stats->mcs;
-  const NR_mac_stats_t *stats = &nrmac->UE_info.mac_stats[UE_id];
-
-  // TODO put back this condition when relevant
-  /*const int dret3x = stats->dlsch_rounds[3] - bler_stats->dlsch_rounds[3];
-  if (dret3x > 0) {
-     if there is a third retransmission, decrease MCS for stabilization and
-     restart averaging window to stabilize transmission
-    bler_stats->last_frame_slot = now;
-    bler_stats->mcs = max(9, bler_stats->mcs - 1);
-    memcpy(bler_stats->dlsch_rounds, stats->dlsch_rounds, sizeof(stats->dlsch_rounds));
-    LOG_D(MAC, "%4d.%2d: %d retx in 3rd round, setting MCS to %d and restarting window\n", frame, slot, dret3x, bler_stats->mcs);
-    return bler_stats->mcs;
-  }*/
-  if (diff < BLER_UPDATE_FRAME * n)
-    return old_mcs; // no update
-
-  // last update is longer than x frames ago
-  const int dtx = (int)(stats->dlsch_rounds[0] - bler_stats->dlsch_rounds[0]);
-  const int dretx = (int)(stats->dlsch_rounds[1] - bler_stats->dlsch_rounds[1]);
-  const int dretx2 = (int)(stats->dlsch_rounds[2] - bler_stats->dlsch_rounds[2]);
-  const float bler_window = dtx > 0 ? (float) dretx / dtx : bler_stats->bler;
-  const float rd2_bler_wnd = dtx > 0 ? (float) dretx2 / dtx : bler_stats->rd2_bler;
-  bler_stats->bler = BLER_FILTER * bler_stats->bler + (1 - BLER_FILTER) * bler_window;
-  bler_stats->rd2_bler = BLER_FILTER / 4 * bler_stats->rd2_bler + (1 - BLER_FILTER / 4) * rd2_bler_wnd;
-  int new_mcs = old_mcs;
-
-  // TODO put back this condition when relevant
-  /* first ensure that number of 2nd retx is below threshold. If this is the
-   * case, use 1st retx to adjust faster
-  if (bler_stats->rd2_bler > nrmac->dl_rd2_bler_threshold && old_mcs > 6) {
-    new_mcs -= 2;
-  } else if (bler_stats->rd2_bler < nrmac->dl_rd2_bler_threshold) {*/
-  if (bler_stats->bler < nrmac->dl_bler_target_lower && old_mcs < max_mcs && dtx > 9)
-    new_mcs += 1;
-  else if (bler_stats->bler > nrmac->dl_bler_target_upper && old_mcs > 6)
-    new_mcs -= 1;
-
-  // else we are within threshold boundaries
-  bler_stats->last_frame_slot = now;
-  bler_stats->mcs = new_mcs;
-  memcpy(bler_stats->dlsch_rounds, stats->dlsch_rounds, sizeof(stats->dlsch_rounds));
-  LOG_D(MAC, "%4d.%2d MCS %d -> %d (dtx %d, dretx %d, BLER wnd %.3f avg %.6f, dretx2 %d, RD2 BLER wnd %.3f avg %.6f)\n",
-        frame, slot, old_mcs, new_mcs, dtx, dretx, bler_window, bler_stats->bler, dretx2, rd2_bler_wnd, bler_stats->rd2_bler);
-  return new_mcs;
-}
-
 void nr_store_dlsch_buffer(module_id_t module_id,
                            frame_t frame,
                            sub_frame_t slot) {
-  NR_UE_info_t *UE_info = &RC.nrmac[module_id]->UE_info;
 
-  for (int UE_id = UE_info->list.head; UE_id >= 0; UE_id = UE_info->list.next[UE_id]) {
-    NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+  UE_iterator(RC.nrmac[module_id]->UE_info.list, UE) {
+    NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
     sched_ctrl->num_total_bytes = 0;
     sched_ctrl->dl_pdus_total = 0;
 
@@ -486,13 +326,11 @@ void nr_store_dlsch_buffer(module_id_t module_id,
     // Note: DL_SCH_LCID_DCCH, DL_SCH_LCID_DCCH1, DL_SCH_LCID_DTCH
     for (int i = 0; i < sched_ctrl->dl_lc_num; ++i) {
       const int lcid = sched_ctrl->dl_lc_ids[i];
-      const uint16_t rnti = UE_info->rnti[UE_id];
-      LOG_D(NR_MAC, "In %s: UE %d/%x: LCID %d\n", __FUNCTION__, UE_id, rnti, lcid);
-
+      const uint16_t rnti = UE->rnti;
+      LOG_D(NR_MAC, "In %s: UE %x: LCID %d\n", __FUNCTION__, rnti, lcid);
       if (lcid == DL_SCH_LCID_DTCH && sched_ctrl->rrc_processing_timer > 0) {
         continue;
       }
-
       start_meas(&RC.nrmac[module_id]->rlc_status_ind);
       sched_ctrl->rlc_status[lcid] = mac_rlc_status_ind(module_id,
                                                         rnti,
@@ -518,7 +356,7 @@ void nr_store_dlsch_buffer(module_id_t module_id,
             slot,
             lcid < 4 ? "DCCH":"DTCH",
             lcid,
-            UE_id,
+            UE->rnti,
             sched_ctrl->rlc_status[lcid].bytes_in_buffer,
             sched_ctrl->num_total_bytes,
             sched_ctrl->dl_pdus_total,
@@ -527,21 +365,42 @@ void nr_store_dlsch_buffer(module_id_t module_id,
   }
 }
 
+void abort_nr_dl_harq(NR_UE_info_t* UE, int8_t harq_pid) {
+
+  NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
+  NR_UE_harq_t *harq = &sched_ctrl->harq_processes[harq_pid];
+
+  harq->ndi ^= 1;
+  harq->round = 0;
+  UE->mac_stats.dl.errors++;
+  add_tail_nr_list(&sched_ctrl->available_dl_harq, harq_pid);
+
+}
+
 bool allocate_dl_retransmission(module_id_t module_id,
                                 frame_t frame,
                                 sub_frame_t slot,
                                 uint16_t *rballoc_mask,
                                 int *n_rb_sched,
-                                int UE_id,
+                                NR_UE_info_t *UE,
                                 int current_harq_pid) {
 
-
   gNB_MAC_INST *nr_mac = RC.nrmac[module_id];
   const NR_ServingCellConfigCommon_t *scc = nr_mac->common_channels->ServingCellConfigCommon;
-  NR_UE_info_t *UE_info = &nr_mac->UE_info;
-  NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+  NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
   NR_sched_pdsch_t *retInfo = &sched_ctrl->harq_processes[current_harq_pid].sched_pdsch;
-  NR_CellGroupConfig_t *cg = UE_info->CellGroup[UE_id];
+  NR_CellGroupConfig_t *cg = UE->CellGroup;
+  NR_pdsch_semi_static_t *ps = &sched_ctrl->pdsch_semi_static;
+
+  //TODO remove this and handle retransmission with old nrOfLayers
+  //     once ps structure is removed
+  if(ps->nrOfLayers < retInfo->nrOfLayers) {
+    LOG_W(NR_MAC,"Cannot schedule retransmission. RI changed from %d to %d\n",
+          retInfo->nrOfLayers, ps->nrOfLayers);
+    abort_nr_dl_harq(UE, current_harq_pid);
+    remove_front_nr_list(&sched_ctrl->retrans_dl_harq);
+    return false;
+  }
 
   NR_BWP_DownlinkDedicated_t *bwpd =
       cg &&
@@ -565,9 +424,8 @@ bool allocate_dl_retransmission(module_id_t module_id,
   const uint16_t bwpSize = coresetid == 0 ? RC.nrmac[module_id]->cset0_bwp_size : NRRIV2BW(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);
 
   int rbStart = 0; // start wrt BWPstart
-  NR_pdsch_semi_static_t *ps = &sched_ctrl->pdsch_semi_static;
   int rbSize = 0;
-  const int tda = RC.nrmac[module_id]->preferred_dl_tda[sched_ctrl->active_bwp ? sched_ctrl->active_bwp->bwp_Id : 0][slot];
+  const int tda = get_dl_tda(RC.nrmac[module_id], scc, slot);
   AssertFatal(tda>=0,"Unable to find PDSCH time domain allocation in list\n");
 
   if (tda == retInfo->time_domain_allocation) {
@@ -581,7 +439,7 @@ bool allocate_dl_retransmission(module_id_t module_id,
         rbStart++;
 
       if (rbStart >= bwpSize) {
-        LOG_D(NR_MAC, "cannot allocate retransmission for UE %d/RNTI %04x: no resources\n", UE_id, UE_info->rnti[UE_id]);
+        LOG_D(NR_MAC, "cannot allocate retransmission for RNTI %04x: no resources\n", UE->rnti);
         return false;
       }
 
@@ -653,8 +511,8 @@ bool allocate_dl_retransmission(module_id_t module_id,
   }
 
   /* Find a free CCE */
-  const int cid = sched_ctrl->coreset->controlResourceSetId;
-  const uint16_t Y = get_Y(cid%3, slot, UE_info->rnti[UE_id]);
+
+  const uint32_t Y = get_Y(sched_ctrl->search_space, slot, UE->rnti);
   uint8_t nr_of_candidates;
 
   for (int i=0; i<5; i++) {
@@ -676,8 +534,8 @@ bool allocate_dl_retransmission(module_id_t module_id,
                                       Y);
 
   if (CCEIndex<0) {
-    LOG_D(MAC, "%4d.%2d could not find CCE for DL DCI retransmission UE %d/RNTI %04x\n",
-          frame, slot, UE_id, UE_info->rnti[UE_id]);
+    LOG_D(MAC, "%4d.%2d could not find CCE for DL DCI retransmission RNTI %04x\n",
+          frame, slot, UE->rnti);
     return false;
   }
 
@@ -685,15 +543,13 @@ bool allocate_dl_retransmission(module_id_t module_id,
    * allocation after CCE alloc fail would be more complex) */
 
   int r_pucch = nr_get_pucch_resource(sched_ctrl->coreset, sched_ctrl->active_ubwp, ubwpd, CCEIndex);
-  const int alloc = nr_acknack_scheduling(module_id, UE_id, frame, slot, r_pucch, 0);
+  const int alloc = nr_acknack_scheduling(module_id, UE, frame, slot, r_pucch, 0);
   if (alloc<0) {
     LOG_D(MAC,
-          "could not find PUCCH for UE %d/%04x@%d.%d\n",
-          UE_id,
-          UE_info->rnti[UE_id],
+          "could not find PUCCH for UE %04x@%d.%d\n",
+          UE->rnti,
           frame,
           slot);
-    RC.nrmac[module_id]->pdcch_cand[cid]--;
     return false;
   }
 
@@ -716,48 +572,54 @@ bool allocate_dl_retransmission(module_id_t module_id,
   return true;
 }
 
-float thr_ue[MAX_MOBILES_PER_GNB];
 uint32_t pf_tbs[3][29]; // pre-computed, approximate TBS values for PF coefficient
+typedef struct UEsched_s {
+  float coef;
+  NR_UE_info_t * UE;
+} UEsched_t;
+
+static int comparator(const void *p, const void *q) {
+  return ((UEsched_t*)p)->coef < ((UEsched_t*)q)->coef;
+}
 
 void pf_dl(module_id_t module_id,
            frame_t frame,
            sub_frame_t slot,
-           NR_list_t *UE_list,
+           NR_UE_info_t **UE_list,
            int max_num_ue,
            int n_rb_sched,
            uint16_t *rballoc_mask) {
   gNB_MAC_INST *mac = RC.nrmac[module_id];
-  NR_UE_info_t *UE_info = &mac->UE_info;
   NR_ServingCellConfigCommon_t *scc=mac->common_channels[0].ServingCellConfigCommon;
-  float coeff_ue[MAX_MOBILES_PER_GNB];
   // UEs that could be scheduled
-  int ue_array[MAX_MOBILES_PER_GNB];
-  int layers[MAX_MOBILES_PER_GNB];
-  NR_list_t UE_sched = { .head = -1, .next = ue_array, .tail = -1, .len = MAX_MOBILES_PER_GNB };
+  UEsched_t UE_sched[MAX_MOBILES_PER_GNB] = {0};
+  int remainUEs = max_num_ue;
+  int curUE = 0;
 
   /* Loop UE_info->list to check retransmission */
-  for (int UE_id = UE_list->head; UE_id >= 0; UE_id = UE_list->next[UE_id]) {
-    if (UE_info->Msg4_ACKed[UE_id] != true) continue;
+  UE_iterator(UE_list, UE) {
+    if (UE->Msg4_ACKed != true)
+      continue;
 
-    NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+    NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
 
     if (sched_ctrl->ul_failure==1 && get_softmodem_params()->phy_test==0) continue;
 
+    const NR_mac_dir_stats_t *stats = &UE->mac_stats.dl;
     NR_sched_pdsch_t *sched_pdsch = &sched_ctrl->sched_pdsch;
     NR_pdsch_semi_static_t *ps = &sched_ctrl->pdsch_semi_static;
     /* get the PID of a HARQ process awaiting retrnasmission, or -1 otherwise */
     sched_pdsch->dl_harq_pid = sched_ctrl->retrans_dl_harq.head;
-    layers[UE_id] = ps->nrOfLayers; // initialization of layers to the previous value in the strcuture
+    UE->layers = ps->nrOfLayers; // initialization of layers to the previous value in the structure
     /* Calculate Throughput */
     const float a = 0.0005f; // corresponds to 200ms window
-    const uint32_t b = UE_info->mac_stats[UE_id].dlsch_current_bytes;
-    thr_ue[UE_id] = (1 - a) * thr_ue[UE_id] + a * b;
+    const uint32_t b = UE->mac_stats.dl.current_bytes;
+    UE->dl_thr_ue = (1 - a) * UE->dl_thr_ue + a * b;
 
     /* retransmission */
     if (sched_pdsch->dl_harq_pid >= 0) {
       /* Allocate retransmission */
-      bool r = allocate_dl_retransmission(
-                 module_id, frame, slot, rballoc_mask, &n_rb_sched, UE_id, sched_pdsch->dl_harq_pid);
+      bool r = allocate_dl_retransmission(module_id, frame, slot, rballoc_mask, &n_rb_sched, UE, sched_pdsch->dl_harq_pid);
 
       if (!r) {
         LOG_D(NR_MAC, "%4d.%2d retransmission can NOT be allocated\n", frame, slot);
@@ -765,18 +627,27 @@ void pf_dl(module_id_t module_id,
       }
 
       /* reduce max_num_ue once we are sure UE can be allocated, i.e., has CCE */
-      max_num_ue--;
+      remainUEs--;
+
+      // we have filled all with mandatory retransmissions
+      // no need to schedule new transmissions
+      if (remainUEs == 0)
+        return;
 
-      if (max_num_ue < 0) return;
     } else {
       /* Check DL buffer and skip this UE if no bytes and no TA necessary */
       if (sched_ctrl->num_total_bytes == 0 && frame != (sched_ctrl->ta_frame + 10) % 1024)
         continue;
 
       /* Calculate coeff */
-      set_dl_mcs(sched_pdsch,sched_ctrl,&mac->dl_max_mcs,ps->mcsTableIdx);
-      sched_pdsch->mcs = get_mcs_from_bler(module_id, /* CC_id = */ 0, frame, slot, UE_id, ps->mcsTableIdx);
-      layers[UE_id] = set_dl_nrOfLayers(sched_ctrl);
+      const NR_bler_options_t *bo = &mac->dl_bler;
+      const int max_mcs_table = ps->mcsTableIdx == 1 ? 27 : 28;
+      const int max_mcs = min(sched_ctrl->dl_max_mcs, max_mcs_table);
+      if (bo->harq_round_max == 1)
+        sched_pdsch->mcs = max_mcs;
+      else
+        sched_pdsch->mcs = get_mcs_from_bler(bo, stats, &sched_ctrl->dl_bler_stats, max_mcs, frame);
+      UE->layers = set_dl_nrOfLayers(sched_ctrl);
       const uint8_t Qm = nr_get_Qm_dl(sched_pdsch->mcs, ps->mcsTableIdx);
       const uint16_t R = nr_get_code_rate_dl(sched_pdsch->mcs, ps->mcsTableIdx);
       uint32_t tbs = nr_compute_tbs(Qm,
@@ -786,40 +657,26 @@ void pf_dl(module_id_t module_id,
                                     0, /* N_PRB_DMRS * N_DMRS_SLOT */
                                     0 /* N_PRB_oh, 0 for initialBWP */,
                                     0 /* tb_scaling */,
-                                    layers[UE_id]) >> 3;
-      coeff_ue[UE_id] = (float) tbs / thr_ue[UE_id];
-      LOG_D(NR_MAC,"b %d, thr_ue[%d] %f, tbs %d, coeff_ue[%d] %f\n",
-            b, UE_id, thr_ue[UE_id], tbs, UE_id, coeff_ue[UE_id]);
+                                    UE->layers) >> 3;
+      float coeff_ue = (float) tbs / UE->dl_thr_ue;
+      LOG_D(NR_MAC,"UE %04x b %d, thr_ue %f, tbs %d, coeff_ue %f\n",
+            UE->rnti, b, UE->dl_thr_ue, tbs, coeff_ue);
       /* Create UE_sched list for UEs eligible for new transmission*/
-      add_tail_nr_list(&UE_sched, UE_id);
+      UE_sched[curUE].coef=coeff_ue;
+      UE_sched[curUE].UE=UE;
+      curUE++;
     }
   }
 
+  qsort(UE_sched, sizeof(*UE_sched), sizeofArray(UE_sched), comparator);
+  UEsched_t *iterator = UE_sched;
+
   const int min_rbSize = 5;
 
   /* Loop UE_sched to find max coeff and allocate transmission */
-  while (max_num_ue > 0 && n_rb_sched >= min_rbSize && UE_sched.head >= 0) {
-    /* Find max coeff from UE_sched*/
-    int *max = &UE_sched.head; /* assume head is max */
-    int *p = &UE_sched.next[*max];
-
-    while (*p >= 0) {
-      /* if the current one has larger coeff, save for later */
-      if (coeff_ue[*p] > coeff_ue[*max])
-        max = p;
-
-      p = &UE_sched.next[*p];
-    }
-
-    /* remove the max one: do not use remove_nr_list() it goes through the
-     * whole list every time. Note that UE_sched.tail might not be set
-     * correctly anymore */
-    const int UE_id = *max;
-    p = &UE_sched.next[*max];
-    *max = UE_sched.next[*max];
-    *p = -1;
-    NR_CellGroupConfig_t *cg = UE_info->CellGroup[UE_id];
+  while (remainUEs> 0 && n_rb_sched >= min_rbSize && iterator->UE != NULL) {
 
+    NR_CellGroupConfig_t *cg = iterator->UE->CellGroup;
 
     NR_BWP_DownlinkDedicated_t *bwpd =
         cg &&
@@ -834,26 +691,32 @@ void pf_dl(module_id_t module_id,
         cg->spCellConfig->spCellConfigDedicated->uplinkConfig ?
         cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP : NULL;
 
-    NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
-    const uint16_t rnti = UE_info->rnti[UE_id];
-    const NR_SIB1_t *sib1 = RC.nrmac[module_id]->common_channels[0].sib1 ? RC.nrmac[module_id]->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL;
+    NR_UE_sched_ctrl_t *sched_ctrl = &iterator->UE->UE_sched_ctrl;
+    const uint16_t rnti = iterator->UE->rnti;
+    const NR_SIB1_t *sib1 = RC.nrmac[module_id]->common_channels[0].sib1 ?
+      RC.nrmac[module_id]->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1 :
+      NULL;
 
     NR_BWP_t *genericParameters = get_dl_bwp_genericParameters(sched_ctrl->active_bwp,
                                                                RC.nrmac[module_id]->common_channels[0].ServingCellConfigCommon,
                                                                sib1);
 
-    const int coresetid = (sched_ctrl->active_bwp||bwpd) ? sched_ctrl->coreset->controlResourceSetId : RC.nrmac[module_id]->sched_ctrlCommon->coreset->controlResourceSetId;
-    const uint16_t bwpSize = coresetid == 0 ? RC.nrmac[module_id]->cset0_bwp_size : NRRIV2BW(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);
+    const int coresetid = (sched_ctrl->active_bwp||bwpd) ?
+      sched_ctrl->coreset->controlResourceSetId :
+      RC.nrmac[module_id]->sched_ctrlCommon->coreset->controlResourceSetId;
+    const uint16_t bwpSize = coresetid == 0 ?
+      RC.nrmac[module_id]->cset0_bwp_size :
+      NRRIV2BW(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);
     int rbStart = 0; // start wrt BWPstart
 
     if (sched_ctrl->available_dl_harq.head < 0) {
-      LOG_D(MAC, "UE %d RNTI %04x has no free HARQ process, skipping\n", UE_id, UE_info->rnti[UE_id]);
+      LOG_D(MAC, "RNTI %04x has no free HARQ process, skipping\n", iterator->UE->rnti);
+      iterator++;
       continue;
     }
 
     /* Find a free CCE */
-    const int cid = sched_ctrl->coreset->controlResourceSetId;
-    const uint16_t Y = get_Y(cid%3, slot, UE_info->rnti[UE_id]);
+    const uint32_t Y = get_Y(sched_ctrl->search_space, slot, iterator->UE->rnti);
     uint8_t nr_of_candidates;
 
     for (int i=0; i<5; i++) {
@@ -875,7 +738,8 @@ void pf_dl(module_id_t module_id,
                                         Y);
 
     if (CCEIndex<0) {
-      LOG_D(NR_MAC, "%4d.%2d could not find CCE for DL DCI UE %d/RNTI %04x\n", frame, slot, UE_id, rnti);
+      LOG_D(NR_MAC, "%4d.%2d could not find CCE for DL DCI RNTI %04x\n", frame, slot, rnti);
+      iterator++;
       continue;
     }
 
@@ -883,48 +747,39 @@ void pf_dl(module_id_t module_id,
     * allocation after CCE alloc fail would be more complex) */
 
     int r_pucch = nr_get_pucch_resource(sched_ctrl->coreset, sched_ctrl->active_ubwp, ubwpd, CCEIndex);
-    const int alloc = nr_acknack_scheduling(module_id, UE_id, frame, slot, r_pucch, 0);
+    const int alloc = nr_acknack_scheduling(module_id, iterator->UE, frame, slot, r_pucch, 0);
 
     if (alloc<0) {
       LOG_D(NR_MAC,
-            "could not find PUCCH for UE %d/%04x@%d.%d\n",
-            UE_id,
+            "could not find PUCCH for %04x@%d.%d\n",
             rnti,
             frame,
             slot);
-      mac->pdcch_cand[cid]--;
+      iterator++;
       continue;
     }
 
-    /* reduce max_num_ue once we are sure UE can be allocated, i.e., has CCE
-     * and PUCCH */
-    max_num_ue--;
-    AssertFatal(max_num_ue >= 0, "Illegal max_num_ue %d\n", max_num_ue);
     sched_ctrl->cce_index = CCEIndex;
     fill_pdcch_vrb_map(mac,
                        /* CC_id = */ 0,
                        &sched_ctrl->sched_pdcch,
                        CCEIndex,
                        sched_ctrl->aggregation_level);
-    /* reduce max_num_ue once we are sure UE can be allocated, i.e., has CCE */
-    max_num_ue--;
-
-    if (max_num_ue < 0) return;
 
     /* MCS has been set above */
-    const int tda = RC.nrmac[module_id]->preferred_dl_tda[sched_ctrl->active_bwp ? sched_ctrl->active_bwp->bwp_Id : 0][slot];
+    const int tda = get_dl_tda(RC.nrmac[module_id], scc, slot);
     AssertFatal(tda>=0,"Unable to find PDSCH time domain allocation in list\n");
     NR_sched_pdsch_t *sched_pdsch = &sched_ctrl->sched_pdsch;
     NR_pdsch_semi_static_t *ps = &sched_ctrl->pdsch_semi_static;
 
-    if (ps->nrOfLayers != layers[UE_id] || ps->time_domain_allocation != tda) {
+    if (ps->nrOfLayers != iterator->UE->layers || ps->time_domain_allocation != tda ) {
       nr_set_pdsch_semi_static(sib1,
                                scc,
-                               UE_info->CellGroup[UE_id],
+                               iterator->UE->CellGroup,
                                sched_ctrl->active_bwp,
                                bwpd,
                                tda,
-                               layers[UE_id],
+                               iterator->UE->layers,
                                sched_ctrl,
                                ps);
     }
@@ -969,27 +824,25 @@ void pf_dl(module_id_t module_id,
 
     for (int rb = 0; rb < sched_pdsch->rbSize; rb++)
       rballoc_mask[rb + sched_pdsch->rbStart] ^= slbitmap;
+
+    remainUEs--;
+    iterator++;
   }
 }
 
 void nr_fr1_dlsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t slot) {
-  NR_UE_info_t *UE_info = &RC.nrmac[module_id]->UE_info;
+  NR_UEs_t *UE_info = &RC.nrmac[module_id]->UE_info;
 
-  if (UE_info->num_UEs == 0)
+  if (UE_info->list[0] == NULL)
     return;
 
   NR_ServingCellConfigCommon_t *scc = RC.nrmac[module_id]->common_channels[0].ServingCellConfigCommon;
   const int CC_id = 0;
   /* Get bwpSize and TDAfrom the first UE */
   /* This is temporary and it assumes all UEs have the same BWP and TDA*/
-  int UE_id = UE_info->list.head;
-  NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
-  const int bwp_id = sched_ctrl->active_bwp ? sched_ctrl->active_bwp->bwp_Id : 0;
-
-  if (!RC.nrmac[module_id]->preferred_dl_tda[bwp_id])
-    return;
-
-  const int tda = RC.nrmac[module_id]->preferred_dl_tda[bwp_id][slot];
+  NR_UE_info_t *UE=UE_info->list[0];
+  NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
+  const int tda = get_dl_tda(RC.nrmac[module_id], scc, slot);
   int startSymbolIndex, nrOfSymbols;
   const struct NR_PDSCH_TimeDomainResourceAllocationList *tdaList = sched_ctrl->active_bwp ?
         sched_ctrl->active_bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList :
@@ -998,17 +851,16 @@ void nr_fr1_dlsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t
   const int startSymbolAndLength = tdaList->list.array[tda]->startSymbolAndLength;
   SLIV2SL(startSymbolAndLength, &startSymbolIndex, &nrOfSymbols);
 
-
   const NR_SIB1_t *sib1 = RC.nrmac[module_id]->common_channels[0].sib1 ? RC.nrmac[module_id]->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL;
   NR_BWP_t *genericParameters = get_dl_bwp_genericParameters(sched_ctrl->active_bwp,
                                                              RC.nrmac[module_id]->common_channels[0].ServingCellConfigCommon,
                                                              sib1);
 
   NR_BWP_DownlinkDedicated_t *bwpd =
-      UE_info->CellGroup[UE_id] &&
-      UE_info->CellGroup[UE_id]->spCellConfig &&
-      UE_info->CellGroup[UE_id]->spCellConfig->spCellConfigDedicated ?
-      UE_info->CellGroup[UE_id]->spCellConfig->spCellConfigDedicated->initialDownlinkBWP : NULL;
+      UE->CellGroup &&
+      UE->CellGroup->spCellConfig &&
+      UE->CellGroup->spCellConfig->spCellConfigDedicated ?
+      UE->CellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP : NULL;
 
   const int coresetid = (sched_ctrl->active_bwp||bwpd) ? sched_ctrl->coreset->controlResourceSetId : RC.nrmac[module_id]->sched_ctrlCommon->coreset->controlResourceSetId;
 
@@ -1026,9 +878,9 @@ void nr_fr1_dlsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t
     rballoc_mask[i] = (~vrb_map[i+BWPStart])&0x3fff; //bitwise not and 14 symbols
 
     // if all the pdsch symbols are free
-    if((rballoc_mask[i]&slbitmap) ==
-        slbitmap)
+    if ((rballoc_mask[i]&slbitmap) == slbitmap) {
       n_rb_sched++;
+    }
   }
 
   /* Retrieve amount of data to send for this UE */
@@ -1037,7 +889,7 @@ void nr_fr1_dlsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t
   pf_dl(module_id,
         frame,
         slot,
-        &UE_info->list,
+        UE_info->list,
         MAX_MOBILES_PER_GNB,
         n_rb_sched,
         rballoc_mask);
@@ -1078,24 +930,21 @@ void nr_schedule_ue_spec(module_id_t module_id,
   if (!is_xlsch_in_slot(gNB_mac->dlsch_slot_bitmap[slot / 64], slot))
     return;
 
-  //if (slot==7 || slot == 17) return;
-
   /* PREPROCESSOR */
   gNB_mac->pre_processor_dl(module_id, frame, slot);
   const int CC_id = 0;
   NR_ServingCellConfigCommon_t *scc = gNB_mac->common_channels[CC_id].ServingCellConfigCommon;
-  NR_UE_info_t *UE_info = &gNB_mac->UE_info;
+  NR_UEs_t *UE_info = &gNB_mac->UE_info;
   nfapi_nr_dl_tti_request_body_t *dl_req = &gNB_mac->DL_req[CC_id].dl_tti_request_body;
-  NR_list_t *UE_list = &UE_info->list;
 
-  for (int UE_id = UE_list->head; UE_id >= 0; UE_id = UE_list->next[UE_id]) {
-    NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+  UE_iterator(UE_info->list, UE) {
+    NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
 
     if (sched_ctrl->ul_failure==1 && get_softmodem_params()->phy_test==0) continue;
 
     NR_sched_pdsch_t *sched_pdsch = &sched_ctrl->sched_pdsch;
-    UE_info->mac_stats[UE_id].dlsch_current_bytes = 0;
-    NR_CellGroupConfig_t *cg = UE_info->CellGroup[UE_id];
+    UE->mac_stats.dl.current_bytes = 0;
+    NR_CellGroupConfig_t *cg = UE->CellGroup;
 
     NR_BWP_DownlinkDedicated_t *bwpd =
         cg &&
@@ -1109,13 +958,13 @@ void nr_schedule_ue_spec(module_id_t module_id,
      * If we add the CE, ta_apply will be reset */
     if (frame == (sched_ctrl->ta_frame + 10) % 1024) {
       sched_ctrl->ta_apply = true; /* the timer is reset once TA CE is scheduled */
-      LOG_D(NR_MAC, "[UE %d][%d.%d] UL timing alignment procedures: setting flag for Timing Advance command\n", UE_id, frame, slot);
+      LOG_D(NR_MAC, "[UE %04x][%d.%d] UL timing alignment procedures: setting flag for Timing Advance command\n", UE->rnti, frame, slot);
     }
 
     if (sched_pdsch->rbSize <= 0)
       continue;
 
-    const rnti_t rnti = UE_info->rnti[UE_id];
+    const rnti_t rnti = UE->rnti;
     /* pre-computed PDSCH values that only change if time domain
      * allocation/DMRS parameters change. Updated in the preprocessor through
      * nr_set_pdsch_semi_static() */
@@ -1131,8 +980,8 @@ void nr_schedule_ue_spec(module_id_t module_id,
       /* PP has not selected a specific HARQ Process, get a new one */
       current_harq_pid = sched_ctrl->available_dl_harq.head;
       AssertFatal(current_harq_pid >= 0,
-                  "no free HARQ process available for UE %d\n",
-                  UE_id);
+                  "no free HARQ process available for UE %04x\n",
+                  UE->rnti);
       remove_front_nr_list(&sched_ctrl->available_dl_harq);
       sched_pdsch->dl_harq_pid = current_harq_pid;
     } else {
@@ -1152,12 +1001,11 @@ void nr_schedule_ue_spec(module_id_t module_id,
     harq->feedback_frame = pucch->frame;
     harq->feedback_slot = pucch->ul_slot;
     harq->is_waiting = true;
-    UE_info->mac_stats[UE_id].dlsch_rounds[harq->round]++;
+    UE->mac_stats.dl.rounds[harq->round]++;
     LOG_D(NR_MAC,
-          "%4d.%2d [DLSCH/PDSCH/PUCCH] UE %d RNTI %04x DCI L %d start %3d RBs %3d startSymbol %2d nb_symbol %2d dmrspos %x MCS %2d nrOfLayers %d TBS %4d HARQ PID %2d round %d RV %d NDI %d dl_data_to_ULACK %d (%d.%d) PUCCH allocation %d TPC %d\n",
+          "%4d.%2d [DLSCH/PDSCH/PUCCH] RNTI %04x DCI L %d start %3d RBs %3d startSymbol %2d nb_symbol %2d dmrspos %x MCS %2d nrOfLayers %d TBS %4d HARQ PID %2d round %d RV %d NDI %d dl_data_to_ULACK %d (%d.%d) PUCCH allocation %d TPC %d\n",
           frame,
           slot,
-          UE_id,
           rnti,
           sched_ctrl->aggregation_level,
           sched_pdsch->rbStart,
@@ -1170,7 +1018,7 @@ void nr_schedule_ue_spec(module_id_t module_id,
           TBS,
           current_harq_pid,
           harq->round,
-          nr_rv_round_map[harq->round],
+          nr_rv_round_map[harq->round%4],
           harq->ndi,
           pucch->timing_indicator,
           pucch->frame,
@@ -1186,7 +1034,7 @@ void nr_schedule_ue_spec(module_id_t module_id,
 
     NR_SearchSpace_t *ss = (bwp||bwpd) ? sched_ctrl->search_space : gNB_mac->sched_ctrlCommon->search_space;
 
-    const int bwpid = bwp ? bwp->bwp_Id : 0;
+    const int bwp_id = bwp ? bwp->bwp_Id : 0;
     const int coresetid = (bwp||bwpd) ? sched_ctrl->coreset->controlResourceSetId : gNB_mac->sched_ctrlCommon->coreset->controlResourceSetId;
 
     /* look up the PDCCH PDU for this CC, BWP, and CORESET. If it does not exist, create it */
@@ -1200,7 +1048,7 @@ void nr_schedule_ue_spec(module_id_t module_id,
       dl_tti_pdcch_pdu->PDUSize = (uint8_t)(2+sizeof(nfapi_nr_dl_tti_pdcch_pdu));
       dl_req->nPDUs += 1;
       pdcch_pdu = &dl_tti_pdcch_pdu->pdcch_pdu.pdcch_pdu_rel15;
-      LOG_D(NR_MAC,"Trying to configure DL pdcch for UE %d, bwp %d, cs %d\n",UE_id,bwpid,coresetid);
+      LOG_D(NR_MAC,"Trying to configure DL pdcch for UE %04x, bwp %d, cs %d\n", UE->rnti, bwp_id, coresetid);
       NR_ControlResourceSet_t *coreset = (bwp||bwpd)? sched_ctrl->coreset:gNB_mac->sched_ctrlCommon->coreset;
       nr_configure_pdcch(pdcch_pdu, coreset, genericParameters, &sched_ctrl->sched_pdcch);
       gNB_mac->pdcch_pdu_idx[CC_id][coresetid] = pdcch_pdu;
@@ -1232,13 +1080,14 @@ void nr_schedule_ue_spec(module_id_t module_id,
     pdsch_pdu->CyclicPrefix = genericParameters->cyclicPrefix ? *genericParameters->cyclicPrefix : 0;
     // Codeword information
     pdsch_pdu->NrOfCodewords = 1;
+    //number of information bits per 1024 coded bits expressed in 0.1 bit units
     pdsch_pdu->targetCodeRate[0] = R;
     pdsch_pdu->qamModOrder[0] = Qm;
     pdsch_pdu->mcsIndex[0] = sched_pdsch->mcs;
     pdsch_pdu->mcsTable[0] = ps->mcsTableIdx;
     AssertFatal(harq!=NULL,"harq is null\n");
-    AssertFatal(harq->round<4,"%d",harq->round);
-    pdsch_pdu->rvIndex[0] = nr_rv_round_map[harq->round];
+    AssertFatal(harq->round<gNB_mac->dl_bler.harq_round_max,"%d",harq->round);
+    pdsch_pdu->rvIndex[0] = nr_rv_round_map[harq->round%4];
     pdsch_pdu->TBSize[0] = TBS;
     pdsch_pdu->dataScramblingId = *scc->physCellId;
     pdsch_pdu->nrOfLayers = nrOfLayers;
@@ -1259,6 +1108,27 @@ void nr_schedule_ue_spec(module_id_t module_id,
     // Resource Allocation in time domain
     pdsch_pdu->StartSymbolIndex = ps->startSymbolIndex;
     pdsch_pdu->NrOfSymbols = ps->nrOfSymbols;
+    // Precoding
+    if (sched_ctrl->set_pmi) {
+      const int report_id = sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.csi_report_id;
+      nr_csi_report_t *csi_report = &UE->csi_report_template[report_id];
+      pdsch_pdu->precodingAndBeamforming.prg_size = pdsch_pdu->rbSize;
+      pdsch_pdu->precodingAndBeamforming.prgs_list[0].pm_idx = set_pm_index(sched_ctrl,
+                                                                            nrOfLayers,
+                                                                            csi_report->N1,
+                                                                            csi_report->N2,
+                                                                            gNB_mac->xp_pdsch_antenna_ports,
+                                                                            csi_report->codebook_mode);
+    }
+    // TBS_LBRM according to section 5.4.2.1 of 38.212
+    long maxMIMO_Layers = cg && cg->spCellConfig && cg->spCellConfig->spCellConfigDedicated ? *cg->spCellConfig->spCellConfigDedicated->pdsch_ServingCellConfig->choice.setup->ext1->maxMIMO_Layers : 1;
+    int nl_tbslbrm = maxMIMO_Layers < 4 ? maxMIMO_Layers : 4;
+    // Maximum number of PRBs across all configured DL BWPs
+    int bw_tbslbrm = get_bw_tbslbrm(genericParameters, cg);
+    pdsch_pdu->maintenance_parms_v3.tbSizeLbrmBytes = nr_compute_tbslbrm(ps->mcsTableIdx,
+                                                                         bw_tbslbrm,
+                                                                         nl_tbslbrm);
+
     NR_PDSCH_Config_t *pdsch_Config=NULL;
 
     if (bwp &&
@@ -1312,19 +1182,18 @@ void nr_schedule_ue_spec(module_id_t module_id,
     dci_pdu_rel15_t dci_payload;
     memset(&dci_payload, 0, sizeof(dci_pdu_rel15_t));
     // bwp indicator
-    const int n_dl_bwp = bwp ? UE_info->CellGroup[UE_id]->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count : 0;
-    AssertFatal(n_dl_bwp <= 1, "downlinkBWP_ToAddModList has %d BWP!\n", n_dl_bwp);
+    const int n_dl_bwp = bwp ? cg->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count : 0;
+    AssertFatal(n_dl_bwp <= NR_MAX_NUM_BWP, "downlinkBWP_ToAddModList has %d BWP!\n", n_dl_bwp);
+
     // as per table 7.3.1.1.2-1 in 38.212
     dci_payload.bwp_indicator.val = bwp ? (n_dl_bwp < 4 ? bwp->bwp_Id : bwp->bwp_Id - 1) : 0;
 
     if (bwp) AssertFatal(bwp->bwp_Dedicated->pdsch_Config->choice.setup->resourceAllocation == NR_PDSCH_Config__resourceAllocation_resourceAllocationType1,
                            "Only frequency resource allocation type 1 is currently supported\n");
 
-    dci_payload.frequency_domain_assignment.val =
-      PRBalloc_to_locationandbandwidth0(
-        pdsch_pdu->rbSize,
-        pdsch_pdu->rbStart,
-        pdsch_pdu->BWPSize);
+    dci_payload.frequency_domain_assignment.val = PRBalloc_to_locationandbandwidth0(pdsch_pdu->rbSize,
+                                                                                    pdsch_pdu->rbStart,
+                                                                                    pdsch_pdu->BWPSize);
     dci_payload.format_indicator = 1;
     dci_payload.time_domain_assignment.val = ps->time_domain_allocation;
     dci_payload.mcs = sched_pdsch->mcs;
@@ -1339,13 +1208,14 @@ void nr_schedule_ue_spec(module_id_t module_id,
     dci_payload.dmrs_sequence_initialization.val = pdsch_pdu->SCID;
     LOG_D(NR_MAC,
           "%4d.%2d DCI type 1 payload: freq_alloc %d (%d,%d,%d), "
-          "time_alloc %d, vrb to prb %d, mcs %d tb_scaling %d ndi %d rv %d tpc %d ti %d\n",
+          "nrOfLayers %d, time_alloc %d, vrb to prb %d, mcs %d tb_scaling %d ndi %d rv %d tpc %d ti %d\n",
           frame,
           slot,
           dci_payload.frequency_domain_assignment.val,
           pdsch_pdu->rbStart,
           pdsch_pdu->rbSize,
           pdsch_pdu->BWPSize,
+          pdsch_pdu->nrOfLayers,
           dci_payload.time_domain_assignment.val,
           dci_payload.vrb_to_prb_mapping.val,
           dci_payload.mcs,
@@ -1355,19 +1225,19 @@ void nr_schedule_ue_spec(module_id_t module_id,
           dci_payload.tpc,
           pucch->timing_indicator);
 
-
     int dci_format = ss && ss->searchSpaceType && ss->searchSpaceType->present == NR_SearchSpace__searchSpaceType_PR_ue_Specific ?
                      NR_DL_DCI_FORMAT_1_1 : NR_DL_DCI_FORMAT_1_0;
 
     const int rnti_type = NR_RNTI_C;
     fill_dci_pdu_rel15(scc,
-                       UE_info->CellGroup[UE_id],
+                       cg,
                        dci_pdu,
                        &dci_payload,
                        dci_format,
                        rnti_type,
                        pdsch_pdu->BWPSize,
-                       bwp? bwp->bwp_Id : 0,
+                       bwp ? bwp->bwp_Id : 0,
+                       coresetid,
                        gNB_mac->cset0_bwp_size);
 
     LOG_D(NR_MAC,
@@ -1381,17 +1251,16 @@ void nr_schedule_ue_spec(module_id_t module_id,
        * from RLC or encode MAC CEs. The TX_req structure is filled below
        * or copy data to FAPI structures */
       LOG_D(NR_MAC,
-            "%d.%2d DL retransmission UE %d/RNTI %04x HARQ PID %d round %d NDI %d\n",
+            "%d.%2d DL retransmission RNTI %04x HARQ PID %d round %d NDI %d\n",
             frame,
             slot,
-            UE_id,
             rnti,
             current_harq_pid,
             harq->round,
             harq->ndi);
       AssertFatal(harq->sched_pdsch.tb_size == TBS,
-                  "UE %d mismatch between scheduled TBS and buffered TB for HARQ PID %d\n",
-                  UE_id,
+                  "UE %04x mismatch between scheduled TBS and buffered TB for HARQ PID %d\n",
+                  UE->rnti,
                   current_harq_pid);
       T(T_GNB_MAC_RETRANSMISSION_DL_PDU_WITH_DATA, T_INT(module_id), T_INT(CC_id), T_INT(rnti),
         T_INT(frame), T_INT(slot), T_INT(current_harq_pid), T_INT(harq->round), T_BUFFER(harq->transportBlock, TBS));
@@ -1428,7 +1297,7 @@ void nr_schedule_ue_spec(module_id_t module_id,
             /* limit requested number of bytes to what preprocessor specified, or
              * such that TBS is full */
             const rlc_buffer_occupancy_t ndata = min(sched_ctrl->rlc_status[lcid].bytes_in_buffer,
-                                                 bufEnd-buf-sizeof(NR_MAC_SUBHEADER_LONG));
+                                                     bufEnd-buf-sizeof(NR_MAC_SUBHEADER_LONG));
             tbs_size_t len = mac_rlc_data_req(module_id,
                                               rnti,
                                               module_id,
@@ -1449,7 +1318,7 @@ void nr_schedule_ue_spec(module_id_t module_id,
                   lcid < 4 ? "DCCH" : "DTCH",
                   lcid,
                   ndata,
-                  bufEnd-buf-+sizeof(NR_MAC_SUBHEADER_LONG));
+                  bufEnd-buf-sizeof(NR_MAC_SUBHEADER_LONG));
 
             if (len == 0)
               break;
@@ -1463,7 +1332,7 @@ void nr_schedule_ue_spec(module_id_t module_id,
             lcid_bytes += len;
           }
 
-          UE_info->mac_stats[UE_id].lc_bytes_tx[lcid] += lcid_bytes;
+          UE->mac_stats.dl.lc_bytes[lcid] += lcid_bytes;
         }
       } else if (get_softmodem_params()->phy_test || get_softmodem_params()->do_ra) {
         /* we will need the large header, phy-test typically allocates all
@@ -1480,6 +1349,8 @@ void nr_schedule_ue_spec(module_id_t module_id,
           header->L = htons(bufEnd-buf);
           dlsch_total_bytes += bufEnd-buf;
 
+          for (; ((intptr_t)buf) % 4; buf++)
+            *buf = lrand48() & 0xff;
           for (; buf < bufEnd - 3; buf += 4) {
             uint32_t *buf32 = (uint32_t *)buf;
             *buf32 = lrand48();
@@ -1501,23 +1372,25 @@ void nr_schedule_ue_spec(module_id_t module_id,
         buf=bufEnd;
       }
 
-      UE_info->mac_stats[UE_id].dlsch_total_bytes += TBS;
-      UE_info->mac_stats[UE_id].dlsch_current_bytes = TBS;
+      UE->mac_stats.dl.total_bytes += TBS;
+      UE->mac_stats.dl.current_bytes = TBS;
       /* save retransmission information */
       harq->sched_pdsch = *sched_pdsch;
       /* save which time allocation has been used, to be used on
        * retransmissions */
       harq->sched_pdsch.time_domain_allocation = ps->time_domain_allocation;
+      /* save nr of layers for retransmissions */
+      harq->sched_pdsch.nrOfLayers = ps->nrOfLayers;
 
       // ta command is sent, values are reset
       if (sched_ctrl->ta_apply) {
         sched_ctrl->ta_apply = false;
         sched_ctrl->ta_frame = frame;
         LOG_D(NR_MAC,
-              "%d.%2d UE %d TA scheduled, resetting TA frame\n",
+              "%d.%2d UE %04x TA scheduled, resetting TA frame\n",
               frame,
               slot,
-              UE_id);
+              UE->rnti);
       }
 
       T(T_GNB_MAC_DL_PDU_WITH_DATA, T_INT(module_id), T_INT(CC_id), T_INT(rnti),
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
index 5f23a40106a029eed1c45d0354df18e85fe68cf1..808fc613f1a854d7b410b7a5e28b82ea05aeaa3f 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
@@ -69,7 +69,6 @@ void nr_schedule_css_dlsch_phytest(module_id_t   module_idP,
   nfapi_nr_pdu_t        *TX_req;
 
   uint16_t rnti = 0x1234;
-  
   //  int time_domain_assignment,k0;
 
   NR_ServingCellConfigCommon_t *scc=cc->ServingCellConfigCommon;
@@ -152,8 +151,6 @@ void nr_schedule_css_dlsch_phytest(module_id_t   module_idP,
 	NrOfSymbols = NrOfSymbols_tmp;
         StartSymbolIndex = StartSymbolIndex_tmp;
         mappingtype = mappingtype_tmp;
-	//	k0 = *scc->downlinkConfigCommon->initialDownlinkBWP->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list.array[i]->k0;
-	//	time_domain_assignment = i;
       }
     }
     AssertFatal(StartSymbolIndex>=0,"StartSymbolIndex is negative\n");
@@ -163,80 +160,9 @@ void nr_schedule_css_dlsch_phytest(module_id_t   module_idP,
                                                     scc->dmrs_TypeA_Position,
                                                     NrOfSymbols,
                                                     StartSymbolIndex,
-                                                    mappingtype, 1);
-
-    /*
-    AssertFatal(k0==0,"k0 is not zero for Initial DL BWP TimeDomain Alloc\n");
-    nr_configure_css_dci_initial(pdcch_pdu_rel15,
-				 scs, 
-				 scs, 
-				 FR, 
-				 0, 
-				 0, 
-				 0,
-				 sfn_sf, slotP,
-				 slots_per_frame,
-				 dlBWP_carrier_bandwidth);
-    
-    
-    pdu_rel15->frequency_domain_assignment = PRBalloc_to_locationandbandwidth0(pdsch_pdu_rel15->rbSize, 
-                                                                               pdsch_pdu_rel15->rbStart, 
-                                                                               dlBWP_carrier_bandwidth);
-    pdu_rel15->time_domain_assignment = time_domain_assignment;
-    
-    pdu_rel15->vrb_to_prb_mapping = 1;
-    pdu_rel15->mcs = 9;
-    pdu_rel15->tb_scaling = 1;
-    
-    pdu_rel15->ra_preamble_index = 25;
-    pdu_rel15->format_indicator = 1;
-    pdu_rel15->ndi = 1;
-    pdu_rel15->rv = 0;
-    pdu_rel15->harq_pid = 0;
-    pdu_rel15->dai = 2;
-    pdu_rel15->tpc = 2;
-    pdu_rel15->pucch_resource_indicator = 7;
-    pdu_rel15->pdsch_to_harq_feedback_timing_indicator = 7;
-    
-    LOG_D(MAC, "[gNB scheduler phytest] DCI type 1 payload: freq_alloc %d, time_alloc %d, vrb to prb %d, mcs %d tb_scaling %d ndi %d rv %d\n",
-	  pdu_rel15->frequency_domain_assignment,
-	  pdu_rel15->time_domain_assignment,
-	  pdu_rel15->vrb_to_prb_mapping,
-	  pdu_rel15->mcs,
-	  pdu_rel15->tb_scaling,
-	  pdu_rel15->ndi,
-	  pdu_rel15->rv);
-    
-    params_rel15->rnti = rnti;
-    params_rel15->rnti_type = NFAPI_NR_RNTI_C;
-    params_rel15->dci_format = NFAPI_NR_DL_DCI_FORMAT_1_0;
-    //params_rel15->aggregation_level = 1;
-    LOG_D(MAC, "DCI type 1 params: rnti %x, rnti_type %d, dci_format %d\n \
-                coreset params: mux_pattern %d, n_rb %d, n_symb %d, rb_offset %d  \n \
-                ss params : nb_ss_sets_per_slot %d, first symb %d, nb_slots %d, sfn_mod2 %d, first slot %d\n",
-	  params_rel15->rnti,
-	  params_rel15->rnti_type,
-	  params_rel15->dci_format,
-	  params_rel15->mux_pattern,
-	  params_rel15->n_rb,
-	  params_rel15->n_symb,
-	  params_rel15->rb_offset,
-	  params_rel15->nb_ss_sets_per_slot,
-	  params_rel15->first_symbol,
-	  params_rel15->nb_slots,
-	  params_rel15->sfn_mod2,
-	  params_rel15->first_slot);
-    nr_get_tbs_dl(&dl_tti_pdsch_pdu->pdsch_pdu, dl_tti_dci_pdu->dci_dl_pdu,0);
-    LOG_D(MAC, "DLSCH PDU: start PRB %d n_PRB %d start symbol %d nb_symbols %d nb_layers %d nb_codewords %d mcs %d\n",
-	  pdsch_pdu_rel15->rbStart,
-	  pdsch_pdu_rel15->rbSize,
-	  pdsch_pdu_rel15->StartSymbolIndex,
-	  pdsch_pdu_rel15->NrOfSymbols,
-	  pdsch_pdu_rel15->nrOfLayers,
-	  pdsch_pdu_rel15->NrOfCodewords,
-	  pdsch_pdu_rel15->mcsIndex[0]);
-    */
-    
+                                                    mappingtype,
+                                                    1);
+
     nr_mac->DL_req[CC_id].dl_tti_request_body.nPDUs+=2;
     
     TX_req = &nr_mac->TX_req[CC_id].pdu_list[nr_mac->TX_req[CC_id].Number_of_PDUs];
@@ -266,24 +192,21 @@ void nr_preprocessor_phytest(module_id_t module_id,
 {
   if (!is_xlsch_in_slot(dlsch_slot_bitmap, slot))
     return;
-  NR_UE_info_t *UE_info = &RC.nrmac[module_id]->UE_info;
+  NR_UE_info_t *UE = RC.nrmac[module_id]->UE_info.list[0];
   NR_ServingCellConfigCommon_t *scc = RC.nrmac[module_id]->common_channels[0].ServingCellConfigCommon;
-  const int UE_id = 0;
+  NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
   const int CC_id = 0;
-  AssertFatal(UE_info->active[UE_id],
-              "%s(): expected UE %d to be active\n",
-              __func__,
-              UE_id);
-  NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
-  const int tda = sched_ctrl->active_bwp ? RC.nrmac[module_id]->preferred_dl_tda[sched_ctrl->active_bwp->bwp_Id][slot] : 1;
+
+  const int tda = get_dl_tda(RC.nrmac[module_id], scc, slot);
   NR_pdsch_semi_static_t *ps = &sched_ctrl->pdsch_semi_static;
   ps->nrOfLayers = target_dl_Nl;
   if (ps->time_domain_allocation != tda || ps->nrOfLayers != target_dl_Nl)
-    nr_set_pdsch_semi_static(NULL, scc, UE_info->CellGroup[UE_id], sched_ctrl->active_bwp, NULL, tda, target_dl_Nl, sched_ctrl, ps);
+    nr_set_pdsch_semi_static(NULL, scc, UE->CellGroup, sched_ctrl->active_bwp, NULL, tda, target_dl_Nl,sched_ctrl , ps);
 
   /* find largest unallocated chunk */
   const int bwpSize = NRRIV2BW(sched_ctrl->active_bwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
   const int BWPStart = NRRIV2PRBOFFSET(sched_ctrl->active_bwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
+
   int rbStart = 0;
   int rbSize = 0;
   if (target_dl_bw>bwpSize)
@@ -314,7 +237,7 @@ void nr_preprocessor_phytest(module_id_t module_id,
   sched_ctrl->dl_lc_num = 1;
   const int lcid = DL_SCH_LCID_DTCH;
   sched_ctrl->dl_lc_ids[sched_ctrl->dl_lc_num - 1] = lcid;
-  const uint16_t rnti = UE_info->rnti[UE_id];
+  const uint16_t rnti = UE->rnti;
   /* update sched_ctrl->num_total_bytes so that postprocessor schedules data,
    * if available */
   sched_ctrl->rlc_status[lcid] = mac_rlc_status_ind(module_id,
@@ -340,8 +263,7 @@ void nr_preprocessor_phytest(module_id_t module_id,
   }
   AssertFatal(nr_of_candidates>0,"nr_of_candidates is 0\n");
 
-  const int cid = sched_ctrl->coreset->controlResourceSetId;
-  const uint16_t Y = get_Y(cid%3, slot, UE_info->rnti[UE_id]);
+  const uint32_t Y = get_Y(sched_ctrl->search_space, slot, UE->rnti);
 
   int CCEIndex = find_pdcch_candidate(RC.nrmac[module_id],
                                       CC_id,
@@ -352,21 +274,19 @@ void nr_preprocessor_phytest(module_id_t module_id,
                                       Y);
 
   AssertFatal(CCEIndex >= 0,
-              "%s(): could not find CCE for UE %d\n",
+              "%s(): could not find CCE for UE %04x\n",
               __func__,
-              UE_id);
+              UE->rnti);
 
   int r_pucch = nr_get_pucch_resource(sched_ctrl->coreset, sched_ctrl->active_ubwp, NULL, CCEIndex);
-  const int alloc = nr_acknack_scheduling(module_id, UE_id, frame, slot, r_pucch, 0);
+  const int alloc = nr_acknack_scheduling(module_id, UE, frame, slot, r_pucch, 0);
   if (alloc < 0) {
     LOG_D(MAC,
-          "%s(): could not find PUCCH for UE %d/%04x@%d.%d\n",
+          "%s(): could not find PUCCH for UE %04x@%d.%d\n",
           __func__,
-          UE_id,
           rnti,
           frame,
           slot);
-    RC.nrmac[module_id]->pdcch_cand[cid]--;
     return;
   }
 
@@ -388,6 +308,7 @@ void nr_preprocessor_phytest(module_id_t module_id,
   sched_pdsch->rbSize = rbSize;
 
   sched_pdsch->mcs = target_dl_mcs;
+  sched_ctrl->dl_bler_stats.mcs = target_dl_mcs; /* for logging output */
   sched_pdsch->Qm = nr_get_Qm_dl(sched_pdsch->mcs, ps->mcsTableIdx);
   sched_pdsch->R = nr_get_code_rate_dl(sched_pdsch->mcs, ps->mcsTableIdx);
   sched_pdsch->tb_size = nr_compute_tbs(sched_pdsch->Qm,
@@ -412,6 +333,7 @@ void nr_preprocessor_phytest(module_id_t module_id,
 
 uint32_t target_ul_mcs = 9;
 uint32_t target_ul_bw = 50;
+uint32_t target_ul_Nl = 1;
 uint64_t ulsch_slot_bitmap = (1 << 8);
 bool nr_ul_preprocessor_phytest(module_id_t module_id, frame_t frame, sub_frame_t slot)
 {
@@ -419,32 +341,36 @@ bool nr_ul_preprocessor_phytest(module_id_t module_id, frame_t frame, sub_frame_
   NR_COMMON_channels_t *cc = nr_mac->common_channels;
   NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon;
   const int mu = scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.subcarrierSpacing;
-  NR_UE_info_t *UE_info = &nr_mac->UE_info;
+  NR_UE_info_t *UE = nr_mac->UE_info.list[0];
 
-  AssertFatal(UE_info->num_UEs <= 1,
-              "%s() cannot handle more than one UE, but found %d\n",
-              __func__,
-              UE_info->num_UEs);
-  if (UE_info->num_UEs == 0)
+  AssertFatal(nr_mac->UE_info.list[1] == NULL,
+              "cannot handle more than one UE\n");
+  if (UE == NULL)
     return false;
 
-  const int UE_id = 0;
   const int CC_id = 0;
 
-  NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+  NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
 
-  const int tda = sched_ctrl->active_ubwp ? RC.nrmac[module_id]->preferred_ul_tda[sched_ctrl->active_ubwp->bwp_Id][slot] : 1;
-  if (tda < 0)
-    return false;
   const struct NR_PUSCH_TimeDomainResourceAllocationList *tdaList =
     sched_ctrl->active_ubwp->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
-  AssertFatal(tda < tdaList->list.count,
+  const int temp_tda = get_ul_tda(nr_mac, scc, slot);
+  if (temp_tda < 0)
+    return false;
+  AssertFatal(temp_tda < tdaList->list.count,
               "time domain assignment %d >= %d\n",
-              tda,
+              temp_tda,
               tdaList->list.count);
-  int K2 = get_K2(scc,NULL,sched_ctrl->active_ubwp, tda, mu);
+  int K2 = get_K2(scc,NULL,sched_ctrl->active_ubwp, temp_tda, mu);
   const int sched_frame = frame + (slot + K2 >= nr_slots_per_frame[mu]);
   const int sched_slot = (slot + K2) % nr_slots_per_frame[mu];
+  const int tda = get_ul_tda(nr_mac, scc, sched_slot);
+  if (tda < 0)
+    return false;
+  AssertFatal(tda < tdaList->list.count,
+              "time domain assignment %d >= %d\n",
+              tda,
+              tdaList->list.count);
   /* check if slot is UL, and that slot is 8 (assuming K2=6 because of UE
    * limitations).  Note that if K2 or the TDD configuration is changed, below
    * conditions might exclude each other and never be true */
@@ -455,15 +381,19 @@ bool nr_ul_preprocessor_phytest(module_id_t module_id, frame_t frame, sub_frame_
                   sched_ctrl->search_space->searchSpaceType->present == NR_SearchSpace__searchSpaceType_PR_ue_Specific) ?
                     sched_ctrl->search_space->searchSpaceType->choice.ue_Specific->dci_Formats : 0;
   const int dci_format = f ? NR_UL_DCI_FORMAT_0_1 : NR_UL_DCI_FORMAT_0_0;
-  const uint8_t num_dmrs_cdm_grps_no_data = 1;
+  uint8_t num_dmrs_cdm_grps_no_data = 1;
+  if ((target_ul_Nl==4)||(target_ul_Nl==3))
+    num_dmrs_cdm_grps_no_data = 2;
+  
   /* we want to avoid a lengthy deduction of DMRS and other parameters in
    * every TTI if we can save it, so check whether dci_format, TDA, or
    * num_dmrs_cdm_grps_no_data has changed and only then recompute */
   NR_pusch_semi_static_t *ps = &sched_ctrl->pusch_semi_static;
   if (ps->time_domain_allocation != tda
       || ps->dci_format != dci_format
+      || ps->nrOfLayers != target_ul_Nl
       || ps->num_dmrs_cdm_grps_no_data != num_dmrs_cdm_grps_no_data)
-    nr_set_pusch_semi_static(NULL, scc, sched_ctrl->active_ubwp, NULL,dci_format, tda, num_dmrs_cdm_grps_no_data, ps);
+    nr_set_pusch_semi_static(NULL, scc, sched_ctrl->active_ubwp, NULL,dci_format, tda, num_dmrs_cdm_grps_no_data,target_ul_Nl,ps);
 
   uint16_t rbStart = 0;
   uint16_t rbSize;
@@ -508,8 +438,7 @@ bool nr_ul_preprocessor_phytest(module_id_t module_id, frame_t frame, sub_frame_
   }
   AssertFatal(nr_of_candidates>0,"nr_of_candidates is 0\n");
 
-  const int cid = sched_ctrl->coreset->controlResourceSetId;
-  const uint16_t Y = get_Y(cid%3, slot, UE_info->rnti[UE_id]);
+  const uint32_t Y = get_Y(sched_ctrl->search_space, slot, UE->rnti);
 
   int CCEIndex = find_pdcch_candidate(nr_mac,
                                       CC_id,
@@ -521,7 +450,6 @@ bool nr_ul_preprocessor_phytest(module_id_t module_id, frame_t frame, sub_frame_
 
   if (CCEIndex < 0) {
     LOG_E(MAC, "%s(): CCE list not empty, couldn't schedule PUSCH\n", __func__);
-    nr_mac->pdcch_cand[cid]--;
     return false;
   }
 
@@ -530,12 +458,14 @@ bool nr_ul_preprocessor_phytest(module_id_t module_id, frame_t frame, sub_frame_
   const int mcs = target_ul_mcs;
   NR_sched_pusch_t *sched_pusch = &sched_ctrl->sched_pusch;
   sched_pusch->mcs = mcs;
+  sched_ctrl->ul_bler_stats.mcs = mcs; /* for logging output */
   sched_pusch->rbStart = rbStart;
   sched_pusch->rbSize = rbSize;
   /* get the PID of a HARQ process awaiting retransmission, or -1 for "any new" */
   sched_pusch->ul_harq_pid = sched_ctrl->retrans_ul_harq.head;
 
   /* Calculate TBS from MCS */
+  ps->nrOfLayers = target_ul_Nl;
   sched_pusch->R = nr_get_code_rate_ul(mcs, ps->mcs_table);
   sched_pusch->Qm = nr_get_Qm_ul(mcs, ps->mcs_table);
   if (ps->pusch_Config->tp_pi2BPSK
@@ -550,7 +480,7 @@ bool nr_ul_preprocessor_phytest(module_id_t module_id, frame_t frame, sub_frame_
                                         ps->N_PRB_DMRS * ps->num_dmrs_symb,
                                         0, // nb_rb_oh
                                         0,
-                                        1 /* NrOfLayers */)
+                                        ps->nrOfLayers /* NrOfLayers */)
                          >> 3;
 
   /* mark the corresponding RBs as used */
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
index 3f7a908395dfc4039dd694e4bec8b1b76049119a..4023c4ed4e1cd0c6b46fa23c8d761489e8cd3964 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
@@ -113,18 +113,18 @@ uint8_t nr_ss_first_symb_idx_scs_120_120_mux3[4] = {4,8,2,6};
 uint8_t nr_max_number_of_candidates_per_slot[4] = {44, 36, 22, 20};
 uint8_t nr_max_number_of_cces_per_slot[4] = {56, 56, 48, 32};
 
-// CQI TABLES
+// CQI TABLES (10 times the value in 214 to adequately compare with R)
 // Table 1 (38.214 5.2.2.1-2)
-uint16_t cqi_table1[16][2] = {{0,0},{2,78},{2,120},{2,193},{2,308},{2,449},{2,602},{4,378},
-                              {4,490},{4,616},{6,466},{6,567},{6,666},{6,772},{6,873},{6,948}};
+uint16_t cqi_table1[16][2] = {{0,0},{2,780},{2,1200},{2,1930},{2,3080},{2,4490},{2,6020},{4,3780},
+                              {4,4900},{4,6160},{6,4660},{6,5670},{6,6660},{6,7720},{6,8730},{6,9480}};
 
 // Table 2 (38.214 5.2.2.1-3)
-uint16_t cqi_table2[16][2] = {{0,0},{2,78},{2,193},{2,449},{4,378},{4,490},{4,616},{6,466},
-                              {6,567},{6,666},{6,772},{6,873},{8,711},{8,797},{8,885},{8,948}};
+uint16_t cqi_table2[16][2] = {{0,0},{2,780},{2,1930},{2,4490},{4,3780},{4,4900},{4,6160},{6,4660},
+                              {6,5670},{6,6660},{6,7720},{6,8730},{8,7110},{8,7970},{8,8850},{8,9480}};
 
 // Table 2 (38.214 5.2.2.1-4)
-uint16_t cqi_table3[16][2] = {{0,0},{2,30},{2,50},{2,78},{2,120},{2,193},{2,308},{2,449},
-                              {2,602},{4,378},{4,490},{4,616},{6,466},{6,567},{6,666},{6,772}};
+uint16_t cqi_table3[16][2] = {{0,0},{2,300},{2,500},{2,780},{2,1200},{2,1930},{2,3080},{2,4490},
+                              {2,6020},{4,3780},{4,4900},{4,6160},{6,4660},{6,5670},{6,6660},{6,7720}};
 
 
 static inline uint8_t get_max_candidates(uint8_t scs) {
@@ -145,50 +145,68 @@ uint8_t set_dl_nrOfLayers(NR_UE_sched_ctrl_t *sched_ctrl) {
 
 }
 
-void set_dl_mcs(NR_sched_pdsch_t *sched_pdsch,
-                NR_UE_sched_ctrl_t *sched_ctrl,
-                uint8_t *target_mcs,
-                uint8_t mcs_table_idx) {
-
-  if (sched_ctrl->set_mcs) {
-    // TODO for wideband case and multiple TB
-    int cqi_idx = sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.wb_cqi_1tb;
-    uint16_t target_coderate,target_qm;
-    if (cqi_idx>0) {
-      int cqi_table = sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.cqi_table;
-      if (cqi_table != mcs_table_idx) 
-       LOG_W(NR_MAC,"Indices of MCS tables don't correspond yet, cri_ri_li_pmi_cqi_report.cqi_table %d, mcs_table_index %d\n",cqi_table,mcs_table_idx);
-      switch (cqi_table) {
-        case 0:
-          target_qm = cqi_table1[cqi_idx][0];
-          target_coderate = cqi_table1[cqi_idx][1];
-          break;
-        case 1:
-          target_qm = cqi_table2[cqi_idx][0];
-          target_coderate = cqi_table2[cqi_idx][1];
-          break;
-        case 2:
-          target_qm = cqi_table3[cqi_idx][0];
-          target_coderate = cqi_table3[cqi_idx][1];
-          break;
-        default:
-          AssertFatal(1==0,"Invalid cqi table index %d\n",cqi_table);
-      }
-      int max_mcs = 28;
-      int R,Qm;
-      if (mcs_table_idx == 1)
-        max_mcs = 27;
-      for (int i=0; i<=max_mcs; i++) {
-        R = nr_get_code_rate_dl(i, mcs_table_idx);
-        Qm = nr_get_Qm_dl(i, mcs_table_idx);
-        if ((Qm == target_qm) && (target_coderate <= R)) {
-          *target_mcs = i;
-          break;
-        }
-      }
-    }
-    sched_ctrl->set_mcs = FALSE;
+uint16_t set_pm_index(NR_UE_sched_ctrl_t *sched_ctrl,
+                      int layers,
+                      int N1, int N2,
+                      int xp_pdsch_antenna_ports,
+                      int codebook_mode) {
+
+  int antenna_ports = (N1*N2)<<1;
+  if (xp_pdsch_antenna_ports == 1 &&
+      antenna_ports>1)
+    return 0; //identity matrix (basic 5G configuration handled by PMI report is with XP antennas)
+
+  int x1 = sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.pmi_x1;
+  int x2 = sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.pmi_x2;
+  LOG_D(NR_MAC,"PMI report: x1 %d x2 %d\n",x1,x2);
+
+  sched_ctrl->set_pmi = false;
+
+  if (antenna_ports == 2)
+    return x2;
+  else
+    AssertFatal(1==0,"More than 2 antenna ports not yet supported\n");
+}
+
+uint8_t get_mcs_from_cqi(int mcs_table, int cqi_table, int cqi_idx)
+{
+  if (cqi_idx <= 0) {
+    LOG_E(NR_MAC, "invalid cqi_idx %d, default to MCS 9\n", cqi_idx);
+    return 9;
   }
+
+  if (mcs_table != cqi_table) {
+    LOG_E(NR_MAC, "indices of CQI (%d) and MCS (%d) tables don't correspond yet\n", cqi_table, mcs_table);
+    return 9;
+  }
+
+  uint16_t target_coderate, target_qm;
+  switch (cqi_table) {
+    case 0:
+      target_qm = cqi_table1[cqi_idx][0];
+      target_coderate = cqi_table1[cqi_idx][1];
+      break;
+    case 1:
+      target_qm = cqi_table2[cqi_idx][0];
+      target_coderate = cqi_table2[cqi_idx][1];
+      break;
+    case 2:
+      target_qm = cqi_table3[cqi_idx][0];
+      target_coderate = cqi_table3[cqi_idx][1];
+      break;
+    default:
+      AssertFatal(1==0,"Invalid cqi table index %d\n",cqi_table);
+  }
+  const int max_mcs = mcs_table == 1 ? 27 : 28;
+  for (int i = 0; i <= max_mcs; i++) {
+    const int R = nr_get_code_rate_dl(i, mcs_table);
+    const int Qm = nr_get_Qm_dl(i, mcs_table);
+    if (Qm == target_qm && target_coderate <= R)
+      return i;
+  }
+
+  LOG_E(NR_MAC, "could not find maximum MCS from cqi_idx %d, default to 9\n", cqi_idx);
+  return 9;
 }
 
 void set_dl_dmrs_ports(NR_pdsch_semi_static_t *ps) {
@@ -270,7 +288,7 @@ NR_PDSCH_TimeDomainResourceAllocationList_t *get_pdsch_TimeDomainAllocationList(
 }
 
 
-NR_ControlResourceSet_t *get_coreset(module_id_t module_idP,
+NR_ControlResourceSet_t *get_coreset(gNB_MAC_INST *nrmac,
                                      NR_ServingCellConfigCommon_t *scc,
                                      void *bwp,
                                      NR_SearchSpace_t *ss,
@@ -280,7 +298,7 @@ NR_ControlResourceSet_t *get_coreset(module_id_t module_idP,
   if (ss_type == NR_SearchSpace__searchSpaceType_PR_common) { // common search space
     NR_ControlResourceSet_t *coreset;
     if(coreset_id == 0) {
-      coreset =  RC.nrmac[module_idP]->sched_ctrlCommon->coreset; // this is coreset 0
+      coreset =  nrmac->sched_ctrlCommon->coreset; // this is coreset 0
     } else if (bwp) {
       coreset = ((NR_BWP_Downlink_t*)bwp)->bwp_Common->pdcch_ConfigCommon->choice.setup->commonControlResourceSet;
     } else if (scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->commonControlResourceSet) {
@@ -422,36 +440,17 @@ NR_sched_pdcch_t set_pdcch_structure(gNB_MAC_INST *gNB_mac,
 }
 
 
-int cce_to_reg_interleaving(const int R, int k, int n_shift, const int C, int L, const int N_regs) {
-
-  int f;  // interleaving function
-  if(R==0)
-    f = k;
-  else {
-    int c = k/R;
-     int r = k%R;
-     f = (r*C + c + n_shift)%(N_regs/L);
-  }
-  return f;
-}
-
 int find_pdcch_candidate(gNB_MAC_INST *mac,
                          int cc_id,
                          int aggregation,
                          int nr_of_candidates,
                          NR_sched_pdcch_t *pdcch,
                          NR_ControlResourceSet_t *coreset,
-                         uint16_t Y){
+                         uint32_t Y){
 
   uint16_t *vrb_map = mac->common_channels[cc_id].vrb_map;
-  const int next_cand = mac->pdcch_cand[coreset->controlResourceSetId];
   const int N_ci = 0;
 
-  if(next_cand>=nr_of_candidates) {
-    LOG_D(NR_MAC,"No more available candidates for this coreset\n");
-    return -1;
-  }
-
   const int N_rb = pdcch->n_rb;  // nb of rbs of coreset per symbol
   const int N_symb = coreset->duration; // nb of coreset symbols
   const int N_regs = N_rb*N_symb; // nb of REGs per coreset
@@ -463,9 +462,10 @@ int find_pdcch_candidate(gNB_MAC_INST *mac,
 
   // loop over all the available candidates
   // this implements TS 38.211 Sec. 7.3.2.2
-  for(int m=next_cand; m<nr_of_candidates; m++) { // loop over candidates
+  for(int m=0; m<nr_of_candidates; m++) { // loop over candidates
     bool taken = false; // flag if the resource for a given candidate are taken
     int first_cce = aggregation * (( Y + CEILIDIV((m*N_cces),(aggregation*nr_of_candidates)) + N_ci ) % CEILIDIV(N_cces,aggregation));
+    LOG_D(NR_MAC,"Candidate %d of %d first_cce %d (L %d N_cces %d Y %d)\n", m, nr_of_candidates, first_cce, aggregation, N_cces, Y);
     for (int j=first_cce; (j<first_cce+aggregation) && !taken; j++) { // loop over CCEs
       for (int k=6*j/L; (k<(6*j/L+6/L)) && !taken; k++) { // loop over REG bundles
         int f = cce_to_reg_interleaving(R, k, pdcch->ShiftIndex, C, L, N_regs);
@@ -477,10 +477,8 @@ int find_pdcch_candidate(gNB_MAC_INST *mac,
         }
       }
     }
-    if(!taken){
-      mac->pdcch_cand[coreset->controlResourceSetId] = m++; // using candidate m, next available is m+1
+    if(!taken)
       return first_cce;
-    }
   }
   return -1;
 }
@@ -511,7 +509,6 @@ void fill_pdcch_vrb_map(gNB_MAC_INST *mac,
   }
 }
 
-
 bool nr_find_nb_rb(uint16_t Qm,
                    uint16_t R,
                    uint8_t nrOfLayers,
@@ -572,8 +569,7 @@ void nr_set_pdsch_semi_static(const NR_SIB1_t *sib1,
 {
   bool reset_dmrs = false;
 
-  NR_BWP_DownlinkDedicated_t *bwpd;
-
+  NR_BWP_DownlinkDedicated_t *bwpd = NULL;
   if (bwp && bwp->bwp_Dedicated) {
     bwpd = bwp->bwp_Dedicated;
   } else {
@@ -600,26 +596,24 @@ void nr_set_pdsch_semi_static(const NR_SIB1_t *sib1,
   }
   LOG_D(NR_MAC,"MCS Table Index: %d\n",ps->mcsTableIdx);
 
-  NR_PDSCH_Config_t *pdsch_Config=NULL;
-  if (bwpd) pdsch_Config = bwpd->pdsch_Config->choice.setup;
+  NR_PDSCH_Config_t *pdsch_Config = NULL;
+  if (bwpd && bwpd->pdsch_Config) pdsch_Config = bwpd->pdsch_Config->choice.setup;
   LOG_D(NR_MAC,"tda %d, ps->time_domain_allocation %d,layers %d, ps->nrOfLayers %d, pdsch_config %p\n",tda,ps->time_domain_allocation,layers,ps->nrOfLayers,pdsch_Config);
-  if (ps->time_domain_allocation != tda) {
-    reset_dmrs = true;
-    ps->time_domain_allocation = tda;
-    NR_PDSCH_TimeDomainResourceAllocationList_t *tdaList = get_pdsch_TimeDomainAllocationList(bwp, scc, sib1);
-    AssertFatal(tda < tdaList->list.count, "time_domain_allocation %d>=%d\n", tda, tdaList->list.count);
-    ps->mapping_type = tdaList->list.array[tda]->mappingType;
-    if (pdsch_Config) {
-      if (ps->mapping_type == NR_PDSCH_TimeDomainResourceAllocation__mappingType_typeB)
-        ps->dmrsConfigType = pdsch_Config->dmrs_DownlinkForPDSCH_MappingTypeB->choice.setup->dmrs_Type == NULL ? 0 : 1;
-      else
-        ps->dmrsConfigType = pdsch_Config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type == NULL ? 0 : 1;
-    }
+  reset_dmrs = true;
+  ps->time_domain_allocation = tda;
+  NR_PDSCH_TimeDomainResourceAllocationList_t *tdaList = get_pdsch_TimeDomainAllocationList(bwp, scc, sib1);
+  AssertFatal(tda < tdaList->list.count, "time_domain_allocation %d>=%d\n", tda, tdaList->list.count);
+  ps->mapping_type = tdaList->list.array[tda]->mappingType;
+  if (pdsch_Config) {
+    if (ps->mapping_type == NR_PDSCH_TimeDomainResourceAllocation__mappingType_typeB)
+      ps->dmrsConfigType = pdsch_Config->dmrs_DownlinkForPDSCH_MappingTypeB->choice.setup->dmrs_Type != NULL;
     else
-      ps->dmrsConfigType = NFAPI_NR_DMRS_TYPE1;
-    const int startSymbolAndLength = tdaList->list.array[tda]->startSymbolAndLength;
-    SLIV2SL(startSymbolAndLength, &ps->startSymbolIndex, &ps->nrOfSymbols);
+      ps->dmrsConfigType = pdsch_Config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type != NULL;
   }
+  else
+    ps->dmrsConfigType = NFAPI_NR_DMRS_TYPE1;
+  const int startSymbolAndLength = tdaList->list.array[tda]->startSymbolAndLength;
+  SLIV2SL(startSymbolAndLength, &ps->startSymbolIndex, &ps->nrOfSymbols);
 
   const long f = ((bwp || bwpd) &&
                   sched_ctrl->search_space &&
@@ -643,8 +637,8 @@ void nr_set_pdsch_semi_static(const NR_SIB1_t *sib1,
     ps->nrOfLayers = 1;
   }
   else {
-    if (ps->nrOfLayers != layers ||
-        ps->numDmrsCdmGrpsNoData == 0) {
+    LOG_D(NR_MAC,"checking layers\n");
+    if (ps->nrOfLayers != layers || ps->numDmrsCdmGrpsNoData == 0) {
       reset_dmrs = true;
       ps->nrOfLayers = layers;
       set_dl_dmrs_ports(ps);
@@ -667,7 +661,9 @@ void nr_set_pusch_semi_static(const NR_SIB1_t *sib1,
                               long dci_format,
                               int tda,
                               uint8_t num_dmrs_cdm_grps_no_data,
+                              uint8_t nrOfLayers,
                               NR_pusch_semi_static_t *ps) {
+
   ps->dci_format = dci_format;
   ps->time_domain_allocation = tda;
 
@@ -709,6 +705,7 @@ void nr_set_pusch_semi_static(const NR_SIB1_t *sib1,
     num_dmrs_cdm_grps_no_data = 2; // in case of transform precoding - no Data sent in DMRS symbol
   }
 
+  ps->nrOfLayers = nrOfLayers;
   ps->num_dmrs_cdm_grps_no_data = num_dmrs_cdm_grps_no_data;
 
   /* DMRS calculations */
@@ -742,6 +739,51 @@ void nr_set_pusch_semi_static(const NR_SIB1_t *sib1,
       : num_dmrs_cdm_grps_no_data * 4;
 }
 
+#define BLER_UPDATE_FRAME 10
+#define BLER_FILTER 0.9f
+int get_mcs_from_bler(const NR_bler_options_t *bler_options,
+                      const NR_mac_dir_stats_t *stats,
+                      NR_bler_stats_t *bler_stats,
+                      int max_mcs,
+                      frame_t frame)
+{
+  /* first call: everything is zero. Initialize to sensible default */
+  if (bler_stats->last_frame == 0 && bler_stats->mcs == 0) {
+    bler_stats->last_frame = frame;
+    bler_stats->mcs = 9;
+    bler_stats->bler = (bler_options->lower + bler_options->upper) / 2.0f;
+  }
+  int diff = frame - bler_stats->last_frame;
+  if (diff < 0) // wrap around
+    diff += 1024;
+
+  max_mcs = min(max_mcs, bler_options->max_mcs);
+  const uint8_t old_mcs = min(bler_stats->mcs, max_mcs);
+  if (diff < BLER_UPDATE_FRAME)
+    return old_mcs; // no update
+
+  // last update is longer than x frames ago
+  const int dtx = (int)(stats->rounds[0] - bler_stats->rounds[0]);
+  const int dretx = (int)(stats->rounds[1] - bler_stats->rounds[1]);
+  const float bler_window = dtx > 0 ? (float) dretx / dtx : bler_stats->bler;
+  bler_stats->bler = BLER_FILTER * bler_stats->bler + (1 - BLER_FILTER) * bler_window;
+
+  int new_mcs = old_mcs;
+  if (bler_stats->bler < bler_options->lower && old_mcs < max_mcs && dtx > 9)
+    new_mcs += 1;
+  else if ((bler_stats->bler > bler_options->upper && old_mcs > 6) // above threshold
+      || (dtx <= 3 && old_mcs > 9))                                // no activity
+    new_mcs -= 1;
+  // else we are within threshold boundaries
+
+  bler_stats->last_frame = frame;
+  bler_stats->mcs = new_mcs;
+  memcpy(bler_stats->rounds, stats->rounds, sizeof(stats->rounds));
+  LOG_D(MAC, "frame %4d MCS %d -> %d (dtx %d, dretx %d, BLER wnd %.3f avg %.6f)\n",
+        frame, old_mcs, new_mcs, dtx, dretx, bler_window, bler_stats->bler);
+  return new_mcs;
+}
+
 void nr_configure_css_dci_initial(nfapi_nr_dl_tti_pdcch_pdu_rel15_t* pdcch_pdu,
 				  nr_scs_e scs_common,
 				  nr_scs_e pdcch_scs,
@@ -1009,8 +1051,16 @@ void config_uldci(const NR_SIB1_t *sib1,
                     "Non Codebook configuration non supported\n");
         dci_pdu_rel15->srs_resource_indicator.val = 0; // taking resource 0 for SRS
       }
+      dci_pdu_rel15->precoding_information.val= 0;
+      if (pusch_pdu->nrOfLayers == 2)
+        dci_pdu_rel15->precoding_information.val = 4;
+      else if (pusch_pdu->nrOfLayers == 4)
+        dci_pdu_rel15->precoding_information.val = 11;
+
+      // antenna_ports.val = 0 for transform precoder is disabled, dmrs-Type=1, maxLength=1, Rank=1/2/3/4
       // Antenna Ports
-      dci_pdu_rel15->antenna_ports.val = 0; // TODO for now it is hardcoded, it should depends on cdm group no data and rank
+      dci_pdu_rel15->antenna_ports.val = 0;
+
       // DMRS sequence initialization
       dci_pdu_rel15->dmrs_sequence_initialization.val = pusch_pdu->scid;
       break;
@@ -1019,11 +1069,14 @@ void config_uldci(const NR_SIB1_t *sib1,
   }
 
   LOG_D(NR_MAC,
-        "%s() ULDCI type 0 payload: freq_alloc %d, time_alloc %d, freq_hop_flag %d, mcs %d tpc %d ndi %d rv %d\n",
+        "%s() ULDCI type 0 payload: dci_format %d, freq_alloc %d, time_alloc %d, freq_hop_flag %d, precoding_information.val %d antenna_ports.val %d mcs %d tpc %d ndi %d rv %d\n",
         __func__,
+        dci_format,
         dci_pdu_rel15->frequency_domain_assignment.val,
         dci_pdu_rel15->time_domain_assignment.val,
         dci_pdu_rel15->frequency_hopping_flag.val,
+        dci_pdu_rel15->precoding_information.val,
+        dci_pdu_rel15->antenna_ports.val,
         dci_pdu_rel15->mcs,
         dci_pdu_rel15->tpc,
         dci_pdu_rel15->ndi,
@@ -1043,8 +1096,6 @@ int nr_get_default_pucch_res(int pucch_ResourceCommon) {
   return(default_pucch_csset[pucch_ResourceCommon]);
 }
 
-
-
 void nr_configure_pdcch(nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu,
                         NR_ControlResourceSet_t *coreset,
                         NR_BWP_t *bwp,
@@ -1062,7 +1113,7 @@ void nr_configure_pdcch(nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu,
   for (int i=0;i<6;i++)
     pdcch_pdu->FreqDomainResource[i] = coreset->frequencyDomainResources.buf[i];
 
-  LOG_D(MAC,"Coreset : BWPstart %d, BWPsize %d, SCS %d, freq %x, , duration %d,  \n",
+  LOG_D(MAC,"Coreset : BWPstart %d, BWPsize %d, SCS %d, freq %x, , duration %d\n",
         pdcch_pdu->BWPStart,pdcch_pdu->BWPSize,(int)pdcch_pdu->SubcarrierSpacing,(int)coreset->frequencyDomainResources.buf[0],(int)coreset->duration);
 
   pdcch_pdu->CceRegMappingType = pdcch->CceRegMappingType;
@@ -1385,7 +1436,6 @@ void set_r_pucch_parms(int rsetindex,
   *start_symbol_index = default_pucch_firstsymb[rsetindex];
 }
 
-
 void prepare_dci(const NR_CellGroupConfig_t *CellGroup,
                  dci_pdu_rel15_t *dci_pdu_rel15,
                  nr_dci_format_t format,
@@ -1486,12 +1536,13 @@ void fill_dci_pdu_rel15(const NR_ServingCellConfigCommon_t *scc,
                         int rnti_type,
                         int N_RB,
                         int bwp_id,
+                        NR_ControlResourceSetId_t coreset_id,
                         uint16_t cset0_bwp_size) {
   uint8_t fsize = 0, pos = 0;
 
   uint64_t *dci_pdu = (uint64_t *)pdcch_dci_pdu->Payload;
   *dci_pdu=0;
-  int dci_size = nr_dci_size(scc->downlinkConfigCommon->initialDownlinkBWP,scc->uplinkConfigCommon->initialUplinkBWP, CellGroup, dci_pdu_rel15, dci_format, rnti_type, N_RB, bwp_id, cset0_bwp_size);
+  int dci_size = nr_dci_size(scc->downlinkConfigCommon->initialDownlinkBWP,scc->uplinkConfigCommon->initialUplinkBWP, CellGroup, dci_pdu_rel15, dci_format, rnti_type, N_RB, bwp_id, coreset_id, cset0_bwp_size);
   pdcch_dci_pdu->PayloadSizeBits = dci_size;
   AssertFatal(dci_size <= 64, "DCI sizes above 64 bits not yet supported");
   if (dci_format == NR_DL_DCI_FORMAT_1_1 || dci_format == NR_UL_DCI_FORMAT_0_1)
@@ -2059,10 +2110,11 @@ int extract_length(int startSymbolAndLength) {
 /*
  * Dump the UL or DL UE_info into LOG_T(MAC)
  */
-void dump_nr_list(NR_list_t *listP)
+void dump_nr_list(NR_UE_info_t **list)
 {
-  for (int j = listP->head; j >= 0; j = listP->next[j])
-    LOG_T(NR_MAC, "NR list node %d => %d\n", j, listP->next[j]);
+  UE_iterator(list, UE) {
+    LOG_T(NR_MAC, "NR list UEs rntis %04x\n", (*list)->rnti);
+  }
 }
 
 /*
@@ -2146,16 +2198,7 @@ void remove_nr_list(NR_list_t *listP, int id)
     prev = cur;
     cur = &listP->next[*cur];
   }
-  if (*cur == -1) {
-     cur = &listP->head;
-     prev=&listP->head;
-     while (*cur != -1 && *cur != id) {
-       LOG_I(NR_MAC,"remove_nr_list : id %d, *cur %d\n",id,*cur);
-       prev = cur;
-       cur = &listP->next[*cur];
-     }
-     AssertFatal(1==0, "ID %d not found in UE_list\n", id);
-  }
+  AssertFatal(*cur != -1, "ID %d not found in UE_list\n", id);
   int *next = &listP->next[*cur];
   *cur = listP->next[*cur];
   *next = -1;
@@ -2200,35 +2243,17 @@ void remove_front_nr_list(NR_list_t *listP)
     listP->tail = -1;
 }
 
-int find_nr_UE_id(module_id_t mod_idP, rnti_t rntiP)
-//------------------------------------------------------------------------------
+NR_UE_info_t *find_nr_UE(NR_UEs_t *UEs, rnti_t rntiP)
 {
-  int UE_id;
-  NR_UE_info_t *UE_info = &RC.nrmac[mod_idP]->UE_info;
 
-  for (UE_id = 0; UE_id < MAX_MOBILES_PER_GNB; UE_id++) {
-    if (UE_info->active[UE_id]) {
-      if (UE_info->rnti[UE_id] == rntiP) {
-        return UE_id;
-      }
+  UE_iterator(UEs->list, UE) {
+    if (UE->rnti == rntiP) {
+      LOG_D(NR_MAC,"Search and found rnti: %04x\n", rntiP);
+      return UE;
     }
   }
-
-  return -1;
-}
-
-uint16_t get_Y(int cid, int slot, rnti_t rnti) {
-
-  const int A[3] = {39827, 39829, 39839};
-  const int D = 65537;
-  int Y;
-
-  Y = (A[cid] * rnti) % D;
-
-  for (int s = 0; s < slot; s++)
-    Y = (A[cid] * Y) % D;
-
-  return Y;
+  LOG_W(NR_MAC,"Search for not existing rnti (ignore for RA): %04x\n", rntiP);
+  return NULL;
 }
 
 int find_nr_RA_id(module_id_t mod_idP, int CC_idP, rnti_t rntiP) {
@@ -2287,42 +2312,86 @@ int get_ul_bwp_id(const NR_ServingCellConfig_t *servingCellConfig)
     return 1;
 }
 
+/* hack data to remove UE in the phy */
+int rnti_to_remove[10];
+volatile int rnti_to_remove_count;
+pthread_mutex_t rnti_to_remove_mutex = PTHREAD_MUTEX_INITIALIZER;
+
+void delete_nr_ue_data(NR_UE_info_t *UE, NR_COMMON_channels_t *ccPtr)
+{
+  NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
+  destroy_nr_list(&sched_ctrl->available_dl_harq);
+  destroy_nr_list(&sched_ctrl->feedback_dl_harq);
+  destroy_nr_list(&sched_ctrl->retrans_dl_harq);
+  destroy_nr_list(&sched_ctrl->available_ul_harq);
+  destroy_nr_list(&sched_ctrl->feedback_ul_harq);
+  destroy_nr_list(&sched_ctrl->retrans_ul_harq);
+  LOG_I(NR_MAC, "Remove NR rnti 0x%04x\n", UE->rnti);
+  const rnti_t rnti = UE->rnti;
+  free(UE);
+  /* hack to remove UE in the phy */
+  if (pthread_mutex_lock(&rnti_to_remove_mutex))
+    exit(1);
+  if (rnti_to_remove_count == 10)
+    exit(1);
+  rnti_to_remove[rnti_to_remove_count] = rnti;
+  LOG_W(NR_MAC, "to remove in mac rnti_to_remove[%d] = 0x%04x\n", rnti_to_remove_count, rnti);
+  rnti_to_remove_count++;
+  if (pthread_mutex_unlock(&rnti_to_remove_mutex))
+    exit(1);
+
+  /* clear RA process(es?) associated to the UE */
+  for (int cc_id = 0; cc_id < NFAPI_CC_MAX; cc_id++) {
+    for (int i = 0; i < NR_NB_RA_PROC_MAX; i++) {
+      NR_COMMON_channels_t *cc = &ccPtr[cc_id];
+      if (cc->ra[i].rnti == rnti) {
+        LOG_D(NR_MAC, "free RA process %d for rnti %04x\n", i, rnti);
+        /* is it enough? */
+        cc->ra[i].cfra  = false;
+        cc->ra[i].rnti  = 0;
+        cc->ra[i].crnti = 0;
+      }
+    }
+  }
+}
+
 //------------------------------------------------------------------------------
-int add_new_nr_ue(module_id_t mod_idP, rnti_t rntiP, NR_CellGroupConfig_t *CellGroup)
+NR_UE_info_t *add_new_nr_ue(gNB_MAC_INST *nr_mac, rnti_t rntiP, NR_CellGroupConfig_t *CellGroup)
 {
-  gNB_MAC_INST *nr_mac = RC.nrmac[mod_idP];
   NR_ServingCellConfigCommon_t *scc = nr_mac->common_channels[0].ServingCellConfigCommon;
-  NR_UE_info_t *UE_info = &nr_mac->UE_info;
-  LOG_I(NR_MAC, "[gNB %d] Adding UE with rnti 0x%04x (num_UEs %d)\n",
-        mod_idP,
-        rntiP,
-        UE_info->num_UEs);
-  dump_nr_list(&UE_info->list);
-
-  for (int i = 0; i < MAX_MOBILES_PER_GNB; i++) {
-    if (UE_info->active[i]) {
-      LOG_D(NR_MAC,"UE %x is active, skipping\n",rntiP);
-      continue;
-    }
-    int UE_id = i;
-    UE_info->num_UEs++;
-    UE_info->active[UE_id] = true;
-    if (CellGroup) UE_info->Msg4_ACKed[UE_id] = true;
-    else           UE_info->Msg4_ACKed[UE_id] = false;
-    UE_info->rnti[UE_id] = rntiP;
-    UE_info->CellGroup[UE_id] = CellGroup;
-    add_nr_list(&UE_info->list, UE_id);
-    memset(&UE_info->mac_stats[UE_id], 0, sizeof(NR_mac_stats_t));
-    if (CellGroup && 
-        CellGroup->spCellConfig && 
-        CellGroup->spCellConfig->spCellConfigDedicated &&
-        CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig &&
-        CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup 
-        )
-      compute_csi_bitlen (CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup, UE_info, UE_id, mod_idP);
-    NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+  NR_UEs_t *UE_info = &nr_mac->UE_info;
+  LOG_I(NR_MAC, "Adding UE with rnti 0x%04x\n",
+        rntiP);
+  dump_nr_list(UE_info->list);
+
+  // We will attach at the end, to mitigate race conditions
+  // This is not good, but we will fix it progressively
+  NR_UE_info_t *UE=calloc(1,sizeof(NR_UE_info_t));
+  if(!UE) {
+    LOG_E(NR_MAC,"want to add UE %04x but the fixed allocated size is full\n",rntiP);
+    return NULL;
+  }
+
+  UE->rnti = rntiP;
+  UE->CellGroup = CellGroup;
+
+  if (CellGroup)
+    UE->Msg4_ACKed = true;
+  else
+    UE->Msg4_ACKed = false;
+
+  if (CellGroup &&
+      CellGroup->spCellConfig &&
+      CellGroup->spCellConfig->spCellConfigDedicated &&
+      CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig &&
+      CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup) {
+    compute_csi_bitlen(CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup, UE->csi_report_template);
+  }
+
+    NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
     memset(sched_ctrl, 0, sizeof(*sched_ctrl));
-    sched_ctrl->set_mcs = true;
+    sched_ctrl->dl_max_mcs = 28; /* do not limit MCS for individual UEs */
+    sched_ctrl->set_pmi = false;
     sched_ctrl->ta_frame = 0;
     sched_ctrl->ta_update = 31;
     sched_ctrl->ta_apply = false;
@@ -2330,7 +2399,6 @@ int add_new_nr_ue(module_id_t mod_idP, rnti_t rntiP, NR_CellGroupConfig_t *CellG
     sched_ctrl->pucch_consecutive_dtx_cnt = 0;
     sched_ctrl->pusch_consecutive_dtx_cnt = 0;
     sched_ctrl->ul_failure                = 0;
-
     sched_ctrl->sched_srs.frame = -1;
     sched_ctrl->sched_srs.slot = -1;
     sched_ctrl->sched_srs.srs_scheduled = false;
@@ -2340,11 +2408,8 @@ int add_new_nr_ue(module_id_t mod_idP, rnti_t rntiP, NR_CellGroupConfig_t *CellG
     sched_ctrl->pusch_semi_static.time_domain_allocation = -1;
     const NR_ServingCellConfig_t *servingCellConfig = CellGroup && CellGroup->spCellConfig ? CellGroup->spCellConfig->spCellConfigDedicated : NULL;
 
-    /* Set default BWPs */
-    const struct NR_ServingCellConfig__downlinkBWP_ToAddModList *bwpList = servingCellConfig ? servingCellConfig->downlinkBWP_ToAddModList : NULL;
-    if (bwpList) AssertFatal(bwpList->list.count == 1,
-			     "downlinkBWP_ToAddModList has %d BWP!\n",
-			     bwpList->list.count);
+  /* Set default BWPs */
+  const struct NR_ServingCellConfig__downlinkBWP_ToAddModList *bwpList = servingCellConfig ? servingCellConfig->downlinkBWP_ToAddModList : NULL;
 
     const int bwp_id = servingCellConfig ? *servingCellConfig->firstActiveDownlinkBWP_Id : 0;
     sched_ctrl->active_bwp = bwpList && bwp_id > 0 ? bwpList->list.array[bwp_id - 1] : NULL;
@@ -2357,26 +2422,31 @@ int add_new_nr_ue(module_id_t mod_idP, rnti_t rntiP, NR_CellGroupConfig_t *CellG
                                                scc,
                                                sched_ctrl->active_bwp ? sched_ctrl->active_bwp->bwp_Dedicated : NULL,
                                                target_ss);
-    sched_ctrl->coreset = get_coreset(mod_idP, scc,
-                                      sched_ctrl->active_bwp ? (void*)sched_ctrl->active_bwp->bwp_Dedicated : NULL,
-                                      sched_ctrl->search_space, target_ss);
-    sched_ctrl->sched_pdcch = set_pdcch_structure(RC.nrmac[mod_idP],
+  sched_ctrl->coreset = get_coreset(nr_mac,
+                                    scc,
+                                    sched_ctrl->active_bwp ? sched_ctrl->active_bwp->bwp_Dedicated : NULL,
+                                      sched_ctrl->search_space,
+                                    target_ss);
+    sched_ctrl->sched_pdcch = set_pdcch_structure(nr_mac,
                                                   sched_ctrl->search_space,
                                                   sched_ctrl->coreset,
                                                   scc,
                                                   genericParameters,
                                                   NULL);
+    sched_ctrl->next_dl_bwp_id = -1;
+    sched_ctrl->next_ul_bwp_id = -1;
     const struct NR_UplinkConfig__uplinkBWP_ToAddModList *ubwpList = servingCellConfig ? servingCellConfig->uplinkConfig->uplinkBWP_ToAddModList : NULL;
-    if (ubwpList) AssertFatal(ubwpList->list.count == 1,
-			      "uplinkBWP_ToAddModList has %d BWP!\n",
-			      ubwpList->list.count);
+    AssertFatal(ubwpList == NULL || ubwpList->list.count <= NR_MAX_NUM_BWP,
+                "uplinkBWP_ToAddModList has %d BWP!\n",
+                ubwpList->list.count);
     const int ul_bwp_id = servingCellConfig ? *servingCellConfig->uplinkConfig->firstActiveUplinkBWP_Id : 0;
     sched_ctrl->active_ubwp = ubwpList && ul_bwp_id > 0 ? ubwpList->list.array[ul_bwp_id - 1] : NULL;
 
     /* get Number of HARQ processes for this UE */
-    if (servingCellConfig) AssertFatal(servingCellConfig->pdsch_ServingCellConfig->present == NR_SetupRelease_PDSCH_ServingCellConfig_PR_setup,
-				       "no pdsch-ServingCellConfig found for UE %d\n",
-				       UE_id);
+    AssertFatal(servingCellConfig == NULL
+                || servingCellConfig->pdsch_ServingCellConfig->present == NR_SetupRelease_PDSCH_ServingCellConfig_PR_setup,
+                "no pdsch-ServingCellConfig found for UE %04x\n",
+                UE->rnti);
     const NR_PDSCH_ServingCellConfig_t *pdsch = servingCellConfig ? servingCellConfig->pdsch_ServingCellConfig->choice.setup : NULL;
     // pdsch == NULL in SA -> will create default (8) number of HARQ processes
     create_dl_harq_list(sched_ctrl, pdsch);
@@ -2387,21 +2457,27 @@ int add_new_nr_ue(module_id_t mod_idP, rnti_t rntiP, NR_CellGroupConfig_t *CellG
       add_tail_nr_list(&sched_ctrl->available_ul_harq, harq);
     create_nr_list(&sched_ctrl->feedback_ul_harq, 16);
     create_nr_list(&sched_ctrl->retrans_ul_harq, 16);
-    LOG_D(NR_MAC, "[gNB %d] Add NR UE_id %d : rnti %x\n",
-          mod_idP,
-          UE_id,
-          rntiP);
-    dump_nr_list(&UE_info->list);
-    return (UE_id);
+
+  pthread_mutex_lock(&UE_info->mutex);
+  int i;
+  for(i=0; i<MAX_MOBILES_PER_GNB; i++)
+    if (UE_info->list[i] == NULL) {
+      UE_info->list[i] = UE;
+      break;
+    }
+  if (i == MAX_MOBILES_PER_GNB) {
+    LOG_E(NR_MAC,"Try to add UE %04x but the list is full\n", rntiP);
+    delete_nr_ue_data(UE, nr_mac->common_channels);
+    pthread_mutex_unlock(&UE_info->mutex);
+    return NULL;
   }
+  pthread_mutex_unlock(&UE_info->mutex);
 
-  // printf("MAC: cannot add new UE for rnti %x\n", rntiP);
-  LOG_E(NR_MAC, "error in add_new_ue(), could not find space in UE_info, Dumping UE list\n");
-  dump_nr_list(&UE_info->list);
-  return -1;
+  LOG_D(NR_MAC, "Add NR rnti %x\n", rntiP);
+  dump_nr_list(UE_info->list);
+  return (UE);
 }
 
-
 void create_dl_harq_list(NR_UE_sched_ctrl_t *sched_ctrl,
                          const NR_PDSCH_ServingCellConfig_t *pdsch) {
   const int nrofHARQ = pdsch && pdsch->nrofHARQ_ProcessesForPDSCH ?
@@ -2434,68 +2510,70 @@ void create_dl_harq_list(NR_UE_sched_ctrl_t *sched_ctrl,
   }
 }
 
-/* hack data to remove UE in the phy */
-int rnti_to_remove[10];
-volatile int rnti_to_remove_count;
-pthread_mutex_t rnti_to_remove_mutex = PTHREAD_MUTEX_INITIALIZER;
+void reset_dl_harq_list(NR_UE_sched_ctrl_t *sched_ctrl) {
+  int harq;
+  while ((harq = sched_ctrl->feedback_dl_harq.head) >= 0) {
+    remove_front_nr_list(&sched_ctrl->feedback_dl_harq);
+    add_tail_nr_list(&sched_ctrl->available_dl_harq, harq);
+  }
 
-void mac_remove_nr_ue(module_id_t mod_id, rnti_t rnti)
-{
-  int UE_id;
-  int i;
-  int cc_id;
-  NR_UE_info_t *UE_info = &RC.nrmac[mod_id]->UE_info;
+  while ((harq = sched_ctrl->retrans_dl_harq.head) >= 0) {
+    remove_front_nr_list(&sched_ctrl->retrans_dl_harq);
+    add_tail_nr_list(&sched_ctrl->available_dl_harq, harq);
+  }
 
-  for (i = 0; i < MAX_MOBILES_PER_GNB; i++) {
+  for (int i = 0; i < NR_MAX_NB_HARQ_PROCESSES; i++) {
+    sched_ctrl->harq_processes[i].feedback_slot = -1;
+    sched_ctrl->harq_processes[i].round = 0;
+    sched_ctrl->harq_processes[i].is_waiting = false;
+  }
+}
 
-    if (UE_info->active[i] != TRUE)
-      continue;
-    if (UE_info->rnti[i] != rnti)
-      continue;
+void reset_ul_harq_list(NR_UE_sched_ctrl_t *sched_ctrl) {
+  int harq;
+  while ((harq = sched_ctrl->feedback_ul_harq.head) >= 0) {
+    remove_front_nr_list(&sched_ctrl->feedback_ul_harq);
+    add_tail_nr_list(&sched_ctrl->available_ul_harq, harq);
+  }
 
-    /* UE found, remove it */
-    UE_id = i;
-
-    UE_info->num_UEs--;
-    UE_info->active[UE_id] = FALSE;
-    UE_info->rnti[UE_id] = 0;
-    remove_nr_list(&UE_info->list, UE_id);
-    NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
-    destroy_nr_list(&sched_ctrl->available_dl_harq);
-    destroy_nr_list(&sched_ctrl->feedback_dl_harq);
-    destroy_nr_list(&sched_ctrl->retrans_dl_harq);
-    destroy_nr_list(&sched_ctrl->available_ul_harq);
-    destroy_nr_list(&sched_ctrl->feedback_ul_harq);
-    destroy_nr_list(&sched_ctrl->retrans_ul_harq);
-    LOG_I(NR_MAC, "[gNB %d] Remove NR UE_id %d: rnti 0x%04x\n",
-          mod_id,
-          UE_id,
-          rnti);
-
-    /* hack to remove UE in the phy */
-    if (pthread_mutex_lock(&rnti_to_remove_mutex)) exit(1);
-    if (rnti_to_remove_count == 10) exit(1);
-    rnti_to_remove[rnti_to_remove_count] = rnti;
-    LOG_W(NR_MAC, "to remove in mac rnti_to_remove[%d] = 0x%04x\n", rnti_to_remove_count, rnti);
-    rnti_to_remove_count++;
-    if (pthread_mutex_unlock(&rnti_to_remove_mutex)) exit(1);
+  while ((harq = sched_ctrl->retrans_ul_harq.head) >= 0) {
+    remove_front_nr_list(&sched_ctrl->retrans_ul_harq);
+    add_tail_nr_list(&sched_ctrl->available_ul_harq, harq);
   }
 
-  /* clear RA process(es?) associated to the UE */
-  for (cc_id = 0; cc_id < NFAPI_CC_MAX; cc_id++) {
-    NR_COMMON_channels_t *cc = &RC.nrmac[mod_id]->common_channels[cc_id];
-    for (i = 0; i < NR_NB_RA_PROC_MAX; i++) {
-      if (cc->ra[i].rnti == rnti) {
-        LOG_D(NR_MAC, "free RA process %d for rnti %d\n", i, rnti);
-        /* is it enough? */
-        cc->ra[i].cfra  = false;
-        cc->ra[i].rnti  = 0;
-        cc->ra[i].crnti = 0;
-      }
-    }
+  for (int i = 0; i < NR_MAX_NB_HARQ_PROCESSES; i++) {
+    sched_ctrl->ul_harq_processes[i].feedback_slot = -1;
+    sched_ctrl->ul_harq_processes[i].round = 0;
+    sched_ctrl->ul_harq_processes[i].is_waiting = false;
   }
 }
 
+void mac_remove_nr_ue(gNB_MAC_INST *nr_mac, rnti_t rnti)
+{
+ NR_UEs_t *UE_info = &nr_mac->UE_info;
+ pthread_mutex_lock(&UE_info->mutex);
+ UE_iterator(UE_info->list, UE) {
+   if (UE->rnti==rnti)
+     break;
+ }
+
+ if (!UE) {
+   LOG_W(NR_MAC,"Call to del rnti %04x, but not existing\n", rnti);
+   pthread_mutex_unlock(&UE_info->mutex);
+   return;
+ }
+
+ NR_UE_info_t * newUEs[MAX_MOBILES_PER_GNB+1]={0};
+ int newListIdx=0;
+ for (int i=0; i<MAX_MOBILES_PER_GNB; i++)
+   if(UE_info->list[i] && UE_info->list[i]->rnti != rnti)
+     newUEs[newListIdx++]=UE_info->list[i];
+ memcpy(UE_info->list, newUEs, sizeof(UE_info->list));
+ pthread_mutex_unlock(&UE_info->mutex);
+
+ delete_nr_ue_data(UE, nr_mac->common_channels);
+}
+
 void nr_mac_remove_ra_rnti(module_id_t mod_id, rnti_t rnti) {
   // Hack to remove UE in the phy (following the same procedure as in function mac_remove_nr_ue)
   if (pthread_mutex_lock(&rnti_to_remove_mutex)) exit(1);
@@ -2517,20 +2595,18 @@ uint8_t nr_get_tpc(int target, uint8_t cqi, int incr) {
 }
 
 
-void get_pdsch_to_harq_feedback(int Mod_idP,
-                                int UE_id,
+void get_pdsch_to_harq_feedback(NR_UE_info_t *UE,
                                 int bwp_id,
                                 NR_SearchSpace__searchSpaceType_PR ss_type,
                                 int *max_fb_time,
                                 uint8_t *pdsch_to_harq_feedback) {
 
-  NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info;
-  NR_CellGroupConfig_t *CellGroup = UE_info->CellGroup[UE_id];
+  NR_CellGroupConfig_t *CellGroup = UE->CellGroup;
   NR_BWP_DownlinkDedicated_t *bwpd=NULL;
   NR_BWP_UplinkDedicated_t *ubwpd=NULL;
 
   if (ss_type == NR_SearchSpace__searchSpaceType_PR_ue_Specific) {
-    AssertFatal(CellGroup!=NULL,"Cellgroup is not defined for UE_id %d\n",UE_id);
+    AssertFatal(CellGroup!=NULL,"Cellgroup is not defined for UE %04x\n",UE->rnti);
     AssertFatal(CellGroup->spCellConfig!=NULL,"Cellgroup->spCellConfig is null\n");
     AssertFatal(CellGroup->spCellConfig->spCellConfigDedicated!=NULL,"CellGroup->spCellConfig->spCellConfigDedicated is null\n");
   }
@@ -2588,7 +2664,6 @@ void get_pdsch_to_harq_feedback(int Mod_idP,
         pdsch_to_harq_feedback[i] = i+1;
         if(pdsch_to_harq_feedback[i]>*max_fb_time)
           *max_fb_time = pdsch_to_harq_feedback[i];
-
       }
     }
     else {
@@ -2606,28 +2681,25 @@ void get_pdsch_to_harq_feedback(int Mod_idP,
   }
 }
 
-
-
 void nr_csirs_scheduling(int Mod_idP,
                          frame_t frame,
                          sub_frame_t slot,
                          int n_slots_frame){
 
   int CC_id = 0;
-  NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info;
-  NR_list_t *UE_list = &UE_info->list;
+  NR_UEs_t *UE_info = &RC.nrmac[Mod_idP]->UE_info;
   gNB_MAC_INST *gNB_mac = RC.nrmac[Mod_idP];
   uint16_t *vrb_map = gNB_mac->common_channels[CC_id].vrb_map;
 
-  for (int UE_id = UE_list->head; UE_id >= 0; UE_id = UE_list->next[UE_id]) {
+  UE_info->sched_csirs = false;
 
-    NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+  UE_iterator(UE_info->list, UE) {
 
+    NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
     if (sched_ctrl->rrc_processing_timer > 0) {
       continue;
     }
-
-    NR_CellGroupConfig_t *CellGroup = UE_info->CellGroup[UE_id];
+    NR_CellGroupConfig_t *CellGroup = UE->CellGroup;
 
     if (!CellGroup || !CellGroup->spCellConfig || !CellGroup->spCellConfig->spCellConfigDedicated ||
 	      !CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig) continue;
@@ -2640,9 +2712,10 @@ void nr_csirs_scheduling(int Mod_idP,
       int period, offset;
 
       nfapi_nr_dl_tti_request_body_t *dl_req = &gNB_mac->DL_req[CC_id].dl_tti_request_body;
-      NR_BWP_t *genericParameters = sched_ctrl->active_bwp ? 
-                                    &sched_ctrl->active_bwp->bwp_Common->genericParameters:
+      NR_BWP_t *genericParameters = sched_ctrl->active_bwp ?
+                                    &sched_ctrl->active_bwp->bwp_Common->genericParameters :
                                     &gNB_mac->common_channels[0].ServingCellConfigCommon->downlinkConfigCommon->initialDownlinkBWP->genericParameters;
+
       for (int id = 0; id < csi_measconfig->nzp_CSI_RS_ResourceToAddModList->list.count; id++){
         nzpcsi = csi_measconfig->nzp_CSI_RS_ResourceToAddModList->list.array[id];
         NR_CSI_RS_ResourceMapping_t  resourceMapping = nzpcsi->resourceMapping;
@@ -2651,6 +2724,7 @@ void nr_csirs_scheduling(int Mod_idP,
         if((frame*n_slots_frame+slot-offset)%period == 0) {
 
           LOG_D(NR_MAC,"Scheduling CSI-RS in frame %d slot %d\n",frame,slot);
+          UE_info->sched_csirs = true;
 
           nfapi_nr_dl_tti_request_pdu_t *dl_tti_csirs_pdu = &dl_req->dl_tti_pdu_list[dl_req->nPDUs];
           memset((void*)dl_tti_csirs_pdu,0,sizeof(nfapi_nr_dl_tti_request_pdu_t));
@@ -2659,16 +2733,27 @@ void nr_csirs_scheduling(int Mod_idP,
 
           nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *csirs_pdu_rel15 = &dl_tti_csirs_pdu->csi_rs_pdu.csi_rs_pdu_rel15;
 
-          csirs_pdu_rel15->bwp_size  = NRRIV2BW(genericParameters->locationAndBandwidth,275);
-          csirs_pdu_rel15->bwp_start = NRRIV2PRBOFFSET(genericParameters->locationAndBandwidth,275);
           csirs_pdu_rel15->subcarrier_spacing = genericParameters->subcarrierSpacing;
           if (genericParameters->cyclicPrefix)
             csirs_pdu_rel15->cyclic_prefix = *genericParameters->cyclicPrefix;
           else
             csirs_pdu_rel15->cyclic_prefix = 0;
 
-          csirs_pdu_rel15->start_rb = resourceMapping.freqBand.startingRB;
-          csirs_pdu_rel15->nr_of_rbs = resourceMapping.freqBand.nrofRBs;
+          // According to last paragraph of TS 38.214 5.2.2.3.1
+          uint16_t BWPSize = NRRIV2BW(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);
+          uint16_t BWPStart = NRRIV2PRBOFFSET(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);
+          if (resourceMapping.freqBand.startingRB < BWPStart) {
+            csirs_pdu_rel15->start_rb = BWPStart;
+          } else {
+            csirs_pdu_rel15->start_rb = resourceMapping.freqBand.startingRB;
+          }
+          if (resourceMapping.freqBand.nrofRBs > (BWPStart + BWPSize - csirs_pdu_rel15->start_rb)) {
+            csirs_pdu_rel15->nr_of_rbs = BWPStart + BWPSize - csirs_pdu_rel15->start_rb;
+          } else {
+            csirs_pdu_rel15->nr_of_rbs = resourceMapping.freqBand.nrofRBs;
+          }
+          AssertFatal(csirs_pdu_rel15->nr_of_rbs >= 24, "CSI-RS has %d RBs, but the minimum is 24\n", csirs_pdu_rel15->nr_of_rbs);
+
           csirs_pdu_rel15->csi_type = 1; // NZP-CSI-RS
           csirs_pdu_rel15->symb_l0 = resourceMapping.firstOFDMSymbolInTimeDomain;
           if (resourceMapping.firstOFDMSymbolInTimeDomain2)
@@ -2689,20 +2774,20 @@ void nr_csirs_scheduling(int Mod_idP,
               csirs_pdu_rel15->row = 1;
               csirs_pdu_rel15->freq_domain = ((resourceMapping.frequencyDomainAllocation.choice.row1.buf[0])>>4)&0x0f;
               for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
-                vrb_map[rb+csirs_pdu_rel15->bwp_start] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 1);
+                vrb_map[rb] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 1);
               break;
             case NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_row2:
               csirs_pdu_rel15->row = 2;
               csirs_pdu_rel15->freq_domain = (((resourceMapping.frequencyDomainAllocation.choice.row2.buf[1]>>4)&0x0f) |
                                              ((resourceMapping.frequencyDomainAllocation.choice.row2.buf[0]<<4)&0xff0));
               for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
-                vrb_map[rb+csirs_pdu_rel15->bwp_start] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 1);
+                vrb_map[rb] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 1);
               break;
             case NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_row4:
               csirs_pdu_rel15->row = 4;
               csirs_pdu_rel15->freq_domain = ((resourceMapping.frequencyDomainAllocation.choice.row4.buf[0])>>5)&0x07;
               for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
-                vrb_map[rb+csirs_pdu_rel15->bwp_start] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 1);
+                vrb_map[rb] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 1);
               break;
             case NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_other:
               csirs_pdu_rel15->freq_domain = ((resourceMapping.frequencyDomainAllocation.choice.other.buf[0])>>2)&0x3f;
@@ -2714,18 +2799,18 @@ void nr_csirs_scheduling(int Mod_idP,
                 case NR_CSI_RS_ResourceMapping__nrofPorts_p2:
                   csirs_pdu_rel15->row = 3;
                   for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
-                    vrb_map[rb+csirs_pdu_rel15->bwp_start] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 1);
+                    vrb_map[rb] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 1);
                   break;
                 case NR_CSI_RS_ResourceMapping__nrofPorts_p4:
                   csirs_pdu_rel15->row = 5;
                   for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
-                    vrb_map[rb+csirs_pdu_rel15->bwp_start] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 2);
+                    vrb_map[rb] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 2);
                   break;
                 case NR_CSI_RS_ResourceMapping__nrofPorts_p8:
                   if (resourceMapping.cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm4_FD2_TD2) {
                     csirs_pdu_rel15->row = 8;
                     for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
-                      vrb_map[rb+csirs_pdu_rel15->bwp_start] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 2);
+                      vrb_map[rb] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 2);
                   }
                   else{
                     int num_k = 0;
@@ -2734,12 +2819,12 @@ void nr_csirs_scheduling(int Mod_idP,
                     if(num_k==4) {
                       csirs_pdu_rel15->row = 6;
                       for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
-                        vrb_map[rb+csirs_pdu_rel15->bwp_start] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 1);
+                        vrb_map[rb] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 1);
                     }
                     else {
                       csirs_pdu_rel15->row = 7;
                       for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
-                        vrb_map[rb+csirs_pdu_rel15->bwp_start] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 2);
+                        vrb_map[rb] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 2);
                     }
                   }
                   break;
@@ -2747,12 +2832,12 @@ void nr_csirs_scheduling(int Mod_idP,
                   if (resourceMapping.cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm4_FD2_TD2) {
                     csirs_pdu_rel15->row = 10;
                     for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
-                      vrb_map[rb+csirs_pdu_rel15->bwp_start] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 2);
+                      vrb_map[rb] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 2);
                   }
                   else {
                     csirs_pdu_rel15->row = 9;
                     for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
-                      vrb_map[rb+csirs_pdu_rel15->bwp_start] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 1);
+                      vrb_map[rb] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 1);
                   }
                   break;
                 case NR_CSI_RS_ResourceMapping__nrofPorts_p16:
@@ -2761,24 +2846,24 @@ void nr_csirs_scheduling(int Mod_idP,
                   else
                     csirs_pdu_rel15->row = 11;
                   for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
-                    vrb_map[rb+csirs_pdu_rel15->bwp_start] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 2);
+                    vrb_map[rb] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 2);
                   break;
                 case NR_CSI_RS_ResourceMapping__nrofPorts_p24:
                   if (resourceMapping.cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm4_FD2_TD2) {
                     csirs_pdu_rel15->row = 14;
                     for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
-                      vrb_map[rb+csirs_pdu_rel15->bwp_start] |= (SL_to_bitmap(csirs_pdu_rel15->symb_l0, 2) | SL_to_bitmap(csirs_pdu_rel15->symb_l1, 2));
+                      vrb_map[rb] |= (SL_to_bitmap(csirs_pdu_rel15->symb_l0, 2) | SL_to_bitmap(csirs_pdu_rel15->symb_l1, 2));
                   }
                   else{
                     if (resourceMapping.cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm8_FD2_TD4) {
                       csirs_pdu_rel15->row = 15;
                       for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
-                        vrb_map[rb+csirs_pdu_rel15->bwp_start] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 3);
+                        vrb_map[rb] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 3);
                     }
                     else {
                       csirs_pdu_rel15->row = 13;
                       for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
-                        vrb_map[rb+csirs_pdu_rel15->bwp_start] |= (SL_to_bitmap(csirs_pdu_rel15->symb_l0, 2) | SL_to_bitmap(csirs_pdu_rel15->symb_l1, 2));
+                        vrb_map[rb] |= (SL_to_bitmap(csirs_pdu_rel15->symb_l0, 2) | SL_to_bitmap(csirs_pdu_rel15->symb_l1, 2));
                     }
                   }
                   break;
@@ -2786,18 +2871,18 @@ void nr_csirs_scheduling(int Mod_idP,
                   if (resourceMapping.cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm4_FD2_TD2) {
                     csirs_pdu_rel15->row = 17;
                     for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
-                      vrb_map[rb+csirs_pdu_rel15->bwp_start] |= (SL_to_bitmap(csirs_pdu_rel15->symb_l0, 2) | SL_to_bitmap(csirs_pdu_rel15->symb_l1, 2));
+                      vrb_map[rb] |= (SL_to_bitmap(csirs_pdu_rel15->symb_l0, 2) | SL_to_bitmap(csirs_pdu_rel15->symb_l1, 2));
                   }
                   else{
                     if (resourceMapping.cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm8_FD2_TD4) {
                       csirs_pdu_rel15->row = 18;
                       for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
-                        vrb_map[rb+csirs_pdu_rel15->bwp_start] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 3);
+                        vrb_map[rb] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 3);
                     }
                     else {
                       csirs_pdu_rel15->row = 16;
                       for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
-                        vrb_map[rb+csirs_pdu_rel15->bwp_start] |= (SL_to_bitmap(csirs_pdu_rel15->symb_l0, 2) | SL_to_bitmap(csirs_pdu_rel15->symb_l1, 2));
+                        vrb_map[rb] |= (SL_to_bitmap(csirs_pdu_rel15->symb_l0, 2) | SL_to_bitmap(csirs_pdu_rel15->symb_l1, 2));
                     }
                   }
                   break;
@@ -2818,30 +2903,127 @@ void nr_csirs_scheduling(int Mod_idP,
 void nr_mac_update_timers(module_id_t module_id,
                           frame_t frame,
                           sub_frame_t slot) {
-  NR_UE_info_t *UE_info = &RC.nrmac[module_id]->UE_info;
-  const NR_list_t *UE_list = &UE_info->list;
-  for (int UE_id = UE_list->head; UE_id >= 0; UE_id = UE_list->next[UE_id]) {
-    NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+  NR_UEs_t *UE_info = &RC.nrmac[module_id]->UE_info;
+
+  UE_iterator(UE_info->list, UE) {
+    NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
     if (sched_ctrl->rrc_processing_timer > 0) {
       sched_ctrl->rrc_processing_timer--;
       if (sched_ctrl->rrc_processing_timer == 0) {
-        LOG_I(NR_MAC, "(%d.%d) De-activating RRC processing timer for UE %d\n", frame, slot, UE_id);
+        LOG_I(NR_MAC, "(%d.%d) De-activating RRC processing timer for UE %04x\n", frame, slot, UE->rnti);
 
         const NR_SIB1_t *sib1 = RC.nrmac[module_id]->common_channels[0].sib1 ? RC.nrmac[module_id]->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL;
+
+        NR_CellGroupConfig_t *cg = NULL;
+        uper_decode(NULL,
+                    &asn_DEF_NR_CellGroupConfig,   //might be added prefix later
+                    (void **)&cg,
+                    (uint8_t *)UE->cg_buf,
+                    (UE->enc_rval.encoded+7)/8, 0, 0);
+        UE->CellGroup = cg;
+
+        if (LOG_DEBUGFLAG(DEBUG_ASN1)) {
+          xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void *) UE->CellGroup);
+        }
+
         NR_ServingCellConfigCommon_t *scc = RC.nrmac[module_id]->common_channels[0].ServingCellConfigCommon;
-        NR_CellGroupConfig_t *cg = UE_info->CellGroup[UE_id];
+        const NR_ServingCellConfig_t *spCellConfigDedicated = cg && cg->spCellConfig ? cg->spCellConfig->spCellConfigDedicated : NULL;
 
+        LOG_I(NR_MAC,"Modified rnti %04x with CellGroup\n", UE->rnti);
+        process_CellGroup(cg,&UE->UE_sched_ctrl);
+        NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
+
+        const NR_PDSCH_ServingCellConfig_t *pdsch = spCellConfigDedicated ? spCellConfigDedicated->pdsch_ServingCellConfig->choice.setup : NULL;
+        if (get_softmodem_params()->sa) {
+          // add all available DL HARQ processes for this UE in SA
+          create_dl_harq_list(sched_ctrl, pdsch);
+        }
+
+        // If needed, update the Dedicated BWP
+        const int current_bwp_id = sched_ctrl->active_bwp ? sched_ctrl->active_bwp->bwp_Id : 0;
+        const int current_ubwp_id = sched_ctrl->active_ubwp ? sched_ctrl->active_ubwp->bwp_Id : 0;
+        if (UE->Msg3_dcch_dtch) {
+          // 3GPP TS 38.321 Section 5.15 Bandwidth Part (BWP) operation
+          // Currently there are no PRACH occasions configured for any Dedicated BWP, so UE will switch to the initialDownlinkBWP
+          sched_ctrl->active_bwp = NULL;
+          if (current_bwp_id != 0) {
+            LOG_I(NR_MAC, "(%d.%d) Switching to initialDownlinkBWP\n", frame, slot);
+          }
+          // 3GPP TS 38.321 Section 5.15 Bandwidth Part (BWP) operation
+          // Currently there are no PRACH occasions configured for any Dedicated BWP, so UE will switch to the initialUplinkBWP
+          sched_ctrl->active_ubwp = NULL;
+          if (current_ubwp_id != 0) {
+            LOG_I(NR_MAC, "(%d.%d) Switching to initialUplinkBWP\n", frame, slot);
+          }
+          UE->Msg3_dcch_dtch = false;
+
+          // Schedule BWP switching to the first active BWP (previous active BWP before RA with Msg3 carrying DCCH or DTCH message)
+          sched_ctrl->next_dl_bwp_id = current_bwp_id;
+          sched_ctrl->next_ul_bwp_id = current_ubwp_id;
+        } else if (spCellConfigDedicated &&
+            spCellConfigDedicated->downlinkBWP_ToAddModList &&
+            spCellConfigDedicated->uplinkConfig &&
+            spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList) {
+          sched_ctrl->active_bwp = spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[*spCellConfigDedicated->firstActiveDownlinkBWP_Id - 1];
+          if (*spCellConfigDedicated->firstActiveDownlinkBWP_Id != current_bwp_id) {
+            LOG_I(NR_MAC, "(%d.%d) Switching to DL-BWP %li\n", frame, slot, sched_ctrl->active_bwp->bwp_Id);
+          }
+          sched_ctrl->active_ubwp = spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[*spCellConfigDedicated->uplinkConfig->firstActiveUplinkBWP_Id - 1];
+          if (*spCellConfigDedicated->uplinkConfig->firstActiveUplinkBWP_Id != current_ubwp_id) {
+            LOG_I(NR_MAC, "(%d.%d) Switching to UL-BWP %li\n", frame, slot, sched_ctrl->active_ubwp->bwp_Id);
+          }
+
+          // Update next_dl_bwp_id to not trigger BWP switching, UE should be already on active_bwp
+          sched_ctrl->next_dl_bwp_id = sched_ctrl->active_bwp->bwp_Id;
+          // Update next_ul_bwp_id to not trigger BWP switching, UE should be already on active_ubwp
+          sched_ctrl->next_ul_bwp_id = sched_ctrl->active_ubwp->bwp_Id;
+        } else {
+          sched_ctrl->active_bwp = NULL;
+          sched_ctrl->active_ubwp = NULL;
+
+          // Update next_dl_bwp_id to not trigger BWP switching, UE should be already on Initial BWP
+          sched_ctrl->next_dl_bwp_id = 0;
+          // Update next_ul_bwp_id to not trigger BWP switching, UE should be already on Initial BWP
+          sched_ctrl->next_ul_bwp_id = 0;
+        }
+
+        // Update coreset/searchspace
         NR_BWP_Downlink_t *bwp = sched_ctrl->active_bwp;
-        NR_BWP_DownlinkDedicated_t *bwpd = cg &&
-                                           cg->spCellConfig &&
-                                           cg->spCellConfig->spCellConfigDedicated ?
-                                           cg->spCellConfig->spCellConfigDedicated->initialDownlinkBWP : NULL;
-        int **preferred_dl_tda = RC.nrmac[module_id]->preferred_dl_tda;
-        NR_pdsch_semi_static_t *ps = &sched_ctrl->pdsch_semi_static;
+        NR_BWP_DownlinkDedicated_t *bwpd = NULL;
+        NR_BWP_t *genericParameters = NULL;
+        int target_ss = NR_SearchSpace__searchSpaceType_PR_common;
+        if (bwp) {
+          target_ss = NR_SearchSpace__searchSpaceType_PR_ue_Specific;
+          bwpd = sched_ctrl->active_bwp->bwp_Dedicated;
+          genericParameters = &sched_ctrl->active_bwp->bwp_Common->genericParameters;
+        } else if (cg &&
+                   cg->spCellConfig &&
+                   cg->spCellConfig->spCellConfigDedicated &&
+                   (cg->spCellConfig->spCellConfigDedicated->initialDownlinkBWP)) {
+          target_ss = NR_SearchSpace__searchSpaceType_PR_ue_Specific;
+          bwpd = cg->spCellConfig->spCellConfigDedicated->initialDownlinkBWP;
+          genericParameters = &scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters;
+        }
+        sched_ctrl->search_space = get_searchspace(sib1, scc, (void*)bwpd, target_ss);
+        sched_ctrl->coreset = get_coreset(RC.nrmac[module_id], scc, (void*)bwpd, sched_ctrl->search_space, target_ss);
+        sched_ctrl->sched_pdcch = set_pdcch_structure(RC.nrmac[module_id],
+                                                      sched_ctrl->search_space,
+                                                      sched_ctrl->coreset,
+                                                      scc,
+                                                      genericParameters,
+                                                      RC.nrmac[module_id]->type0_PDCCH_CSS_config);
+        sched_ctrl->maxL = 2;
+        if (cg &&
+            cg->spCellConfig &&
+            cg->spCellConfig->spCellConfigDedicated &&
+            cg->spCellConfig->spCellConfigDedicated->csi_MeasConfig &&
+            cg->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup) {
+          compute_csi_bitlen (cg->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup, UE->csi_report_template);
+        }
 
+        NR_pdsch_semi_static_t *ps = &sched_ctrl->pdsch_semi_static;
         const uint8_t layers = set_dl_nrOfLayers(sched_ctrl);
-        const int tda = bwp && preferred_dl_tda[bwp->bwp_Id][slot] >= 0 ?
-                        preferred_dl_tda[bwp->bwp_Id][slot] : (ps->time_domain_allocation >= 0 ? ps->time_domain_allocation : 0);
+        const int tda = get_dl_tda(RC.nrmac[module_id], scc, slot);
 
         nr_set_pdsch_semi_static(sib1,
                                  scc,
@@ -2854,18 +3036,21 @@ void nr_mac_update_timers(module_id_t module_id,
                                  ps);
 
         NR_BWP_Uplink_t *ubwp = sched_ctrl->active_ubwp;
-        NR_BWP_UplinkDedicated_t *ubwpd = cg &&
-                                          cg->spCellConfig &&
-                                          cg->spCellConfig->spCellConfigDedicated &&
-                                          cg->spCellConfig->spCellConfigDedicated->uplinkConfig ?
-                                          cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP : NULL;
-        int **preferred_ul_tda = RC.nrmac[module_id]->preferred_ul_tda;
-        NR_pusch_semi_static_t *ups = &sched_ctrl->pusch_semi_static;
+        NR_BWP_UplinkDedicated_t *ubwpd = NULL;
+        if (ubwp) {
+          ubwpd = sched_ctrl->active_ubwp->bwp_Dedicated;
+        } else if (cg &&
+                   cg->spCellConfig &&
+                   cg->spCellConfig->spCellConfigDedicated &&
+                   (cg->spCellConfig->spCellConfigDedicated->initialDownlinkBWP)) {
+          ubwpd = cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP;
+        }
 
+        NR_pusch_semi_static_t *ups = &sched_ctrl->pusch_semi_static;
         int dci_format = get_dci_format(sched_ctrl);
         const uint8_t num_dmrs_cdm_grps_no_data = (ubwp || ubwpd) ? 1 : 2;
-        const int utda = ubwp && preferred_ul_tda[ubwp->bwp_Id][slot] >= 0 ?
-            preferred_ul_tda[ubwp->bwp_Id][slot] : (ups->time_domain_allocation >= 0 ? ups->time_domain_allocation : 0);
+        const uint8_t nrOfLayers = 1;
+        const int utda = get_ul_tda(RC.nrmac[module_id], scc, slot);
 
         nr_set_pusch_semi_static(sib1,
                                  scc,
@@ -2874,312 +3059,63 @@ void nr_mac_update_timers(module_id_t module_id,
                                  dci_format,
                                  utda,
                                  num_dmrs_cdm_grps_no_data,
+                                 nrOfLayers,
                                  ups);
       }
     }
   }
 }
 
-/*void fill_nfapi_coresets_and_searchspaces(NR_CellGroupConfig_t *cg,
-					  nfapi_nr_coreset_t *coreset,
-					  nfapi_nr_search_space_t *search_space) {
-
-  nfapi_nr_coreset_t *cs;
-  nfapi_nr_search_space_t *ss;
-  NR_ServingCellConfigCommon_t *scc=cg->spCellConfig->reconfigurationWithSync->spCellConfigCommon;
-  AssertFatal(cg->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count == 1,
-	      "downlinkBWP_ToAddModList has %d BWP!\n",
-	      cg->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count);
-
-  NR_BWP_Downlink_t *bwp=cg->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[0];
-  struct NR_PDCCH_Config__controlResourceSetToAddModList *coreset_list = bwp->bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList;
-  AssertFatal(coreset_list->list.count>0,
-	      "cs list has 0 elements\n");
-  for (int i=0;i<coreset_list->list.count;i++) {
-    NR_ControlResourceSet_t *coreset_i=coreset_list->list.array[i];
-    cs = coreset + coreset_i->controlResourceSetId;
-      
-    cs->coreset_id = coreset_i->controlResourceSetId;
-    AssertFatal(coreset_i->frequencyDomainResources.size <=8 && coreset_i->frequencyDomainResources.size>0,
-		"coreset_i->frequencyDomainResources.size=%d\n",
-		(int)coreset_i->frequencyDomainResources.size);
-  
-    for (int f=0;f<coreset_i->frequencyDomainResources.size;f++)
-      ((uint8_t*)&cs->frequency_domain_resources)[coreset_i->frequencyDomainResources.size-1-f]=coreset_i->frequencyDomainResources.buf[f];
-    
-    cs->frequency_domain_resources>>=coreset_i->frequencyDomainResources.bits_unused;
-    
-    cs->duration = coreset_i->duration;
-    // Need to add information about TCI_StateIDs
-
-    if (coreset_i->cce_REG_MappingType.present == NR_ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved)
-      cs->cce_reg_mapping_type = NFAPI_NR_CCE_REG_MAPPING_NON_INTERLEAVED;
-    else {
-      cs->cce_reg_mapping_type = NFAPI_NR_CCE_REG_MAPPING_INTERLEAVED;
+void schedule_nr_bwp_switch(module_id_t module_id,
+                            frame_t frame,
+                            sub_frame_t slot) {
 
-      if (coreset_i->cce_REG_MappingType.choice.interleaved->reg_BundleSize==NR_ControlResourceSet__cce_REG_MappingType__interleaved__reg_BundleSize_n6)
-	cs->reg_bundle_size = 6;
-      else cs->reg_bundle_size = 2+coreset_i->cce_REG_MappingType.choice.interleaved->reg_BundleSize;
+  NR_UEs_t *UE_info = &RC.nrmac[module_id]->UE_info;
 
-      if (coreset_i->cce_REG_MappingType.choice.interleaved->interleaverSize==NR_ControlResourceSet__cce_REG_MappingType__interleaved__interleaverSize_n6)
-	cs->interleaver_size = 6;
-      else cs->interleaver_size = 2+coreset_i->cce_REG_MappingType.choice.interleaved->interleaverSize;
+  // TODO: Implementation of a algorithm to perform:
+  //  - DL BWP selection:     sched_ctrl->next_dl_bwp_id = dl_bwp_id
+  //  - UL BWP selection:     sched_ctrl->next_ul_bwp_id = ul_bwp_id
 
-      if (coreset_i->cce_REG_MappingType.choice.interleaved->shiftIndex)
-	cs->shift_index = *coreset_i->cce_REG_MappingType.choice.interleaved->shiftIndex;
-      else cs->shift_index = 0;
-    }
-    
-    if (coreset_i->precoderGranularity == NR_ControlResourceSet__precoderGranularity_sameAsREG_bundle)
-      cs->precoder_granularity = NFAPI_NR_CSET_SAME_AS_REG_BUNDLE;
-    else cs->precoder_granularity = NFAPI_NR_CSET_ALL_CONTIGUOUS_RBS;
-    if (coreset_i->tci_PresentInDCI == NULL) cs->tci_present_in_dci = 0;
-    else                                     cs->tci_present_in_dci = 1;
-
-    if (coreset_i->tci_PresentInDCI == NULL) cs->dmrs_scrambling_id = 0;
-    else                                     cs->dmrs_scrambling_id = *coreset_i->tci_PresentInDCI;
-  }
-
-  struct NR_PDCCH_ConfigCommon__commonSearchSpaceList *commonSearchSpaceList = bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList;
-  AssertFatal(commonSearchSpaceList->list.count>0,
-	      "common SearchSpace list has 0 elements\n");
-  // Common searchspace list
-  for (int i=0;i<commonSearchSpaceList->list.count;i++) {
-    NR_SearchSpace_t *searchSpace_i=commonSearchSpaceList->list.array[i];  
-    ss=search_space + searchSpace_i->searchSpaceId;
-    if (searchSpace_i->controlResourceSetId) ss->coreset_id = *searchSpace_i->controlResourceSetId;
-    switch(searchSpace_i->monitoringSlotPeriodicityAndOffset->present) {
-    case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1:
-      ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL1;
-      break;
-    case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl2:
-      ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL2;
-      ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl2;
-      break;
-    case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl4:
-      ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL4;
-      ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl4;
-      break;
-    case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl5:
-      ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL5;
-      ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl5;
-      break;
-    case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl8:
-      ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL8;
-      ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl8;
-      break;
-    case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl10:
-      ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL10;
-      ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl10;
-      break;
-    case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl16:
-      ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL16;
-      ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl16;
-      break;
-    case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl20:
-      ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL20;
-      ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl20;
-      break;
-    case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl40:
-      ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL40;
-      ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl40;
-      break;
-    case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl80:
-      ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL80;
-      ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl80;
-      break;
-    case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl160:
-      ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL160;
-      ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl160;
-      break;
-    case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl320:
-      ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL320;
-      ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl320;
-      break;
-    case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl640:
-      ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL640;
-      ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl640;
-      break;
-    case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1280:
-      ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL1280;
-      ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl1280;
-      break;
-    case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl2560:
-      ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL2560;
-      ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl2560;
-      break;
-    default:
-      AssertFatal(1==0,"Shouldn't get here\n");
-      break;    
-    }
-    if (searchSpace_i->duration) ss->duration = *searchSpace_i->duration;
-    else                         ss->duration = 1;
-
-
-    AssertFatal(searchSpace_i->monitoringSymbolsWithinSlot->size == 2,
-		"ss_i->monitoringSymbolsWithinSlot = %d != 2\n",
-		(int)searchSpace_i->monitoringSymbolsWithinSlot->size);
-    ((uint8_t*)&ss->monitoring_symbols_in_slot)[1] = searchSpace_i->monitoringSymbolsWithinSlot->buf[0];
-    ((uint8_t*)&ss->monitoring_symbols_in_slot)[0] = searchSpace_i->monitoringSymbolsWithinSlot->buf[1];
-
-    AssertFatal(searchSpace_i->nrofCandidates!=NULL,"searchSpace_%d->nrofCandidates is null\n",(int)searchSpace_i->searchSpaceId);
-    if (searchSpace_i->nrofCandidates->aggregationLevel1 == NR_SearchSpace__nrofCandidates__aggregationLevel1_n8)
-      ss->number_of_candidates[0] = 8;
-    else ss->number_of_candidates[0] = searchSpace_i->nrofCandidates->aggregationLevel1;
-    if (searchSpace_i->nrofCandidates->aggregationLevel2 == NR_SearchSpace__nrofCandidates__aggregationLevel2_n8)
-      ss->number_of_candidates[1] = 8;
-    else ss->number_of_candidates[1] = searchSpace_i->nrofCandidates->aggregationLevel2;
-    if (searchSpace_i->nrofCandidates->aggregationLevel4 == NR_SearchSpace__nrofCandidates__aggregationLevel4_n8)
-      ss->number_of_candidates[2] = 8;
-    else ss->number_of_candidates[2] = searchSpace_i->nrofCandidates->aggregationLevel4;
-    if (searchSpace_i->nrofCandidates->aggregationLevel8 == NR_SearchSpace__nrofCandidates__aggregationLevel8_n8)
-      ss->number_of_candidates[3] = 8;
-    else ss->number_of_candidates[3] = searchSpace_i->nrofCandidates->aggregationLevel8;
-    if (searchSpace_i->nrofCandidates->aggregationLevel16 == NR_SearchSpace__nrofCandidates__aggregationLevel16_n8)
-      ss->number_of_candidates[4] = 8;
-    else ss->number_of_candidates[4] = searchSpace_i->nrofCandidates->aggregationLevel16;      
-
-    AssertFatal(searchSpace_i->searchSpaceType->present==NR_SearchSpace__searchSpaceType_PR_common,
-		"searchspace %d is not common\n",(int)searchSpace_i->searchSpaceId);
-    AssertFatal(searchSpace_i->searchSpaceType->choice.common!=NULL,
-		"searchspace %d common is null\n",(int)searchSpace_i->searchSpaceId);
-    ss->search_space_type = NFAPI_NR_SEARCH_SPACE_TYPE_COMMON;
-    if (searchSpace_i->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0)
-      ss->css_formats_0_0_and_1_0 = 1;
-    if (searchSpace_i->searchSpaceType->choice.common->dci_Format2_0) {
-      ss->css_format_2_0 = 1;
-      // add aggregation info
-    }
-    if (searchSpace_i->searchSpaceType->choice.common->dci_Format2_1)
-      ss->css_format_2_1 = 1;
-    if (searchSpace_i->searchSpaceType->choice.common->dci_Format2_2)
-      ss->css_format_2_2 = 1;
-    if (searchSpace_i->searchSpaceType->choice.common->dci_Format2_3)
-      ss->css_format_2_3 = 1;
-  }
-
-  struct NR_PDCCH_Config__searchSpacesToAddModList *dedicatedSearchSpaceList = bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList;
-  AssertFatal(dedicatedSearchSpaceList->list.count>0,
-	      "Dedicated Search Space list has 0 elements\n");
-  // Dedicated searchspace list
-  for (int i=0;i<dedicatedSearchSpaceList->list.count;i++) {
-    NR_SearchSpace_t *searchSpace_i=dedicatedSearchSpaceList->list.array[i];  
-    ss=search_space + searchSpace_i->searchSpaceId;
-    ss->search_space_id = searchSpace_i->searchSpaceId;
-    if (searchSpace_i->controlResourceSetId) ss->coreset_id = *searchSpace_i->controlResourceSetId;
-    switch(searchSpace_i->monitoringSlotPeriodicityAndOffset->present) {
-    case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1:
-      ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL1;
-      break;
-    case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl2:
-      ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL2;
-      ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl2;
-      break;
-    case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl4:
-      ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL4;
-      ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl4;
-      break;
-    case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl5:
-      ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL5;
-      ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl5;
-      break;
-    case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl8:
-      ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL8;
-      ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl8;
-      break;
-    case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl10:
-      ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL10;
-      ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl10;
-      break;
-    case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl16:
-      ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL16;
-      ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl16;
-      break;
-    case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl20:
-      ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL20;
-      ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl20;
-      break;
-    case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl40:
-      ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL40;
-      ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl40;
-      break;
-    case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl80:
-      ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL80;
-      ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl80;
-      break;
-    case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl160:
-      ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL160;
-      ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl160;
-      break;
-    case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl320:
-      ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL320;
-      ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl320;
-      break;
-    case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl640:
-      ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL640;
-      ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl640;
-      break;
-    case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1280:
-      ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL1280;
-      ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl1280;
-      break;
-    case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl2560:
-      ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL2560;
-      ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl2560;
-      break;
-    default:
-      AssertFatal(1==0,"Shouldn't get here\n");
-      break;    
-    }
-    if (searchSpace_i->duration) ss->duration = *searchSpace_i->duration;
-    else                         ss->duration = 1;
-    
-    
-    AssertFatal(searchSpace_i->monitoringSymbolsWithinSlot->size == 2,
-		"ss_i->monitoringSymbolsWithinSlot = %d != 2\n",
-		(int)searchSpace_i->monitoringSymbolsWithinSlot->size);
-    ((uint8_t*)&ss->monitoring_symbols_in_slot)[1] = searchSpace_i->monitoringSymbolsWithinSlot->buf[0];
-    ((uint8_t*)&ss->monitoring_symbols_in_slot)[0] = searchSpace_i->monitoringSymbolsWithinSlot->buf[1];
-    
-    AssertFatal(searchSpace_i->nrofCandidates!=NULL,"searchSpace_%d->nrofCandidates is null\n",(int)searchSpace_i->searchSpaceId);
-    if (searchSpace_i->nrofCandidates->aggregationLevel1 == NR_SearchSpace__nrofCandidates__aggregationLevel1_n8)
-      ss->number_of_candidates[0] = 8;
-    else ss->number_of_candidates[0] = searchSpace_i->nrofCandidates->aggregationLevel1;
-    if (searchSpace_i->nrofCandidates->aggregationLevel2 == NR_SearchSpace__nrofCandidates__aggregationLevel2_n8)
-      ss->number_of_candidates[1] = 8;
-    else ss->number_of_candidates[1] = searchSpace_i->nrofCandidates->aggregationLevel2;
-    if (searchSpace_i->nrofCandidates->aggregationLevel4 == NR_SearchSpace__nrofCandidates__aggregationLevel4_n8)
-      ss->number_of_candidates[2] = 8;
-    else ss->number_of_candidates[2] = searchSpace_i->nrofCandidates->aggregationLevel4;
-    if (searchSpace_i->nrofCandidates->aggregationLevel8 == NR_SearchSpace__nrofCandidates__aggregationLevel8_n8)
-      ss->number_of_candidates[3] = 8;
-    else ss->number_of_candidates[3] = searchSpace_i->nrofCandidates->aggregationLevel8;
-    if (searchSpace_i->nrofCandidates->aggregationLevel16 == NR_SearchSpace__nrofCandidates__aggregationLevel16_n8)
-      ss->number_of_candidates[4] = 8;
-    else ss->number_of_candidates[4] = searchSpace_i->nrofCandidates->aggregationLevel16;      
-    
-    if (searchSpace_i->searchSpaceType->present==NR_SearchSpace__searchSpaceType_PR_ue_Specific && searchSpace_i->searchSpaceType->choice.ue_Specific!=NULL) {
-      
-      ss->search_space_type = NFAPI_NR_SEARCH_SPACE_TYPE_UE_SPECIFIC;
-      
-      ss->uss_dci_formats = searchSpace_i->searchSpaceType->choice.ue_Specific-> dci_Formats;
-      
-    } else if (searchSpace_i->searchSpaceType->present==NR_SearchSpace__searchSpaceType_PR_common && searchSpace_i->searchSpaceType->choice.common!=NULL) {
-      ss->search_space_type = NFAPI_NR_SEARCH_SPACE_TYPE_COMMON;
-      
-      if (searchSpace_i->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0)
-	ss->css_formats_0_0_and_1_0 = 1;
-      if (searchSpace_i->searchSpaceType->choice.common->dci_Format2_0) {
-	ss->css_format_2_0 = 1;
-	// add aggregation info
+  UE_iterator(UE_info->list, UE) {
+    NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
+    if (sched_ctrl->rrc_processing_timer == 0 && UE->Msg4_ACKed && sched_ctrl->next_dl_bwp_id >= 0) {
+
+      int schedule_bwp_switching = false;
+      if (sched_ctrl->active_bwp == NULL) {
+        // Switching from Initial BWP to Dedicated BWP
+        if (sched_ctrl->next_dl_bwp_id > 0 && sched_ctrl->next_ul_bwp_id > 0) {
+          schedule_bwp_switching = true;
+          LOG_W(NR_MAC,"%4d.%2d UE %04x Schedule BWP switch from Initial DL BWP to %ld and from Initial UL BWP to %ld\n",
+                frame, slot, UE->rnti, sched_ctrl->next_dl_bwp_id, sched_ctrl->next_ul_bwp_id);
+        }
+      } else if (sched_ctrl->active_bwp->bwp_Id != sched_ctrl->next_dl_bwp_id && sched_ctrl->active_ubwp->bwp_Id != sched_ctrl->next_ul_bwp_id) {
+        // Switching between Dedicated BWPs
+        schedule_bwp_switching = true;
+        LOG_W(NR_MAC,"%4d.%2d UE %04x Schedule BWP switch from dl_bwp_id %ld to %ld and from ul_bwp_id %ld to %ld\n",
+              frame, slot, UE->rnti, sched_ctrl->active_bwp->bwp_Id, sched_ctrl->next_dl_bwp_id, sched_ctrl->active_ubwp->bwp_Id, sched_ctrl->next_ul_bwp_id);
+      }
+
+      if (schedule_bwp_switching) {
+        AssertFatal(sched_ctrl->next_dl_bwp_id > 0 && sched_ctrl->next_ul_bwp_id > 0, "BWP switching from a Dedicated BWP to the Initial BWP not handled yet!");
+        nr_mac_rrc_bwp_switch_req(module_id, frame, slot, UE->rnti, sched_ctrl->next_dl_bwp_id, sched_ctrl->next_ul_bwp_id);
       }
-      if (searchSpace_i->searchSpaceType->choice.common->dci_Format2_1)
-	ss->css_format_2_1 = 1;
-      if (searchSpace_i->searchSpaceType->choice.common->dci_Format2_2)
-	ss->css_format_2_2 = 1;
-      if (searchSpace_i->searchSpaceType->choice.common->dci_Format2_3)
-	ss->css_format_2_3 = 1;
     }
   }
 }
-*/
+
+void UL_tti_req_ahead_initialization(gNB_MAC_INST * gNB, NR_ServingCellConfigCommon_t *scc, int n, int CCid) {
+
+  if(gNB->UL_tti_req_ahead[CCid]) return;
+
+  gNB->UL_tti_req_ahead[CCid] = calloc(n, sizeof(nfapi_nr_ul_tti_request_t));
+  AssertFatal(gNB->UL_tti_req_ahead[CCid],
+              "could not allocate memory for RC.nrmac[]->UL_tti_req_ahead[]\n");
+  /* fill in slot/frame numbers: slot is fixed, frame will be updated by scheduler
+   * consider that scheduler runs sl_ahead: the first sl_ahead slots are
+   * already "in the past" and thus we put frame 1 instead of 0! */
+  for (int i = 0; i < n; ++i) {
+    nfapi_nr_ul_tti_request_t *req = &gNB->UL_tti_req_ahead[CCid][i];
+    req->SFN = i < (gNB->if_inst->sl_ahead-1);
+    req->Slot = i;
+  }
+}
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_srs.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_srs.c
index 8680cc25d138ca77dbd277707408223796254651..4be176714eccbba1e5ae9fe28b7c16bea0cc49cf 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_srs.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_srs.c
@@ -34,22 +34,22 @@
 
 extern RAN_CONTEXT_t RC;
 
-void nr_configure_srs(nfapi_nr_srs_pdu_t *srs_pdu, int module_id, int CC_id, int UE_id, NR_SRS_Resource_t *srs_resource) {
+void nr_configure_srs(nfapi_nr_srs_pdu_t *srs_pdu, int module_id, int CC_id,NR_UE_info_t*  UE, NR_SRS_Resource_t *srs_resource) {
 
   gNB_MAC_INST *nrmac = RC.nrmac[module_id];
   NR_ServingCellConfigCommon_t *scc = nrmac->common_channels[CC_id].ServingCellConfigCommon;
-  NR_UE_info_t *UE_info = &nrmac->UE_info;
-  NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+  NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
 
-  NR_BWP_t ubwp = sched_ctrl->active_ubwp ?
-                  sched_ctrl->active_ubwp->bwp_Common->genericParameters :
-                  scc->uplinkConfigCommon->initialUplinkBWP->genericParameters;
+  const NR_SIB1_t *sib1 = nrmac->common_channels[0].sib1 ? nrmac->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL;
+  const NR_BWP_t *genericParameters = get_ul_bwp_genericParameters(sched_ctrl->active_ubwp,
+                                                                   scc,
+                                                                   sib1);
 
-  srs_pdu->rnti = UE_info->rnti[UE_id];
+  srs_pdu->rnti = UE->rnti;
   srs_pdu->handle = 0;
-  srs_pdu->bwp_size = NRRIV2BW(ubwp.locationAndBandwidth, MAX_BWP_SIZE);;
-  srs_pdu->bwp_start = NRRIV2PRBOFFSET(ubwp.locationAndBandwidth, MAX_BWP_SIZE);;
-  srs_pdu->subcarrier_spacing = ubwp.subcarrierSpacing;
+  srs_pdu->bwp_size = NRRIV2BW(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);;
+  srs_pdu->bwp_start = NRRIV2PRBOFFSET(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);;
+  srs_pdu->subcarrier_spacing = genericParameters->subcarrierSpacing;
   srs_pdu->cyclic_prefix = 0;
   srs_pdu->num_ant_ports = srs_resource->nrofSRS_Ports;
   srs_pdu->num_symbols = srs_resource->resourceMapping.nrofSymbols;
@@ -82,7 +82,7 @@ void nr_configure_srs(nfapi_nr_srs_pdu_t *srs_pdu, int module_id, int CC_id, int
   srs_pdu->t_offset = get_nr_srs_offset(srs_resource->resourceType.choice.periodic->periodicityAndOffset_p);
 }
 
-void nr_fill_nfapi_srs(int module_id, int CC_id, int UE_id, sub_frame_t slot, NR_SRS_Resource_t *srs_resource) {
+void nr_fill_nfapi_srs(int module_id, int CC_id, NR_UE_info_t* UE, sub_frame_t slot, NR_SRS_Resource_t *srs_resource) {
 
   nfapi_nr_ul_tti_request_t *future_ul_tti_req = &RC.nrmac[module_id]->UL_tti_req_ahead[0][slot];
   AssertFatal(future_ul_tti_req->n_pdus <
@@ -94,7 +94,7 @@ void nr_fill_nfapi_srs(int module_id, int CC_id, int UE_id, sub_frame_t slot, NR
   memset(srs_pdu, 0, sizeof(nfapi_nr_srs_pdu_t));
   future_ul_tti_req->n_pdus += 1;
 
-  nr_configure_srs(srs_pdu, module_id, CC_id, UE_id, srs_resource);
+  nr_configure_srs(srs_pdu, module_id, CC_id, UE, srs_resource);
 }
 
 /*******************************************************************
@@ -111,32 +111,38 @@ void nr_fill_nfapi_srs(int module_id, int CC_id, int UE_id, sub_frame_t slot, NR
 void nr_schedule_srs(int module_id, frame_t frame) {
 
   gNB_MAC_INST *nrmac = RC.nrmac[module_id];
-  NR_UE_info_t *UE_info = &nrmac->UE_info;
-  const NR_list_t *UE_list = &UE_info->list;
-
-  for (int UE_id = UE_list->head; UE_id >= 0; UE_id = UE_list->next[UE_id]) {
+  NR_UEs_t *UE_info = &nrmac->UE_info;
 
+  UE_iterator(UE_info->list, UE) {
     const int CC_id = 0;
     NR_ServingCellConfigCommon_t *scc = RC.nrmac[module_id]->common_channels[CC_id].ServingCellConfigCommon;
-    NR_CellGroupConfig_t *cg = UE_info->CellGroup[UE_id];
-    NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+    NR_CellGroupConfig_t *cg = UE->CellGroup;
+    NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
 
     sched_ctrl->sched_srs.frame = -1;
     sched_ctrl->sched_srs.slot = -1;
     sched_ctrl->sched_srs.srs_scheduled = false;
 
-    if(!UE_info->Msg4_ACKed[UE_id] || sched_ctrl->rrc_processing_timer > 0) {
+    if((sched_ctrl->ul_failure == 1 && get_softmodem_params()->phy_test==0) ||
+       sched_ctrl->rrc_processing_timer > 0) {
       continue;
     }
 
     NR_SRS_Config_t *srs_config = NULL;
-    if (cg &&
-        cg->spCellConfig &&
-        cg->spCellConfig->spCellConfigDedicated &&
-        cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
-        cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP) {
+    if (sched_ctrl->active_ubwp) {
+      if (sched_ctrl->active_ubwp->bwp_Dedicated &&
+          sched_ctrl->active_ubwp->bwp_Dedicated->srs_Config) {
+        srs_config = sched_ctrl->active_ubwp->bwp_Dedicated->srs_Config->choice.setup;
+      }
+    } else if (cg &&
+               cg->spCellConfig &&
+               cg->spCellConfig->spCellConfigDedicated &&
+               cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
+               cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP) {
       srs_config = cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->srs_Config->choice.setup;
-    } else {
+    }
+
+    if (!srs_config) {
       continue;
     }
 
@@ -166,23 +172,24 @@ void nr_schedule_srs(int module_id, frame_t frame) {
         continue;
       }
 
-      NR_BWP_t ubwp = sched_ctrl->active_ubwp ?
-                        sched_ctrl->active_ubwp->bwp_Common->genericParameters :
-                        scc->uplinkConfigCommon->initialUplinkBWP->genericParameters;
+      const NR_SIB1_t *sib1 = nrmac->common_channels[0].sib1 ? nrmac->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL;
+      const NR_BWP_t *genericParameters = get_ul_bwp_genericParameters(sched_ctrl->active_ubwp,
+                                                                       scc,
+                                                                       sib1);
 
       uint16_t period = srs_period[srs_resource->resourceType.choice.periodic->periodicityAndOffset_p.present];
       uint16_t offset = get_nr_srs_offset(srs_resource->resourceType.choice.periodic->periodicityAndOffset_p);
 
-      int n_slots_frame = nr_slots_per_frame[ubwp.subcarrierSpacing];
+      const int n_slots_frame = nr_slots_per_frame[genericParameters->subcarrierSpacing];
 
       // Check if UE will transmit the SRS in this frame
       if ( ((frame - offset/n_slots_frame)*n_slots_frame)%period == 0) {
         LOG_D(NR_MAC,"Scheduling SRS reception for %d.%d\n", frame, offset%n_slots_frame);
-        nr_fill_nfapi_srs(module_id, CC_id, UE_id, offset%n_slots_frame, srs_resource);
+        nr_fill_nfapi_srs(module_id, CC_id, UE, offset%n_slots_frame, srs_resource);
         sched_ctrl->sched_srs.frame = frame;
         sched_ctrl->sched_srs.slot = offset%n_slots_frame;
         sched_ctrl->sched_srs.srs_scheduled = true;
       }
     }
   }
-}
\ No newline at end of file
+}
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
index dda9e0972113f21b630fa01af8bbbdd5ba495ea8..b5e90a4dcce8ada14bf2eb09be4560d2d70c514e 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
@@ -38,30 +38,29 @@
 extern RAN_CONTEXT_t RC;
 
 
-void nr_fill_nfapi_pucch(module_id_t mod_id,
-                         frame_t frame,
-                         sub_frame_t slot,
-                         const NR_sched_pucch_t *pucch,
-                         int UE_id)
-{
-  gNB_MAC_INST *nr_mac = RC.nrmac[mod_id];
-  NR_UE_info_t *UE_info = &nr_mac->UE_info;
 
+static void nr_fill_nfapi_pucch(gNB_MAC_INST *nrmac,
+                                frame_t frame,
+                                sub_frame_t slot,
+                                const NR_sched_pucch_t *pucch,
+                                NR_UE_info_t* UE)
+{
   nfapi_nr_ul_tti_request_t *future_ul_tti_req =
-      &RC.nrmac[mod_id]->UL_tti_req_ahead[0][pucch->ul_slot];
-
-  if (future_ul_tti_req->SFN != pucch->frame || future_ul_tti_req->Slot != pucch->ul_slot)
-    LOG_W(MAC,
-          "Current %d.%d : future UL_tti_req's frame.slot %4d.%2d does not match PUCCH %4d.%2d\n",
-          frame,slot,
-          future_ul_tti_req->SFN,
-          future_ul_tti_req->Slot,
-          pucch->frame,
-          pucch->ul_slot);
-  AssertFatal(future_ul_tti_req->n_pdus <
-              sizeof(future_ul_tti_req->pdus_list) / sizeof(future_ul_tti_req->pdus_list[0]),
-              "Invalid future_ul_tti_req->n_pdus %d\n", future_ul_tti_req->n_pdus);
-
+      &nrmac->UL_tti_req_ahead[0][pucch->ul_slot];
+  AssertFatal(future_ul_tti_req->SFN == pucch->frame
+              && future_ul_tti_req->Slot == pucch->ul_slot,
+              "Current %4d.%2d : future UL_tti_req's frame.slot %4d.%2d does not match PUCCH %4d.%2d\n",
+              frame,slot,
+              future_ul_tti_req->SFN,
+              future_ul_tti_req->Slot,
+              pucch->frame,
+              pucch->ul_slot);
+  // n_pdus is number of pdus, so, in the array, it is the index of the next free element
+  if (future_ul_tti_req->n_pdus >= sizeofArray(future_ul_tti_req->pdus_list) ) {
+    LOG_E(NR_MAC,"future_ul_tti_req->n_pdus %d is full, slot: %d, sr flag %d dropping request\n",
+	  future_ul_tti_req->n_pdus, pucch->ul_slot, pucch->sr_flag);
+    return;
+  }
   future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].pdu_type = NFAPI_NR_UL_CONFIG_PUCCH_PDU_TYPE;
   future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].pdu_size = sizeof(nfapi_nr_pucch_pdu_t);
   nfapi_nr_pucch_pdu_t *pucch_pdu = &future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].pucch_pdu;
@@ -79,9 +78,9 @@ void nr_fill_nfapi_pucch(module_id_t mod_id,
         pucch->dai_c,
         pucch->csi_bits,
         pucch->resource_indicator);
-
-  NR_ServingCellConfigCommon_t *scc = RC.nrmac[mod_id]->common_channels->ServingCellConfigCommon;
-  NR_CellGroupConfig_t *cg=UE_info->CellGroup[UE_id];
+  NR_COMMON_channels_t * common_ch=nrmac->common_channels;
+  NR_ServingCellConfigCommon_t *scc = common_ch->ServingCellConfigCommon;
+  NR_CellGroupConfig_t *cg=UE->CellGroup;
 
   NR_BWP_UplinkDedicated_t *ubwpd = cg && cg->spCellConfig && cg->spCellConfig->spCellConfigDedicated &&
                                     cg->spCellConfig->spCellConfigDedicated->uplinkConfig ?
@@ -90,14 +89,14 @@ void nr_fill_nfapi_pucch(module_id_t mod_id,
   LOG_D(NR_MAC,"%4d.%2d Calling nr_configure_pucch (ubwpd %p,r_pucch %d) pucch to be scheduled in %4d.%2d\n",
         frame,slot,ubwpd,pucch->r_pucch,pucch->frame,pucch->ul_slot);
 
-  const NR_SIB1_t *sib1 = nr_mac->common_channels[0].sib1 ? nr_mac->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL;
+  const NR_SIB1_t *sib1 = common_ch->sib1 ? common_ch->sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL;
   nr_configure_pucch(sib1,
                      pucch_pdu,
                      scc,
-                     UE_info->CellGroup[UE_id],
-                     UE_info->UE_sched_ctrl[UE_id].active_ubwp,
+                     UE->CellGroup,
+                     UE->UE_sched_ctrl.active_ubwp,
                      ubwpd,
-                     UE_info->rnti[UE_id],
+                     UE->rnti,
                      pucch->resource_indicator,
                      pucch->csi_bits,
                      pucch->dai_c,
@@ -141,22 +140,18 @@ int diff_rsrp_ssb_csi_meas_10_1_6_1_2[16] = {
 };
 
 
-void nr_schedule_pucch(int Mod_idP,
+void nr_schedule_pucch(gNB_MAC_INST *nrmac,
                        frame_t frameP,
                        sub_frame_t slotP)
 {
-  gNB_MAC_INST *nrmac = RC.nrmac[Mod_idP];
   if (!is_xlsch_in_slot(nrmac->ulsch_slot_bitmap[slotP / 64], slotP))
     return;
 
-  NR_UE_info_t *UE_info = &nrmac->UE_info;
-  const NR_list_t *UE_list = &UE_info->list;
-
-  for (int UE_id = UE_list->head; UE_id >= 0; UE_id = UE_list->next[UE_id]) {
-    NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+  UE_iterator(nrmac->UE_info.list, UE) {
+    NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
     const int n = sizeof(sched_ctrl->sched_pucch) / sizeof(*sched_ctrl->sched_pucch);
     for (int i = 0; i < n; i++) {
-      NR_sched_pucch_t *curr_pucch = &UE_info->UE_sched_ctrl[UE_id].sched_pucch[i];
+      NR_sched_pucch_t *curr_pucch = &UE->UE_sched_ctrl.sched_pucch[i];
       const uint16_t O_ack = curr_pucch->dai_c;
       const uint16_t O_csi = curr_pucch->csi_bits;
       const uint8_t O_sr = curr_pucch->sr_flag;
@@ -164,537 +159,16 @@ void nr_schedule_pucch(int Mod_idP,
           || frameP != curr_pucch->frame
           || slotP != curr_pucch->ul_slot)
         continue;
-      if (O_csi > 0) LOG_D(NR_MAC,"Scheduling PUCCH[%d] RX for UE %d in %4d.%2d O_ack %d, O_sr %d, O_csi %d\n",
-	                   i,UE_id,curr_pucch->frame,curr_pucch->ul_slot,O_ack,O_sr,O_csi);
-      nr_fill_nfapi_pucch(Mod_idP, frameP, slotP, curr_pucch, UE_id);
-      memset(curr_pucch, 0, sizeof(*curr_pucch));
-    }
-  }
-}
-
-
-//! Calculating number of bits set
-uint8_t number_of_bits_set (uint8_t buf){
-  uint8_t nb_of_bits_set = 0;
-  uint8_t mask = 0xff;
-  uint8_t index = 0;
-
-  for (index=7; (buf & mask) && (index>=0)  ; index--){
-    if (buf & (1<<index))
-      nb_of_bits_set++;
-
-    mask>>=1;
-  }
-  return nb_of_bits_set;
-}
-
-
-void compute_rsrp_bitlen(struct NR_CSI_ReportConfig *csi_reportconfig,
-                         uint8_t nb_resources,
-                         nr_csi_report_t *csi_report) {
-
-  if (NR_CSI_ReportConfig__groupBasedBeamReporting_PR_disabled == csi_reportconfig->groupBasedBeamReporting.present) {
-    if (NULL != csi_reportconfig->groupBasedBeamReporting.choice.disabled->nrofReportedRS)
-      csi_report->CSI_report_bitlen.nb_ssbri_cri = *(csi_reportconfig->groupBasedBeamReporting.choice.disabled->nrofReportedRS)+1;
-    else
-      /*! From Spec 38.331
-       * nrofReportedRS
-       * The number (N) of measured RS resources to be reported per report setting in a non-group-based report. N <= N_max, where N_max is either 2 or 4 depending on UE
-       * capability. FFS: The signaling mechanism for the gNB to select a subset of N beams for the UE to measure and report.
-       * When the field is absent the UE applies the value 1
-       */
-      csi_report->CSI_report_bitlen.nb_ssbri_cri= 1;
-  } else
-    csi_report->CSI_report_bitlen.nb_ssbri_cri= 2;
-
-  if (nb_resources) {
-    csi_report->CSI_report_bitlen.cri_ssbri_bitlen =ceil(log2 (nb_resources));
-    csi_report->CSI_report_bitlen.rsrp_bitlen = 7; //From spec 38.212 Table 6.3.1.1.2-6: CRI, SSBRI, and RSRP
-    csi_report->CSI_report_bitlen.diff_rsrp_bitlen =4; //From spec 38.212 Table 6.3.1.1.2-6: CRI, SSBRI, and RSRP
-  } else {
-    csi_report->CSI_report_bitlen.cri_ssbri_bitlen =0;
-    csi_report->CSI_report_bitlen.rsrp_bitlen = 0;
-    csi_report->CSI_report_bitlen.diff_rsrp_bitlen =0;
-  }
-}
-
-
-uint8_t compute_ri_bitlen(struct NR_CSI_ReportConfig *csi_reportconfig,
-                          nr_csi_report_t *csi_report){
-
-  struct NR_CodebookConfig *codebookConfig = csi_reportconfig->codebookConfig;
-  uint8_t nb_allowed_ri, ri_bitlen;
-  uint8_t ri_restriction = 0;
-
-  if (codebookConfig == NULL) {
-    csi_report->csi_meas_bitlen.ri_bitlen=0;
-    return ri_restriction;
-  }
-
-  // codebook type1 single panel
-  if (NR_CodebookConfig__codebookType__type1__subType_PR_typeI_SinglePanel==codebookConfig->codebookType.choice.type1->subType.present){
-    struct NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel *type1single = codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel;
-    if (type1single->nrOfAntennaPorts.present == NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts_PR_two){
-
-      ri_restriction = csi_reportconfig->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->typeI_SinglePanel_ri_Restriction.buf[0];
-
-      nb_allowed_ri = number_of_bits_set(ri_restriction);
-      ri_bitlen = ceil(log2(nb_allowed_ri));
-
-      ri_bitlen = ri_bitlen<1?ri_bitlen:1; //from the spec 38.212 and table  6.3.1.1.2-3: RI, LI, CQI, and CRI of codebookType=typeI-SinglePanel
-      csi_report->csi_meas_bitlen.ri_bitlen=ri_bitlen;
-    }
-    if (type1single->nrOfAntennaPorts.present == NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts_PR_moreThanTwo){
-      if (type1single->nrOfAntennaPorts.choice.moreThanTwo->n1_n2.present ==
-          NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_two_one_TypeI_SinglePanel_Restriction) {
-        // 4 ports
-
-        ri_restriction = csi_reportconfig->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->typeI_SinglePanel_ri_Restriction.buf[0];
-
-        nb_allowed_ri = number_of_bits_set(ri_restriction);
-        ri_bitlen = ceil(log2(nb_allowed_ri));
-
-        ri_bitlen = ri_bitlen<2?ri_bitlen:2; //from the spec 38.212 and table  6.3.1.1.2-3: RI, LI, CQI, and CRI of codebookType=typeI-SinglePanel
-        csi_report->csi_meas_bitlen.ri_bitlen=ri_bitlen;
-      }
-      else {
-        // more than 4 ports
-
-        ri_restriction = csi_reportconfig->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->typeI_SinglePanel_ri_Restriction.buf[0];
-
-        nb_allowed_ri = number_of_bits_set(ri_restriction);
-        ri_bitlen = ceil(log2(nb_allowed_ri));
-
-        csi_report->csi_meas_bitlen.ri_bitlen=ri_bitlen;
-      }
-    }
-    return ri_restriction;
-  }
-  else 
-    AssertFatal(1==0,"Other configurations not yet implemented\n");
-  return -1;
-}
-
-void compute_li_bitlen(struct NR_CSI_ReportConfig *csi_reportconfig,
-                       uint8_t ri_restriction,
-                       nr_csi_report_t *csi_report){
-
-  struct NR_CodebookConfig *codebookConfig = csi_reportconfig->codebookConfig;
-  for(int i=0; i<8; i++) {
-    if (codebookConfig == NULL || ((ri_restriction>>i)&0x01) == 0)
-      csi_report->csi_meas_bitlen.li_bitlen[i]=0;
-    else {
-      // codebook type1 single panel
-      if (NR_CodebookConfig__codebookType__type1__subType_PR_typeI_SinglePanel==codebookConfig->codebookType.choice.type1->subType.present)
-        csi_report->csi_meas_bitlen.li_bitlen[i]=ceil(log2(i+1))<2?ceil(log2(i+1)):2;
-      else
-        AssertFatal(1==0,"Other configurations not yet implemented\n");
-    }
-  }
-}
-
-
-void get_n1n2_o1o2_singlepanel(int *n1, int *n2, int *o1, int *o2,
-                               struct NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo *morethantwo) {
-
-  // Table 5.2.2.2.1-2 in 38.214 for supported configurations
-  switch(morethantwo->n1_n2.present){
-    case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_two_one_TypeI_SinglePanel_Restriction):
-      *n1 = 2;
-      *n2 = 1;
-      *o1 = 4;
-      *o2 = 1;
-      break;
-    case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_two_two_TypeI_SinglePanel_Restriction):
-      *n1 = 2;
-      *n2 = 2;
-      *o1 = 4;
-      *o2 = 4;
-      break;
-    case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_four_one_TypeI_SinglePanel_Restriction):
-      *n1 = 4;
-      *n2 = 1;
-      *o1 = 4;
-      *o2 = 1;
-      break;
-    case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_three_two_TypeI_SinglePanel_Restriction):
-      *n1 = 3;
-      *n2 = 2;
-      *o1 = 4;
-      *o2 = 4;
-      break;
-    case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_six_one_TypeI_SinglePanel_Restriction):
-      *n1 = 6;
-      *n2 = 1;
-      *o1 = 4;
-      *o2 = 1;
-      break;
-    case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_four_two_TypeI_SinglePanel_Restriction):
-      *n1 = 4;
-      *n2 = 2;
-      *o1 = 4;
-      *o2 = 4;
-      break;
-    case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_eight_one_TypeI_SinglePanel_Restriction):
-      *n1 = 8;
-      *n2 = 1;
-      *o1 = 4;
-      *o2 = 1;
-      break;
-    case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_four_three_TypeI_SinglePanel_Restriction):
-      *n1 = 4;
-      *n2 = 3;
-      *o1 = 4;
-      *o2 = 4;
-      break;
-    case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_six_two_TypeI_SinglePanel_Restriction):
-      *n1 = 4;
-      *n2 = 2;
-      *o1 = 4;
-      *o2 = 4;
-      break;
-    case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_twelve_one_TypeI_SinglePanel_Restriction):
-      *n1 = 12;
-      *n2 = 1;
-      *o1 = 4;
-      *o2 = 1;
-      break;
-    case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_four_four_TypeI_SinglePanel_Restriction):
-      *n1 = 4;
-      *n2 = 4;
-      *o1 = 4;
-      *o2 = 4;
-      break;
-    case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_eight_two_TypeI_SinglePanel_Restriction):
-      *n1 = 8;
-      *n2 = 2;
-      *o1 = 4;
-      *o2 = 4;
-      break;
-    case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_sixteen_one_TypeI_SinglePanel_Restriction):
-      *n1 = 16;
-      *n2 = 1;
-      *o1 = 4;
-      *o2 = 1;
-      break;
-  default:
-    AssertFatal(1==0,"Not supported configuration for n1_n2 in codebook configuration");
-  }
-}
-
-void get_x1x2_bitlen_singlepanel(int n1, int n2, int o1, int o2,
-                                 int *x1, int *x2, int rank, int codebook_mode) {
-
-  // Table 6.3.1.1.2-1 in 38.212
-  switch(rank){
-    case 1:
-      if(n2>1) {
-        if (codebook_mode == 1) {
-          *x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2));
-          *x2 = 2;
-        }
-        else {
-          *x1 = ceil(log2(n1*o1/2)) + ceil(log2(n2*o2/2));
-          *x2 = 4;
-        }
-      }
-      else{
-        if (codebook_mode == 1) {
-          *x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2));
-          *x2 = 2;
-        }
-        else {
-          *x1 = ceil(log2(n1*o1/2));
-          *x2 = 4;
-        }
-      }
-      break;
-    case 2:
-      if(n1*n2 == 2) {
-        if (codebook_mode == 1) {
-          *x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2));
-          *x2 = 1;
-        }
-        else {
-          *x1 = ceil(log2(n1*o1/2));
-          *x2 = 3;
-        }
-        *x1 += 1;
-      }
-      else {
-        if(n2>1) {
-          if (codebook_mode == 1) {
-            *x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2));
-            *x2 = 3;
-          }
-          else {
-            *x1 = ceil(log2(n1*o1/2)) + ceil(log2(n2*o2/2));
-            *x2 = 3;
-          }
-        }
-        else{
-          if (codebook_mode == 1) {
-            *x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2));
-            *x2 = 1;
-          }
-          else {
-            *x1 = ceil(log2(n1*o1/2));
-            *x2 = 3;
-          }
-        }
-        *x1 += 2;
-      }
-      break;
-    case 3:
-    case 4:
-      if(n1*n2 == 2) {
-        *x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2));
-        *x2 = 1;
-      }
-      else {
-        if(n1*n2 >= 8) {
-          *x1 = ceil(log2(n1*o1/2)) + ceil(log2(n2*o2)) + 2;
-          *x2 = 1;
-        }
-        else {
-          *x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2)) + 2;
-          *x2 = 1;
-        }
-      }
-      break;
-    case 5:
-    case 6:
-      *x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2));
-      *x2 = 1;
-      break;
-    case 7:
-    case 8:
-      if(n1 == 4 && n2 == 1) {
-        *x1 = ceil(log2(n1*o1/2)) + ceil(log2(n2*o2));
-        *x2 = 1;
-      }
-      else {
-        if(n1 > 2 && n2 == 2) {
-          *x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2/2));
-          *x2 = 1;
-        }
-        else {
-          *x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2));
-          *x2 = 1;
-        }
-      }
-      break;
-  default:
-    AssertFatal(1==0,"Invalid rank in x1 x2 bit length computation\n");
-  }
-}
-
 
-void compute_pmi_bitlen(struct NR_CSI_ReportConfig *csi_reportconfig,
-                        uint8_t ri_restriction,
-                        nr_csi_report_t *csi_report){
-
-  struct NR_CodebookConfig *codebookConfig = csi_reportconfig->codebookConfig;
-  for(int i=0; i<8; i++) {
-    csi_report->csi_meas_bitlen.pmi_x1_bitlen[i]=0;
-    csi_report->csi_meas_bitlen.pmi_x2_bitlen[i]=0;
-    if (codebookConfig == NULL || ((ri_restriction>>i)&0x01) == 0)
-      return;
-    else {
-      if(codebookConfig->codebookType.present == NR_CodebookConfig__codebookType_PR_type1) {
-        if(codebookConfig->codebookType.choice.type1->subType.present == NR_CodebookConfig__codebookType__type1__subType_PR_typeI_SinglePanel) {
-          if(codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.present ==
-             NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts_PR_two) {
-            if (i==0)
-              csi_report->csi_meas_bitlen.pmi_x2_bitlen[i]=2;
-            if (i==1)
-              csi_report->csi_meas_bitlen.pmi_x2_bitlen[i]=1;
-          }
-          else {  // more than two
-            int n1,n2,o1,o2,x1,x2;
-            get_n1n2_o1o2_singlepanel(&n1,&n2,&o1,&o2,codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.choice.moreThanTwo);
-            get_x1x2_bitlen_singlepanel(n1,n2,o1,o2,&x1,&x2,i+1,codebookConfig->codebookType.choice.type1->codebookMode);
-            csi_report->csi_meas_bitlen.pmi_x1_bitlen[i]=x1;
-            csi_report->csi_meas_bitlen.pmi_x2_bitlen[i]=x2;
-          }
-        }
-        else
-          AssertFatal(1==0,"Type1 Multi-panel Codebook Config not yet implemented\n");
-      }
-      else
-        AssertFatal(1==0,"Type2 Codebook Config not yet implemented\n");
-    }
-  }
-}
-
-void compute_cqi_bitlen(struct NR_CSI_ReportConfig *csi_reportconfig,
-                        uint8_t ri_restriction,
-                        nr_csi_report_t *csi_report){
-
-  struct NR_CodebookConfig *codebookConfig = csi_reportconfig->codebookConfig;
-  struct NR_CSI_ReportConfig__reportFreqConfiguration *freq_config = csi_reportconfig->reportFreqConfiguration;
-
-  if (*freq_config->cqi_FormatIndicator == NR_CSI_ReportConfig__reportFreqConfiguration__cqi_FormatIndicator_widebandCQI) {
-    for(int i=0; i<8; i++) {
-      if ((ri_restriction>>i)&0x01) {
-        csi_report->csi_meas_bitlen.cqi_bitlen[i] = 4;
-        if(codebookConfig != NULL) {
-          if (NR_CodebookConfig__codebookType__type1__subType_PR_typeI_SinglePanel == codebookConfig->codebookType.choice.type1->subType.present){
-            struct NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel *type1single = codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel;
-            if (type1single->nrOfAntennaPorts.present == NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts_PR_moreThanTwo) {
-              if (type1single->nrOfAntennaPorts.choice.moreThanTwo->n1_n2.present >
-                  NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_two_one_TypeI_SinglePanel_Restriction) {
-                // more than 4 antenna ports
-                if (i > 4)
-                  csi_report->csi_meas_bitlen.cqi_bitlen[i] += 4; // CQI for second TB
-              }
-            }
-          }
-        }
-      }
-      else
-        csi_report->csi_meas_bitlen.cqi_bitlen[i] = 0;
-    }
-  }
-  else
-    AssertFatal(1==0,"Sub-band CQI reporting not yet supported");
-}
-
-
-//!TODO : same function can be written to handle csi_resources
-void compute_csi_bitlen(NR_CSI_MeasConfig_t *csi_MeasConfig, NR_UE_info_t *UE_info, int UE_id, module_id_t Mod_idP){
-  uint8_t csi_report_id = 0;
-  uint8_t nb_resources = 0;
-  NR_CSI_ReportConfig__reportQuantity_PR reportQuantity_type;
-  NR_CSI_ResourceConfigId_t csi_ResourceConfigId;
-  struct NR_CSI_ResourceConfig *csi_resourceconfig;
-
-  // for each CSI measurement report configuration (list of CSI-ReportConfig)
-  LOG_D(NR_MAC,"Searching %d csi_reports\n",csi_MeasConfig->csi_ReportConfigToAddModList->list.count);
-  for (csi_report_id=0; csi_report_id < csi_MeasConfig->csi_ReportConfigToAddModList->list.count; csi_report_id++){
-    struct NR_CSI_ReportConfig *csi_reportconfig = csi_MeasConfig->csi_ReportConfigToAddModList->list.array[csi_report_id];
-    // MAC structure for CSI measurement reports (per UE and per report)
-    nr_csi_report_t *csi_report = &UE_info->csi_report_template[UE_id][csi_report_id];
-    // csi-ResourceConfigId of a CSI-ResourceConfig included in the configuration
-    // (either CSI-RS or SSB)
-    csi_ResourceConfigId = csi_reportconfig->resourcesForChannelMeasurement;
-    // looking for CSI-ResourceConfig
-    int found_resource = 0;
-    int csi_resourceidx = 0;
-    while (found_resource == 0 && csi_resourceidx < csi_MeasConfig->csi_ResourceConfigToAddModList->list.count) {
-      csi_resourceconfig = csi_MeasConfig->csi_ResourceConfigToAddModList->list.array[csi_resourceidx];
-      if ( csi_resourceconfig->csi_ResourceConfigId == csi_ResourceConfigId)
-        found_resource = 1;
-      csi_resourceidx++;
-    }
-    AssertFatal(found_resource==1,"Not able to found any CSI-ResourceConfig with csi-ResourceConfigId %ld\n",
-                csi_ResourceConfigId);
-
-    long resourceType = csi_resourceconfig->resourceType;
-
-    reportQuantity_type = csi_reportconfig->reportQuantity.present;
-    csi_report->reportQuantity_type = reportQuantity_type;
-
-    // setting the CSI or SSB index list
-    if (NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP == csi_report->reportQuantity_type) {
-      for (int csi_idx = 0; csi_idx < csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.count; csi_idx++) {
-        if (csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.array[csi_idx]->csi_SSB_ResourceSetId ==
-            *(csi_resourceconfig->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList->list.array[0])){
-          //We can configure only one SSB resource set from spec 38.331 IE CSI-ResourceConfig
-          nb_resources=  csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.array[csi_idx]->csi_SSB_ResourceList.list.count;
-          csi_report->SSB_Index_list = csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.array[csi_idx]->csi_SSB_ResourceList.list.array;
-          csi_report->CSI_Index_list = NULL;
-          break;
-        }
-      }
-    }
-    else {
-      if (resourceType == NR_CSI_ResourceConfig__resourceType_periodic) {
-        AssertFatal(csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList != NULL,
-                    "Wrong settings! Report quantity requires CSI-RS but csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList is NULL\n");
-        for (int csi_idx = 0; csi_idx < csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.count; csi_idx++) {
-          if (csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.array[csi_idx]->nzp_CSI_ResourceSetId ==
-              *(csi_resourceconfig->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList->list.array[0])) {
-            //For periodic and semi-persistent CSI Resource Settings, the number of CSI-RS Resource Sets configured is limited to S=1 for spec 38.212
-            nb_resources = csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.array[csi_idx]->nzp_CSI_RS_Resources.list.count;
-            csi_report->CSI_Index_list = csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.array[csi_idx]->nzp_CSI_RS_Resources.list.array;
-            csi_report->SSB_Index_list = NULL;
-            break;
-          }
-        }
-      }
-      else AssertFatal(1==0,"Only periodic resource configuration currently supported\n");
-    }
-    LOG_D(NR_MAC,"nb_resources %d\n",nb_resources);
-    // computation of bit length depending on the report type
-    switch(reportQuantity_type){
-      case (NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP):
-        compute_rsrp_bitlen(csi_reportconfig, nb_resources, csi_report);
-        break;
-      case (NR_CSI_ReportConfig__reportQuantity_PR_cri_RSRP):
-        compute_rsrp_bitlen(csi_reportconfig, nb_resources, csi_report);
-        break;
-      case (NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_CQI):
-        csi_report->csi_meas_bitlen.cri_bitlen=ceil(log2(nb_resources));
-        csi_report->csi_meas_bitlen.ri_restriction = compute_ri_bitlen(csi_reportconfig, csi_report);
-        compute_cqi_bitlen(csi_reportconfig, csi_report->csi_meas_bitlen.ri_restriction, csi_report);
-        break;
-      case (NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_PMI_CQI):
-        csi_report->csi_meas_bitlen.cri_bitlen=ceil(log2(nb_resources));
-        csi_report->csi_meas_bitlen.ri_restriction = compute_ri_bitlen(csi_reportconfig, csi_report);
-        compute_cqi_bitlen(csi_reportconfig, csi_report->csi_meas_bitlen.ri_restriction, csi_report);
-        compute_pmi_bitlen(csi_reportconfig, csi_report->csi_meas_bitlen.ri_restriction, csi_report);
-        break;
-      case (NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_LI_PMI_CQI):
-        csi_report->csi_meas_bitlen.cri_bitlen=ceil(log2(nb_resources));
-        csi_report->csi_meas_bitlen.ri_restriction = compute_ri_bitlen(csi_reportconfig, csi_report);
-        compute_li_bitlen(csi_reportconfig, csi_report->csi_meas_bitlen.ri_restriction, csi_report);
-        compute_cqi_bitlen(csi_reportconfig, csi_report->csi_meas_bitlen.ri_restriction, csi_report);
-        compute_pmi_bitlen(csi_reportconfig, csi_report->csi_meas_bitlen.ri_restriction, csi_report);
-        break;
-    default:
-      AssertFatal(1==0,"Not yet supported CSI report quantity type");
+      if (O_csi > 0)
+         LOG_D(NR_MAC,"Scheduling PUCCH[%d] RX for UE %04x in %4d.%2d O_ack %d, O_sr %d, O_csi %d\n",
+               i,UE->rnti,curr_pucch->frame,curr_pucch->ul_slot,O_ack,O_sr,O_csi);
+      nr_fill_nfapi_pucch(nrmac, frameP, slotP, curr_pucch, UE);
+      memset(curr_pucch, 0, sizeof(*curr_pucch));
     }
   }
 }
 
-
-uint16_t nr_get_csi_bitlen(int Mod_idP,
-                           int UE_id,
-                           uint8_t csi_report_id) {
-
-  uint16_t csi_bitlen = 0;
-  uint16_t max_bitlen = 0;
-  NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info;
-  L1_RSRP_bitlen_t * CSI_report_bitlen = NULL;
-  CSI_Meas_bitlen_t * csi_meas_bitlen = NULL;
-
-  if (NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP==UE_info->csi_report_template[UE_id][csi_report_id].reportQuantity_type||
-      NR_CSI_ReportConfig__reportQuantity_PR_cri_RSRP==UE_info->csi_report_template[UE_id][csi_report_id].reportQuantity_type){
-    CSI_report_bitlen = &(UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen); //This might need to be moodif for Aperiodic CSI-RS measurements
-    csi_bitlen+= ((CSI_report_bitlen->cri_ssbri_bitlen * CSI_report_bitlen->nb_ssbri_cri) +
-                  CSI_report_bitlen->rsrp_bitlen +(CSI_report_bitlen->diff_rsrp_bitlen *
-                  (CSI_report_bitlen->nb_ssbri_cri -1 )));
-  } else{
-   csi_meas_bitlen = &(UE_info->csi_report_template[UE_id][csi_report_id].csi_meas_bitlen); //This might need to be moodif for Aperiodic CSI-RS measurements
-   uint16_t temp_bitlen;
-   for (int i=0; i<8; i++) {
-     temp_bitlen = (csi_meas_bitlen->cri_bitlen+
-                    csi_meas_bitlen->ri_bitlen+
-                    csi_meas_bitlen->li_bitlen[i]+
-                    csi_meas_bitlen->cqi_bitlen[i]+
-                    csi_meas_bitlen->pmi_x1_bitlen[i]+
-                    csi_meas_bitlen->pmi_x2_bitlen[i]);
-     if(temp_bitlen>max_bitlen)
-       max_bitlen = temp_bitlen;
-   }
-   csi_bitlen += max_bitlen;
- }
-
-  return csi_bitlen;
-}
-
-
 void nr_csi_meas_reporting(int Mod_idP,
                            frame_t frame,
                            sub_frame_t slot) {
@@ -702,11 +176,9 @@ void nr_csi_meas_reporting(int Mod_idP,
   NR_ServingCellConfigCommon_t *scc = RC.nrmac[Mod_idP]->common_channels->ServingCellConfigCommon;
   const int n_slots_frame = nr_slots_per_frame[*scc->ssbSubcarrierSpacing];
 
-  NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info;
-  NR_list_t *UE_list = &UE_info->list;
-  for (int UE_id = UE_list->head; UE_id >= 0; UE_id = UE_list->next[UE_id]) {
-    const NR_CellGroupConfig_t *CellGroup = UE_info->CellGroup[UE_id];
-    NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+  UE_iterator(RC.nrmac[Mod_idP]->UE_info.list, UE ) {
+    const NR_CellGroupConfig_t *CellGroup = UE->CellGroup;
+    NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
     if ((sched_ctrl->rrc_processing_timer > 0) || (sched_ctrl->ul_failure==1 && get_softmodem_params()->phy_test==0)) {
       continue;
     }
@@ -718,16 +190,15 @@ void nr_csi_meas_reporting(int Mod_idP,
     NR_PUCCH_Config_t *pucch_Config = NULL;
     if (sched_ctrl->active_ubwp) {
       pucch_Config = sched_ctrl->active_ubwp->bwp_Dedicated->pucch_Config->choice.setup;
-    } else if (RC.nrmac[Mod_idP]->UE_info.CellGroup[UE_id] &&
-             RC.nrmac[Mod_idP]->UE_info.CellGroup[UE_id]->spCellConfig &&
-             RC.nrmac[Mod_idP]->UE_info.CellGroup[UE_id]->spCellConfig->spCellConfigDedicated &&
-             RC.nrmac[Mod_idP]->UE_info.CellGroup[UE_id]->spCellConfig->spCellConfigDedicated->uplinkConfig &&
-             RC.nrmac[Mod_idP]->UE_info.CellGroup[UE_id]->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP &&
-             RC.nrmac[Mod_idP]->UE_info.CellGroup[UE_id]->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup) {
-      pucch_Config = RC.nrmac[Mod_idP]->UE_info.CellGroup[UE_id]->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup;
+    } else if (CellGroup &&
+               CellGroup->spCellConfig &&
+               CellGroup->spCellConfig->spCellConfigDedicated &&
+               CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig &&
+               CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP &&
+               CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup) {
+      pucch_Config = CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup;
     }
 
-
     for (int csi_report_id = 0; csi_report_id < csi_measconfig->csi_ReportConfigToAddModList->list.count; csi_report_id++){
       NR_CSI_ReportConfig_t *csirep = csi_measconfig->csi_ReportConfigToAddModList->list.array[csi_report_id];
 
@@ -750,7 +221,7 @@ void nr_csi_meas_reporting(int Mod_idP,
         if (*pucchresset->resourceList.list.array[res_index] == pucchcsires->pucch_Resource)
           break;
       AssertFatal(res_index < n,
-                  "CSI pucch resource %ld not found among PUCCH resources\n",pucchcsires->pucch_Resource);
+                  "CSI pucch resource %ld not found among PUCCH resources\n", pucchcsires->pucch_Resource);
 
       // find free PUCCH that is in order with possibly existing PUCCH
       // schedulings (other CSI, SR)
@@ -759,13 +230,12 @@ void nr_csi_meas_reporting(int Mod_idP,
                   && !curr_pucch->sr_flag
                   && curr_pucch->dai_c == 0,
                   "PUCCH not free at index 1 for UE %04x\n",
-                  UE_info->rnti[UE_id]);
+                  UE->rnti);
       curr_pucch->r_pucch = -1;
       curr_pucch->frame = frame;
       curr_pucch->ul_slot = sched_slot;
       curr_pucch->resource_indicator = res_index;
-      curr_pucch->csi_bits +=
-          nr_get_csi_bitlen(Mod_idP,UE_id,csi_report_id);
+      curr_pucch->csi_bits += nr_get_csi_bitlen(UE->csi_report_template, csi_report_id);
 
       const NR_SIB1_t *sib1 = RC.nrmac[Mod_idP]->common_channels[0].sib1 ? RC.nrmac[Mod_idP]->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL;
       NR_BWP_t *genericParameters = get_ul_bwp_genericParameters(sched_ctrl->active_ubwp,
@@ -817,37 +287,30 @@ void nr_csi_meas_reporting(int Mod_idP,
   }
 }
 
-__attribute__((unused))
-static void handle_dl_harq(module_id_t mod_id,
-                           int UE_id,
+static void handle_dl_harq(NR_UE_info_t * UE,
                            int8_t harq_pid,
-                           bool success)
+                           bool success,
+                           int harq_round_max)
 {
-  NR_UE_info_t *UE_info = &RC.nrmac[mod_id]->UE_info;
-  NR_UE_harq_t *harq = &UE_info->UE_sched_ctrl[UE_id].harq_processes[harq_pid];
+  NR_UE_harq_t *harq = &UE->UE_sched_ctrl.harq_processes[harq_pid];
   harq->feedback_slot = -1;
   harq->is_waiting = false;
   if (success) {
-    add_tail_nr_list(&UE_info->UE_sched_ctrl[UE_id].available_dl_harq, harq_pid);
+    add_tail_nr_list(&UE->UE_sched_ctrl.available_dl_harq, harq_pid);
     harq->round = 0;
     harq->ndi ^= 1;
-  } else if (harq->round >= RC.nrmac[mod_id]->harq_round_max - 1) {
-    add_tail_nr_list(&UE_info->UE_sched_ctrl[UE_id].available_dl_harq, harq_pid);
-    harq->round = 0;
-    harq->ndi ^= 1;
-    NR_mac_stats_t *stats = &UE_info->mac_stats[UE_id];
-    stats->dlsch_errors++;
-    LOG_D(NR_MAC, "retransmission error for UE %d (total %"PRIu64")\n", UE_id, stats->dlsch_errors);
+  } else if (harq->round >= harq_round_max - 1) {
+    abort_nr_dl_harq(UE, harq_pid);
+    LOG_D(NR_MAC, "retransmission error for UE %04x (total %"PRIu64")\n", UE->rnti, UE->mac_stats.dl.errors);
   } else {
-    LOG_D(PHY,"NACK for: pid %d, ue %x\n",harq_pid, UE_id);
-    add_tail_nr_list(&UE_info->UE_sched_ctrl[UE_id].retrans_dl_harq, harq_pid);
+    LOG_D(PHY,"NACK for: pid %d, ue %04x\n",harq_pid, UE->rnti);
+    add_tail_nr_list(&UE->UE_sched_ctrl.retrans_dl_harq, harq_pid);
     harq->round++;
   }
 }
 
-int checkTargetSSBInFirst64TCIStates_pdschConfig(int ssb_index_t, int Mod_idP, int UE_id) {
-  NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info;
-  NR_CellGroupConfig_t *CellGroup = UE_info->CellGroup[UE_id] ;
+int checkTargetSSBInFirst64TCIStates_pdschConfig(int ssb_index_t, NR_UE_info_t * UE) {
+  NR_CellGroupConfig_t *CellGroup = UE->CellGroup;
   int nb_tci_states = CellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->tci_StatesToAddModList->list.count;
   NR_TCI_State_t *tci =NULL;
   int i;
@@ -872,15 +335,13 @@ int checkTargetSSBInFirst64TCIStates_pdschConfig(int ssb_index_t, int Mod_idP, i
   return -1;
 }
 
-int checkTargetSSBInTCIStates_pdcchConfig(int ssb_index_t, int Mod_idP, int UE_id) {
-  NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info;
-  NR_CellGroupConfig_t *CellGroup = UE_info->CellGroup[UE_id] ;
+int checkTargetSSBInTCIStates_pdcchConfig(int ssb_index_t, NR_UE_info_t *UE) {
+  NR_CellGroupConfig_t *CellGroup = UE->CellGroup ;
   int nb_tci_states = CellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->tci_StatesToAddModList->list.count;
   NR_TCI_State_t *tci =NULL;
   NR_TCI_StateId_t *tci_id = NULL;
-  int bwp_id = 1;
-  NR_BWP_Downlink_t *bwp = CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[bwp_id-1];
-  NR_ControlResourceSet_t *coreset = bwp->bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList->list.array[bwp_id-1];
+  NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
+  NR_ControlResourceSet_t *coreset = sched_ctrl->coreset;
   int i;
   int flag = 0;
   int tci_stateID = -1;
@@ -934,7 +395,7 @@ int get_diff_rsrp(uint8_t index, int strongest_rsrp) {
 //identifies the target SSB Beam index
 //keeps the required date for PDCCH and PDSCH TCI state activation/deactivation CE consutruction globally
 //handles triggering of PDCCH and PDSCH MAC CEs
-void tci_handling(module_id_t Mod_idP, int UE_id, frame_t frame, slot_t slot) {
+void tci_handling(NR_UE_info_t *UE, frame_t frame, slot_t slot) {
 
   int strongest_ssb_rsrp = 0;
   int cqi_idx = 0;
@@ -946,23 +407,20 @@ void tci_handling(module_id_t Mod_idP, int UE_id, frame_t frame, slot_t slot) {
   int ssb_index[MAX_NUM_SSB] = {0};
   int ssb_rsrp[MAX_NUM_SSB] = {0};
   uint8_t idx = 0;
-  NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info;
-  NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
-  int bwp_id  = sched_ctrl->active_bwp ? 1 : 0;
-  NR_CellGroupConfig_t *CellGroup = UE_info->CellGroup[UE_id];
-  NR_BWP_Downlink_t *bwp = bwp_id>0 ? 
-                           sched_ctrl->active_bwp:
-                           NULL;
-
-                               
+
+  NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
+  const int bwp_id = sched_ctrl->active_bwp ? sched_ctrl->active_bwp->bwp_Id : 0;
+  NR_CellGroupConfig_t *CellGroup = UE->CellGroup;
+
   //bwp indicator
   int n_dl_bwp=0;
-  if (CellGroup->spCellConfig->spCellConfigDedicated &&
+  if (CellGroup->spCellConfig &&
+      CellGroup->spCellConfig->spCellConfigDedicated &&
       CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList)
-      n_dl_bwp = CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count;
+    n_dl_bwp = CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count;
 
   uint8_t nr_ssbri_cri = 0;
-  uint8_t nb_of_csi_ssb_report = UE_info->csi_report_template[UE_id][cqi_idx].nb_of_csi_ssb_report;
+  uint8_t nb_of_csi_ssb_report = UE->csi_report_template[cqi_idx].nb_of_csi_ssb_report;
   int better_rsrp_reported = -140-(-0); /*minimum_measured_RSRP_value - minimum_differntail_RSRP_value*///considering the minimum RSRP value as better RSRP initially
   uint8_t diff_rsrp_idx = 0;
   uint8_t i, j;
@@ -1033,7 +491,7 @@ void tci_handling(module_id_t Mod_idP, int UE_id, frame_t frame, slot_t slot) {
     The length of the field is 7 bits
      */
     if(sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.coresetId == 0) {
-      int tci_state_id = checkTargetSSBInFirst64TCIStates_pdschConfig(ssb_index[target_ssb_beam_index], Mod_idP, UE_id);
+      int tci_state_id = checkTargetSSBInFirst64TCIStates_pdschConfig(ssb_index[target_ssb_beam_index], UE);
 
       if( tci_state_id != -1)
         sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.tciStateId = tci_state_id;
@@ -1043,7 +501,7 @@ void tci_handling(module_id_t Mod_idP, int UE_id, frame_t frame, slot_t slot) {
         int flag = 0;
 
         for(i =0; ssb_index_sorted[i]!=0; i++) {
-          tci_state_id = checkTargetSSBInFirst64TCIStates_pdschConfig(ssb_index_sorted[i], Mod_idP, UE_id) ;
+          tci_state_id = checkTargetSSBInFirst64TCIStates_pdschConfig(ssb_index_sorted[i],UE) ;
 
           if(tci_state_id != -1 && ssb_rsrp_sorted[i] > ssb_rsrp[curr_ssb_beam_index] && ssb_rsrp_sorted[i] - ssb_rsrp[curr_ssb_beam_index] > L1_RSRP_HYSTERIS) {
             sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.tciStateId = tci_state_id;
@@ -1057,7 +515,7 @@ void tci_handling(module_id_t Mod_idP, int UE_id, frame_t frame, slot_t slot) {
         }
       }
     } else {
-      int tci_state_id = checkTargetSSBInTCIStates_pdcchConfig(ssb_index[target_ssb_beam_index], Mod_idP, UE_id);
+      int tci_state_id = checkTargetSSBInTCIStates_pdcchConfig(ssb_index[target_ssb_beam_index], UE);
 
       if (tci_state_id !=-1)
         sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.tciStateId = tci_state_id;
@@ -1067,7 +525,7 @@ void tci_handling(module_id_t Mod_idP, int UE_id, frame_t frame, slot_t slot) {
         int flag = 0;
 
         for(i =0; ssb_index_sorted[i]!=0; i++) {
-          tci_state_id = checkTargetSSBInTCIStates_pdcchConfig(ssb_index_sorted[i], Mod_idP, UE_id);
+          tci_state_id = checkTargetSSBInTCIStates_pdcchConfig(ssb_index_sorted[i], UE);
 
           if( tci_state_id != -1 && ssb_rsrp_sorted[i] > ssb_rsrp[curr_ssb_beam_index] && ssb_rsrp_sorted[i] - ssb_rsrp[curr_ssb_beam_index] > L1_RSRP_HYSTERIS) {
             sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.tciStateId = tci_state_id;
@@ -1082,10 +540,8 @@ void tci_handling(module_id_t Mod_idP, int UE_id, frame_t frame, slot_t slot) {
       }
     }
 
-    sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.tci_present_inDCI = bwp ? 
-                                                                   bwp->bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList->list.array[bwp_id-1]->tci_PresentInDCI :
-                                                                   CellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdcch_Config->choice.setup->controlResourceSetToAddModList->list.array[0]->tci_PresentInDCI;
-
+    sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.tci_present_inDCI = sched_ctrl->coreset ?
+                                                                   sched_ctrl->coreset->tci_PresentInDCI : NULL;
 
     //filling pdsch tci state activation deactivation mac ce structure fields
     if(sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.tci_present_inDCI) {
@@ -1130,15 +586,14 @@ uint8_t pickandreverse_bits(uint8_t *payload, uint16_t bitlen, uint8_t start_bit
 }
 
 
-void evaluate_rsrp_report(NR_UE_info_t *UE_info,
+void evaluate_rsrp_report(NR_UE_info_t *UE,
                           NR_UE_sched_ctrl_t *sched_ctrl,
-                          int UE_id,
                           uint8_t csi_report_id,
                           uint8_t *payload,
                           int *cumul_bits,
                           NR_CSI_ReportConfig__reportQuantity_PR reportQuantity_type){
 
-  nr_csi_report_t *csi_report = &UE_info->csi_report_template[UE_id][csi_report_id];
+  nr_csi_report_t *csi_report = &UE->csi_report_template[csi_report_id];
   uint8_t cri_ssbri_bitlen = csi_report->CSI_report_bitlen.cri_ssbri_bitlen;
   uint16_t curr_payload;
 
@@ -1190,13 +645,12 @@ void evaluate_rsrp_report(NR_UE_info_t *UE_info,
   }
   csi_report->nb_of_csi_ssb_report++;
   int strongest_ssb_rsrp = get_measured_rsrp(sched_ctrl->CSI_report.ssb_cri_report.RSRP);
-  NR_mac_stats_t *stats = &UE_info->mac_stats[UE_id];
+  NR_mac_stats_t *stats = &UE->mac_stats;
   // including ssb rsrp in mac stats
   stats->cumul_rsrp += strongest_ssb_rsrp;
   stats->num_rsrp_meas++;
 }
 
-
 void evaluate_cri_report(uint8_t *payload,
                          uint8_t cri_bitlen,
                          int cumul_bits,
@@ -1254,7 +708,12 @@ void evaluate_cqi_report(uint8_t *payload,
     sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.wb_cqi_2tb = temp_cqi;
     LOG_D(MAC,"Wide-band CQI for the second TB %d\n", temp_cqi);
   }
-  sched_ctrl->set_mcs = TRUE;
+
+  // TODO for wideband case and multiple TB
+  const int cqi_idx = sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.wb_cqi_1tb;
+  const int mcs_table = sched_ctrl->pdsch_semi_static.mcsTableIdx;
+  const int cqi_table = sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.cqi_table;
+  sched_ctrl->dl_max_mcs = get_mcs_from_cqi(mcs_table, cqi_table, cqi_idx);
 }
 
 
@@ -1277,6 +736,7 @@ uint8_t evaluate_pmi_report(uint8_t *payload,
         sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.pmi_x1,
         sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.pmi_x2);
 
+  sched_ctrl->set_pmi = true;
   return tot_bitlen;
 
 }
@@ -1322,22 +782,19 @@ void extract_pucch_csi_report(NR_CSI_MeasConfig_t *csi_MeasConfig,
                               const nfapi_nr_uci_pucch_pdu_format_2_3_4_t *uci_pdu,
                               frame_t frame,
                               slot_t slot,
-                              int UE_id,
-                              module_id_t Mod_idP) {
-
+                              NR_UE_info_t *UE,
+                              NR_ServingCellConfigCommon_t *scc)
+{
   /** From Table 6.3.1.1.2-3: RI, LI, CQI, and CRI of codebookType=typeI-SinglePanel */
-  NR_ServingCellConfigCommon_t *scc =
-      RC.nrmac[Mod_idP]->common_channels->ServingCellConfigCommon;
   const int n_slots_frame = nr_slots_per_frame[*scc->ssbSubcarrierSpacing];
   uint8_t *payload = uci_pdu->csi_part1.csi_part1_payload;
   uint16_t bitlen = uci_pdu->csi_part1.csi_part1_bit_len;
   NR_CSI_ReportConfig__reportQuantity_PR reportQuantity_type = NR_CSI_ReportConfig__reportQuantity_PR_NOTHING;
-  NR_UE_info_t *UE_info = &(RC.nrmac[Mod_idP]->UE_info);
-  NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+  NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
   int cumul_bits = 0;
   int r_index = -1;
   for (int csi_report_id = 0; csi_report_id < csi_MeasConfig->csi_ReportConfigToAddModList->list.count; csi_report_id++ ) {
-    nr_csi_report_t *csi_report = &UE_info->csi_report_template[UE_id][csi_report_id];
+    nr_csi_report_t *csi_report = &UE->csi_report_template[csi_report_id];
     csi_report->nb_of_csi_ssb_report = 0;
     uint8_t cri_bitlen = 0;
     uint8_t ri_bitlen = 0;
@@ -1352,10 +809,10 @@ void extract_pucch_csi_report(NR_CSI_MeasConfig_t *csi_MeasConfig,
       LOG_D(MAC,"SFN/SF:%d/%d reportQuantity type = %d\n",frame,slot,reportQuantity_type);
       switch(reportQuantity_type){
         case NR_CSI_ReportConfig__reportQuantity_PR_cri_RSRP:
-          evaluate_rsrp_report(UE_info,sched_ctrl,UE_id,csi_report_id,payload,&cumul_bits,reportQuantity_type);
+          evaluate_rsrp_report(UE,sched_ctrl,csi_report_id,payload,&cumul_bits,reportQuantity_type);
           break;
         case NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP:
-          evaluate_rsrp_report(UE_info,sched_ctrl,UE_id,csi_report_id,payload,&cumul_bits,reportQuantity_type);
+          evaluate_rsrp_report(UE,sched_ctrl,csi_report_id,payload,&cumul_bits,reportQuantity_type);
           break;
         case NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_CQI:
           cri_bitlen = csi_report->csi_meas_bitlen.cri_bitlen;
@@ -1382,6 +839,7 @@ void extract_pucch_csi_report(NR_CSI_MeasConfig_t *csi_MeasConfig,
           if (r_index != -1)
             skip_zero_padding(&cumul_bits,csi_report,r_index,bitlen);
           pmi_bitlen = evaluate_pmi_report(payload,csi_report,cumul_bits,r_index,sched_ctrl);
+          sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.csi_report_id = csi_report_id;
           cumul_bits += pmi_bitlen;
           evaluate_cqi_report(payload,csi_report,cumul_bits,r_index,sched_ctrl,csirep->cqi_Table);
           break;
@@ -1399,6 +857,7 @@ void extract_pucch_csi_report(NR_CSI_MeasConfig_t *csi_MeasConfig,
           if (r_index != -1)
             skip_zero_padding(&cumul_bits,csi_report,r_index,bitlen);
           pmi_bitlen = evaluate_pmi_report(payload,csi_report,cumul_bits,r_index,sched_ctrl);
+          sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.csi_report_id = csi_report_id;
           cumul_bits += pmi_bitlen;
           evaluate_cqi_report(payload,csi_report,cumul_bits,r_index,sched_ctrl,csirep->cqi_Table);
           break;
@@ -1409,7 +868,7 @@ void extract_pucch_csi_report(NR_CSI_MeasConfig_t *csi_MeasConfig,
   }
 }
 
-static NR_UE_harq_t *find_harq(module_id_t mod_id, frame_t frame, sub_frame_t slot, int UE_id)
+static NR_UE_harq_t *find_harq(frame_t frame, sub_frame_t slot, NR_UE_info_t * UE, int harq_round_max)
 {
   /* In case of realtime problems: we can only identify a HARQ process by
    * timing. If the HARQ process's feedback_frame/feedback_slot is not the one we
@@ -1417,7 +876,7 @@ static NR_UE_harq_t *find_harq(module_id_t mod_id, frame_t frame, sub_frame_t sl
    * skip this HARQ process, which is what happens in the loop below.
    * Similarly, we might be "in advance", in which case we need to skip
    * this result. */
-  NR_UE_sched_ctrl_t *sched_ctrl = &RC.nrmac[mod_id]->UE_info.UE_sched_ctrl[UE_id];
+  NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
   int8_t pid = sched_ctrl->feedback_dl_harq.head;
   if (pid < 0)
     return NULL;
@@ -1433,7 +892,7 @@ static NR_UE_harq_t *find_harq(module_id_t mod_id, frame_t frame, sub_frame_t sl
           frame,
           slot);
     remove_front_nr_list(&sched_ctrl->feedback_dl_harq);
-    handle_dl_harq(mod_id, UE_id, pid, 0);
+    handle_dl_harq(UE, pid, 0, harq_round_max);
     pid = sched_ctrl->feedback_dl_harq.head;
     if (pid < 0)
       return NULL;
@@ -1458,20 +917,19 @@ void handle_nr_uci_pucch_0_1(module_id_t mod_id,
                              sub_frame_t slot,
                              const nfapi_nr_uci_pucch_pdu_format_0_1_t *uci_01)
 {
-  int UE_id = find_nr_UE_id(mod_id, uci_01->rnti);
-  if (UE_id < 0) {
+  NR_UE_info_t * UE = find_nr_UE(&RC.nrmac[mod_id]->UE_info, uci_01->rnti);
+  if (!UE) {
     LOG_E(NR_MAC, "%s(): unknown RNTI %04x in PUCCH UCI\n", __func__, uci_01->rnti);
     return;
   }
-  NR_UE_info_t *UE_info = &RC.nrmac[mod_id]->UE_info;
-  NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+  NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
 
   if (((uci_01->pduBitmap >> 1) & 0x01)) {
     // iterate over received harq bits
     for (int harq_bit = 0; harq_bit < uci_01->harq->num_harq; harq_bit++) {
       const uint8_t harq_value = uci_01->harq->harq_list[harq_bit].harq_value;
       const uint8_t harq_confidence = uci_01->harq->harq_confidence_level;
-      NR_UE_harq_t *harq = find_harq(mod_id, frame, slot, UE_id);
+      NR_UE_harq_t *harq = find_harq(frame, slot, UE, RC.nrmac[mod_id]->dl_bler.harq_round_max);
       if (!harq) {
         LOG_E(NR_MAC, "Oh no! Could not find a harq in %s!\n", __FUNCTION__);
         break;
@@ -1480,8 +938,8 @@ void handle_nr_uci_pucch_0_1(module_id_t mod_id,
       const int8_t pid = sched_ctrl->feedback_dl_harq.head;
       remove_front_nr_list(&sched_ctrl->feedback_dl_harq);
       LOG_D(NR_MAC,"%4d.%2d bit %d pid %d ack/nack %d\n",frame, slot, harq_bit,pid,harq_value);
-      handle_dl_harq(mod_id, UE_id, pid, harq_value == 0 && harq_confidence == 0);
-      if (harq_confidence == 1)  UE_info->mac_stats[UE_id].pucch0_DTX++;
+      handle_dl_harq(UE, pid, harq_value == 0 && harq_confidence == 0, RC.nrmac[mod_id]->dl_bler.harq_round_max);
+      if (harq_confidence == 1)  UE->mac_stats.pucch0_DTX++;
     }
   }
 
@@ -1506,19 +964,21 @@ void handle_nr_uci_pucch_2_3_4(module_id_t mod_id,
                                sub_frame_t slot,
                                const nfapi_nr_uci_pucch_pdu_format_2_3_4_t *uci_234)
 {
-  int UE_id = find_nr_UE_id(mod_id, uci_234->rnti);
-  if (UE_id < 0) {
+  NR_UE_info_t * UE = find_nr_UE(&RC.nrmac[mod_id]->UE_info, uci_234->rnti);
+  if (!UE) {
     LOG_E(NR_MAC, "%s(): unknown RNTI %04x in PUCCH UCI\n", __func__, uci_234->rnti);
     return;
   }
-  AssertFatal(RC.nrmac[mod_id]->UE_info.CellGroup[UE_id],"Cellgroup is null for UE %d/%x\n",UE_id,uci_234->rnti);
-  AssertFatal(RC.nrmac[mod_id]->UE_info.CellGroup[UE_id]->spCellConfig, "Cellgroup->spCellConfig is null for UE %d/%x\n",UE_id,uci_234->rnti);
-  AssertFatal(RC.nrmac[mod_id]->UE_info.CellGroup[UE_id]->spCellConfig->spCellConfigDedicated, "Cellgroup->spCellConfig->spCellConfigDedicated is null for UE %d/%x\n",UE_id,uci_234->rnti);
-  if ( RC.nrmac[mod_id]->UE_info.CellGroup[UE_id]->spCellConfig->spCellConfigDedicated->csi_MeasConfig==NULL) return;
+  AssertFatal(UE->CellGroup,"Cellgroup is null for UE %04x\n", uci_234->rnti);
+  AssertFatal(UE->CellGroup->spCellConfig,
+             "Cellgroup->spCellConfig is null for UE %04x\n", uci_234->rnti);
+  AssertFatal(UE->CellGroup->spCellConfig->spCellConfigDedicated,
+              "Cellgroup->spCellConfig->spCellConfigDedicated is null for UE %04x\n", uci_234->rnti);
+  if ( UE->CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig==NULL)
+    return;
 
-  NR_CSI_MeasConfig_t *csi_MeasConfig = RC.nrmac[mod_id]->UE_info.CellGroup[UE_id]->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup;
-  NR_UE_info_t *UE_info = &RC.nrmac[mod_id]->UE_info;
-  NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+  NR_CSI_MeasConfig_t *csi_MeasConfig = UE->CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup;
+  NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
 
   // tpc (power control)
   // TODO PUCCH2 SNR computation is not correct -> ignore the following
@@ -1531,20 +991,20 @@ void handle_nr_uci_pucch_2_3_4(module_id_t mod_id,
     // iterate over received harq bits
     for (int harq_bit = 0; harq_bit < uci_234->harq.harq_bit_len; harq_bit++) {
       const int acknack = ((uci_234->harq.harq_payload[harq_bit >> 3]) >> harq_bit) & 0x01;
-      NR_UE_harq_t *harq = find_harq(mod_id, frame, slot, UE_id);
+      NR_UE_harq_t *harq = find_harq(frame, slot, UE, RC.nrmac[mod_id]->dl_bler.harq_round_max);
       if (!harq)
         break;
       DevAssert(harq->is_waiting);
       const int8_t pid = sched_ctrl->feedback_dl_harq.head;
       remove_front_nr_list(&sched_ctrl->feedback_dl_harq);
-      handle_dl_harq(mod_id, UE_id, pid, uci_234->harq.harq_crc != 1 && acknack);
+      handle_dl_harq(UE, pid, uci_234->harq.harq_crc != 1 && acknack, RC.nrmac[mod_id]->dl_bler.harq_round_max);
     }
   }
   if ((uci_234->pduBitmap >> 2) & 0x01) {
     //API to parse the csi report and store it into sched_ctrl
-    extract_pucch_csi_report(csi_MeasConfig, uci_234, frame, slot, UE_id, mod_id);
+    extract_pucch_csi_report(csi_MeasConfig, uci_234, frame, slot, UE, RC.nrmac[mod_id]->common_channels->ServingCellConfigCommon);
     //TCI handling function
-    tci_handling(mod_id, UE_id,frame, slot);
+    tci_handling(UE,frame, slot);
   }
   if ((uci_234->pduBitmap >> 3) & 0x01) {
     //@TODO:Handle CSI Report 2
@@ -1606,18 +1066,16 @@ bool test_acknack_vrb_occupation(NR_UE_sched_ctrl_t *sched_ctrl,
   return true;
 }
 
-
 // this function returns an index to NR_sched_pucch structure
 // currently this structure contains PUCCH0 at index 0 and PUCCH2 at index 1
 // if the function returns -1 it was not possible to schedule acknack
 // when current pucch is ready to be scheduled nr_fill_nfapi_pucch is called
 int nr_acknack_scheduling(int mod_id,
-                          int UE_id,
+                          NR_UE_info_t *UE,
                           frame_t frame,
                           sub_frame_t slot,
                           int r_pucch,
                           int is_common) {
-
   const int CC_id = 0;
   const int minfbtime = RC.nrmac[mod_id]->minRXTXTIMEpdsch;
   const NR_ServingCellConfigCommon_t *scc = RC.nrmac[mod_id]->common_channels[CC_id].ServingCellConfigCommon;
@@ -1635,8 +1093,8 @@ int nr_acknack_scheduling(int mod_id,
    * * SR uses format 0 and is allocated in the first UL (mixed) slot (and not
    *   later)
    * * each UE has dedicated PUCCH Format 0 resources, and we use index 0! */
-  NR_UE_sched_ctrl_t *sched_ctrl = &RC.nrmac[mod_id]->UE_info.UE_sched_ctrl[UE_id];
-  NR_CellGroupConfig_t *cg = RC.nrmac[mod_id]->UE_info.CellGroup[UE_id];
+  NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
+  NR_CellGroupConfig_t *cg = UE->CellGroup;
 
   NR_PUCCH_Config_t *pucch_Config = NULL;
   if (sched_ctrl->active_ubwp) {
@@ -1671,11 +1129,13 @@ int nr_acknack_scheduling(int mod_id,
     const int f = pucch->frame;
     const int s = pucch->ul_slot;
     LOG_D(NR_MAC, "In %s: %4d.%2d DAI = 2 pucch currently in %4d.%2d, advancing by 1 slot\n", __FUNCTION__, frame, slot, f, s);
-    if (!(csi_pucch 
-        && csi_pucch->csi_bits > 0
-        && csi_pucch->frame == f
-        && csi_pucch->ul_slot == s)) 
-      nr_fill_nfapi_pucch(mod_id, frame, slot, pucch, UE_id);
+
+    if (!(csi_pucch
+          && csi_pucch->csi_bits > 0
+          && csi_pucch->frame == f
+          && csi_pucch->ul_slot == s))
+      nr_fill_nfapi_pucch(RC.nrmac[mod_id], frame, slot, pucch, UE);
+
     memset(pucch, 0, sizeof(*pucch));
     pucch->frame = s == n_slots_frame - 1 ? (f + 1) % 1024 : f;
     if(((s + 1)%nr_slots_period) == 0)
@@ -1686,13 +1146,14 @@ int nr_acknack_scheduling(int mod_id,
     // skip the CSI PUCCH if it is present and if in the next frame/slot
     // and if we don't multiplex
     csi_pucch->r_pucch=-1;
-    if (csi_pucch 
+    if (csi_pucch
         && csi_pucch->csi_bits > 0
         && csi_pucch->frame == pucch->frame
         && csi_pucch->ul_slot == pucch->ul_slot
         && !csi_pucch->simultaneous_harqcsi) {
       LOG_D(NR_MAC,"Cannot multiplex csi_pucch for %d.%d\n",csi_pucch->frame,csi_pucch->ul_slot);
-      nr_fill_nfapi_pucch(mod_id, frame, slot, csi_pucch, UE_id);
+      nr_fill_nfapi_pucch(RC.nrmac[mod_id], frame, slot, csi_pucch, UE);
+
       memset(csi_pucch, 0, sizeof(*csi_pucch));
       pucch->frame = pucch->ul_slot == n_slots_frame - 1 ? (pucch->frame + 1) % 1024 : pucch->frame;
       if(((pucch->ul_slot + 1)%nr_slots_period) == 0)
@@ -1716,11 +1177,10 @@ int nr_acknack_scheduling(int mod_id,
 
   NR_SearchSpace__searchSpaceType_PR ss_type = (is_common==0 && (sched_ctrl->active_bwp || ubwpd)) ? NR_SearchSpace__searchSpaceType_PR_ue_Specific: NR_SearchSpace__searchSpaceType_PR_common;
   uint8_t pdsch_to_harq_feedback[8];
-  int bwp_Id = 0;
-  if (sched_ctrl->active_ubwp) bwp_Id = sched_ctrl->active_ubwp->bwp_Id;
+  const int bwp_id = sched_ctrl->active_bwp ? sched_ctrl->active_bwp->bwp_Id : 0;
 
   int max_fb_time = 0;
-  get_pdsch_to_harq_feedback(mod_id, UE_id, bwp_Id, ss_type, &max_fb_time, pdsch_to_harq_feedback);
+  get_pdsch_to_harq_feedback(UE, bwp_id, ss_type, &max_fb_time, pdsch_to_harq_feedback);
 
   LOG_D(NR_MAC, "In %s: 1b. DL %4d.%2d, UL_ACK %4d.%2d, DAI_C %d\n", __FUNCTION__, frame,slot,pucch->frame,pucch->ul_slot,pucch->dai_c);
   /* there is a HARQ. Check whether we can use it for this ACKNACK */
@@ -1747,14 +1207,14 @@ int nr_acknack_scheduling(int mod_id,
           csi_pucch->csi_bits > 0 &&
           csi_pucch->frame == f &&
           csi_pucch->ul_slot == s))
-        nr_fill_nfapi_pucch(mod_id, frame, slot, pucch, UE_id);
+        nr_fill_nfapi_pucch(RC.nrmac[mod_id], frame, slot, pucch, UE);
       memset(pucch, 0, sizeof(*pucch));
       pucch->frame = s == n_slots_frame - 1 ? (f + 1) % 1024 : f;
       if(((s + 1)%nr_slots_period) == 0)
         pucch->ul_slot = (s + 1 + first_ul_slot_period) % n_slots_frame;
       else
         pucch->ul_slot = (s + 1) % n_slots_frame;
-      return nr_acknack_scheduling(mod_id, UE_id, frame, slot, r_pucch,is_common);
+      return nr_acknack_scheduling(mod_id, UE, frame, slot, r_pucch,is_common);
     }
 
     pucch->timing_indicator = i;
@@ -1780,8 +1240,8 @@ int nr_acknack_scheduling(int mod_id,
       ((pucch->frame*n_slots_frame + pucch->ul_slot) <
       (frame*n_slots_frame + slot))) {
     AssertFatal(pucch->sr_flag + pucch->dai_c == 0,
-                "expected no SR/AckNack for UE %d in %4d.%2d, but has %d/%d for %4d.%2d\n",
-                UE_id, frame, slot, pucch->sr_flag, pucch->dai_c, pucch->frame, pucch->ul_slot);
+                "expected no SR/AckNack for UE %04x in %4d.%2d, but has %d/%d for %4d.%2d\n",
+                UE->rnti, frame, slot, pucch->sr_flag, pucch->dai_c, pucch->frame, pucch->ul_slot);
     const int s = next_ul_slot;
     pucch->frame = s < n_slots_frame ? frame : (frame + 1) % 1024;
     pucch->ul_slot = s % n_slots_frame;
@@ -1831,11 +1291,11 @@ int nr_acknack_scheduling(int mod_id,
   }
   if (ind_found==-1) {
     LOG_D(NR_MAC,
-          "%4d.%2d could not find pdsch_to_harq_feedback for UE %d: earliest "
+          "%4d.%2d could not find pdsch_to_harq_feedback for UE %04x: earliest "
           "ack slot %d\n",
           frame,
           slot,
-          UE_id,
+          UE->rnti,
           pucch->ul_slot);
     return -1;
   }
@@ -1850,7 +1310,7 @@ int nr_acknack_scheduling(int mod_id,
     if(!csi_pucch->simultaneous_harqcsi
        || ((csi_pucch->csi_bits + csi_pucch->dai_c) >= 11)) {
       LOG_D(NR_MAC,"Cannot multiplex csi_pucch %d +csi_pucch->dai_c %d for %d.%d\n",csi_pucch->csi_bits,csi_pucch->dai_c,csi_pucch->frame,csi_pucch->ul_slot);
-      nr_fill_nfapi_pucch(mod_id, frame, slot, csi_pucch, UE_id);
+      nr_fill_nfapi_pucch(RC.nrmac[mod_id], frame, slot, csi_pucch, UE);
       memset(csi_pucch, 0, sizeof(*csi_pucch));
       /* advance the UL slot information in PUCCH by one so we won't schedule in
        * the same slot again */
@@ -1862,7 +1322,7 @@ int nr_acknack_scheduling(int mod_id,
         pucch->ul_slot = (s + 1 + first_ul_slot_period) % n_slots_frame;
       else
         pucch->ul_slot = (s + 1) % n_slots_frame;
-      return nr_acknack_scheduling(mod_id, UE_id, frame, slot, r_pucch,is_common);
+      return nr_acknack_scheduling(mod_id, UE, frame, slot, r_pucch,is_common);
     }
     // multiplexing harq and csi in a pucch
     else {
@@ -1899,31 +1359,27 @@ int nr_acknack_scheduling(int mod_id,
 }
 
 
-void nr_sr_reporting(int Mod_idP, frame_t SFN, sub_frame_t slot)
+void nr_sr_reporting(gNB_MAC_INST *nrmac, frame_t SFN, sub_frame_t slot)
 {
-  gNB_MAC_INST *nrmac = RC.nrmac[Mod_idP];
   if (!is_xlsch_in_slot(nrmac->ulsch_slot_bitmap[slot / 64], slot))
     return;
   NR_ServingCellConfigCommon_t *scc = nrmac->common_channels->ServingCellConfigCommon;
   const int n_slots_frame = nr_slots_per_frame[*scc->ssbSubcarrierSpacing];
-  NR_UE_info_t *UE_info = &nrmac->UE_info;
-  NR_list_t *UE_list = &UE_info->list;
-  for (int UE_id = UE_list->head; UE_id >= 0; UE_id = UE_list->next[UE_id]) {
-    NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+  UE_iterator(nrmac->UE_info.list, UE) {
+    NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
 
-    if (sched_ctrl->ul_failure==1) continue;
+    if (sched_ctrl->ul_failure==1 || sched_ctrl->rrc_processing_timer>0) continue;
     NR_PUCCH_Config_t *pucch_Config = NULL;
     if (sched_ctrl->active_ubwp) {
       pucch_Config = sched_ctrl->active_ubwp->bwp_Dedicated->pucch_Config->choice.setup;
-    } else if (RC.nrmac[Mod_idP]->UE_info.CellGroup[UE_id] &&
-             RC.nrmac[Mod_idP]->UE_info.CellGroup[UE_id]->spCellConfig &&
-             RC.nrmac[Mod_idP]->UE_info.CellGroup[UE_id]->spCellConfig->spCellConfigDedicated &&
-             RC.nrmac[Mod_idP]->UE_info.CellGroup[UE_id]->spCellConfig->spCellConfigDedicated->uplinkConfig &&
-             RC.nrmac[Mod_idP]->UE_info.CellGroup[UE_id]->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP &&
-             RC.nrmac[Mod_idP]->UE_info.CellGroup[UE_id]->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup) {
-      pucch_Config = RC.nrmac[Mod_idP]->UE_info.CellGroup[UE_id]->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup;
+    } else if (UE->CellGroup &&
+             UE->CellGroup->spCellConfig &&
+             UE->CellGroup->spCellConfig->spCellConfigDedicated &&
+             UE->CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig &&
+             UE->CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP &&
+             UE->CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup) {
+      pucch_Config = UE->CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup;
     }
-
     else continue;
     if (!pucch_Config->schedulingRequestResourceToAddModList) 
         continue;
@@ -1968,7 +1424,7 @@ void nr_sr_reporting(int Mod_idP, frame_t SFN, sub_frame_t slot)
           continue;
         nfapi_nr_pucch_pdu_t *pdu = &ul_tti_req->pdus_list[i].pucch_pdu;
         /* check that it is our PUCCH F0. Assuming there can be only one */
-        if (pdu->rnti == UE_info->rnti[UE_id]
+        if (pdu->rnti == UE->rnti
             && pdu->format_type == 0 // does not use NR_PUCCH_Resource__format_PR_format0
             && pdu->initial_cyclic_shift == pucch_res->format.choice.format0->initialCyclicShift
             && pdu->nr_of_symbols == pucch_res->format.choice.format0->nrofSymbols
@@ -1977,8 +1433,7 @@ void nr_sr_reporting(int Mod_idP, frame_t SFN, sub_frame_t slot)
           pdu->sr_flag = 1;
           nfapi_allocated = true;
           break;
-        }
-        else if (pdu->rnti == UE_info->rnti[UE_id]
+        } else if (pdu->rnti == UE->rnti
             && pdu->format_type == 2 // does not use NR_PUCCH_Resource__format_PR_format0
             && pdu->nr_of_symbols == pucch_res->format.choice.format2->nrofSymbols
             && pdu->start_symbol_index == pucch_res->format.choice.format2->startingSymbolIndex) {
@@ -1986,9 +1441,7 @@ void nr_sr_reporting(int Mod_idP, frame_t SFN, sub_frame_t slot)
           pdu->sr_flag = 1;
           nfapi_allocated = true;
           break;
-
-        }
-        else if (pdu->rnti == UE_info->rnti[UE_id]
+        } else if (pdu->rnti == UE->rnti
             && pdu->format_type == 1 // does not use NR_PUCCH_Resource__format_PR_format0
             && pdu->nr_of_symbols == pucch_res->format.choice.format1->nrofSymbols
             && pdu->start_symbol_index == pucch_res->format.choice.format1->startingSymbolIndex) {
@@ -1996,9 +1449,7 @@ void nr_sr_reporting(int Mod_idP, frame_t SFN, sub_frame_t slot)
           pdu->sr_flag = 1;
           nfapi_allocated = true;
           break;
-
-        }
-        else if (pdu->rnti == UE_info->rnti[UE_id]
+        } else if (pdu->rnti == UE->rnti
             && pdu->format_type == 3 // does not use NR_PUCCH_Resource__format_PR_format0
             && pdu->nr_of_symbols == pucch_res->format.choice.format3->nrofSymbols
             && pdu->start_symbol_index == pucch_res->format.choice.format3->startingSymbolIndex) {
@@ -2006,9 +1457,7 @@ void nr_sr_reporting(int Mod_idP, frame_t SFN, sub_frame_t slot)
           pdu->sr_flag = 1;
           nfapi_allocated = true;
           break;
-
-        }
-        else if (pdu->rnti == UE_info->rnti[UE_id]
+        } else if (pdu->rnti == UE->rnti
             && pdu->format_type == 4 // does not use NR_PUCCH_Resource__format_PR_format0
             && pdu->nr_of_symbols == pucch_res->format.choice.format4->nrofSymbols
             && pdu->start_symbol_index == pucch_res->format.choice.format4->startingSymbolIndex) {
@@ -2016,7 +1465,6 @@ void nr_sr_reporting(int Mod_idP, frame_t SFN, sub_frame_t slot)
           pdu->sr_flag = 1;
           nfapi_allocated = true;
           break;
-
         }
       }
 
@@ -2040,7 +1488,7 @@ void nr_sr_reporting(int Mod_idP, frame_t SFN, sub_frame_t slot)
           .resource_indicator = found,
           .r_pucch = -1
         };
-        nr_fill_nfapi_pucch(Mod_idP, SFN, slot, &sched_sr, UE_id);
+        nr_fill_nfapi_pucch(nrmac, SFN, slot, &sched_sr, UE);
       }
     }
   }
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
index 8831a69f0c5de3a32aec393eead5146a15a3e156..a6e20a7e4d9c5ddb1cfa1ef2c812d7d459f46a53 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
@@ -36,6 +36,9 @@
 #include <openair2/UTIL/OPT/opt.h>
 
 #include "LAYER2/NR_MAC_COMMON/nr_mac_extern.h"
+extern void process_CellGroup(NR_CellGroupConfig_t *CellGroup, NR_UE_sched_ctrl_t *sched_ctrl);
+
+//#define SRS_IND_DEBUG
 
 int get_dci_format(NR_UE_sched_ctrl_t *sched_ctrl) {
 
@@ -46,138 +49,18 @@ int get_dci_format(NR_UE_sched_ctrl_t *sched_ctrl) {
   return(dci_format);
 }
 
-void calculate_preferred_ul_tda(module_id_t module_id, const NR_BWP_Uplink_t *ubwp)
-{
-  gNB_MAC_INST *nrmac = RC.nrmac[module_id];
-  const int bwp_id = ubwp->bwp_Id;
-  if (nrmac->preferred_ul_tda[bwp_id])
-    return;
+const int get_ul_tda(const gNB_MAC_INST *nrmac, const NR_ServingCellConfigCommon_t *scc, int slot) {
 
   /* there is a mixed slot only when in TDD */
-  NR_ServingCellConfigCommon_t *scc = nrmac->common_channels->ServingCellConfigCommon;
-  frame_type_t frame_type = nrmac->common_channels->frame_type;
-  const int n = nr_slots_per_frame[*scc->ssbSubcarrierSpacing];
-
-  NR_ServingCellConfigCommonSIB_t *scc_sib1 = get_softmodem_params()->sa ?
-      RC.nrmac[module_id]->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1->servingCellConfigCommon : NULL;
-
-  AssertFatal(scc!=NULL || scc_sib1!=NULL,"We need one serving cell config common\n");
-
-  const int mu = scc ? scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.subcarrierSpacing :
-                 scc_sib1->uplinkConfigCommon->initialUplinkBWP.genericParameters.subcarrierSpacing;
-
-  NR_TDD_UL_DL_Pattern_t *tdd = NULL;
-  if (scc && scc->tdd_UL_DL_ConfigurationCommon) {
-    tdd = &scc->tdd_UL_DL_ConfigurationCommon->pattern1;
-  } else if (scc_sib1 && scc_sib1->tdd_UL_DL_ConfigurationCommon) {
-    tdd = &scc_sib1->tdd_UL_DL_ConfigurationCommon->pattern1;
-  }
-
-  /* Uplink symbols are at the end of the slot */
-  int symb_ulMixed = 0;
-  int nr_mix_slots = 0;
-  int nr_slots_period = n;
-  if (tdd) {
-    symb_ulMixed = ((1 << tdd->nrofUplinkSymbols) - 1) << (14 - tdd->nrofUplinkSymbols);
-    nr_mix_slots = tdd->nrofDownlinkSymbols != 0 || tdd->nrofUplinkSymbols != 0;
-    nr_slots_period /= get_nb_periods_per_frame(tdd->dl_UL_TransmissionPeriodicity);
-  }
-  else
-    // if TDD configuration is not present and the band is not FDD, it means it is a dynamic TDD configuration
-    AssertFatal(nrmac->common_channels->frame_type == FDD,"Dynamic TDD not handled yet\n");
-
-  const struct NR_PUCCH_Config__resourceToAddModList *resList = ubwp->bwp_Dedicated->pucch_Config->choice.setup->resourceToAddModList;
-  // for the moment, just block any symbol that might hold a PUCCH, regardless
-  // of the RB. This is a big simplification, as most RBs will NOT have a PUCCH
-  // in the respective symbols, but it simplifies scheduling
-  uint16_t symb_pucch = 0;
-  for (int i = 0; i < resList->list.count; ++i) {
-    const NR_PUCCH_Resource_t *resource = resList->list.array[i];
-    int nrofSymbols = 0;
-    int startingSymbolIndex = 0;
-    switch (resource->format.present) {
-      case NR_PUCCH_Resource__format_PR_format0:
-        nrofSymbols = resource->format.choice.format0->nrofSymbols;
-        startingSymbolIndex = resource->format.choice.format0->startingSymbolIndex;
-        break;
-      case NR_PUCCH_Resource__format_PR_format1:
-        nrofSymbols = resource->format.choice.format1->nrofSymbols;
-        startingSymbolIndex = resource->format.choice.format1->startingSymbolIndex;
-        break;
-      case NR_PUCCH_Resource__format_PR_format2:
-        nrofSymbols = resource->format.choice.format2->nrofSymbols;
-        startingSymbolIndex = resource->format.choice.format2->startingSymbolIndex;
-        break;
-      case NR_PUCCH_Resource__format_PR_format3:
-        nrofSymbols = resource->format.choice.format3->nrofSymbols;
-        startingSymbolIndex = resource->format.choice.format3->startingSymbolIndex;
-        break;
-      case NR_PUCCH_Resource__format_PR_format4:
-        nrofSymbols = resource->format.choice.format4->nrofSymbols;
-        startingSymbolIndex = resource->format.choice.format4->startingSymbolIndex;
-        break;
-      default:
-        AssertFatal(0, "found NR_PUCCH format index %d\n", resource->format.present);
-        break;
-    }
-    symb_pucch |= ((1 << nrofSymbols) - 1) << startingSymbolIndex;
-  }
-
-  /* check that TDA index 1 fits into UL slot and does not overlap with PUCCH */
-  const struct NR_PUSCH_TimeDomainResourceAllocationList *tdaList = ubwp->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
-  const NR_PUSCH_TimeDomainResourceAllocation_t *tdaP_UL = tdaList->list.array[0];
-  const int k2 = get_K2(scc, scc_sib1, (NR_BWP_Uplink_t*)ubwp,0, mu);
-  int start, len;
-  SLIV2SL(tdaP_UL->startSymbolAndLength, &start, &len);
-  const uint16_t symb_tda = ((1 << len) - 1) << start;
-  // check whether PUCCH and TDA overlap: then, we cannot use it. Note that
-  // here we assume that the PUCCH is scheduled in every slot, and on all RBs
-  // (which is mostly not true, this is a simplification)
-  AssertFatal((symb_pucch & symb_tda) == 0, "TDA index 0 for UL overlaps with PUCCH\n");
-
-  // get largest time domain allocation (TDA) for UL slot and UL in mixed slot
-  int tdaMi = -1;
-  if (nr_mix_slots>0) {
-    const NR_PUSCH_TimeDomainResourceAllocation_t *tdaP_Mi = tdaList->list.array[1];
-    AssertFatal(k2 == get_K2(scc, scc_sib1, (NR_BWP_Uplink_t*)ubwp, 1, mu),
-                "scheduler cannot handle different k2 for UL slot (%d) and UL Mixed slot (%ld)\n",
-                k2,
-                get_K2(scc, scc_sib1, (NR_BWP_Uplink_t*)ubwp, 1, mu));
-    SLIV2SL(tdaP_Mi->startSymbolAndLength, &start, &len);
-    const uint16_t symb_tda_mi = ((1 << len) - 1) << start;
-    // check whether PUCCH and TDA overlap: then, we cannot use it. Also, check
-    // whether TDA is entirely within mixed slot, UL. Note that here we assume
-    // that the PUCCH is scheduled in every slot, and on all RBs (which is
-    // mostly not true, this is a simplification)
-    if ((symb_pucch & symb_tda_mi) == 0 && (symb_ulMixed & symb_tda_mi) == symb_tda_mi) {
-      tdaMi = 1;
-    } else {
-      LOG_E(NR_MAC,
-            "TDA index 1 UL overlaps with PUCCH or is not entirely in mixed slot (symb_pucch %x symb_ulMixed %x symb_tda_mi %x), won't schedule UL mixed slot\n",
-            symb_pucch,
-            symb_ulMixed,
-            symb_tda_mi);
-    }
-  }
-
-  nrmac->preferred_ul_tda[bwp_id] = malloc(n * sizeof(*nrmac->preferred_ul_tda[bwp_id]));
-
-  for (int slot = 0; slot < n; ++slot) {
-    const int sched_slot = (slot + k2) % n;
-    nrmac->preferred_ul_tda[bwp_id][slot] = -1;
-    if (frame_type == FDD || sched_slot % nr_slots_period >= tdd->nrofDownlinkSlots + nr_mix_slots)
-      nrmac->preferred_ul_tda[bwp_id][slot] = 0;
-    else if (nr_mix_slots && sched_slot % nr_slots_period == tdd->nrofDownlinkSlots)
-      nrmac->preferred_ul_tda[bwp_id][slot] = tdaMi;
-    LOG_D(MAC, "DL slot %d UL slot %d preferred_ul_tda %d\n", slot, sched_slot, nrmac->preferred_ul_tda[bwp_id][slot]);
-  }
+  const NR_TDD_UL_DL_Pattern_t *tdd = scc->tdd_UL_DL_ConfigurationCommon ? &scc->tdd_UL_DL_ConfigurationCommon->pattern1 : NULL;
+  AssertFatal(tdd || nrmac->common_channels->frame_type == FDD, "Dynamic TDD not handled yet\n");
 
-  if (tdd && k2 < tdd->nrofUplinkSlots) {
-    LOG_W(NR_MAC,
-          "k2 %d < tdd->nrofUplinkSlots %ld: not all UL slots can be scheduled\n",
-          k2,
-          tdd->nrofUplinkSlots);
+  if (tdd && tdd->nrofUplinkSymbols > 1) { // if there is uplink symbols in mixed slot
+    const int nr_slots_period = tdd->nrofDownlinkSlots + tdd->nrofUplinkSlots + 1;
+    if ((slot%nr_slots_period) == tdd->nrofDownlinkSlots)
+      return 1;
   }
+  return 0; // if FDD or not mixed slot in TDD, for now use default TDA (TODO handle CSI-RS slots)
 }
 
 //  For both UL-SCH except:
@@ -204,8 +87,8 @@ void calculate_preferred_ul_tda(module_id_t module_id, const NR_BWP_Uplink_t *ub
 //  F: length of L is 0:8 or 1:16 bits wide
 //  R: Reserved bit, set to zero.
 
-int nr_process_mac_pdu(module_id_t module_idP,
-                        int UE_id,
+int nr_process_mac_pdu( instance_t module_idP,
+			NR_UE_info_t* UE,
                         uint8_t CC_id,
                         frame_t frameP,
                         sub_frame_t slot,
@@ -216,11 +99,10 @@ int nr_process_mac_pdu(module_id_t module_idP,
 
     uint8_t done = 0;
 
-    NR_UE_info_t *UE_info = &RC.nrmac[module_idP]->UE_info;
-    NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+    NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
 
     if ( pduP[0] != UL_SCH_LCID_PADDING )
-      trace_NRpdu(DIRECTION_UPLINK, pduP, pdu_len, UE_id, WS_C_RNTI, UE_info->rnti[UE_id], frameP, 0, 0, 0);
+      trace_NRpdu(DIRECTION_UPLINK, pduP, pdu_len, WS_C_RNTI, UE->rnti, frameP, 0, 0, 0);
 
     #ifdef ENABLE_MAC_PAYLOAD_DEBUG
     LOG_I(NR_MAC, "In %s: dumping MAC PDU in %d.%d:\n", __func__, frameP, slot);
@@ -317,7 +199,7 @@ int nr_process_mac_pdu(module_id_t module_idP,
 
           for (int i = 0; i < NR_NB_RA_PROC_MAX; i++) {
             NR_RA_t *ra = &RC.nrmac[module_idP]->common_channels[CC_id].ra[i];
-            if (ra->state >= WAIT_Msg3 && ra->rnti == UE_info->rnti[UE_id]) {
+            if (ra->state >= WAIT_Msg3 && ra->rnti == UE->rnti) {
               ra->crnti = ((pduP[1]&0xFF)<<8)|(pduP[2]&0xFF);
               ra->msg3_dcch_dtch = true;
               LOG_I(NR_MAC, "Received UL_SCH_LCID_C_RNTI with C-RNTI 0x%04x\n", ra->crnti);
@@ -378,22 +260,23 @@ int nr_process_mac_pdu(module_id_t module_idP,
 	  if (!get_mac_len(pduP, pdu_len, &mac_len, &mac_subheader_len))
 	    return 0;
 
-          rnti_t crnti = UE_info->rnti[UE_id];
-          int UE_idx = UE_id;
+          rnti_t crnti = UE->rnti;
+	  NR_UE_info_t* UE_idx = UE;
           for (int i = 0; i < NR_NB_RA_PROC_MAX; i++) {
             NR_RA_t *ra = &RC.nrmac[module_idP]->common_channels[CC_id].ra[i];
-            if (ra->state >= WAIT_Msg3 && ra->rnti == UE_info->rnti[UE_id]) {
+            if (ra->state >= WAIT_Msg3 && ra->rnti == UE->rnti) {
               uint8_t *next_subpduP = pduP + mac_subheader_len + mac_len;
               if ((pduP[mac_subheader_len+mac_len] & 0x3F) == UL_SCH_LCID_C_RNTI) {
                 crnti = ((next_subpduP[1]&0xFF)<<8)|(next_subpduP[2]&0xFF);
-                UE_idx = find_nr_UE_id(module_idP, crnti);
+		LOG_W(NR_MAC, " UL_SCH_LCID_SRB for rnti %04x\n", crnti);
+                UE_idx = find_nr_UE(&RC.nrmac[module_idP]->UE_info, crnti);
                 break;
               }
             }
           }
 
-          if (UE_info->CellGroup[UE_idx]) {
-            LOG_D(NR_MAC, "[UE %d] Frame %d : ULSCH -> UL-DCCH %d (gNB %d, %d bytes), rnti: 0x%04x \n", module_idP, frameP, rx_lcid, module_idP, mac_len, crnti);
+          if (UE_idx->CellGroup) {
+            LOG_D(NR_MAC, "Frame %d : ULSCH -> UL-DCCH %d (gNB %ld, %d bytes), rnti: 0x%04x \n", frameP, rx_lcid, module_idP, mac_len, crnti);
             mac_rlc_data_ind(module_idP,
                              crnti,
                              module_idP,
@@ -406,7 +289,7 @@ int nr_process_mac_pdu(module_id_t module_idP,
                              1,
                              NULL);
           } else {
-            AssertFatal(1==0,"[UE %d] Frame/Slot %d.%d : Received LCID %d which is not configured, dropping packet\n",UE_id,frameP,slot,rx_lcid);
+            AssertFatal(1==0,"[UE %04x] Frame/Slot %d.%d : Received LCID %d which is not configured, dropping packet\n",UE->rnti,frameP,slot,rx_lcid);
           }
           break;
         case UL_SCH_LCID_SRB3:
@@ -444,46 +327,50 @@ int nr_process_mac_pdu(module_id_t module_idP,
                               frameP,
                               0,
                               0,
-                              UE_info->rnti[UE_id],
+                              UE->rnti,
                               CCCH,
                               pduP + mac_subheader_len,
                               mac_len,
                               0);
           break;
 
-        case UL_SCH_LCID_DTCH:
+        case UL_SCH_LCID_DTCH ... (UL_SCH_LCID_DTCH + 28):
           //  check if LCID is valid at current time.
-	  if (!get_mac_len(pduP, pdu_len, &mac_len, &mac_subheader_len))
-	    return 0;
+          if (!get_mac_len(pduP, pdu_len, &mac_len, &mac_subheader_len)) {
+            return 0;
+          }
 
-          LOG_D(NR_MAC, "[UE %x] %d.%d: ULSCH -> UL-%s %d (gNB %d, %d bytes)\n",
-                UE_info->rnti[UE_id],
-                frameP,
-                slot,
-                rx_lcid<4?"DCCH":"DTCH",
-                rx_lcid,
-                module_idP,
-                mac_len);
-          UE_info->mac_stats[UE_id].lc_bytes_rx[rx_lcid] += mac_len;
-
-          mac_rlc_data_ind(module_idP,
-                           UE_info->rnti[UE_id],
-                           module_idP,
-                           frameP,
-                           ENB_FLAG_YES,
-                           MBMS_FLAG_NO,
-                           rx_lcid,
-                           (char *)(pduP + mac_subheader_len),
-                           mac_len,
-                           1,
-                           NULL);
-
-          /* Updated estimated buffer when receiving data */
-          if (sched_ctrl->estimated_ul_buffer >= mac_len)
-            sched_ctrl->estimated_ul_buffer -= mac_len;
-          else
-            sched_ctrl->estimated_ul_buffer = 0;
-          break;
+
+            LOG_D(NR_MAC, "[UE %04x] %d.%d : ULSCH -> UL-%s %d (gNB %ld, %d bytes)\n",
+                  UE->rnti,
+                  frameP,
+                  slot,
+                  rx_lcid<4?"DCCH":"DTCH",
+                  rx_lcid,
+                  module_idP,
+                  mac_len);
+            UE->mac_stats.ul.lc_bytes[rx_lcid] += mac_len;
+
+            mac_rlc_data_ind(module_idP,
+                             UE->rnti,
+                             module_idP,
+                             frameP,
+                             ENB_FLAG_YES,
+                             MBMS_FLAG_NO,
+                             rx_lcid,
+                             (char *)(pduP + mac_subheader_len),
+                             mac_len,
+                             1,
+                             NULL);
+
+            /* Updated estimated buffer when receiving data */
+            if (sched_ctrl->estimated_ul_buffer >= mac_len) {
+              sched_ctrl->estimated_ul_buffer -= mac_len;
+            } else {
+              sched_ctrl->estimated_ul_buffer = 0;
+            }
+
+            break;
 
         default:
           LOG_E(NR_MAC, "Received unknown MAC header (LCID = 0x%02x)\n", rx_lcid);
@@ -518,15 +405,14 @@ int nr_process_mac_pdu(module_id_t module_idP,
   return 0;
 }
 
-void abort_nr_ul_harq(module_id_t mod_id, int UE_id, int8_t harq_pid)
+void abort_nr_ul_harq(NR_UE_info_t *UE, int8_t harq_pid)
 {
-  NR_UE_info_t *UE_info = &RC.nrmac[mod_id]->UE_info;
-  NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+  NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
   NR_UE_ul_harq_t *harq = &sched_ctrl->ul_harq_processes[harq_pid];
 
   harq->ndi ^= 1;
   harq->round = 0;
-  UE_info->mac_stats[UE_id].ulsch_errors++;
+  UE->mac_stats.ul.errors++;
   add_tail_nr_list(&sched_ctrl->available_ul_harq, harq_pid);
 
   /* the transmission failed: the UE won't send the data we expected initially,
@@ -542,11 +428,11 @@ void handle_nr_ul_harq(const int CC_idP,
                        sub_frame_t slot,
                        const nfapi_nr_crc_t *crc_pdu)
 {
-  gNB_MAC_INST *gNB_mac = RC.nrmac[mod_id];
-  int UE_id = find_nr_UE_id(mod_id, crc_pdu->rnti);
-  if (UE_id < 0) {
+  NR_UE_info_t* UE = find_nr_UE(&RC.nrmac[mod_id]->UE_info, crc_pdu->rnti);
+  if (!UE) {
+    LOG_W(NR_MAC, "handle harq for rnti %04x, in RA process\n", crc_pdu->rnti);
     for (int i = 0; i < NR_NB_RA_PROC_MAX; ++i) {
-      NR_RA_t *ra = &gNB_mac->common_channels[CC_idP].ra[i];
+      NR_RA_t *ra = &RC.nrmac[mod_id]->common_channels[CC_idP].ra[i];
       if (ra->state >= WAIT_Msg3 &&
           ra->rnti == crc_pdu->rnti)
         return;
@@ -554,8 +440,7 @@ void handle_nr_ul_harq(const int CC_idP,
     LOG_E(NR_MAC, "%s(): unknown RNTI 0x%04x in PUSCH\n", __func__, crc_pdu->rnti);
     return;
   }
-  NR_UE_info_t *UE_info = &RC.nrmac[mod_id]->UE_info;
-  NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+  NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
   int8_t harq_pid = sched_ctrl->feedback_ul_harq.head;
   LOG_D(NR_MAC, "Comparing crc_pdu->harq_id vs feedback harq_pid = %d %d\n",crc_pdu->harq_id, harq_pid);
   while (crc_pdu->harq_id != harq_pid || harq_pid < 0) {
@@ -569,8 +454,9 @@ void handle_nr_ul_harq(const int CC_idP,
 
     remove_front_nr_list(&sched_ctrl->feedback_ul_harq);
     sched_ctrl->ul_harq_processes[harq_pid].is_waiting = false;
-    if(sched_ctrl->ul_harq_processes[harq_pid].round >= gNB_mac->harq_round_max - 1) {
-      abort_nr_ul_harq(mod_id, UE_id, harq_pid);
+
+    if(sched_ctrl->ul_harq_processes[harq_pid].round >= RC.nrmac[mod_id]->ul_bler.harq_round_max - 1) {
+      abort_nr_ul_harq(UE, harq_pid);
     } else {
       sched_ctrl->ul_harq_processes[harq_pid].round++;
       add_tail_nr_list(&sched_ctrl->retrans_ul_harq, harq_pid);
@@ -590,8 +476,8 @@ void handle_nr_ul_harq(const int CC_idP,
           harq_pid,
           crc_pdu->rnti);
     add_tail_nr_list(&sched_ctrl->available_ul_harq, harq_pid);
-  } else if (harq->round >= gNB_mac->harq_round_max - 1) {
-    abort_nr_ul_harq(mod_id, UE_id, harq_pid);
+  } else if (harq->round >= RC.nrmac[mod_id]->ul_bler.harq_round_max  - 1) {
+    abort_nr_ul_harq(UE, harq_pid);
     LOG_D(NR_MAC,
           "RNTI %04x: Ulharq id %d crc failed in all rounds\n",
           crc_pdu->rnti,
@@ -621,15 +507,15 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
                const uint16_t rssi){
 
   gNB_MAC_INST *gNB_mac = RC.nrmac[gnb_mod_idP];
-  NR_UE_info_t *UE_info = &gNB_mac->UE_info;
 
   const int current_rnti = rntiP;
-  const int UE_id = find_nr_UE_id(gnb_mod_idP, current_rnti);
+  LOG_D(NR_MAC, "rx_sdu for rnti %04x\n", current_rnti);
   const int target_snrx10 = gNB_mac->pusch_target_snrx10;
   const int pusch_failure_thres = gNB_mac->pusch_failure_thres;
-
-  if (UE_id != -1) {
-    NR_UE_sched_ctrl_t *UE_scheduling_control = &UE_info->UE_sched_ctrl[UE_id];
+  
+  NR_UE_info_t* UE = find_nr_UE(&gNB_mac->UE_info, current_rnti);
+  if (UE) {
+    NR_UE_sched_ctrl_t *UE_scheduling_control = &UE->UE_sched_ctrl;
     const int8_t harq_pid = UE_scheduling_control->feedback_ul_harq.head;
 
     if (sduP)
@@ -637,15 +523,14 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
         T_INT(rntiP), T_INT(frameP), T_INT(slotP), T_INT(harq_pid),
         T_BUFFER(sduP, sdu_lenP));
 
-    UE_info->mac_stats[UE_id].ulsch_total_bytes_rx += sdu_lenP;
-    LOG_D(NR_MAC, "[gNB %d][PUSCH %d] CC_id %d %d.%d Received ULSCH sdu from PHY (rnti %x, UE_id %d) ul_cqi %d TA %d sduP %p, rssi %d\n",
+    UE->mac_stats.ul.total_bytes += sdu_lenP;
+    LOG_D(NR_MAC, "[gNB %d][PUSCH %d] CC_id %d %d.%d Received ULSCH sdu from PHY (rnti %04x) ul_cqi %d TA %d sduP %p, rssi %d\n",
           gnb_mod_idP,
           harq_pid,
           CC_idP,
           frameP,
           slotP,
           current_rnti,
-          UE_id,
           ul_cqi,
           timing_advance,
           sduP,
@@ -658,10 +543,11 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
         UE_scheduling_control->ta_update = timing_advance;
       UE_scheduling_control->raw_rssi = rssi;
       UE_scheduling_control->pusch_snrx10 = ul_cqi * 5 - 640;
-      LOG_D(NR_MAC, "[UE %d] PUSCH TPC %d(SNRx10 %d) and TA %d\n",UE_id,UE_scheduling_control->tpc0,UE_scheduling_control->pusch_snrx10,UE_scheduling_control->ta_update);
+
+      LOG_D(NR_MAC, "[UE %04x] PUSCH TPC %d and TA %d\n",UE->rnti,UE_scheduling_control->tpc0,UE_scheduling_control->ta_update);
     }
     else{
-      LOG_D(NR_MAC,"[UE %d] Detected DTX : increasing UE TX power\n",UE_id);
+      LOG_D(NR_MAC,"[UE %04x] Detected DTX : increasing UE TX power\n",UE->rnti);
       UE_scheduling_control->tpc0 = 1;
     }
 
@@ -680,13 +566,13 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
     if (sduP != NULL){
       LOG_D(NR_MAC, "Received PDU at MAC gNB \n");
 
-      UE_info->UE_sched_ctrl[UE_id].pusch_consecutive_dtx_cnt = 0;
+      UE->UE_sched_ctrl.pusch_consecutive_dtx_cnt = 0;
       const uint32_t tb_size = UE_scheduling_control->ul_harq_processes[harq_pid].sched_pusch.tb_size;
       UE_scheduling_control->sched_ul_bytes -= tb_size;
       if (UE_scheduling_control->sched_ul_bytes < 0)
         UE_scheduling_control->sched_ul_bytes = 0;
 
-      nr_process_mac_pdu(gnb_mod_idP, UE_id, CC_idP, frameP, slotP, sduP, sdu_lenP);
+      nr_process_mac_pdu(gnb_mod_idP, UE, CC_idP, frameP, slotP, sduP, sdu_lenP);
     }
     else {
       NR_UE_ul_harq_t *cur_harq = &UE_scheduling_control->ul_harq_processes[harq_pid];
@@ -698,13 +584,15 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
           UE_scheduling_control->sched_ul_bytes = 0;
       }
       if (ul_cqi <= 128) {
-        UE_info->UE_sched_ctrl[UE_id].pusch_consecutive_dtx_cnt++;
-        UE_info->mac_stats[UE_id].ulsch_DTX++;
+        UE->UE_sched_ctrl.pusch_consecutive_dtx_cnt++;
+        UE->mac_stats.ulsch_DTX++;
       }
-      if (!get_softmodem_params()->phy_test && UE_info->UE_sched_ctrl[UE_id].pusch_consecutive_dtx_cnt >= pusch_failure_thres) {
-         LOG_W(NR_MAC,"%d.%d Detected UL Failure on PUSCH after %d PUSCH DTX, stopping scheduling\n",
-               frameP,slotP,UE_info->UE_sched_ctrl[UE_id].pusch_consecutive_dtx_cnt);
-         UE_info->UE_sched_ctrl[UE_id].ul_failure = 1;
+
+      if (!get_softmodem_params()->phy_test && UE->UE_sched_ctrl.pusch_consecutive_dtx_cnt >= pusch_failure_thres) {
+         LOG_W(NR_MAC,"Detected UL Failure on PUSCH after %d PUSCH DTX, stopping scheduling\n",
+               UE->UE_sched_ctrl.pusch_consecutive_dtx_cnt);
+         UE->UE_sched_ctrl.ul_failure = 1;
+
          nr_mac_gNB_rrc_ul_failure(gnb_mod_idP,CC_idP,frameP,slotP,rntiP);
       }
     }
@@ -725,7 +613,7 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
     T(T_GNB_MAC_UL_PDU_WITH_DATA, T_INT(gnb_mod_idP), T_INT(CC_idP),
       T_INT(rntiP), T_INT(frameP), T_INT(slotP), T_INT(-1) /* harq_pid */,
       T_BUFFER(sduP, sdu_lenP));
-
+    
     /* we don't know this UE (yet). Check whether there is a ongoing RA (Msg 3)
      * and check the corresponding UE's RNTI match, in which case we activate
      * it. */
@@ -733,7 +621,7 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
       NR_RA_t *ra = &gNB_mac->common_channels[CC_idP].ra[i];
       if (ra->state != WAIT_Msg3)
         continue;
-
+      
       if(no_sig) {
         LOG_D(NR_MAC, "Random Access %i failed at state %i (no signal)\n", i, ra->state);
         nr_mac_remove_ra_rnti(gnb_mod_idP, ra->rnti);
@@ -756,20 +644,20 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
           continue;
         }
 
-        int UE_id=-1;
 
-        UE_id = add_new_nr_ue(gnb_mod_idP, ra->rnti, ra->CellGroup);
-        if (UE_id<0) {
-          LOG_D(NR_MAC, "Random Access %i discarded at state %i (TC_RNTI %04x RNTI %04x): max number of users achieved!\n", i, ra->state,ra->rnti,current_rnti);
+	NR_UE_info_t* UE = add_new_nr_ue(gNB_mac, ra->rnti, ra->CellGroup);
+        if (!UE) {
+          LOG_W(NR_MAC, "Random Access %i discarded at state %i (TC_RNTI %04x RNTI %04x): max number of users achieved!\n", i, ra->state,ra->rnti,current_rnti);
+
           nr_mac_remove_ra_rnti(gnb_mod_idP, ra->rnti);
           nr_clear_ra_proc(gnb_mod_idP, CC_idP, frameP, ra);
           return;
         }
 
-        UE_info->UE_beam_index[UE_id] = ra->beam_id;
+        UE->UE_beam_index = ra->beam_id;
 
         // re-initialize ta update variables after RA procedure completion
-        UE_info->UE_sched_ctrl[UE_id].ta_frame = frameP;
+        UE->UE_sched_ctrl.ta_frame = frameP;
 
         LOG_D(NR_MAC,
               "reset RA state information for RA-RNTI 0x%04x/index %d\n",
@@ -778,27 +666,24 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
 
         LOG_I(NR_MAC,
               "[gNB %d][RAPROC] PUSCH with TC_RNTI 0x%04x received correctly, "
-              "adding UE MAC Context UE_id %d/RNTI 0x%04x\n",
+              "adding UE MAC Context RNTI 0x%04x\n",
               gnb_mod_idP,
               current_rnti,
-              UE_id,
               ra->rnti);
 
-      NR_UE_sched_ctrl_t *UE_scheduling_control = &UE_info->UE_sched_ctrl[UE_id];
+      NR_UE_sched_ctrl_t *UE_scheduling_control = &UE->UE_sched_ctrl;
 
       UE_scheduling_control->tpc0 = nr_get_tpc(target_snrx10,ul_cqi,30);
       if (timing_advance != 0xffff)
         UE_scheduling_control->ta_update = timing_advance;
       UE_scheduling_control->raw_rssi = rssi;
       UE_scheduling_control->pusch_snrx10 = ul_cqi * 5 - 640;
-      LOG_D(NR_MAC, "[UE %d] PUSCH TPC %d and TA %d\n",UE_id,UE_scheduling_control->tpc0,UE_scheduling_control->ta_update);
+      LOG_D(NR_MAC, "[UE %04x] PUSCH TPC %d and TA %d\n",UE->rnti,UE_scheduling_control->tpc0,UE_scheduling_control->ta_update);
         if(ra->cfra) {
 
-          LOG_A(NR_MAC, "(ue %i, rnti 0x%04x) CFRA procedure succeeded!\n", UE_id, ra->rnti);
+          LOG_A(NR_MAC, "(rnti 0x%04x) CFRA procedure succeeded!\n", ra->rnti);
           nr_mac_remove_ra_rnti(gnb_mod_idP, ra->rnti);
           nr_clear_ra_proc(gnb_mod_idP, CC_idP, frameP, ra);
-          UE_info->active[UE_id] = true;
-
           process_CellGroup(ra->CellGroup, UE_scheduling_control);
 
         } else {
@@ -814,26 +699,28 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
           // First byte corresponds to R/LCID MAC sub-header
           memcpy(ra->cont_res_id, &sduP[1], sizeof(uint8_t) * 6);
 
-          if (nr_process_mac_pdu(gnb_mod_idP, UE_id, CC_idP, frameP, slotP, sduP, sdu_lenP) == 0) {
+          if (nr_process_mac_pdu(gnb_mod_idP, UE, CC_idP, frameP, slotP, sduP, sdu_lenP) == 0) {
             ra->state = Msg4;
             ra->Msg4_frame = (frameP + 2) % 1024;
             ra->Msg4_slot = 1;
             
             if (ra->msg3_dcch_dtch) {
               // Check if the UE identified by C-RNTI still exists at the gNB
-              int UE_id_C = find_nr_UE_id(gnb_mod_idP, ra->crnti);
-              if (UE_id_C < 0) {
+              NR_UE_info_t * UE_C = find_nr_UE(&gNB_mac->UE_info, ra->crnti);
+              if (!UE_C) {
                 // The UE identified by C-RNTI no longer exists at the gNB
                 // Let's abort the current RA, so the UE will trigger a new RA later but using RRCSetupRequest instead. A better solution may be implemented
-                mac_remove_nr_ue(gnb_mod_idP, ra->rnti);
+                mac_remove_nr_ue(gNB_mac, ra->rnti);
                 nr_clear_ra_proc(gnb_mod_idP, CC_idP, frameP, ra);
                 return;
               } else {
                 // The UE identified by C-RNTI still exists at the gNB
-                // Reset uplink failure flags/counters/timers at MAC and at RRC so gNB will resume again scheduling resources for this UE
-                UE_info->UE_sched_ctrl[UE_id_C].pusch_consecutive_dtx_cnt = 0;
-                UE_info->UE_sched_ctrl[UE_id_C].ul_failure = 0;
+                // Reset uplink failure flags/counters/timers at RRC
                 nr_mac_gNB_rrc_ul_failure_reset(gnb_mod_idP, frameP, slotP, ra->crnti);
+
+                // Reset HARQ processes
+                reset_dl_harq_list(&UE_C->UE_sched_ctrl);
+                reset_ul_harq_list(&UE_C->UE_sched_ctrl);
               }
             }
             LOG_I(NR_MAC, "Scheduling RA-Msg4 for TC_RNTI 0x%04x (state %d, frame %d, slot %d)\n",
@@ -864,20 +751,71 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
         return;
       }
 
-      if (ra->msg3_round >= MAX_HARQ_ROUNDS - 1) {
-        LOG_D(NR_MAC, "Random Access %i failed at state %i (Reached msg3 max harq rounds)\n", i, ra->state);
+      if (ra->msg3_round >= gNB_mac->ul_bler.harq_round_max - 1) {
+        LOG_W(NR_MAC, "Random Access %i failed at state %i (Reached msg3 max harq rounds)\n", i, ra->state);
         nr_mac_remove_ra_rnti(gnb_mod_idP, ra->rnti);
         nr_clear_ra_proc(gnb_mod_idP, CC_idP, frameP, ra);
         return;
       }
 
       LOG_D(NR_MAC, "Random Access %i Msg3 CRC did not pass)\n", i);
+
       ra->msg3_round++;
       ra->state = Msg3_retransmission;
     }
   }
 }
 
+void handle_nr_srs_measurements(const module_id_t module_id,
+                                const frame_t frame,
+                                const sub_frame_t slot,
+                                const rnti_t rnti,
+                                const uint16_t timing_advance,
+                                const uint8_t num_symbols,
+                                const uint8_t wide_band_snr,
+                                const uint8_t num_reported_symbols,
+                                nfapi_nr_srs_indication_reported_symbol_t* reported_symbol_list) {
+
+  LOG_D(NR_MAC, "(%d.%d) Received SRS indication for rnti: 0x%04x\n", frame, slot, rnti);
+
+#ifdef SRS_IND_DEBUG
+  LOG_I(NR_MAC, "frame = %i\n", frame);
+  LOG_I(NR_MAC, "slot = %i\n", slot);
+  LOG_I(NR_MAC, "rnti = 0x%04x\n", rnti);
+  LOG_I(NR_MAC, "timing_advance = %i\n", timing_advance);
+  LOG_I(NR_MAC, "num_symbols = %i\n", num_symbols);
+  LOG_I(NR_MAC, "wide_band_snr = %i (%i dB)\n", wide_band_snr, (wide_band_snr>>1)-64);
+  LOG_I(NR_MAC, "num_reported_symbols = %i\n", num_reported_symbols);
+  LOG_I(NR_MAC, "reported_symbol_list[0].num_rbs = %i\n", reported_symbol_list[0].num_rbs);
+  for(int rb = 0; rb < reported_symbol_list[0].num_rbs; rb++) {
+    LOG_I(NR_MAC, "reported_symbol_list[0].rb_list[%3i].rb_snr = %i (%i dB)\n",
+          rb, reported_symbol_list[0].rb_list[rb].rb_snr, (reported_symbol_list[0].rb_list[rb].rb_snr>>1)-64);
+  }
+#endif
+
+  NR_UE_info_t *UE = find_nr_UE(&RC.nrmac[module_id]->UE_info, rnti);
+  if (!UE) {
+    LOG_W(NR_MAC, "Could not find UE for RNTI 0x%04x\n", rnti);
+    return;
+  }
+
+  gNB_MAC_INST *nr_mac = RC.nrmac[module_id];
+  NR_mac_stats_t *stats = &UE->mac_stats;
+  stats->srs_wide_band_snr = (wide_band_snr>>1)-64;
+
+  const int ul_prbblack_SNR_threshold = nr_mac->ul_prbblack_SNR_threshold;
+  uint16_t *ulprbbl = nr_mac->ulprbbl;
+
+  memset(ulprbbl, 0, reported_symbol_list[0].num_rbs*sizeof(uint16_t));
+  for (int rb = 0; rb < reported_symbol_list[0].num_rbs; rb++) {
+    int snr = (reported_symbol_list[0].rb_list[rb].rb_snr>>1)-64;
+    if (snr < ul_prbblack_SNR_threshold) {
+      ulprbbl[rb] = 0x3FFF; // all symbols taken
+    }
+    LOG_D(NR_MAC, "ulprbbl[%3i] = 0x%x\n", rb, ulprbbl[rb]);
+  }
+}
+
 long get_K2(NR_ServingCellConfigCommon_t *scc,
             NR_ServingCellConfigCommonSIB_t *scc_sib1,
             NR_BWP_Uplink_t *ubwp,
@@ -903,37 +841,35 @@ long get_K2(NR_ServingCellConfigCommon_t *scc,
     return 3;
 }
 
-bool nr_UE_is_to_be_scheduled(module_id_t mod_id, int CC_id, int UE_id, frame_t frame, sub_frame_t slot)
+static bool nr_UE_is_to_be_scheduled(const NR_ServingCellConfigCommon_t *scc,
+			      int CC_id,  NR_UE_info_t* UE, frame_t frame, sub_frame_t slot, uint32_t ulsch_max_frame_inactivity)
 {
-  const NR_ServingCellConfigCommon_t *scc = RC.nrmac[mod_id]->common_channels->ServingCellConfigCommon;
   const int n = nr_slots_per_frame[*scc->ssbSubcarrierSpacing];
   const int now = frame * n + slot;
 
-  const struct gNB_MAC_INST_s *nrmac = RC.nrmac[mod_id];
-  const NR_UE_sched_ctrl_t *sched_ctrl = &nrmac->UE_info.UE_sched_ctrl[UE_id];
+  const NR_UE_sched_ctrl_t *sched_ctrl =&UE->UE_sched_ctrl;
 
   const NR_TDD_UL_DL_Pattern_t *tdd =
       scc->tdd_UL_DL_ConfigurationCommon ? &scc->tdd_UL_DL_ConfigurationCommon->pattern1 : NULL;
   int num_slots_per_period;
-  int last_ul_slot,last_ul_sched;
+  int last_ul_slot;
   int tdd_period_len[8] = {500,625,1000,1250,2000,2500,5000,10000};
   if (tdd) { // Force the default transmission in a full slot as early as possible in the UL portion of TDD period (last_ul_slot)
     num_slots_per_period = n*tdd_period_len[tdd->dl_UL_TransmissionPeriodicity]/10000;
     last_ul_slot=1+tdd->nrofDownlinkSlots;
-  }
-  else {
+  } else {
     num_slots_per_period = n;
-    last_ul_slot = sched_ctrl->last_ul_slot; 
+    last_ul_slot = sched_ctrl->last_ul_slot;
   }
 
-  last_ul_sched = sched_ctrl->last_ul_frame * n + last_ul_slot;
+  const int last_ul_sched = sched_ctrl->last_ul_frame * n + last_ul_slot;
   const int diff = (now - last_ul_sched + 1024 * n) % (1024 * n);
   /* UE is to be scheduled if
    * (1) we think the UE has more bytes awaiting than what we scheduled
    * (2) there is a scheduling request
    * (3) or we did not schedule it in more than 10 frames */
   const bool has_data = sched_ctrl->estimated_ul_buffer > sched_ctrl->sched_ul_bytes;
-  const bool high_inactivity = diff >= (nrmac->ulsch_max_frame_inactivity>0 ? (nrmac->ulsch_max_frame_inactivity * n) : num_slots_per_period);
+  const bool high_inactivity = diff >= (ulsch_max_frame_inactivity > 0 ? ulsch_max_frame_inactivity * n : num_slots_per_period);
   LOG_D(NR_MAC,
         "%4d.%2d UL inactivity %d slots has_data %d SR %d\n",
         frame,
@@ -944,43 +880,34 @@ bool nr_UE_is_to_be_scheduled(module_id_t mod_id, int CC_id, int UE_id, frame_t
   return has_data || sched_ctrl->SR || high_inactivity;
 }
 
-int next_list_entry_looped(NR_list_t *list, int UE_id)
-{
-  if (UE_id < 0)
-    return list->head;
-  return list->next[UE_id] < 0 ? list->head : list->next[UE_id];
-}
-
-bool allocate_ul_retransmission(module_id_t module_id,
-                                frame_t frame,
-                                sub_frame_t slot,
-                                uint16_t *rballoc_mask,
-                                int *n_rb_sched,
-                                int UE_id,
-                                int harq_pid)
+static bool allocate_ul_retransmission(gNB_MAC_INST *nrmac,
+				       frame_t frame,
+				       sub_frame_t slot,
+				       uint16_t *rballoc_mask,
+				       int *n_rb_sched,
+				       NR_UE_info_t* UE,
+				       int harq_pid,
+				       const NR_SIB1_t *sib1,
+				       const NR_ServingCellConfigCommon_t *scc,
+				       const int tda)
 {
   const int CC_id = 0;
-  gNB_MAC_INST *nr_mac = RC.nrmac[module_id];
-  const NR_ServingCellConfigCommon_t *scc = nr_mac->common_channels[CC_id].ServingCellConfigCommon;
-  NR_UE_info_t *UE_info = &nr_mac->UE_info;
-  NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+  NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
   NR_sched_pusch_t *retInfo = &sched_ctrl->ul_harq_processes[harq_pid].sched_pusch;
-  NR_CellGroupConfig_t *cg = UE_info->CellGroup[UE_id];
+  NR_CellGroupConfig_t *cg = UE->CellGroup;
 
   NR_BWP_UplinkDedicated_t *ubwpd = cg && cg->spCellConfig && cg->spCellConfig->spCellConfigDedicated &&
                                     cg->spCellConfig->spCellConfigDedicated->uplinkConfig ?
                                     cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP : NULL;
 
-  const NR_SIB1_t *sib1 = RC.nrmac[module_id]->common_channels[0].sib1 ? RC.nrmac[module_id]->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL;
   NR_BWP_t *genericParameters = get_ul_bwp_genericParameters(sched_ctrl->active_ubwp,
                                                              (NR_ServingCellConfigCommon_t *)scc,
                                                              sib1);
 
   int rbStart = 0; // wrt BWP start
   const uint16_t bwpSize = NRRIV2BW(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);
-
+  const uint8_t nrOfLayers = 1;
   const uint8_t num_dmrs_cdm_grps_no_data = (sched_ctrl->active_bwp || ubwpd) ? 1 : 2;
-  const int tda = sched_ctrl->active_ubwp ? RC.nrmac[module_id]->preferred_ul_tda[sched_ctrl->active_ubwp->bwp_Id][slot] : 0;
   LOG_D(NR_MAC,"retInfo->time_domain_allocation = %d, tda = %d\n", retInfo->time_domain_allocation, tda);
   LOG_D(NR_MAC,"num_dmrs_cdm_grps_no_data %d, tbs %d\n",num_dmrs_cdm_grps_no_data, retInfo->tb_size);
   if (tda == retInfo->time_domain_allocation) {
@@ -992,6 +919,7 @@ bool allocate_ul_retransmission(module_id_t module_id,
 
     if (ps->time_domain_allocation != tda
         || ps->dci_format != dci_format
+        || ps->nrOfLayers != nrOfLayers
         || ps->num_dmrs_cdm_grps_no_data != num_dmrs_cdm_grps_no_data) {
       nr_set_pusch_semi_static(sib1,
                                scc,
@@ -1000,6 +928,7 @@ bool allocate_ul_retransmission(module_id_t module_id,
                                dci_format,
                                tda,
                                num_dmrs_cdm_grps_no_data,
+                               nrOfLayers,
                                ps);
     }
 
@@ -1008,7 +937,7 @@ bool allocate_ul_retransmission(module_id_t module_id,
     while (rbStart < bwpSize && (rballoc_mask[rbStart] & slbitmap) != slbitmap)
       rbStart++;
     if (rbStart + retInfo->rbSize > bwpSize) {
-      LOG_W(NR_MAC, "cannot allocate retransmission of UE %d/RNTI %04x: no resources (rbStart %d, retInfo->rbSize %d, bwpSize %d\n", UE_id, UE_info->rnti[UE_id], rbStart, retInfo->rbSize, bwpSize);
+      LOG_W(NR_MAC, "cannot allocate retransmission of RNTI %04x: no resources (rbStart %d, retInfo->rbSize %d, bwpSize %d\n", UE->rnti, rbStart, retInfo->rbSize, bwpSize);
       return false;
     }
     LOG_D(NR_MAC, "%s(): retransmission keeping TDA %d and TBS %d\n", __func__, tda, retInfo->tb_size);
@@ -1022,6 +951,7 @@ bool allocate_ul_retransmission(module_id_t module_id,
                              dci_format,
                              tda,
                              num_dmrs_cdm_grps_no_data,
+                             nrOfLayers,
                              &temp_ps);
     /* the retransmission will use a different time domain allocation, check
      * that we have enough resources */
@@ -1057,8 +987,7 @@ bool allocate_ul_retransmission(module_id_t module_id,
   }
 
   /* Find a free CCE */
-  const int cid = sched_ctrl->coreset->controlResourceSetId;
-  const uint16_t Y = get_Y(cid%3, slot, UE_info->rnti[UE_id]);
+  const uint32_t Y = get_Y(sched_ctrl->search_space, slot, UE->rnti);
   uint8_t nr_of_candidates;
   for (int i=0; i<5; i++) {
     // for now taking the lowest value among the available aggregation levels
@@ -1068,7 +997,7 @@ bool allocate_ul_retransmission(module_id_t module_id,
                                 1<<i);
     if(nr_of_candidates>0) break;
   }
-  int CCEIndex = find_pdcch_candidate(RC.nrmac[module_id],
+  int CCEIndex = find_pdcch_candidate(nrmac,
                                       CC_id,
                                       sched_ctrl->aggregation_level,
                                       nr_of_candidates,
@@ -1077,12 +1006,12 @@ bool allocate_ul_retransmission(module_id_t module_id,
                                       Y);
 
   if (CCEIndex<0) {
-    LOG_D(NR_MAC, "%4d.%2d no free CCE for retransmission UL DCI UE %04x\n", frame, slot, UE_info->rnti[UE_id]);
+    LOG_D(NR_MAC, "%4d.%2d no free CCE for retransmission UL DCI UE %04x\n", frame, slot, UE->rnti);
     return false;
   }
 
   sched_ctrl->cce_index = CCEIndex;
-  fill_pdcch_vrb_map(RC.nrmac[module_id],
+  fill_pdcch_vrb_map(nrmac,
                      CC_id,
                      &sched_ctrl->sched_pdcch,
                      CCEIndex,
@@ -1098,11 +1027,10 @@ bool allocate_ul_retransmission(module_id_t module_id,
   NR_sched_pusch_t *sched_pusch = &sched_ctrl->sched_pusch;
 
   LOG_D(NR_MAC,
-        "%4d.%2d Allocate UL retransmission UE %d/RNTI %04x sched %4d.%2d (%d RBs)\n",
+        "%4d.%2d Allocate UL retransmission RNTI %04x sched %4d.%2d (%d RBs)\n",
         frame,
         slot,
-        UE_id,
-        UE_info->rnti[UE_id],
+        UE->rnti,
         sched_pusch->frame,
         sched_pusch->slot,
         sched_pusch->rbSize);
@@ -1129,12 +1057,20 @@ void update_ul_ue_R_Qm(NR_sched_pusch_t *sched_pusch, const NR_pusch_semi_static
   }
 }
 
-float ul_thr_ue[MAX_MOBILES_PER_GNB];
 uint32_t ul_pf_tbs[3][29]; // pre-computed, approximate TBS values for PF coefficient
+typedef struct UEsched_s {
+  float coef;
+  NR_UE_info_t * UE;
+} UEsched_t;
+
+static int comparator(const void *p, const void *q) {
+  return ((UEsched_t*)p)->coef < ((UEsched_t*)q)->coef;
+}
+
 void pf_ul(module_id_t module_id,
            frame_t frame,
            sub_frame_t slot,
-           NR_list_t *UE_list,
+           NR_UE_info_t *UE_list[],
            int max_num_ue,
            int n_rb_sched,
            uint16_t *rballoc_mask) {
@@ -1142,28 +1078,29 @@ void pf_ul(module_id_t module_id,
   const int CC_id = 0;
   gNB_MAC_INST *nrmac = RC.nrmac[module_id];
   NR_ServingCellConfigCommon_t *scc = nrmac->common_channels[CC_id].ServingCellConfigCommon;
-  NR_UE_info_t *UE_info = &nrmac->UE_info;
   const NR_SIB1_t *sib1 = RC.nrmac[module_id]->common_channels[0].sib1 ? RC.nrmac[module_id]->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL;
-  const int min_rb = nrmac->min_grant_prb;
-  float coeff_ue[MAX_MOBILES_PER_GNB];
+  
+  const int min_rb = 5;
   // UEs that could be scheduled
-  int ue_array[MAX_MOBILES_PER_GNB];
-  NR_list_t UE_sched = { .head = -1, .next = ue_array, .tail = -1, .len = MAX_MOBILES_PER_GNB };
+  UEsched_t UE_sched[MAX_MOBILES_PER_GNB] = {0};
+  int remainUEs=max_num_ue;
+  int curUE=0;
 
   /* Loop UE_list to calculate throughput and coeff */
-  for (int UE_id = UE_list->head; UE_id >= 0; UE_id = UE_list->next[UE_id]) {
+  UE_iterator(UE_list, UE) {
 
-    if (UE_info->Msg4_ACKed[UE_id] != true) continue;
+    if (UE->Msg4_ACKed != true)
+      continue;
 
-    LOG_D(NR_MAC,"pf_ul: preparing UL scheduling for UE %d\n",UE_id);
-    NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+    LOG_D(NR_MAC,"pf_ul: preparing UL scheduling for UE %04x\n",UE->rnti);
+    NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
 
     NR_BWP_t *genericParameters = get_ul_bwp_genericParameters(sched_ctrl->active_ubwp,
                                                                scc,
                                                                sib1);
 
     int rbStart = 0; // wrt BWP start
-    NR_CellGroupConfig_t *cg = UE_info->CellGroup[UE_id];
+    NR_CellGroupConfig_t *cg = UE->CellGroup;
     NR_BWP_UplinkDedicated_t *ubwpd = cg && cg->spCellConfig && cg->spCellConfig->spCellConfigDedicated &&
                                       cg->spCellConfig->spCellConfigDedicated->uplinkConfig ?
                                       cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP : NULL;
@@ -1171,48 +1108,58 @@ void pf_ul(module_id_t module_id,
     const uint16_t bwpSize = NRRIV2BW(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);
     NR_sched_pusch_t *sched_pusch = &sched_ctrl->sched_pusch;
     NR_pusch_semi_static_t *ps = &sched_ctrl->pusch_semi_static;
+    const NR_mac_dir_stats_t *stats = &UE->mac_stats.ul;
 
     /* Calculate throughput */
     const float a = 0.0005f; // corresponds to 200ms window
-    const uint32_t b = UE_info->mac_stats[UE_id].ulsch_current_bytes;
-    ul_thr_ue[UE_id] = (1 - a) * ul_thr_ue[UE_id] + a * b;
+    const uint32_t b = stats->current_bytes;
+    UE->ul_thr_ue = (1 - a) * UE->ul_thr_ue + a * b;
 
     /* Check if retransmission is necessary */
     sched_pusch->ul_harq_pid = sched_ctrl->retrans_ul_harq.head;
-    LOG_D(NR_MAC,"pf_ul: UE %d harq_pid %d\n",UE_id,sched_pusch->ul_harq_pid);
+    LOG_D(NR_MAC,"pf_ul: UE %04x harq_pid %d\n",UE->rnti,sched_pusch->ul_harq_pid);
     if (sched_pusch->ul_harq_pid >= 0) {
       /* Allocate retransmission*/
-      bool r = allocate_ul_retransmission(
-          module_id, frame, slot, rballoc_mask, &n_rb_sched, UE_id, sched_pusch->ul_harq_pid);
+      const int tda = get_ul_tda(nrmac, scc, sched_pusch->slot);
+      bool r = allocate_ul_retransmission(nrmac, frame, slot, rballoc_mask, &n_rb_sched, UE, sched_pusch->ul_harq_pid, sib1, scc, tda);
       if (!r) {
-        LOG_D(NR_MAC, "%4d.%2d UL retransmission UE RNTI %04x can NOT be allocated\n", frame, slot, UE_info->rnti[UE_id]);
+        LOG_D(NR_MAC, "%4d.%2d UL retransmission UE RNTI %04x can NOT be allocated\n", frame, slot, UE->rnti);
         continue;
       }
-      else LOG_D(NR_MAC,"%4d.%2d UL Retransmission UE RNTI %04x to be allocated, max_num_ue %d\n",frame,slot,UE_info->rnti[UE_id],max_num_ue);
+      else LOG_D(NR_MAC,"%4d.%2d UL Retransmission UE RNTI %04x to be allocated, max_num_ue %d\n",frame,slot,UE->rnti,max_num_ue);
 
       /* reduce max_num_ue once we are sure UE can be allocated, i.e., has CCE */
-      max_num_ue--;
-      if (max_num_ue < 0)
-        return;
-      continue;
-    }
+      remainUEs--;
+
+      // we have filled all with mandatory retransmissions
+      // no need to schedule new transmissions
+      if (remainUEs == 0)
+	      return;
 
+      continue;
+    } 
     const int B = max(0, sched_ctrl->estimated_ul_buffer - sched_ctrl->sched_ul_bytes);
     /* preprocessor computed sched_frame/sched_slot */
-    const bool do_sched = nr_UE_is_to_be_scheduled(module_id, 0, UE_id, sched_pusch->frame, sched_pusch->slot);
+    const bool do_sched = nr_UE_is_to_be_scheduled(scc, 0, UE, sched_pusch->frame, sched_pusch->slot, nrmac->ulsch_max_frame_inactivity);
 
-    LOG_D(NR_MAC,"pf_ul: do_sched UE %d => %s\n",UE_id,do_sched ? "yes" : "no");
+    LOG_D(NR_MAC,"pf_ul: do_sched UE %04x => %s\n",UE->rnti,do_sched ? "yes" : "no");
     if ((B == 0 && !do_sched) || (sched_ctrl->rrc_processing_timer > 0)) {
       continue;
     }
 
+    const NR_bler_options_t *bo = &nrmac->ul_bler;
+    const int max_mcs = bo->max_mcs; /* no per-user maximum MCS yet */
+    if (bo->harq_round_max == 1)
+      sched_pusch->mcs = max_mcs;
+    else
+      sched_pusch->mcs = get_mcs_from_bler(bo, stats, &UE->UE_sched_ctrl.ul_bler_stats, max_mcs, frame);
+
     /* Schedule UE on SR or UL inactivity and no data (otherwise, will be scheduled
      * based on data to transmit) */
     if (B == 0 && do_sched) {
       /* if no data, pre-allocate 5RB */
       /* Find a free CCE */
-      const int cid = sched_ctrl->coreset->controlResourceSetId;
-      const uint16_t Y = get_Y(cid%3, slot, UE_info->rnti[UE_id]);
+      const uint32_t Y = get_Y(sched_ctrl->search_space, slot, UE->rnti);
       uint8_t nr_of_candidates;
       for (int i=0; i<5; i++) {
         // for now taking the lowest value among the available aggregation levels
@@ -1223,31 +1170,37 @@ void pf_ul(module_id_t module_id,
         if(nr_of_candidates>0) break;
       }
       int CCEIndex = find_pdcch_candidate(RC.nrmac[module_id],
-                                          CC_id,
-                                          sched_ctrl->aggregation_level,
-                                          nr_of_candidates,
-                                          &sched_ctrl->sched_pdcch,
-                                          sched_ctrl->coreset,
-                                          Y);
+					  CC_id,
+					  sched_ctrl->aggregation_level,
+					  nr_of_candidates,
+					  &sched_ctrl->sched_pdcch,
+					  sched_ctrl->coreset,
+					  Y);
 
       if (CCEIndex<0) {
-        LOG_D(NR_MAC, "%4d.%2d no free CCE for UL DCI UE %04x (BSR 0)\n", frame, slot, UE_info->rnti[UE_id]);
+        LOG_D(NR_MAC, "%4d.%2d no free CCE for UL DCI UE %04x (BSR 0)\n", frame, slot, UE->rnti);
         continue;
       }
+
       /* reduce max_num_ue once we are sure UE can be allocated, i.e., has CCE */
-      max_num_ue--;
-      if (max_num_ue < 0)
+      remainUEs--;
+
+      // we have filled all with mandatory retransmissions
+      // no need to schedule new transmissions
+      if (remainUEs == 0)
         return;
 
       /* Save PUSCH field */
       /* we want to avoid a lengthy deduction of DMRS and other parameters in
        * every TTI if we can save it, so check whether dci_format, TDA, or
        * num_dmrs_cdm_grps_no_data has changed and only then recompute */
+      const uint8_t nrOfLayers = 1;
       const uint8_t num_dmrs_cdm_grps_no_data = (sched_ctrl->active_ubwp || ubwpd) ? 1 : 2;
       int dci_format = get_dci_format(sched_ctrl);
-      const int tda = sched_ctrl->active_ubwp ? nrmac->preferred_ul_tda[sched_ctrl->active_ubwp->bwp_Id][slot] : 0;
+      const int tda = get_ul_tda(nrmac, scc, sched_pusch->slot);
       if (ps->time_domain_allocation != tda
           || ps->dci_format != dci_format
+          || ps->nrOfLayers != nrOfLayers
           || ps->num_dmrs_cdm_grps_no_data != num_dmrs_cdm_grps_no_data) {
         nr_set_pusch_semi_static(sib1,
                                  scc,
@@ -1256,16 +1209,18 @@ void pf_ul(module_id_t module_id,
                                  dci_format,
                                  tda,
                                  num_dmrs_cdm_grps_no_data,
+                                 nrOfLayers,
                                  ps);
       }
 
-      LOG_D(NR_MAC,"Looking for min_rb %d RBs, starting at %d\n", min_rb, rbStart);
+      LOG_D(NR_MAC,"Looking for min_rb %d RBs, starting at %d num_dmrs_cdm_grps_no_data %d\n",
+            min_rb, rbStart, ps->num_dmrs_cdm_grps_no_data);
       const uint16_t slbitmap = SL_to_bitmap(ps->startSymbolIndex, ps->nrOfSymbols);
       while (rbStart < bwpSize && (rballoc_mask[rbStart] & slbitmap) != slbitmap)
         rbStart++;
       if (rbStart + min_rb >= bwpSize) {
-        LOG_W(NR_MAC, "cannot allocate continuous UL data for UE %d/RNTI %04x: no resources (rbStart %d, min_rb %d, bwpSize %d\n",
-              UE_id, UE_info->rnti[UE_id],rbStart,min_rb,bwpSize);
+        LOG_W(NR_MAC, "cannot allocate continuous UL data for RNTI %04x: no resources (rbStart %d, min_rb %d, bwpSize %d\n",
+              UE->rnti,rbStart,min_rb,bwpSize);
         return;
       }
 
@@ -1277,7 +1232,7 @@ void pf_ul(module_id_t module_id,
                          sched_ctrl->aggregation_level);
 
       NR_sched_pusch_t *sched_pusch = &sched_ctrl->sched_pusch;
-      sched_pusch->mcs = nrmac->min_grant_mcs;
+      sched_pusch->mcs = min(nrmac->min_grant_mcs, sched_pusch->mcs);
       update_ul_ue_R_Qm(sched_pusch, ps);
       sched_pusch->rbStart = rbStart;
       sched_pusch->rbSize = min_rb;
@@ -1288,7 +1243,7 @@ void pf_ul(module_id_t module_id,
                                             ps->N_PRB_DMRS * ps->num_dmrs_symb,
                                             0, // nb_rb_oh
                                             0,
-                                            1 /* NrOfLayers */)
+                                            ps->nrOfLayers)
                              >> 3;
 
       /* Mark the corresponding RBs as used */
@@ -1300,41 +1255,26 @@ void pf_ul(module_id_t module_id,
     }
 
     /* Create UE_sched for UEs eligibale for new data transmission*/
-    add_tail_nr_list(&UE_sched, UE_id);
-
     /* Calculate coefficient*/
-    sched_pusch->mcs = nrmac->min_grant_mcs;
     const uint32_t tbs = ul_pf_tbs[ps->mcs_table][sched_pusch->mcs];
-    coeff_ue[UE_id] = (float) tbs / ul_thr_ue[UE_id];
-    LOG_D(NR_MAC,"b %d, ul_thr_ue[%d] %f, tbs %d, coeff_ue[%d] %f\n",
-          b, UE_id, ul_thr_ue[UE_id], tbs, UE_id, coeff_ue[UE_id]);
+    float coeff_ue = (float) tbs / UE->ul_thr_ue;
+    LOG_D(NR_MAC,"rnti %04x b %d, ul_thr_ue %f, tbs %d, coeff_ue %f\n",
+          UE->rnti, b, UE->ul_thr_ue, tbs, coeff_ue);
+    UE_sched[curUE].coef=coeff_ue;
+    UE_sched[curUE].UE=UE;
+    curUE++;
   }
 
-
+  qsort(UE_sched, sizeof(*UE_sched), sizeofArray(UE_sched), comparator);
+  UEsched_t *iterator=UE_sched;
+  
   const int min_rbSize = 5;
   /* Loop UE_sched to find max coeff and allocate transmission */
-  while (UE_sched.head >= 0 && max_num_ue> 0 && n_rb_sched >= min_rbSize) {
-    /* Find max coeff */
-    int *max = &UE_sched.head; /* Find max coeff: assume head is max */
-    int *p = &UE_sched.next[*max];
-    while (*p >= 0) {
-      /* Find max coeff: if the current one has larger coeff, save for later */
-      if (coeff_ue[*p] > coeff_ue[*max])
-        max = p;
-      p = &UE_sched.next[*p];
-    }
-    /* Find max coeff: remove the max one: do not use remove_nr_list() since it
-     * goes through the whole list every time. Note that UE_sched.tail might
-     * not be set correctly anymore */
-    const int UE_id = *max;
-    p = &UE_sched.next[*max];
-    *max = UE_sched.next[*max];
-    *p = -1;
-
-    NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
-
-    const int cid = sched_ctrl->coreset->controlResourceSetId;
-    const uint16_t Y = get_Y(cid%3, slot, UE_info->rnti[UE_id]);
+  while (remainUEs> 0 && n_rb_sched >= min_rbSize && iterator->UE != NULL) {
+
+    NR_UE_sched_ctrl_t *sched_ctrl = &iterator->UE->UE_sched_ctrl;
+
+    const uint32_t Y = get_Y(sched_ctrl->search_space, slot, iterator->UE->rnti);
     uint8_t nr_of_candidates;
     for (int i=0; i<5; i++) {
       // for now taking the lowest value among the available aggregation levels
@@ -1342,7 +1282,8 @@ void pf_ul(module_id_t module_id,
                                   &nr_of_candidates,
                                   sched_ctrl->search_space,
                                   1<<i);
-      if(nr_of_candidates>0) break;
+      if(nr_of_candidates>0)
+        break;
     }
     int CCEIndex = find_pdcch_candidate(RC.nrmac[module_id],
                                         CC_id,
@@ -1352,16 +1293,13 @@ void pf_ul(module_id_t module_id,
                                         sched_ctrl->coreset,
                                         Y);
     if (CCEIndex<0) {
-      LOG_D(NR_MAC, "%4d.%2d no free CCE for UL DCI UE %04x\n", frame, slot, UE_info->rnti[UE_id]);
+      LOG_D(NR_MAC, "%4d.%2d no free CCE for UL DCI UE %04x\n", frame, slot, iterator->UE->rnti);
+      iterator++;
       continue;
     }
-    else LOG_D(NR_MAC, "%4d.%2d free CCE for UL DCI UE %04x\n",frame,slot, UE_info->rnti[UE_id]);
-
-    /* reduce max_num_ue once we are sure UE can be allocated, i.e., has CCE */
-    max_num_ue--;
-    AssertFatal(max_num_ue >= 0, "Illegal max_num_ue %d\n", max_num_ue);
+    else LOG_D(NR_MAC, "%4d.%2d free CCE for UL DCI UE %04x\n",frame,slot, iterator->UE->rnti);
 
-    NR_CellGroupConfig_t *cg = UE_info->CellGroup[UE_id];
+    NR_CellGroupConfig_t *cg = iterator->UE->CellGroup;
     NR_BWP_UplinkDedicated_t *ubwpd = cg && cg->spCellConfig && cg->spCellConfig->spCellConfigDedicated
                                       && cg->spCellConfig->spCellConfigDedicated->uplinkConfig ?
                                       cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP : NULL;
@@ -1379,11 +1317,13 @@ void pf_ul(module_id_t module_id,
     /* we want to avoid a lengthy deduction of DMRS and other parameters in
      * every TTI if we can save it, so check whether dci_format, TDA, or
      * num_dmrs_cdm_grps_no_data has changed and only then recompute */
+    const uint8_t nrOfLayers = 1;
     const uint8_t num_dmrs_cdm_grps_no_data = (sched_ctrl->active_ubwp || ubwpd) ? 1 : 2;
     int dci_format = get_dci_format(sched_ctrl);
-    const int tda = sched_ctrl->active_ubwp ? nrmac->preferred_ul_tda[sched_ctrl->active_ubwp->bwp_Id][slot] : 0;
+    const int tda = get_ul_tda(nrmac, scc, sched_pusch->slot);
     if (ps->time_domain_allocation != tda
         || ps->dci_format != dci_format
+        || ps->nrOfLayers != nrOfLayers
         || ps->num_dmrs_cdm_grps_no_data != num_dmrs_cdm_grps_no_data) {
       nr_set_pusch_semi_static(sib1,
                                scc,
@@ -1392,6 +1332,7 @@ void pf_ul(module_id_t module_id,
                                dci_format,
                                tda,
                                num_dmrs_cdm_grps_no_data,
+                               nrOfLayers,
                                ps);
     }
     update_ul_ue_R_Qm(sched_pusch, ps);
@@ -1405,18 +1346,18 @@ void pf_ul(module_id_t module_id,
       max_rbSize++;
 
     if (rbStart + min_rb >= bwpSize) {
-      LOG_W(NR_MAC, "cannot allocate UL data for UE %d/RNTI %04x: no resources (rbStart %d, min_rb %d, bwpSize %d\n",
-	    UE_id, UE_info->rnti[UE_id],rbStart,min_rb,bwpSize);
+      LOG_W(NR_MAC, "cannot allocate UL data for RNTI %04x: no resources (rbStart %d, min_rb %d, bwpSize %d)\n",
+	    iterator->UE->rnti,rbStart,min_rb,bwpSize);
       return;
     }
-    else LOG_D(NR_MAC,"allocating UL data for UE %d/RNTI %04x (rbStsart %d, min_rb %d, bwpSize %d\n",UE_id, UE_info->rnti[UE_id],rbStart,min_rb,bwpSize);
-
+    else
+      LOG_D(NR_MAC,"allocating UL data for RNTI %04x (rbStsart %d, min_rb %d, bwpSize %d)\n", iterator->UE->rnti,rbStart,min_rb,bwpSize);
 
     /* Calculate the current scheduling bytes and the necessary RBs */
     const int B = cmax(sched_ctrl->estimated_ul_buffer - sched_ctrl->sched_ul_bytes, 0);
     uint16_t rbSize = 0;
     uint32_t TBS = 0;
-    
+
     nr_find_nb_rb(sched_pusch->Qm,
                   sched_pusch->R,
                   1, // layers
@@ -1444,6 +1385,10 @@ void pf_ul(module_id_t module_id,
     n_rb_sched -= sched_pusch->rbSize;
     for (int rb = 0; rb < sched_ctrl->sched_pusch.rbSize; rb++)
       rballoc_mask[rb + sched_ctrl->sched_pusch.rbStart] ^= slbitmap;
+
+    /* reduce max_num_ue once we are sure UE can be allocated, i.e., has CCE */
+    remainUEs--;
+    iterator++;
   }
 }
 
@@ -1460,9 +1405,8 @@ bool nr_fr1_ulsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t
   const int mu = scc ? scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.subcarrierSpacing :
                  scc_sib1->uplinkConfigCommon->initialUplinkBWP.genericParameters.subcarrierSpacing;
 
-  NR_UE_info_t *UE_info = &nr_mac->UE_info;
-
-  if (UE_info->num_UEs == 0)
+  // no UEs
+  if (nr_mac->UE_info.list[0] == NULL)
     return false;
 
   const int CC_id = 0;
@@ -1471,14 +1415,15 @@ bool nr_fr1_ulsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t
    * have the same K2 (we don't support multiple/different K2s via different
    * TDAs yet). If the TDA is negative, it means that there is no UL slot to
    * schedule now (slot + k2 is not UL slot) */
-  int UE_id = UE_info->list.head;
-  NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
-  const int tda = sched_ctrl->active_ubwp ? nr_mac->preferred_ul_tda[sched_ctrl->active_ubwp->bwp_Id][slot] : 0;
+  NR_UE_sched_ctrl_t *sched_ctrl = &nr_mac->UE_info.list[0]->UE_sched_ctrl;
+  const int temp_tda = get_ul_tda(nr_mac, scc, slot);
+  int K2 = get_K2(scc, scc_sib1, sched_ctrl->active_ubwp, temp_tda, mu);
+  const int sched_frame = (frame + (slot + K2 >= nr_slots_per_frame[mu])) & 1023;
+  const int sched_slot = (slot + K2) % nr_slots_per_frame[mu];
+  const int tda = get_ul_tda(nr_mac, scc, sched_slot);
   if (tda < 0)
     return false;
-  int K2 = get_K2(scc, scc_sib1, sched_ctrl->active_ubwp, tda, mu);
-  const int sched_frame = (frame + (slot + K2 >= nr_slots_per_frame[mu])) % 1024;
-  const int sched_slot = (slot + K2) % nr_slots_per_frame[mu];
+  DevAssert(K2 == get_K2(scc, scc_sib1, sched_ctrl->active_ubwp, tda, mu));
 
   if (!is_xlsch_in_slot(nr_mac->ulsch_slot_bitmap[sched_slot / 64], sched_slot))
     return false;
@@ -1496,9 +1441,8 @@ bool nr_fr1_ulsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t
     return false;
 
   // Avoid slots with the SRS
-  const NR_list_t *UE_list = &UE_info->list;
-  for (int UE_idx = UE_list->head; UE_idx >= 0; UE_idx = UE_list->next[UE_idx]) {
-    NR_sched_srs_t sched_srs = UE_info->UE_sched_ctrl[UE_idx].sched_srs;
+  UE_iterator(nr_mac->UE_info.list, UE) {
+    NR_sched_srs_t sched_srs = UE->UE_sched_ctrl.sched_srs;
     if(sched_srs.srs_scheduled && sched_srs.frame==sched_frame && sched_srs.slot==sched_slot) {
       return false;
     }
@@ -1506,10 +1450,10 @@ bool nr_fr1_ulsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t
 
   sched_ctrl->sched_pusch.slot = sched_slot;
   sched_ctrl->sched_pusch.frame = sched_frame;
-  for (UE_id = UE_info->list.next[UE_id]; UE_id >= 0; UE_id = UE_info->list.next[UE_id]) {
-    NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+  UE_iterator(nr_mac->UE_info.list, UE2) {
+    NR_UE_sched_ctrl_t *sched_ctrl = &UE2->UE_sched_ctrl;
     AssertFatal(K2 == get_K2(scc,scc_sib1,sched_ctrl->active_ubwp, tda, mu),
-                "Different K2, %d(UE%d) != %ld(UE%d)\n", K2, 0, get_K2(scc,scc_sib1,sched_ctrl->active_ubwp, tda, mu), UE_id);
+                "Different K2, %d(UE%d) != %ld(UE%04x)\n", K2, 0, get_K2(scc,scc_sib1,sched_ctrl->active_ubwp, tda, mu), UE2->rnti);
     sched_ctrl->sched_pusch.slot = sched_slot;
     sched_ctrl->sched_pusch.frame = sched_frame;
   }
@@ -1569,7 +1513,7 @@ bool nr_fr1_ulsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t
   pf_ul(module_id,
         frame,
         slot,
-        &UE_info->list,
+        nr_mac->UE_info.list,
         2,
         len,
         rballoc_mask);
@@ -1590,7 +1534,7 @@ nr_pp_impl_ul nr_init_fr1_ulsch_preprocessor(module_id_t module_id, int CC_id)
       if (mcs > 27 && mcsTableIdx == 1)
         continue;
       const uint8_t Qm = nr_get_Qm_dl(mcs, mcsTableIdx);
-      const uint16_t R = nr_get_code_rate_dl(mcs, mcsTableIdx);
+      const uint16_t R = nr_get_code_rate_ul(mcs, mcsTableIdx);
       /* note: we do not update R/Qm based on low MCS or pi2BPSK */
       ul_pf_tbs[mcsTableIdx][mcs] = nr_compute_tbs(Qm,
                                                    R,
@@ -1630,29 +1574,28 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot)
 
 
   NR_ServingCellConfigCommon_t *scc = RC.nrmac[module_id]->common_channels[0].ServingCellConfigCommon;
-  NR_UE_info_t *UE_info = &RC.nrmac[module_id]->UE_info;
+  NR_UEs_t *UE_info = &RC.nrmac[module_id]->UE_info;
   const NR_SIB1_t *sib1 = RC.nrmac[module_id]->common_channels[0].sib1 ? RC.nrmac[module_id]->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL;
-  const NR_list_t *UE_list = &UE_info->list;
-  for (int UE_id = UE_list->head; UE_id >= 0; UE_id = UE_list->next[UE_id]) {
-    NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+  UE_iterator( UE_info->list, UE) {
+    NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
     if (sched_ctrl->ul_failure == 1 && get_softmodem_params()->phy_test==0) continue;
 
-    NR_CellGroupConfig_t *cg = UE_info->CellGroup[UE_id];
+    NR_CellGroupConfig_t *cg = UE->CellGroup;
 
     NR_BWP_UplinkDedicated_t *ubwpd = cg && cg->spCellConfig && cg->spCellConfig->spCellConfigDedicated &&
                                       cg->spCellConfig->spCellConfigDedicated->uplinkConfig ?
                                       cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP : NULL;
 
-    UE_info->mac_stats[UE_id].ulsch_current_bytes = 0;
+    UE->mac_stats.ul.current_bytes = 0;
 
     /* dynamic PUSCH values (RB alloc, MCS, hence R, Qm, TBS) that change in
      * every TTI are pre-populated by the preprocessor and used below */
     NR_sched_pusch_t *sched_pusch = &sched_ctrl->sched_pusch;
-    LOG_D(NR_MAC,"UE %x : sched_pusch->rbSize %d\n",UE_info->rnti[UE_id],sched_pusch->rbSize);
+    LOG_D(NR_MAC,"UE %04x : sched_pusch->rbSize %d\n",UE->rnti,sched_pusch->rbSize);
     if (sched_pusch->rbSize <= 0)
       continue;
 
-    uint16_t rnti = UE_info->rnti[UE_id];
+    uint16_t rnti = UE->rnti;
     sched_ctrl->SR = false;
 
     int8_t harq_id = sched_pusch->ul_harq_pid;
@@ -1660,8 +1603,8 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot)
       /* PP has not selected a specific HARQ Process, get a new one */
       harq_id = sched_ctrl->available_ul_harq.head;
       AssertFatal(harq_id >= 0,
-                  "no free HARQ process available for UE %d\n",
-                  UE_id);
+                  "no free HARQ process available for UE %04x\n",
+                  UE->rnti);
       remove_front_nr_list(&sched_ctrl->available_ul_harq);
       sched_pusch->ul_harq_pid = harq_id;
     } else {
@@ -1687,10 +1630,10 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot)
     NR_pusch_semi_static_t *ps = &sched_ctrl->pusch_semi_static;
 
     /* Statistics */
-    AssertFatal(cur_harq->round < 8, "Indexing ulsch_rounds[%d] is out of bounds\n", cur_harq->round);
-    UE_info->mac_stats[UE_id].ulsch_rounds[cur_harq->round]++;
+    AssertFatal(cur_harq->round < nr_mac->ul_bler.harq_round_max, "Indexing ulsch_rounds[%d] is out of bounds\n", cur_harq->round);
+    UE->mac_stats.ul.rounds[cur_harq->round]++;
     if (cur_harq->round == 0) {
-      UE_info->mac_stats[UE_id].ulsch_total_bytes_scheduled += sched_pusch->tb_size;
+      UE->mac_stats.ulsch_total_bytes_scheduled += sched_pusch->tb_size;
       /* Save information on MCS, TBS etc for the current initial transmission
        * so we have access to it when retransmitting */
       cur_harq->sched_pusch = *sched_pusch;
@@ -1710,12 +1653,12 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot)
             cur_harq->round,
             cur_harq->ndi);
     }
-    UE_info->mac_stats[UE_id].ulsch_current_bytes = sched_pusch->tb_size;
+    UE->mac_stats.ul.current_bytes = sched_pusch->tb_size;
     sched_ctrl->last_ul_frame = sched_pusch->frame;
     sched_ctrl->last_ul_slot = sched_pusch->slot;
 
     LOG_D(NR_MAC,
-          "ULSCH/PUSCH: %4d.%2d RNTI %04x UL sched %4d.%2d DCI L %d start %2d RBS %3d startSymbol %2d nb_symbol %2d dmrs_pos %x MCS %2d TBS %4d HARQ PID %2d round %d RV %d NDI %d est %6d sched %6d est BSR %6d TPC %d\n",
+          "ULSCH/PUSCH: %4d.%2d RNTI %04x UL sched %4d.%2d DCI L %d start %2d RBS %3d startSymbol %2d nb_symbol %2d dmrs_pos %x MCS %2d nrOfLayers %2d num_dmrs_cdm_grps_no_data %2d TBS %4d HARQ PID %2d round %d RV %d NDI %d est %6d sched %6d est BSR %6d TPC %d\n",
           frame,
           slot,
           rnti,
@@ -1728,10 +1671,12 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot)
           ps->nrOfSymbols,
           ps->ul_dmrs_symb_pos,
           sched_pusch->mcs,
+          ps->nrOfLayers,
+          ps->num_dmrs_cdm_grps_no_data,
           sched_pusch->tb_size,
           harq_id,
           cur_harq->round,
-          nr_rv_round_map[cur_harq->round],
+          nr_rv_round_map[cur_harq->round%4],
           cur_harq->ndi,
           sched_ctrl->estimated_ul_buffer,
           sched_ctrl->sched_ul_bytes,
@@ -1785,7 +1730,8 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot)
       pusch_pdu->data_scrambling_id = *ps->pusch_Config->dataScramblingIdentityPUSCH;
     else
       pusch_pdu->data_scrambling_id = *scc->physCellId;
-    pusch_pdu->nrOfLayers = 1;
+    pusch_pdu->nrOfLayers = ps->nrOfLayers;
+    pusch_pdu->num_dmrs_cdm_grps_no_data = ps->num_dmrs_cdm_grps_no_data;
 
     /* FAPI: DMRS */
     pusch_pdu->ul_dmrs_symb_pos = ps->ul_dmrs_symb_pos;
@@ -1810,7 +1756,7 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot)
     }
     pusch_pdu->scid = 0;      // DMRS sequence initialization [TS38.211, sec 6.4.1.1.1]
     pusch_pdu->num_dmrs_cdm_grps_no_data = ps->num_dmrs_cdm_grps_no_data;
-    pusch_pdu->dmrs_ports = 1;
+    pusch_pdu->dmrs_ports = ((1<<ps->nrOfLayers) - 1);
 
     /* FAPI: Pusch Allocation in frequency domain */
     pusch_pdu->resource_alloc = 1; //type 1
@@ -1827,13 +1773,15 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot)
     pusch_pdu->nr_of_symbols = ps->nrOfSymbols;
 
     /* PUSCH PDU */
-    AssertFatal(cur_harq->round < 4, "Indexing nr_rv_round_map[%d] is out of bounds\n", cur_harq->round);
-    pusch_pdu->pusch_data.rv_index = nr_rv_round_map[cur_harq->round];
+    AssertFatal(cur_harq->round < nr_mac->ul_bler.harq_round_max, "Indexing nr_rv_round_map[%d] is out of bounds\n", cur_harq->round%4);
+    pusch_pdu->pusch_data.rv_index = nr_rv_round_map[cur_harq->round%4];
     pusch_pdu->pusch_data.harq_process_id = harq_id;
     pusch_pdu->pusch_data.new_data_indicator = cur_harq->ndi;
     pusch_pdu->pusch_data.tb_size = sched_pusch->tb_size;
     pusch_pdu->pusch_data.num_cb = 0; //CBG not supported
 
+    pusch_pdu->maintenance_parms_v3.tbSizeLbrmBytes = 0;
+
     LOG_D(NR_MAC,"PUSCH PDU : data_scrambling_identity %x, dmrs_scrambling_id %x\n",pusch_pdu->data_scrambling_id,pusch_pdu->ul_dmrs_scrambling_id);
     /* TRANSFORM PRECODING --------------------------------------------------------*/
 
@@ -1873,7 +1821,7 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot)
 
     /* look up the PDCCH PDU for this BWP and CORESET. If it does not exist,
      * create it */
-    const int bwpid = sched_ctrl->active_bwp ? sched_ctrl->active_bwp->bwp_Id : 0;
+    const int bwp_id = sched_ctrl->active_bwp ? sched_ctrl->active_bwp->bwp_Id : 0;
     NR_SearchSpace_t *ss = (sched_ctrl->active_bwp || ubwpd) ? sched_ctrl->search_space: RC.nrmac[module_id]->sched_ctrlCommon->search_space;
     NR_ControlResourceSet_t *coreset = (sched_ctrl->active_bwp || ubwpd) ? sched_ctrl->coreset: RC.nrmac[module_id]->sched_ctrlCommon->coreset;
     const int coresetid = coreset->controlResourceSetId;
@@ -1889,7 +1837,7 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot)
       pdcch_pdu_coreset[coresetid] = pdcch_pdu;
     }
 
-    LOG_D(NR_MAC,"Configuring ULDCI/PDCCH in %d.%d at CCE %d, rnti %x\n", frame,slot,sched_ctrl->cce_index,rnti);
+    LOG_D(NR_MAC,"Configuring ULDCI/PDCCH in %d.%d at CCE %d, rnti %04x\n", frame,slot,sched_ctrl->cce_index,rnti);
 
     /* Fill PDCCH DL DCI PDU */
     nfapi_nr_dl_dci_pdu_t *dci_pdu = &pdcch_pdu->dci_pdu[pdcch_pdu->numDlDci];
@@ -1927,9 +1875,9 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot)
                  &uldci_payload,
                  ps->dci_format,
                  ps->time_domain_allocation,
-                 UE_info->UE_sched_ctrl[UE_id].tpc0,
+                 UE->UE_sched_ctrl.tpc0,
                  n_ubwp,
-                 bwpid);
+                 bwp_id);
     fill_dci_pdu_rel15(scc,
                        cg,
                        dci_pdu,
@@ -1937,10 +1885,10 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot)
                        ps->dci_format,
                        rnti_types[0],
                        pusch_pdu->bwp_size,
-                       bwpid,
+                       bwp_id,
+                       coresetid,
                        nr_mac->cset0_bwp_size);
 
     memset(sched_pusch, 0, sizeof(*sched_pusch));
   }
 }
-
diff --git a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
index 9cb4dd88b275084b2f6b9af97f64ff98eb11c567..75902ca60a6f1b892b0c8a975e9ba8ae2ef99ad9 100644
--- a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
+++ b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
@@ -41,8 +41,7 @@ void mac_top_init_gNB(void);
 void process_CellGroup(NR_CellGroupConfig_t *CellGroup, NR_UE_sched_ctrl_t *sched_ctrl);
 
 void config_common(int Mod_idP,
-                   int ssb_SubcarrierOffset,
-                   rrc_pdsch_AntennaPorts_t pdsch_AntennaPorts,
+                   int pdsch_AntennaPorts,
                    int pusch_AntennaPorts,
                    NR_ServingCellConfigCommon_t *scc);
 
@@ -52,7 +51,6 @@ int nr_mac_enable_ue_rrc_processing_timer(module_id_t Mod_idP,
                                           uint32_t rrc_reconfiguration_delay);
 
 int rrc_mac_config_req_gNB(module_id_t Mod_idP,
-                           int ssb_SubcarrierOffset,
                            rrc_pdsch_AntennaPorts_t pdsch_AntennaPorts,
                            int pusch_AntennaPorts,
                            int sib1_tda,
@@ -76,6 +74,10 @@ void nr_mac_update_timers(module_id_t module_id,
 void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
 			       frame_t frame_rxP, sub_frame_t slot_rxP);
 
+void schedule_nr_bwp_switch(module_id_t module_id,
+                            frame_t frame,
+                            sub_frame_t slot);
+
 /* \brief main DL scheduler function. Calls a preprocessor to decide on
  * resource allocation, then "post-processes" resource allocation (nFAPI
  * messages, statistics, HARQ handling, CEs, ... */
@@ -91,7 +93,7 @@ uint32_t schedule_control_sib1(module_id_t module_id,
                                int nrOfSymbols,
                                uint16_t dlDmrsSymbPos,
                                uint8_t candidate_idx,
-                               int num_total_bytes);
+                               uint16_t num_total_bytes);
 
 /* \brief default FR1 DL preprocessor init routine, returns preprocessor to call */
 nr_pp_impl_dl nr_init_fr1_dlsch_preprocessor(module_id_t module_id, int CC_id);
@@ -199,7 +201,7 @@ void config_uldci(const NR_SIB1_t *sib1,
                   int n_ubwp,
                   int bwp_id);
 
-void nr_schedule_pucch(int Mod_idP,
+void nr_schedule_pucch(gNB_MAC_INST *nrmac,
                        frame_t frameP,
                        sub_frame_t slotP);
 
@@ -215,14 +217,13 @@ void nr_csi_meas_reporting(int Mod_idP,
                            sub_frame_t slotP);
 
 int nr_acknack_scheduling(int Mod_idP,
-                           int UE_id,
-                           frame_t frameP,
-                           sub_frame_t slotP,
-                           int r_pucch,
-                           int do_common);
+                          NR_UE_info_t *UE,
+                          frame_t frameP,
+                          sub_frame_t slotP,
+                          int r_pucch,
+                          int do_common);
 
-void get_pdsch_to_harq_feedback(int Mod_idP,
-                                int UE_id,
+void get_pdsch_to_harq_feedback(NR_UE_info_t *,
                                 int bwp_id,
                                 NR_SearchSpace__searchSpaceType_PR ss_type,
                                 int *max_fb_time,
@@ -287,7 +288,7 @@ int find_pdcch_candidate(gNB_MAC_INST *mac,
                          int nr_of_candidates,
                          NR_sched_pdcch_t *pdcch,
                          NR_ControlResourceSet_t *coreset,
-                         uint16_t Y);
+                         uint32_t Y);
 
 void fill_pdcch_vrb_map(gNB_MAC_INST *mac,
                         int CC_id,
@@ -303,6 +304,7 @@ void fill_dci_pdu_rel15(const NR_ServingCellConfigCommon_t *scc,
                         int rnti_types,
                         int N_RB,
                         int bwp_id,
+                        NR_ControlResourceSetId_t coreset_id,
                         uint16_t cset0_bwp_size);
 
 void prepare_dci(const NR_CellGroupConfig_t *CellGroup,
@@ -331,7 +333,7 @@ NR_PDSCH_TimeDomainResourceAllocationList_t *get_pdsch_TimeDomainAllocationList(
                                                                                 const NR_SIB1_t *sib1);
 
 /* find coreset within the search space */
-NR_ControlResourceSet_t *get_coreset(module_id_t module_idP,
+NR_ControlResourceSet_t *get_coreset(gNB_MAC_INST *nrmac,
                                      NR_ServingCellConfigCommon_t *scc,
                                      void *bwp,
                                      NR_SearchSpace_t *ss,
@@ -366,10 +368,9 @@ void nr_set_pusch_semi_static(const NR_SIB1_t *sib1,
                               long dci_format,
                               int tda,
                               uint8_t num_dmrs_cdm_grps_no_data,
+                              uint8_t nrOfLayers,
                               NR_pusch_semi_static_t *ps);
 
-uint16_t get_Y(int cid, int slot, rnti_t rnti);
-
 uint8_t nr_get_tpc(int target, uint8_t cqi, int incr);
 
 int get_spf(nfapi_nr_config_request_scf_t *cfg);
@@ -382,20 +383,12 @@ void nr_get_tbs_dl(nfapi_nr_dl_tti_pdsch_pdu *pdsch_pdu,
 		   int x_overhead,
                    uint8_t numdmrscdmgroupnodata,
                    uint8_t tb_scaling);
-/** \brief Computes Q based on I_MCS PDSCH and table_idx for downlink. Implements MCS Tables from 38.214. */
-uint8_t nr_get_Qm_dl(uint8_t Imcs, uint8_t table_idx);
-uint32_t nr_get_code_rate_dl(uint8_t Imcs, uint8_t table_idx);
-
-/** \brief Computes Q based on I_MCS PDSCH and table_idx for uplink. Implements MCS Tables from 38.214. */
-uint8_t nr_get_Qm_ul(uint8_t Imcs, uint8_t table_idx);
-uint32_t nr_get_code_rate_ul(uint8_t Imcs, uint8_t table_idx);
 
 int NRRIV2BW(int locationAndBandwidth,int N_RB);
 
 int NRRIV2PRBOFFSET(int locationAndBandwidth,int N_RB);
 
 /* Functions to manage an NR_list_t */
-void dump_nr_list(NR_list_t *listP);
 void create_nr_list(NR_list_t *listP, int len);
 void resize_nr_list(NR_list_t *list, int new_len);
 void destroy_nr_list(NR_list_t *list);
@@ -405,44 +398,24 @@ void add_tail_nr_list(NR_list_t *listP, int id);
 void add_front_nr_list(NR_list_t *listP, int id);
 void remove_front_nr_list(NR_list_t *listP);
 
-int find_nr_UE_id(module_id_t mod_idP, rnti_t rntiP);
+NR_UE_info_t * find_nr_UE(NR_UEs_t* UEs, rnti_t rntiP);
 
 int find_nr_RA_id(module_id_t mod_idP, int CC_idP, rnti_t rntiP);
 
-int add_new_nr_ue(module_id_t mod_idP, rnti_t rntiP, NR_CellGroupConfig_t *CellGroup);
+NR_UE_info_t*add_new_nr_ue(gNB_MAC_INST *nr_mac, rnti_t rntiP, NR_CellGroupConfig_t *CellGroup);
 
-void mac_remove_nr_ue(module_id_t mod_id, rnti_t rnti);
+void mac_remove_nr_ue(gNB_MAC_INST *nr_mac, rnti_t rnti);
 
 void nr_mac_remove_ra_rnti(module_id_t mod_id, rnti_t rnti);
 
-int allocate_nr_CCEs(gNB_MAC_INST *nr_mac,
-                     NR_BWP_Downlink_t *bwp,
-                     NR_ControlResourceSet_t *coreset,
-                     int aggregation,
-                     uint16_t Y,
-                     int m,
-                     int nr_of_candidates);
-
 int nr_get_default_pucch_res(int pucch_ResourceCommon);
 
-void compute_csi_bitlen(NR_CSI_MeasConfig_t *csi_MeasConfig, NR_UE_info_t *UE_info, int UE_id, module_id_t Mod_idP);
-
 int get_dlscs(nfapi_nr_config_request_t *cfg);
 
 int get_ulscs(nfapi_nr_config_request_t *cfg);
 
 int get_symbolsperslot(nfapi_nr_config_request_t *cfg);
 
-void config_nr_mib(int Mod_idP, 
-                   int CC_idP,
-                   int p_gNBP,
-                   int subCarrierSpacingCommon,
-                   uint32_t ssb_SubcarrierOffset,
-                   int dmrs_TypeA_Position,
-                   uint32_t pdcch_ConfigSIB1,
-                   int cellBarred,
-                   int intraFreqReselection);
-
 int nr_write_ce_dlsch_pdu(module_id_t module_idP,
                           const NR_UE_sched_ctrl_t *ue_sched_ctl,
                           unsigned char *mac_pdu,
@@ -459,7 +432,7 @@ int binomial(int n, int k);
 
 bool is_xlsch_in_slot(uint64_t bitmap, sub_frame_t slot);
 
-void fill_ssb_vrb_map (NR_COMMON_channels_t *cc, int rbStart, uint16_t symStart, int CC_id);
+void fill_ssb_vrb_map (NR_COMMON_channels_t *cc, int rbStart, int ssb_subcarrier_offset, uint16_t symStart, int CC_id);
 
 
 /* \brief Function to indicate a received SDU on ULSCH.
@@ -485,15 +458,29 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
 void create_dl_harq_list(NR_UE_sched_ctrl_t *sched_ctrl,
                          const NR_PDSCH_ServingCellConfig_t *pdsch);
 
+void reset_dl_harq_list(NR_UE_sched_ctrl_t *sched_ctrl);
+
+void reset_ul_harq_list(NR_UE_sched_ctrl_t *sched_ctrl);
+
 void handle_nr_ul_harq(const int CC_idP,
                        module_id_t mod_id,
                        frame_t frame,
                        sub_frame_t slot,
                        const nfapi_nr_crc_t *crc_pdu);
 
+void handle_nr_srs_measurements(const module_id_t module_id,
+                                const frame_t frame,
+                                const sub_frame_t slot,
+                                const rnti_t rnti,
+                                const uint16_t timing_advance,
+                                const uint8_t num_symbols,
+                                const uint8_t wide_band_snr,
+                                const uint8_t num_reported_symbols,
+                                nfapi_nr_srs_indication_reported_symbol_t* reported_symbol_list);
+
 int16_t ssb_index_from_prach(module_id_t module_idP,
                              frame_t frameP,
-			     sub_frame_t slotP,
+                             sub_frame_t slotP,
                              uint16_t preamble_index,
                              uint8_t freq_index,
                              uint8_t symbol);
@@ -502,18 +489,21 @@ void find_SSB_and_RO_available(module_id_t module_idP);
 
 void set_dl_dmrs_ports(NR_pdsch_semi_static_t *ps);
 
-void set_dl_mcs(NR_sched_pdsch_t *sched_pdsch,
-                NR_UE_sched_ctrl_t *sched_ctrl,
-                uint8_t *target_mcs,
-                uint8_t mcs_table_idx);
+uint16_t set_pm_index(NR_UE_sched_ctrl_t *sched_ctrl,
+                      int layers,
+                      int N1, int N2,
+                      int xp_pdsch_antenna_ports,
+                      int codebook_mode);
+
+uint8_t get_mcs_from_cqi(int mcs_table, int cqi_table, int cqi_idx);
 
 uint8_t set_dl_nrOfLayers(NR_UE_sched_ctrl_t *sched_ctrl);
 
 int get_dci_format(NR_UE_sched_ctrl_t *sched_ctrl);
-void calculate_preferred_dl_tda(module_id_t module_id, const NR_BWP_Downlink_t *bwp);
-void calculate_preferred_ul_tda(module_id_t module_id, const NR_BWP_Uplink_t *ubwp);
+const int get_dl_tda(const gNB_MAC_INST *nrmac, const NR_ServingCellConfigCommon_t *scc, int slot);
+const int get_ul_tda(const gNB_MAC_INST *nrmac, const NR_ServingCellConfigCommon_t *scc, int slot);
 
-bool find_free_CCE(module_id_t module_id, sub_frame_t slot, int UE_id);
+bool find_free_CCE(sub_frame_t slot, NR_UE_info_t *UE);
 
 bool nr_find_nb_rb(uint16_t Qm,
                    uint16_t R,
@@ -526,10 +516,20 @@ bool nr_find_nb_rb(uint16_t Qm,
                    uint32_t *tbs,
                    uint16_t *nb_rb);
 
-void nr_sr_reporting(int Mod_idP, frame_t frameP, sub_frame_t slotP);
+int get_mcs_from_bler(const NR_bler_options_t *bler_options,
+                      const NR_mac_dir_stats_t *stats,
+                      NR_bler_stats_t *bler_stats,
+                      int max_mcs,
+                      frame_t frame);
 
-void dump_mac_stats(gNB_MAC_INST *gNB, char *output, int strlen, bool reset_rsrp);
+void UL_tti_req_ahead_initialization(gNB_MAC_INST * gNB, NR_ServingCellConfigCommon_t *scc, int n, int CCid);
+
+void nr_sr_reporting(gNB_MAC_INST *nrmac, frame_t frameP, sub_frame_t slotP);
+
+size_t dump_mac_stats(gNB_MAC_INST *gNB, char *output, size_t strlen, bool reset_rsrp);
 
 void process_CellGroup(NR_CellGroupConfig_t *CellGroup, NR_UE_sched_ctrl_t *sched_ctrl);
 
+void abort_nr_dl_harq(NR_UE_info_t* UE, int8_t harq_pid);
+
 #endif /*__LAYER2_NR_MAC_PROTO_H__*/
diff --git a/openair2/LAYER2/NR_MAC_gNB/main.c b/openair2/LAYER2/NR_MAC_gNB/main.c
index e047494b5296666e55510465702e5f7a72429f68..12c9846037f61696f0550d5c72c8839c6055e019 100644
--- a/openair2/LAYER2/NR_MAC_gNB/main.c
+++ b/openair2/LAYER2/NR_MAC_gNB/main.c
@@ -45,107 +45,138 @@
 extern RAN_CONTEXT_t RC;
 
 
-#define MACSTATSSTRLEN 16384
+#define MACSTATSSTRLEN 65536
 
 void *nrmac_stats_thread(void *arg) {
 
   gNB_MAC_INST *gNB = (gNB_MAC_INST *)arg;
 
-  char output[MACSTATSSTRLEN];
-  memset(output,0,MACSTATSSTRLEN);
-  FILE *fd=fopen("nrMAC_stats.log","w");
-  AssertFatal(fd!=NULL,"Cannot open nrMAC_stats.log, error %s\n",strerror(errno));
+  char output[MACSTATSSTRLEN] = {0};
+  const char *end = output + MACSTATSSTRLEN;
+  FILE *file = fopen("nrMAC_stats.log","w");
+  AssertFatal(file!=NULL,"Cannot open nrMAC_stats.log, error %s\n",strerror(errno));
 
   while (oai_exit == 0) {
-     dump_mac_stats(gNB,output,MACSTATSSTRLEN,false);
-     fprintf(fd,"%s\n",output);
-     fflush(fd);
-     usleep(200000);
-     fseek(fd,0,SEEK_SET);
+    char *p = output;
+    p += dump_mac_stats(gNB, p, end - p, false);
+    p += snprintf(p, end - p, "\n");
+    p += print_meas_log(&gNB->eNB_scheduler, "DL & UL scheduling timing", NULL, NULL, p, end - p);
+    p += print_meas_log(&gNB->schedule_dlsch, "dlsch scheduler", NULL, NULL, p, end - p);
+    p += print_meas_log(&gNB->rlc_data_req, "rlc_data_req", NULL, NULL, p, end - p);
+    p += print_meas_log(&gNB->rlc_status_ind, "rlc_status_ind", NULL, NULL, p, end - p);
+    fwrite(output, p - output, 1, file);
+    fflush(file);
+    sleep(1);
+    fseek(file,0,SEEK_SET);
   }
-  fclose(fd);
+  fclose(file);
   return NULL;
 }
 
 void clear_mac_stats(gNB_MAC_INST *gNB) {
-  memset((void*)gNB->UE_info.mac_stats,0,MAX_MOBILES_PER_GNB*sizeof(NR_mac_stats_t));
+  UE_iterator(gNB->UE_info.list, UE) {
+    memset(&UE->mac_stats,0,sizeof(UE->mac_stats));
+  }
 }
 
-void dump_mac_stats(gNB_MAC_INST *gNB, char *output, int strlen, bool reset_rsrp)
+size_t dump_mac_stats(gNB_MAC_INST *gNB, char *output, size_t strlen, bool reset_rsrp)
 {
-  NR_UE_info_t *UE_info = &gNB->UE_info;
   int num = 1;
- 
-  int stroff=0;
-  if (UE_info->num_UEs == 0) return;
-
-  for (int UE_id = UE_info->list.head; UE_id >= 0; UE_id = UE_info->list.next[UE_id]) {
+  const char *begin = output;
+  const char *end = output + strlen;
 
-    const NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
-    NR_mac_stats_t *stats = &UE_info->mac_stats[UE_id];
+  pthread_mutex_lock(&gNB->UE_info.mutex);
+  UE_iterator(gNB->UE_info.list, UE) {
+    NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
+    NR_mac_stats_t *stats = &UE->mac_stats;
     const int avg_rsrp = stats->num_rsrp_meas > 0 ? stats->cumul_rsrp / stats->num_rsrp_meas : 0;
-    stroff+=sprintf(output+stroff,"UE ID %d RNTI %04x (%d/%d) PH %d dB PCMAX %d dBm, average RSRP %d (%d meas)\n",
-      UE_id,
-      UE_info->rnti[UE_id],
-      num++,
-      UE_info->num_UEs,
-      sched_ctrl->ph,
-      sched_ctrl->pcmax,
-      avg_rsrp,
-      stats->num_rsrp_meas);
-    stroff+=sprintf(output+stroff,"UE %d: CQI %d, RI %d, PMI (%d,%d)\n",
-                    UE_id,
-                    UE_info->UE_sched_ctrl[UE_id].CSI_report.cri_ri_li_pmi_cqi_report.wb_cqi_1tb,
-                    UE_info->UE_sched_ctrl[UE_id].CSI_report.cri_ri_li_pmi_cqi_report.ri+1,
-                    UE_info->UE_sched_ctrl[UE_id].CSI_report.cri_ri_li_pmi_cqi_report.pmi_x1,
-                    UE_info->UE_sched_ctrl[UE_id].CSI_report.cri_ri_li_pmi_cqi_report.pmi_x2);
-
-    stroff+=sprintf(output+stroff,"UE %d: dlsch_rounds %"PRIu64"/%"PRIu64"/%"PRIu64"/%"PRIu64", dlsch_errors %"PRIu64", pucch0_DTX %d, BLER %.5f MCS %d\n",
-                    UE_id,
-                    stats->dlsch_rounds[0], stats->dlsch_rounds[1],
-                    stats->dlsch_rounds[2], stats->dlsch_rounds[3],
-                    stats->dlsch_errors,
-                    stats->pucch0_DTX,
-                    sched_ctrl->dl_bler_stats.bler,
-                    sched_ctrl->dl_bler_stats.mcs);
+
+    output += snprintf(output,
+                       end - output,
+                       "UE RNTI %04x (%d) PH %d dB PCMAX %d dBm, average RSRP %d (%d meas), UL-SNR %d dB\n",
+                       UE->rnti,
+                       num++,
+                       sched_ctrl->ph,
+                       sched_ctrl->pcmax,
+                       avg_rsrp,
+                       stats->num_rsrp_meas,
+                       stats->srs_wide_band_snr);
+    output += snprintf(output,
+                       end - output,
+                       "UE %04x: CQI %d, RI %d, PMI (%d,%d)\n",
+                       UE->rnti,
+                       sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.wb_cqi_1tb,
+                       sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.ri+1,
+                       sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.pmi_x1,
+                       sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.pmi_x2);
+
+    output += snprintf(output,
+                       end - output,
+                       "UE %04x: dlsch_rounds ", UE->rnti);
+    output += snprintf(output, end - output, "%"PRIu64, stats->dl.rounds[0]);
+    for (int i = 1; i < gNB->dl_bler.harq_round_max; i++)
+      output += snprintf(output, end - output, "/%"PRIu64, stats->dl.rounds[i]);
+
+    output += snprintf(output,
+                       end - output,
+                       ", dlsch_errors %"PRIu64", pucch0_DTX %d, BLER %.5f MCS %d\n",
+                       stats->dl.errors,
+                       stats->pucch0_DTX,
+                       sched_ctrl->dl_bler_stats.bler,
+                       sched_ctrl->dl_bler_stats.mcs);
     if (reset_rsrp) {
       stats->num_rsrp_meas = 0;
       stats->cumul_rsrp = 0;
     }
-    stroff+=sprintf(output+stroff,"UE %d: dlsch_total_bytes %"PRIu64"\n", UE_id, stats->dlsch_total_bytes);
-    stroff+=sprintf(output+stroff,"UE %d: ulsch_rounds %"PRIu64"/%"PRIu64"/%"PRIu64"/%"PRIu64", ulsch_DTX %d, ulsch_errors %"PRIu64"\n",
-                    UE_id,
-                    stats->ulsch_rounds[0], stats->ulsch_rounds[1],
-                    stats->ulsch_rounds[2], stats->ulsch_rounds[3],
-                    stats->ulsch_DTX,
-                    stats->ulsch_errors);
-    stroff+=sprintf(output+stroff,
-                    "UE %d: ulsch_total_bytes_scheduled %"PRIu64", ulsch_total_bytes_received %"PRIu64"\n",
-                    UE_id,
-                    stats->ulsch_total_bytes_scheduled, stats->ulsch_total_bytes_rx);
+    output += snprintf(output,
+                       end - output,
+                       "UE %04x: dlsch_total_bytes %"PRIu64"\n",
+                       UE->rnti, stats->dl.total_bytes);
+    output += snprintf(output,
+                       end - output,
+                       "UE %04x: ulsch_rounds ", UE->rnti);
+    output += snprintf(output, end - output, "%"PRIu64, stats->ul.rounds[0]);
+    for (int i = 1; i < gNB->ul_bler.harq_round_max; i++)
+      output += snprintf(output, end - output, "/%"PRIu64, stats->ul.rounds[i]);
+
+    output += snprintf(output,
+                       end - output,
+                       ", ulsch_DTX %d, ulsch_errors %"PRIu64", BLER %.5f MCS %d\n",
+                       stats->ulsch_DTX,
+                       stats->ul.errors,
+                       sched_ctrl->ul_bler_stats.bler,
+                       sched_ctrl->ul_bler_stats.mcs);
+    output += snprintf(output,
+                       end - output,
+                       "UE %04x: ulsch_total_bytes_scheduled %"PRIu64", ulsch_total_bytes_received %"PRIu64"\n",
+                       UE->rnti,
+                       stats->ulsch_total_bytes_scheduled, stats->ul.total_bytes);
+
     for (int lc_id = 0; lc_id < 63; lc_id++) {
-      if (stats->lc_bytes_tx[lc_id] > 0) {
-        stroff+=sprintf(output+stroff, "UE %d: LCID %d: %"PRIu64" bytes TX\n", UE_id, lc_id, stats->lc_bytes_tx[lc_id]);
-	LOG_D(NR_MAC, "UE %d: LCID %d: %"PRIu64" bytes TX\n", UE_id, lc_id, stats->lc_bytes_tx[lc_id]);
-      }
-      if (stats->lc_bytes_rx[lc_id] > 0) {
-        stroff+=sprintf(output+stroff, "UE %d: LCID %d: %"PRIu64" bytes RX\n", UE_id, lc_id, stats->lc_bytes_rx[lc_id]);
-	LOG_D(NR_MAC, "UE %d: LCID %d: %"PRIu64" bytes RX\n", UE_id, lc_id, stats->lc_bytes_rx[lc_id]);
-      }
+      if (stats->dl.lc_bytes[lc_id] > 0)
+        output += snprintf(output,
+                           end - output,
+                           "UE %04x: LCID %d: %"PRIu64" bytes TX\n",
+                           UE->rnti,
+                           lc_id,
+                           stats->dl.lc_bytes[lc_id]);
+      if (stats->ul.lc_bytes[lc_id] > 0)
+        output += snprintf(output,
+                           end - output,
+                           "UE %04x: LCID %d: %"PRIu64" bytes RX\n",
+                           UE->rnti,
+                           lc_id,
+                           stats->ul.lc_bytes[lc_id]);
     }
   }
-  print_meas(&gNB->eNB_scheduler, "DL & UL scheduling timing stats", NULL, NULL);
-  print_meas(&gNB->schedule_dlsch,"dlsch scheduler",NULL,NULL);
-  print_meas(&gNB->rlc_data_req, "rlc_data_req",NULL,NULL);
-  print_meas(&gNB->rlc_status_ind,"rlc_status_ind",NULL,NULL);
+  pthread_mutex_unlock(&gNB->UE_info.mutex);
+  return output - begin;
 }
 
 
 void mac_top_init_gNB(void)
 {
   module_id_t     i;
-  int             list_el;
-  NR_UE_info_t    *UE_info;
   gNB_MAC_INST    *nrmac;
 
   LOG_I(MAC, "[MAIN] Init function start:nb_nr_macrlc_inst=%d\n",RC.nb_nr_macrlc_inst);
@@ -179,6 +210,8 @@ void mac_top_init_gNB(void)
 
       RC.nrmac[i]->first_MIB = true;
 
+      pthread_mutex_init(&RC.nrmac[i]->UE_info.mutex, NULL);
+
       if (get_softmodem_params()->phy_test) {
         RC.nrmac[i]->pre_processor_dl = nr_preprocessor_phytest;
         RC.nrmac[i]->pre_processor_ul = nr_ul_preprocessor_phytest;
@@ -186,8 +219,8 @@ void mac_top_init_gNB(void)
         RC.nrmac[i]->pre_processor_dl = nr_init_fr1_dlsch_preprocessor(i, 0);
         RC.nrmac[i]->pre_processor_ul = nr_init_fr1_ulsch_preprocessor(i, 0);
       }
-      pthread_create(&RC.nrmac[i]->stats_thread,NULL,nrmac_stats_thread,(void*)RC.nrmac[i]);
-
+      if (!IS_SOFTMODEM_NOSTATS_BIT)
+        pthread_create(&RC.nrmac[i]->stats_thread, NULL, nrmac_stats_thread, (void*)RC.nrmac[i]);
     }//END for (i = 0; i < RC.nb_nr_macrlc_inst; i++)
 
     AssertFatal(rlc_module_init(1) == 0,"Could not initialize RLC layer\n");
@@ -207,16 +240,9 @@ void mac_top_init_gNB(void)
 
   // Initialize Linked-List for Active UEs
   for (i = 0; i < RC.nb_nr_macrlc_inst; i++) {
-
     nrmac = RC.nrmac[i];
     nrmac->if_inst = NR_IF_Module_init(i);
-    
-    UE_info = &nrmac->UE_info;
-    UE_info->num_UEs = 0;
-    create_nr_list(&UE_info->list, MAX_MOBILES_PER_GNB);
-    for (list_el = 0; list_el < MAX_MOBILES_PER_GNB; list_el++) {
-      UE_info->active[list_el] = false;
-    }
+    memset(&nrmac->UE_info, 0, sizeof(nrmac->UE_info));
   }
 
   srand48(0);
diff --git a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
index a2c77234c0c329c2b43376785e399dfe9d8a5a0d..3ec0de57e48bb9a763f543e1514d9760642a7fc5 100644
--- a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
+++ b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
@@ -72,14 +72,15 @@
 
 
 /* Defs */
-#define MAX_NUM_BWP 2
+#define MAX_NUM_BWP 5
 #define MAX_NUM_CORESET 12
 #define MAX_NUM_CCE 90
-#define MAX_HARQ_ROUNDS 4
 /*!\brief Maximum number of random access process */
 #define NR_NB_RA_PROC_MAX 4
 #define MAX_NUM_OF_SSB 64
 
+#define MIN_NUM_PRBS_TO_SCHEDULE  5
+
 /*! \brief NR_list_t is a "list" (of users, HARQ processes, slices, ...).
  * Especially useful in the scheduler and to keep "classes" of users. */
 typedef struct {
@@ -89,6 +90,7 @@ typedef struct {
   int len;
 } NR_list_t;
 
+
 typedef enum {
   RA_IDLE = 0,
   Msg2 = 1,
@@ -121,8 +123,10 @@ typedef struct NR_sched_pdcch {
 typedef struct {
   /// Flag to indicate this process is active
   RA_gNB_state_t state;
-  /// BWP id of RA process
-  int bwp_id;
+  /// DL BWP id of RA process
+  int dl_bwp_id;
+  /// UL BWP id of RA process
+  int ul_bwp_id;
   /// CORESET0 configured flag
   int coreset0_configured;
   /// Slot where preamble was received
@@ -343,6 +347,7 @@ typedef struct NR_sched_pucch {
 typedef struct NR_pusch_semi_static_t {
   int dci_format;
   int time_domain_allocation;
+  uint8_t nrOfLayers;
   uint8_t num_dmrs_cdm_grps_no_data;
 
   int startSymbolIndex;
@@ -434,6 +439,7 @@ typedef struct NR_sched_pdsch {
   /// only important for retransmissions; otherwise, the TDA in
   /// NR_pdsch_semi_static_t has precedence
   int time_domain_allocation;
+  uint8_t nrOfLayers;
 } NR_sched_pdsch_t;
 
 typedef struct NR_UE_harq {
@@ -454,13 +460,12 @@ typedef struct NR_UE_harq {
 
 //! fixme : need to enhace for the multiple TB CQI report
 
-typedef struct NR_DL_bler_stats {
-  frame_t last_frame_slot;
+typedef struct NR_bler_stats {
+  frame_t last_frame;
   float bler;
-  float rd2_bler;
   uint8_t mcs;
-  uint64_t dlsch_rounds[8];
-} NR_DL_bler_stats_t;
+  uint64_t rounds[8];
+} NR_bler_stats_t;
 
 //
 /*! As per spec 38.214 section 5.2.1.4.2
@@ -486,6 +491,7 @@ struct CRI_RI_LI_PMI_CQI {
   uint8_t wb_cqi_1tb;
   uint8_t wb_cqi_2tb;
   uint8_t cqi_table;
+  uint8_t csi_report_id;
 };
 
 typedef struct CRI_SSB_RSRP {
@@ -502,35 +508,6 @@ struct CSI_Report {
 
 #define MAX_SR_BITLEN 8
 
-typedef struct {
-  uint8_t nb_ssbri_cri;
-  uint8_t cri_ssbri_bitlen;
-  uint8_t rsrp_bitlen;
-  uint8_t diff_rsrp_bitlen;
-}L1_RSRP_bitlen_t;
-
-typedef struct{
-  uint8_t ri_restriction;
-  uint8_t cri_bitlen;
-  uint8_t ri_bitlen;
-  uint8_t li_bitlen[8];
-  uint8_t pmi_x1_bitlen[8];
-  uint8_t pmi_x2_bitlen[8];
-  uint8_t cqi_bitlen[8];
-} CSI_Meas_bitlen_t;
-
-typedef struct nr_csi_report {
-  NR_CSI_ReportConfig__reportQuantity_PR reportQuantity_type;
-  long periodicity;
-  uint16_t offset;
-  long ** SSB_Index_list;
-  long ** CSI_Index_list;
-//  uint8_t nb_of_nzp_csi_report;
-  uint8_t nb_of_csi_ssb_report;
-  L1_RSRP_bitlen_t CSI_report_bitlen;
-  CSI_Meas_bitlen_t csi_meas_bitlen;
-} nr_csi_report_t;
-
 /*! As per the spec 38.212 and table:  6.3.1.1.2-12 in a single UCI sequence we can have multiple CSI_report 
   the number of CSI_report will depend on number of CSI resource sets that are configured in CSI-ResourceConfig RRC IE
   From spec 38.331 from the IE CSI-ResourceConfig for SSB RSRP reporting we can configure only one resource set 
@@ -561,6 +538,12 @@ typedef struct {
   NR_BWP_Downlink_t *active_bwp;
   /// the currently active BWP in UL
   NR_BWP_Uplink_t *active_ubwp;
+
+  /// the next active BWP ID in DL
+  NR_BWP_Id_t next_dl_bwp_id;
+  /// the next active BWP ID in UL
+  NR_BWP_Id_t next_ul_bwp_id;
+
   /// CCE index and aggregation, should be coherent with cce_list
   NR_SearchSpace_t *search_space;
   NR_ControlResourceSet_t *coreset;
@@ -598,6 +581,9 @@ typedef struct {
   NR_pdsch_semi_static_t pdsch_semi_static;
   /// Sched PDSCH: scheduling decisions, copied into HARQ and cleared every TTI
   NR_sched_pdsch_t sched_pdsch;
+  /// UE-estimated maximum MCS (from CSI-RS)
+  uint8_t dl_max_mcs;
+
   /// For UL synchronization: store last UL scheduling grant
   frame_t last_ul_frame;
   sub_frame_t last_ul_slot;
@@ -609,7 +595,8 @@ typedef struct {
   mac_rlc_status_resp_t rlc_status[NR_MAX_NUM_LCID];
 
   /// Estimation of HARQ from BLER
-  NR_DL_bler_stats_t dl_bler_stats;
+  NR_bler_stats_t dl_bler_stats;
+  NR_bler_stats_t ul_bler_stats;
 
   uint16_t ta_frame;
   int16_t ta_update;
@@ -626,7 +613,7 @@ typedef struct {
   int ul_failure;
   struct CSI_Report CSI_report;
   bool SR;
-  bool set_mcs;
+  bool set_pmi;
   /// information about every HARQ process
   NR_UE_harq_t harq_processes[NR_MAX_NB_HARQ_PROCESSES];
   /// HARQ processes that are free
@@ -654,49 +641,68 @@ typedef struct {
 } NR_UE_sched_ctrl_t;
 
 typedef struct {
-  boolean_t fiveG_connected;
   uicc_t *uicc;
 } NRUEcontext_t;
 
-typedef struct {
-  uint64_t lc_bytes_tx[64];
-  uint64_t lc_bytes_rx[64];
-  uint64_t dlsch_rounds[8];
-  uint64_t dlsch_errors;
-  uint64_t dlsch_total_bytes;
-  int dlsch_current_bytes;
-  uint64_t ulsch_rounds[8];
-  uint64_t ulsch_errors;
+typedef struct NR_mac_dir_stats {
+  uint64_t lc_bytes[64];
+  uint64_t rounds[8];
+  uint64_t errors;
+  uint64_t total_bytes;
+  uint32_t current_bytes;
+} NR_mac_dir_stats_t;
+
+typedef struct NR_mac_stats {
+  NR_mac_dir_stats_t dl;
+  NR_mac_dir_stats_t ul;
   uint32_t ulsch_DTX;
   uint64_t ulsch_total_bytes_scheduled;
-  uint64_t ulsch_total_bytes_rx;
-  int ulsch_current_bytes;
   uint32_t pucch0_DTX;
   int cumul_rsrp;
   uint8_t num_rsrp_meas;
+  int8_t srs_wide_band_snr;
 } NR_mac_stats_t;
 
+typedef struct NR_bler_options {
+  double upper;
+  double lower;
+  uint8_t max_mcs;
+  uint8_t harq_round_max;
+} NR_bler_options_t;
 
 /*! \brief UE list used by gNB to order UEs/CC for scheduling*/
-#define MAX_CSI_REPORTCONFIG 48
 typedef struct {
+  rnti_t rnti;
   /// scheduling control info
-  nr_csi_report_t csi_report_template[MAX_MOBILES_PER_GNB][MAX_CSI_REPORTCONFIG];
-  NR_UE_sched_ctrl_t UE_sched_ctrl[MAX_MOBILES_PER_GNB];
-  NR_mac_stats_t mac_stats[MAX_MOBILES_PER_GNB];
-  NR_list_t list;
-  int num_UEs;
-  bool active[MAX_MOBILES_PER_GNB];
-  rnti_t rnti[MAX_MOBILES_PER_GNB];
-  NR_CellGroupConfig_t *CellGroup[MAX_MOBILES_PER_GNB];
+  nr_csi_report_t csi_report_template[MAX_CSI_REPORTCONFIG];
+  NR_UE_sched_ctrl_t UE_sched_ctrl;
+  NR_mac_stats_t mac_stats;
+  NR_CellGroupConfig_t *CellGroup;
+  char cg_buf[32768]; /* arbitrary size */
+  asn_enc_rval_t enc_rval;
   /// CCE indexing
-  int m[MAX_MOBILES_PER_GNB];
+  int m;
   // UE selected beam index
-  uint8_t UE_beam_index[MAX_MOBILES_PER_GNB];
-  bool Msg4_ACKed[MAX_MOBILES_PER_GNB];
-
+  uint8_t UE_beam_index;
+  bool Msg3_dcch_dtch;
+  bool Msg4_ACKed;
+  /// Sched CSI-RS: scheduling decisions
+  NR_gNB_UCI_STATS_t uci_statS;
+  float ul_thr_ue;
+  float dl_thr_ue;
+  int layers; 
 } NR_UE_info_t;
 
+typedef struct {
+  /// scheduling control info
+  // last element always NULL
+  pthread_mutex_t mutex;
+  NR_UE_info_t *list[MAX_MOBILES_PER_GNB+1];
+  bool sched_csirs;
+} NR_UEs_t;
+
+#define UE_iterator(BaSe, VaR) NR_UE_info_t ** VaR##pptr=BaSe, *VaR; while ((VaR=*(VaR##pptr++)))
+
 typedef void (*nr_pp_impl_dl)(module_id_t mod_id,
                               frame_t frame,
                               sub_frame_t slot);
@@ -721,12 +727,15 @@ typedef struct gNB_MAC_INST_s {
   int                             pusch_target_snrx10;
   /// Pucch target SNR
   int                             pucch_target_snrx10;
+  /// SNR threshold needed to put or not a PRB in the black list
+  int                             ul_prbblack_SNR_threshold;
   /// PUCCH Failure threshold (compared to consecutive PUCCH DTX)
   int                             pucch_failure_thres;
   /// PUSCH Failure threshold (compared to consecutive PUSCH DTX)
   int                             pusch_failure_thres;
   /// Subcarrier Offset
   int                             ssb_SubcarrierOffset;
+  int                             ssb_OffsetPointA;
   /// SIB1 Time domain allocation
   int                             sib1_tda;
   int                             minRXTXTIMEpdsch;
@@ -735,7 +744,7 @@ typedef struct gNB_MAC_INST_s {
   /// current PDU index (BCH,DLSCH)
   uint16_t pdu_index[NFAPI_CC_MAX];
   int num_ulprbbl;
-  uint16_t ulprbbl[275];
+  uint16_t ulprbbl[MAX_BWP_SIZE];
   /// NFAPI Config Request Structure
   nfapi_nr_config_request_scf_t     config[NFAPI_CC_MAX];
   /// NFAPI DL Config Request Structure
@@ -754,8 +763,8 @@ typedef struct gNB_MAC_INST_s {
   nfapi_nr_ul_dci_request_t         UL_dci_req[NFAPI_CC_MAX];
   /// NFAPI DL PDU structure
   nfapi_nr_tx_data_request_t        TX_req[NFAPI_CC_MAX];
-  int pdcch_cand[MAX_NUM_CORESET];
-  NR_UE_info_t UE_info;
+
+  NR_UEs_t UE_info;
 
   /// UL handle
   uint32_t ul_handle;
@@ -791,15 +800,8 @@ typedef struct gNB_MAC_INST_s {
 
   /// bitmap of DLSCH slots, can hold up to 160 slots
   uint64_t dlsch_slot_bitmap[3];
-  /// Lookup for preferred time domain allocation for BWP, in DL, slots
-  /// dynamically allocated
-  int *preferred_dl_tda[MAX_NUM_BWP];
   /// bitmap of ULSCH slots, can hold up to 160 slots
   uint64_t ulsch_slot_bitmap[3];
-  /// Lookup for preferred time domain allocation for UL BWP, dynamically
-  /// allocated. The index refers to the DL slot, and the indicated TDA's k2
-  /// points to the right UL slot
-  int *preferred_ul_tda[MAX_NUM_BWP];
 
   /// maximum number of slots before a UE will be scheduled ULSCH automatically
   uint32_t ulsch_max_frame_inactivity;
@@ -814,12 +816,11 @@ typedef struct gNB_MAC_INST_s {
   uint16_t cset0_bwp_size;
   NR_Type0_PDCCH_CSS_config_t type0_PDCCH_CSS_config[64];
 
+  int xp_pdsch_antenna_ports;
+
   bool first_MIB;
-  double dl_bler_target_upper;
-  double dl_bler_target_lower;
-  double dl_rd2_bler_threshold;
-  uint8_t dl_max_mcs;
-  uint8_t harq_round_max;
+  NR_bler_options_t dl_bler;
+  NR_bler_options_t ul_bler;
   uint8_t min_grant_prb;
   uint8_t min_grant_mcs;
 } gNB_MAC_INST;
diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c
index 108a5dbe91435b6e1265360d2abc5c14df37e097..9adc6ecb5dfc90aa72926d3b233f281814261758 100644
--- a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c
+++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c
@@ -139,7 +139,7 @@ extern volatile int oai_exit;
 pthread_t pdcp_stats_thread_desc;
 
 // will be called when 4G F1 implementation will use GTP-U instead of protobuf
-boolean_t cu_f1u_data_req(
+bool cu_f1u_data_req(
   protocol_ctxt_t  *ctxt_pP,
   const srb_flag_t srb_flagP,
   const rb_id_t rb_id,
@@ -228,7 +228,7 @@ rlc_op_status_t cu_send_to_du(const protocol_ctxt_t *const ctxt,
 	__func__, rb_id, size);
   extern instance_t CUuniqInstance;
   itti_send_msg_to_task(TASK_GTPV1_U, CUuniqInstance, message_p);
-  return TRUE;
+  return true;
 }
 
 //-----------------------------------------------------------------------------
@@ -239,18 +239,16 @@ rlc_op_status_t cu_send_to_du(const protocol_ctxt_t *const ctxt,
  * this mem_block_t to be dissected for testing purposes. For further details see test
  * code at targets/TEST/PDCP/test_pdcp.c:test_pdcp_data_req()
  */
-boolean_t pdcp_data_req(
-  protocol_ctxt_t  *ctxt_pP,
-  const srb_flag_t     srb_flagP,
-  const rb_id_t        rb_idP,
-  const mui_t          muiP,
-  const confirm_t      confirmP,
-  const sdu_size_t     sdu_buffer_sizeP,
-  unsigned char *const sdu_buffer_pP,
-  const pdcp_transmission_mode_t modeP,
-  const uint32_t *const sourceL2Id,
-  const uint32_t *const destinationL2Id
-)
+bool pdcp_data_req(protocol_ctxt_t  *ctxt_pP,
+                   const srb_flag_t     srb_flagP,
+                   const rb_id_t        rb_idP,
+                   const mui_t          muiP,
+                   const confirm_t      confirmP,
+                   const sdu_size_t     sdu_buffer_sizeP,
+                   unsigned char *const sdu_buffer_pP,
+                   const pdcp_transmission_mode_t modeP,
+                   const uint32_t *const sourceL2Id,
+                   const uint32_t *const destinationL2Id)
 //-----------------------------------------------------------------------------
 {
   pdcp_t            *pdcp_p          = NULL;
@@ -261,7 +259,7 @@ boolean_t pdcp_data_req(
   uint16_t           current_sn      = 0;
   mem_block_t       *pdcp_pdu_p      = NULL;
   rlc_op_status_t    rlc_status;
-  boolean_t          ret             = TRUE;
+  bool               ret             = true;
   hash_key_t         key             = HASHTABLE_NOT_A_KEY_VALUE;
   hashtable_rc_t     h_rc;
   uint8_t            rb_offset= (srb_flagP == 0) ? DTCH -1 : 0;
@@ -277,7 +275,7 @@ boolean_t pdcp_data_req(
 
   if (sdu_buffer_sizeP == 0) {
     LOG_W(PDCP, "Handed SDU is of size 0! Ignoring...\n");
-    return FALSE;
+    return false;
   }
 
   /*
@@ -287,12 +285,12 @@ boolean_t pdcp_data_req(
               sdu_buffer_sizeP, MAX_IP_PACKET_SIZE);
 
   if (modeP == PDCP_TRANSMISSION_MODE_TRANSPARENT) {
-    AssertError (rb_idP < NB_RB_MBMS_MAX, return FALSE, "RB id is too high (%ld/%d) %u %u!\n", rb_idP, NB_RB_MBMS_MAX, ctxt_pP->module_id, ctxt_pP->rnti);
+    AssertError (rb_idP < NB_RB_MBMS_MAX, return false, "RB id is too high (%ld/%d) %u %u!\n", rb_idP, NB_RB_MBMS_MAX, ctxt_pP->module_id, ctxt_pP->rnti);
   } else {
     if (srb_flagP) {
-      AssertError (rb_idP < 3, return FALSE, "RB id is too high (%ld/%d) %u %u!\n", rb_idP, 3, ctxt_pP->module_id, ctxt_pP->rnti);
+      AssertError (rb_idP < 3, return false, "RB id is too high (%ld/%d) %u %u!\n", rb_idP, 3, ctxt_pP->module_id, ctxt_pP->rnti);
     } else {
-      AssertError (rb_idP < LTE_maxDRB, return FALSE, "RB id is too high (%ld/%d) %u %u!\n", rb_idP, LTE_maxDRB, ctxt_pP->module_id, ctxt_pP->rnti);
+      AssertError (rb_idP < LTE_maxDRB, return false, "RB id is too high (%ld/%d) %u %u!\n", rb_idP, LTE_maxDRB, ctxt_pP->module_id, ctxt_pP->rnti);
     }
   }
 
@@ -304,7 +302,7 @@ boolean_t pdcp_data_req(
       LOG_W(PDCP, PROTOCOL_CTXT_FMT" Instance is not configured for rb_id %ld Ignoring SDU...\n",
             PROTOCOL_CTXT_ARGS(ctxt_pP),
             rb_idP);
-      return FALSE;
+      return false;
     }
   }
 
@@ -371,7 +369,7 @@ boolean_t pdcp_data_req(
         memset(&pdu_header.mac_i[0],0,PDCP_CONTROL_PLANE_DATA_PDU_MAC_I_SIZE);
         memset(&pdcp_pdu_p->data[sdu_buffer_sizeP + pdcp_header_len],0,PDCP_CONTROL_PLANE_DATA_PDU_MAC_I_SIZE);
 
-        if (pdcp_serialize_control_plane_data_pdu_with_SRB_sn_buffer((unsigned char *)pdcp_pdu_p->data, &pdu_header) == FALSE) {
+        if (pdcp_serialize_control_plane_data_pdu_with_SRB_sn_buffer((unsigned char *)pdcp_pdu_p->data, &pdu_header) == false) {
           LOG_E(PDCP, PROTOCOL_PDCP_CTXT_FMT" Cannot fill PDU buffer with relevant header fields!\n",
                 PROTOCOL_PDCP_CTXT_ARGS(ctxt_pP,pdcp_p));
 
@@ -382,7 +380,7 @@ boolean_t pdcp_data_req(
           }
 
           VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_DATA_REQ,VCD_FUNCTION_OUT);
-          return FALSE;
+          return false;
         }
       } else {
         pdcp_user_plane_data_pdu_header_with_long_sn pdu_header;
@@ -390,7 +388,7 @@ boolean_t pdcp_data_req(
         pdu_header.sn = pdcp_get_next_tx_seq_number(pdcp_p);
         current_sn = pdu_header.sn ;
 
-        if (pdcp_serialize_user_plane_data_pdu_with_long_sn_buffer((unsigned char *)pdcp_pdu_p->data, &pdu_header) == FALSE) {
+        if (pdcp_serialize_user_plane_data_pdu_with_long_sn_buffer((unsigned char *)pdcp_pdu_p->data, &pdu_header) == false) {
           LOG_E(PDCP, PROTOCOL_PDCP_CTXT_FMT" Cannot fill PDU buffer with relevant header fields!\n",
                 PROTOCOL_PDCP_CTXT_ARGS(ctxt_pP,pdcp_p));
 
@@ -401,7 +399,7 @@ boolean_t pdcp_data_req(
           }
 
           VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_DATA_REQ,VCD_FUNCTION_OUT);
-          return FALSE;
+          return false;
         }
       }
 
@@ -422,7 +420,7 @@ boolean_t pdcp_data_req(
         }
 
         VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_DATA_REQ,VCD_FUNCTION_OUT);
-        return FALSE;
+        return false;
       }
 
       LOG_D(PDCP, "Sequence number %d is assigned to current PDU\n", current_sn);
@@ -481,7 +479,7 @@ boolean_t pdcp_data_req(
             ctxt_pP->module_id,
             rb_idP);
       VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_DATA_REQ,VCD_FUNCTION_OUT);
-      return FALSE;
+      return false;
     }
 
     /*
@@ -497,16 +495,16 @@ boolean_t pdcp_data_req(
 
       if (ctxt_pP->enb_flag == ENB_FLAG_YES && NODE_IS_DU(RC.rrc[ctxt_pP->module_id]->node_type)) {
         LOG_E(PDCP, "Can't be DU, bad node type %d \n", RC.rrc[ctxt_pP->module_id]->node_type);
-        ret=FALSE;
+        ret = false;
       } else {
         rlc_status = pdcp_params.send_rlc_data_req_func(ctxt_pP, srb_flagP, MBMS_FLAG_NO, rb_idP, muiP,
                      confirmP, pdcp_pdu_size, pdcp_pdu_p,sourceL2Id,
                      destinationL2Id);
-	ret=FALSE;
+        ret = false;
         switch (rlc_status) {
           case RLC_OP_STATUS_OK:
             LOG_D(PDCP, "Data sending request over RLC succeeded!\n");
-            ret=TRUE;
+            ret=true;
             break;
 
           case RLC_OP_STATUS_BAD_PARAMETER:
@@ -544,7 +542,7 @@ boolean_t pdcp_data_req(
         itti_send_msg_to_task (TASK_CU_F1, ctxt_pP->module_id, message_p);
         //CU_send_DL_RRC_MESSAGE_TRANSFER(ctxt_pP->module_id, message_p);
         LOG_I(PDCP, "Send F1AP_DL_RRC_MESSAGE with ITTI\n");
-        ret=TRUE;
+        ret=true;
       } else {
         rlc_status = rlc_data_req(ctxt_pP
                                   , srb_flagP
@@ -561,27 +559,27 @@ boolean_t pdcp_data_req(
         switch (rlc_status) {
           case RLC_OP_STATUS_OK:
             LOG_D(PDCP, "Data sending request over RLC succeeded!\n");
-            ret=TRUE;
+            ret=true;
             break;
 
           case RLC_OP_STATUS_BAD_PARAMETER:
             LOG_W(PDCP, "Data sending request over RLC failed with 'Bad Parameter' reason!\n");
-            ret= FALSE;
+            ret= false;
             break;
 
           case RLC_OP_STATUS_INTERNAL_ERROR:
             LOG_W(PDCP, "Data sending request over RLC failed with 'Internal Error' reason!\n");
-            ret= FALSE;
+            ret= false;
             break;
 
           case RLC_OP_STATUS_OUT_OF_RESSOURCES:
             LOG_W(PDCP, "Data sending request over RLC failed with 'Out of Resources' reason!\n");
-            ret= FALSE;
+            ret= false;
             break;
 
           default:
             LOG_W(PDCP, "RLC returned an unknown status code after PDCP placed the order to send some data (Status Code:%d)\n", rlc_status);
-            ret= FALSE;
+            ret= false;
             break;
         } // switch case
       }
@@ -596,7 +594,7 @@ boolean_t pdcp_data_req(
 
   /*
    * Control arrives here only if rlc_data_req() returns RLC_OP_STATUS_OK
-   * so we return TRUE afterwards
+   * so we return true afterwards
    */
 
   for (pdcp_uid=0; pdcp_uid< MAX_MOBILES_PER_ENB; pdcp_uid++) {
@@ -619,7 +617,7 @@ boolean_t pdcp_data_req(
 
 
 //-----------------------------------------------------------------------------
-boolean_t
+bool
 pdcp_data_ind(
   const protocol_ctxt_t *const ctxt_pP,
   const srb_flag_t   srb_flagP,
@@ -638,7 +636,7 @@ pdcp_data_ind(
   pdcp_sn_t    sequence_number = 0;
   volatile sdu_size_t   payload_offset  = 0;
   rb_id_t      rb_id            = rb_idP;
-  boolean_t    packet_forwarded = FALSE;
+  bool         packet_forwarded = false;
   hash_key_t      key             = HASHTABLE_NOT_A_KEY_VALUE;
   hashtable_rc_t  h_rc;
   uint8_t      rb_offset= (srb_flagP == 0) ? DTCH -1 :0;
@@ -654,7 +652,7 @@ pdcp_data_ind(
               "[MSG] PDCP UL %s PDU on rb_id %ld\n", (srb_flagP)? "CONTROL" : "DATA", rb_idP);
 
   if (MBMS_flagP) {
-    AssertError (rb_idP < NB_RB_MBMS_MAX, return FALSE,
+    AssertError (rb_idP < NB_RB_MBMS_MAX, return false,
                  "RB id is too high (%ld/%d) %u rnti %x!\n",
                  rb_idP,
                  NB_RB_MBMS_MAX,
@@ -680,12 +678,12 @@ pdcp_data_ind(
     }
   } else {
     rb_id = rb_idP % LTE_maxDRB;
-    AssertError (rb_id < LTE_maxDRB, return FALSE, "RB id is too high (%ld/%d) %u UE %x!\n",
+    AssertError (rb_id < LTE_maxDRB, return false, "RB id is too high (%ld/%d) %u UE %x!\n",
                  rb_id,
                  LTE_maxDRB,
                  ctxt_pP->module_id,
                  ctxt_pP->rnti);
-    AssertError (rb_id > 0, return FALSE, "RB id is too low (%ld/%d) %u UE %x!\n",
+    AssertError (rb_id > 0, return false, "RB id is too low (%ld/%d) %u UE %x!\n",
                  rb_id,
                  LTE_maxDRB,
                  ctxt_pP->module_id,
@@ -700,14 +698,14 @@ pdcp_data_ind(
             key);
       free_mem_block(sdu_buffer_pP, __func__);
       VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_DATA_IND,VCD_FUNCTION_OUT);
-      return FALSE;
+      return false;
     }
   }
 
 
   if (sdu_buffer_sizeP == 0) {
     LOG_W(PDCP, "SDU buffer size is zero! Ignoring this chunk!\n");
-    return FALSE;
+    return false;
   }
 
   if (ctxt_pP->enb_flag) {
@@ -764,13 +762,13 @@ pdcp_data_ind(
       }
 
       VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_DATA_IND,VCD_FUNCTION_OUT);
-      return FALSE;
+      return false;
     }
 
 #if 0
 
     /* Removed by Cedric */
-    if (pdcp_is_rx_seq_number_valid(sequence_number, pdcp_p, srb_flagP) == TRUE) {
+    if (pdcp_is_rx_seq_number_valid(sequence_number, pdcp_p, srb_flagP) == true) {
       LOG_T(PDCP, "Incoming PDU has a sequence number (%d) in accordance with RX window\n", sequence_number);
       /* if (dc == PDCP_DATA_PDU )
       LOG_D(PDCP, "Passing piggybacked SDU to NAS driver...\n");
@@ -788,7 +786,7 @@ pdcp_data_ind(
        */
       LOG_W(PDCP, "Ignoring PDU...\n");
       free_mem_block(sdu_buffer_pP, __func__);
-      return FALSE;
+      return false;
     }
 
 #endif
@@ -837,7 +835,7 @@ pdcp_data_ind(
         LOG_W(PDCP, "Ignoring PDU...\n");
         free_mem_block(sdu_buffer_pP, __func__);
         /* TODO: indicate integrity verification failure to upper layer */
-        return FALSE;
+        return false;
       }
 
       if (sequence_number < pdcp_p->next_pdcp_rx_sn)
@@ -864,7 +862,7 @@ pdcp_data_ind(
       }
 
       VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_DATA_IND,VCD_FUNCTION_OUT);
-      return TRUE;
+      return true;
     } /* if (srb_flagP) */
 
     /*
@@ -892,7 +890,7 @@ pdcp_data_ind(
           LOG_W(PDCP, "Ignoring PDU...\n");
           free_mem_block(sdu_buffer_pP, __func__);
           /* TODO: indicate integrity verification failure to upper layer */
-          return FALSE;
+          return false;
         } else if (pdcp_p->next_pdcp_rx_sn - sequence_number > reordering_window) {
           pdcp_p->rx_hfn++;
           rx_hfn_for_count  = pdcp_p->rx_hfn;
@@ -948,7 +946,7 @@ pdcp_data_ind(
           LOG_W(PDCP, "Ignoring PDU...\n");
           free_mem_block(sdu_buffer_pP, __func__);
           /* TODO: indicate integrity verification failure to upper layer */
-          return FALSE;
+          return false;
         }
 
         /* TODO: specs say we have to store this PDU in a list and then deliver
@@ -1015,7 +1013,7 @@ pdcp_data_ind(
           LOG_W(PDCP, "Ignoring PDU...\n");
           free_mem_block(sdu_buffer_pP, __func__);
           /* TODO: indicate integrity verification failure to upper layer */
-          return FALSE;
+          return false;
         }
 
         break;
@@ -1039,7 +1037,7 @@ pdcp_data_ind(
     }
 
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_DATA_IND,VCD_FUNCTION_OUT);
-    return TRUE;
+    return true;
   }
 
   // XXX Decompression would be done at this point
@@ -1051,7 +1049,7 @@ pdcp_data_ind(
    */
 
   if (LINK_ENB_PDCP_TO_GTPV1U) {
-    if ((TRUE == ctxt_pP->enb_flag) && (FALSE == srb_flagP)) {
+    if ((true == ctxt_pP->enb_flag) && (false == srb_flagP)) {
       LOG_D(PDCP, "Sending packet to GTP, Calling GTPV1U_ENB_TUNNEL_DATA_REQ  ue %x rab %ld len %u\n",
             ctxt_pP->rnti,
             rb_id + 4,
@@ -1069,10 +1067,10 @@ pdcp_data_ind(
       GTPV1U_ENB_TUNNEL_DATA_REQ(message_p).rnti         = ctxt_pP->rnti;
       GTPV1U_ENB_TUNNEL_DATA_REQ(message_p).rab_id       = rb_id + 4;
       itti_send_msg_to_task(TASK_GTPV1_U, INSTANCE_DEFAULT, message_p);
-      packet_forwarded = TRUE;
+      packet_forwarded = true;
     }
   } else {
-    packet_forwarded = FALSE;
+    packet_forwarded = false;
   }
 
 #ifdef MBMS_MULTICAST_OUT
@@ -1086,13 +1084,13 @@ pdcp_data_ind(
    // dest_addr.sin_addr.s_addr = ip_header->daddr;
 
    // sendto(mbms_socket, &sdu_buffer_pP->data[payload_offset], sdu_buffer_sizeP - payload_offset, MSG_DONTWAIT, (struct sockaddr*)&dest_addr, sizeof(dest_addr));
-   // //packet_forwarded = TRUE;
+   // //packet_forwarded = true;
 
   }
 
 #endif
 
-  if (FALSE == packet_forwarded) {
+  if (false == packet_forwarded) {
     notifiedFIFO_elt_t * new_sdu_p = newNotifiedFIFO_elt(sdu_buffer_sizeP - payload_offset + sizeof (pdcp_data_ind_header_t), 0, NULL, NULL);
 
       if ((MBMS_flagP == 0) && (pdcp_p->rlc_mode == RLC_MODE_AM)) {
@@ -1185,7 +1183,7 @@ pdcp_data_ind(
   }
 
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_DATA_IND,VCD_FUNCTION_OUT);
-  return TRUE;
+  return true;
 }
 
 void pdcp_update_stats(const protocol_ctxt_t *const  ctxt_pP) {
@@ -1297,7 +1295,7 @@ pdcp_run (
                                   NULL, NULL
                                  );
 
-          if (result != TRUE)
+          if (result != true)
             LOG_E(PDCP, "PDCP data request failed!\n");
 
           // Message buffer has been processed, free it now.
@@ -1420,7 +1418,7 @@ pdcp_mbms_run (
 //                                  NULL, NULL
 //                                 );
 //
-//          if (result != TRUE)
+//          if (result != true)
 //            LOG_E(PDCP, "PDCP data request failed!\n");
 //
 //          // Message buffer has been processed, free it now.
@@ -1549,10 +1547,7 @@ void pdcp_add_UE(const protocol_ctxt_t *const  ctxt_pP) {
 }
 
 //-----------------------------------------------------------------------------
-boolean_t
-pdcp_remove_UE(
-  const protocol_ctxt_t *const  ctxt_pP
-)
+bool pdcp_remove_UE(const protocol_ctxt_t *const  ctxt_pP)
 //-----------------------------------------------------------------------------
 {
   LTE_DRB_Identity_t  srb_id         = 0;
@@ -1599,19 +1594,17 @@ pdcp_remove_UE(
 
 
 //-----------------------------------------------------------------------------
-boolean_t
-rrc_pdcp_config_asn1_req (
-  const protocol_ctxt_t *const  ctxt_pP,
-  LTE_SRB_ToAddModList_t  *const srb2add_list_pP,
-  LTE_DRB_ToAddModList_t  *const drb2add_list_pP,
-  LTE_DRB_ToReleaseList_t *const drb2release_list_pP,
-  const uint8_t                   security_modeP,
-  uint8_t                  *const kRRCenc_pP,
-  uint8_t                  *const kRRCint_pP,
-  uint8_t                  *const kUPenc_pP,
-  LTE_PMCH_InfoList_r9_t  *const pmch_InfoList_r9_pP,
-  rb_id_t                 *const defaultDRB
-)
+bool
+rrc_pdcp_config_asn1_req(const protocol_ctxt_t *const  ctxt_pP,
+                         LTE_SRB_ToAddModList_t  *const srb2add_list_pP,
+                         LTE_DRB_ToAddModList_t  *const drb2add_list_pP,
+                         LTE_DRB_ToReleaseList_t *const drb2release_list_pP,
+                         const uint8_t                   security_modeP,
+                         uint8_t                  *const kRRCenc_pP,
+                         uint8_t                  *const kRRCint_pP,
+                         uint8_t                  *const kUPenc_pP,
+                         LTE_PMCH_InfoList_r9_t  *const pmch_InfoList_r9_pP,
+                         rb_id_t                 *const defaultDRB)
 //-----------------------------------------------------------------------------
 {
   long int        lc_id          = 0;
@@ -1669,7 +1662,7 @@ rrc_pdcp_config_asn1_req (
                 PROTOCOL_PDCP_CTXT_ARGS(ctxt_pP, pdcp_p),
                 key);
           free(pdcp_p);
-          return TRUE;
+          return true;
         } else {
           LOG_D(PDCP, PROTOCOL_PDCP_CTXT_FMT" CONFIG_ACTION_ADD key 0x%"PRIx64"\n",
                 PROTOCOL_PDCP_CTXT_ARGS(ctxt_pP, pdcp_p),
@@ -1784,13 +1777,13 @@ rrc_pdcp_config_asn1_req (
                 PROTOCOL_PDCP_CTXT_ARGS(ctxt_pP, pdcp_p),
                 key_defaultDRB);
           free(pdcp_p);
-          return TRUE;
+          return true;
         } else if (h_rc != HASH_TABLE_OK) {
           LOG_E(PDCP, PROTOCOL_PDCP_CTXT_FMT" CONFIG_ACTION_ADD ADD key 0x%"PRIx64" FAILED\n",
                 PROTOCOL_PDCP_CTXT_ARGS(ctxt_pP, pdcp_p),
                 key);
           free(pdcp_p);
-          return TRUE;
+          return true;
         } else {
           LOG_D(PDCP, PROTOCOL_PDCP_CTXT_FMT" CONFIG_ACTION_ADD ADD key 0x%"PRIx64"\n",
                 PROTOCOL_PDCP_CTXT_ARGS(ctxt_pP, pdcp_p),
@@ -1944,7 +1937,7 @@ rrc_pdcp_config_asn1_req (
         if (ctxt_pP->enb_flag) {
           drb_id =  (mch_id * LTE_maxSessionPerPMCH ) + lc_id ;//+ (LTE_maxDRB + 3)*MAX_MOBILES_PER_ENB; // 1
 
-          if (pdcp_mbms_array_eNB[ctxt_pP->module_id][mch_id][lc_id].instanciated_instance == TRUE) {
+          if (pdcp_mbms_array_eNB[ctxt_pP->module_id][mch_id][lc_id].instanciated_instance == true) {
             action = CONFIG_ACTION_MBMS_MODIFY;
           } else {
             action = CONFIG_ACTION_MBMS_ADD;
@@ -1952,7 +1945,7 @@ rrc_pdcp_config_asn1_req (
         } else {
           drb_id =  (mch_id * LTE_maxSessionPerPMCH ) + lc_id; // + (LTE_maxDRB + 3); // 15
 
-          if (pdcp_mbms_array_ue[ctxt_pP->module_id][mch_id][lc_id].instanciated_instance == TRUE) {
+          if (pdcp_mbms_array_ue[ctxt_pP->module_id][mch_id][lc_id].instanciated_instance == true) {
             action = CONFIG_ACTION_MBMS_MODIFY;
           } else {
             action = CONFIG_ACTION_MBMS_ADD;
@@ -1990,23 +1983,22 @@ rrc_pdcp_config_asn1_req (
 }
 
 //-----------------------------------------------------------------------------
-boolean_t
-pdcp_config_req_asn1 (
-  const protocol_ctxt_t *const  ctxt_pP,
-  pdcp_t          *const        pdcp_pP,
-  const srb_flag_t              srb_flagP,
-  const rlc_mode_t              rlc_modeP,
-  const config_action_t         actionP,
-  const uint16_t                lc_idP,
-  const uint16_t                mch_idP,
-  const rb_id_t                 rb_idP,
-  const uint8_t                 rb_snP,
-  const uint8_t                 rb_reportP,
-  const uint16_t                header_compression_profileP,
-  const uint8_t                 security_modeP,
-  uint8_t         *const        kRRCenc_pP,
-  uint8_t         *const        kRRCint_pP,
-  uint8_t         *const        kUPenc_pP)
+bool
+pdcp_config_req_asn1(const protocol_ctxt_t *const  ctxt_pP,
+                     pdcp_t          *const        pdcp_pP,
+                     const srb_flag_t              srb_flagP,
+                     const rlc_mode_t              rlc_modeP,
+                     const config_action_t         actionP,
+                     const uint16_t                lc_idP,
+                     const uint16_t                mch_idP,
+                     const rb_id_t                 rb_idP,
+                     const uint8_t                 rb_snP,
+                     const uint8_t                 rb_reportP,
+                     const uint16_t                header_compression_profileP,
+                     const uint8_t                 security_modeP,
+                     uint8_t         *const        kRRCenc_pP,
+                     uint8_t         *const        kRRCint_pP,
+                     uint8_t         *const        kUPenc_pP)
 //-----------------------------------------------------------------------------
 {
 
@@ -2015,7 +2007,7 @@ pdcp_config_req_asn1 (
       DevAssert(pdcp_pP != NULL);
 
       if (ctxt_pP->enb_flag == ENB_FLAG_YES) {
-        pdcp_pP->is_ue = FALSE;
+        pdcp_pP->is_ue = false;
         pdcp_add_UE(ctxt_pP);
 
         //pdcp_eNB_UE_instance_to_rnti[ctxtP->module_id] = ctxt_pP->rnti;
@@ -2035,11 +2027,11 @@ pdcp_config_req_asn1 (
 
         //pdcp_eNB_UE_instance_to_rnti_index = (pdcp_eNB_UE_instance_to_rnti_index + 1) % MAX_MOBILES_PER_ENB;
       } else {
-        pdcp_pP->is_ue = TRUE;
+        pdcp_pP->is_ue = true;
         pdcp_UE_UE_module_id_to_rnti[ctxt_pP->module_id] = ctxt_pP->rnti;
       }
 
-      pdcp_pP->is_srb                     = (srb_flagP == SRB_FLAG_YES) ? TRUE : FALSE;
+      pdcp_pP->is_srb                     = srb_flagP == SRB_FLAG_YES;
       pdcp_pP->lcid                       = lc_idP;
       pdcp_pP->rb_id                      = rb_idP;
       pdcp_pP->header_compression_profile = header_compression_profileP;
@@ -2162,10 +2154,10 @@ pdcp_config_req_asn1 (
             rb_idP);
 
       if (ctxt_pP->enb_flag == ENB_FLAG_YES) {
-        pdcp_mbms_array_eNB[ctxt_pP->module_id][mch_idP][lc_idP].instanciated_instance = TRUE ;
+        pdcp_mbms_array_eNB[ctxt_pP->module_id][mch_idP][lc_idP].instanciated_instance = true ;
         pdcp_mbms_array_eNB[ctxt_pP->module_id][mch_idP][lc_idP].rb_id = rb_idP;
       } else {
-        pdcp_mbms_array_ue[ctxt_pP->module_id][mch_idP][lc_idP].instanciated_instance = TRUE ;
+        pdcp_mbms_array_ue[ctxt_pP->module_id][mch_idP][lc_idP].instanciated_instance = true ;
         pdcp_mbms_array_ue[ctxt_pP->module_id][mch_idP][lc_idP].rb_id = rb_idP;
       }
 
@@ -2245,10 +2237,10 @@ void rrc_pdcp_config_req (
         pdcp_p->rb_id  = rb_idP;
 
         if (ctxt_pP->enb_flag == ENB_FLAG_NO) {
-          pdcp_p->is_ue = TRUE;
+          pdcp_p->is_ue = true;
           pdcp_UE_UE_module_id_to_rnti[ctxt_pP->module_id] = ctxt_pP->rnti;
         } else {
-          pdcp_p->is_ue = FALSE;
+          pdcp_p->is_ue = false;
         }
 
         pdcp_p->next_pdcp_tx_sn = 0;
@@ -2321,10 +2313,10 @@ void rrc_pdcp_config_req (
           pdcp_p->rb_id  = rb_idP;
 
           if (ctxt_pP->enb_flag == ENB_FLAG_NO) {
-            pdcp_p->is_ue = TRUE;
+            pdcp_p->is_ue = true;
             pdcp_UE_UE_module_id_to_rnti[ctxt_pP->module_id] = ctxt_pP->rnti;
           } else {
-            pdcp_p->is_ue = FALSE;
+            pdcp_p->is_ue = false;
           }
 
           pdcp_p->next_pdcp_tx_sn = 0;
diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp.h b/openair2/LAYER2/PDCP_v10.1.0/pdcp.h
index 332ee382d712bd3c161623845d9a08d1d002569a..8cbc49d756356f697428e536843539b1b9bf72d2 100644
--- a/openair2/LAYER2/PDCP_v10.1.0/pdcp.h
+++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp.h
@@ -51,7 +51,7 @@ typedef rlc_op_status_t  (*send_rlc_data_req_func_t)(const protocol_ctxt_t *cons
 						     const rb_id_t, const mui_t,
     confirm_t, sdu_size_t, mem_block_t *,const uint32_t *const, const uint32_t *const);
 
-typedef boolean_t (pdcp_data_ind_t)( const protocol_ctxt_t *, const srb_flag_t,
+typedef bool (pdcp_data_ind_t)( const protocol_ctxt_t *, const srb_flag_t,
 						 const MBMS_flag_t, const rb_id_t, const sdu_size_t,
 						 mem_block_t *,const uint32_t *const, const uint32_t *const);
 typedef pdcp_data_ind_t* pdcp_data_ind_func_t;
@@ -153,14 +153,13 @@ typedef struct pdcp_stats_s {
 
 
 typedef struct pdcp_s {
-  //boolean_t     instanciated_instance;
   uint16_t       header_compression_profile;
 
   /* SR: added this flag to distinguish UE/eNB instance as pdcp_run for virtual
    * mode can receive data on NETLINK for eNB while eNB_flag = 0 and for UE when eNB_flag = 1
    */
-  boolean_t is_ue;
-  boolean_t is_srb;
+  bool is_ue;
+  bool is_srb;
 
   /* Configured security algorithms */
   uint8_t cipheringAlgorithm;
@@ -217,7 +216,7 @@ typedef struct pdcp_s {
 } pdcp_t;
 
 typedef struct pdcp_mbms_s {
-  boolean_t instanciated_instance;
+  bool instanciated_instance;
   rb_id_t   rb_id;
 } pdcp_mbms_t;
 
@@ -230,7 +229,7 @@ typedef struct pdcp_mbms_s {
  * under targets/TEST/PDCP/
  */
 
-/*! \fn boolean_t pdcp_data_req(const protocol_ctxt_t* const  , srb_flag_t , rb_id_t , mui_t , confirm_t ,sdu_size_t , unsigned char* , pdcp_transmission_mode_t )
+/*! \fn bool pdcp_data_req(const protocol_ctxt_t* const  , srb_flag_t , rb_id_t , mui_t , confirm_t ,sdu_size_t , unsigned char* , pdcp_transmission_mode_t )
 * \brief This functions handles data transfer requests coming either from RRC or from IP
 * \param[in] ctxt_pP        Running context.
 * \param[in] rab_id         Radio Bearer ID
@@ -239,38 +238,34 @@ typedef struct pdcp_mbms_s {
 * \param[in] sdu_buffer_size Size of incoming SDU in bytes
 * \param[in] sdu_buffer      Buffer carrying SDU
 * \param[in] mode            flag to indicate whether the userplane data belong to the control plane or data plane or transparent
-* \return TRUE on success, FALSE otherwise
+* \return true on success, false otherwise
 * \note None
 * @ingroup _pdcp
 */
 
-boolean_t pdcp_data_req(
-  protocol_ctxt_t  *ctxt_pP,
-  const srb_flag_t srb_flagP,
-  const rb_id_t rb_id,
-  const mui_t muiP,
-  const confirm_t confirmP,
-  const sdu_size_t sdu_buffer_size,
-  unsigned char *const sdu_buffer,
-  const pdcp_transmission_mode_t mode,
-  const uint32_t * sourceL2Id,
-  const uint32_t * destinationL2Id
-);
-
-boolean_t cu_f1u_data_req(
-  protocol_ctxt_t  *ctxt_pP,
-  const srb_flag_t srb_flagP,
-  const rb_id_t rb_id,
-  const mui_t muiP,
-  const confirm_t confirmP,
-  const sdu_size_t sdu_buffer_size,
-  unsigned char *const sdu_buffer,
-  const pdcp_transmission_mode_t mode,
-  const uint32_t *const sourceL2Id,
-  const uint32_t *const destinationL2Id
-  );
-
-/*! \fn boolean_t pdcp_data_ind(const protocol_ctxt_t* const, srb_flag_t, MBMS_flag_t, rb_id_t, sdu_size_t, mem_block_t*, boolean_t)
+bool pdcp_data_req(protocol_ctxt_t  *ctxt_pP,
+                   const srb_flag_t srb_flagP,
+                   const rb_id_t rb_id,
+                   const mui_t muiP,
+                   const confirm_t confirmP,
+                   const sdu_size_t sdu_buffer_size,
+                   unsigned char *const sdu_buffer,
+                   const pdcp_transmission_mode_t mode,
+                   const uint32_t * sourceL2Id,
+                   const uint32_t * destinationL2Id);
+
+bool cu_f1u_data_req(protocol_ctxt_t  *ctxt_pP,
+                     const srb_flag_t srb_flagP,
+                     const rb_id_t rb_id,
+                     const mui_t muiP,
+                     const confirm_t confirmP,
+                     const sdu_size_t sdu_buffer_size,
+                     unsigned char *const sdu_buffer,
+                     const pdcp_transmission_mode_t mode,
+                     const uint32_t *const sourceL2Id,
+                     const uint32_t *const destinationL2Id);
+
+/*! \fn bool pdcp_data_ind(const protocol_ctxt_t* const, srb_flag_t, MBMS_flag_t, rb_id_t, sdu_size_t, mem_block_t*, bool)
 * \brief This functions handles data transfer indications coming from RLC
 * \param[in] ctxt_pP        Running context.
 * \param[in] Shows if rb is SRB
@@ -279,7 +274,7 @@ boolean_t cu_f1u_data_req(
 * \param[in] sdu_buffer_size Size of incoming SDU in bytes
 * \param[in] sdu_buffer Buffer carrying SDU
 * \param[in] is_data_plane flag to indicate whether the userplane data belong to the control plane or data plane
-* \return TRUE on success, FALSE otherwise
+* \return TRUE on success, false otherwise
 * \note None
 * @ingroup _pdcp
 */
@@ -316,20 +311,18 @@ void rrc_pdcp_config_req (
 * \param[in]  defaultDRB        Default DRB ID
 * \return     A status about the processing, OK or error code.
 */
-boolean_t rrc_pdcp_config_asn1_req (
-  const protocol_ctxt_t *const  ctxt_pP,
-  LTE_SRB_ToAddModList_t  *const srb2add_list,
-  LTE_DRB_ToAddModList_t  *const drb2add_list,
-  LTE_DRB_ToReleaseList_t *const drb2release_list,
-  const uint8_t                   security_modeP,
-  uint8_t                  *const kRRCenc,
-  uint8_t                  *const kRRCint,
-  uint8_t                  *const kUPenc,
-  LTE_PMCH_InfoList_r9_t  *pmch_InfoList_r9,
-  rb_id_t                 *const defaultDRB
-);
-
-/*! \fn boolean_t pdcp_config_req_asn1 (const protocol_ctxt_t* const ctxt_pP, srb_flag_t srb_flagP, uint32_t  action, rb_id_t rb_id, uint8_t rb_sn, uint8_t rb_report, uint16_t header_compression_profile, uint8_t security_mode)
+bool rrc_pdcp_config_asn1_req(const protocol_ctxt_t *const  ctxt_pP,
+                              LTE_SRB_ToAddModList_t  *const srb2add_list,
+                              LTE_DRB_ToAddModList_t  *const drb2add_list,
+                              LTE_DRB_ToReleaseList_t *const drb2release_list,
+                              const uint8_t                   security_modeP,
+                              uint8_t                  *const kRRCenc,
+                              uint8_t                  *const kRRCint,
+                              uint8_t                  *const kUPenc,
+                              LTE_PMCH_InfoList_r9_t  *pmch_InfoList_r9,
+                              rb_id_t                 *const defaultDRB);
+
+/*! \fn bool pdcp_config_req_asn1 (const protocol_ctxt_t* const ctxt_pP, srb_flag_t srb_flagP, uint32_t  action, rb_id_t rb_id, uint8_t rb_sn, uint8_t rb_report, uint16_t header_compression_profile, uint8_t security_mode)
 * \brief  Function for RRC to configure a Radio Bearer.
 * \param[in]  ctxt_pP           Running context.
 * \param[in]  pdcp_pP            Pointer on PDCP structure.
@@ -349,22 +342,21 @@ boolean_t rrc_pdcp_config_asn1_req (
 * \param[in]  kUPenc             User-Plane encryption key
 * \return     A status about the processing, OK or error code.
 */
-boolean_t pdcp_config_req_asn1 (
-  const protocol_ctxt_t *const  ctxt_pP,
-  pdcp_t         *const pdcp_pP,
-  const srb_flag_t       srb_flagP,
-  const rlc_mode_t       rlc_mode,
-  const uint32_t         action,
-  const uint16_t         lc_id,
-  const uint16_t         mch_id,
-  const rb_id_t          rb_id,
-  const uint8_t          rb_sn,
-  const uint8_t          rb_report,
-  const uint16_t         header_compression_profile,
-  const uint8_t          security_mode,
-  uint8_t         *const kRRCenc,
-  uint8_t         *const kRRCint,
-  uint8_t         *const kUPenc);
+bool pdcp_config_req_asn1(const protocol_ctxt_t *const  ctxt_pP,
+                          pdcp_t         *const pdcp_pP,
+                          const srb_flag_t       srb_flagP,
+                          const rlc_mode_t       rlc_mode,
+                          const uint32_t         action,
+                          const uint16_t         lc_id,
+                          const uint16_t         mch_id,
+                          const rb_id_t          rb_id,
+                          const uint8_t          rb_sn,
+                          const uint8_t          rb_report,
+                          const uint16_t         header_compression_profile,
+                          const uint8_t          security_mode,
+                          uint8_t         *const kRRCenc,
+                          uint8_t         *const kRRCint,
+                          uint8_t         *const kUPenc);
 
 /*! \fn void pdcp_add_UE(const protocol_ctxt_t* const  ctxt_pP)
 * \brief  Function (for RRC) to add a new UE in PDCP module
@@ -373,13 +365,12 @@ boolean_t pdcp_config_req_asn1 (
 */
 void pdcp_add_UE(const protocol_ctxt_t *const  ctxt_pP);
 
-/*! \fn boolean_t pdcp_remove_UE(const protocol_ctxt_t* const  ctxt_pP)
+/*! \fn bool pdcp_remove_UE(const protocol_ctxt_t* const  ctxt_pP)
 * \brief  Function for RRC to remove UE from PDCP module hashtable
 * \param[in]  ctxt_pP           Running context.
 * \return     A status about the processing, OK or error code.
 */
-boolean_t pdcp_remove_UE(
-  const protocol_ctxt_t *const  ctxt_pP);
+bool pdcp_remove_UE(const protocol_ctxt_t *const  ctxt_pP);
 
 /*! \fn void rrc_pdcp_config_release( const protocol_ctxt_t* const, rb_id_t)
 * \brief This functions is unused
diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.c
index ef674132c45f38d9e38ed4c564559e4edee85237..77d3cf3857a3d32f2616ea8ae95709ac4e308f6d 100644
--- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.c
+++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.c
@@ -32,7 +32,7 @@
 #include "pdcp.h"
 #include "pdcp_primitives.h"
 
-extern boolean_t util_mark_nth_bit_of_octet(uint8_t* octet, uint8_t index);
+extern bool util_mark_nth_bit_of_octet(uint8_t* octet, uint8_t index);
 
 /*
  * Parses data/control field out of buffer of User Plane PDCP Data PDU with
@@ -123,13 +123,13 @@ uint8_t pdcp_get_sequence_number_of_pdu_with_SRB_sn(unsigned char* pdu_buffer)
  * Fills the incoming buffer with the fields of the header for srb sn
  *
  * @param pdu_buffer PDCP PDU buffer
- * @return TRUE on success, FALSE otherwise
+ * @return true on success, false otherwise
  */
-boolean_t pdcp_serialize_control_plane_data_pdu_with_SRB_sn_buffer(unsigned char* pdu_buffer, \
-    pdcp_control_plane_data_pdu_header* pdu)
+bool pdcp_serialize_control_plane_data_pdu_with_SRB_sn_buffer(unsigned char* pdu_buffer,
+                                                              pdcp_control_plane_data_pdu_header* pdu)
 {
   if (pdu_buffer == NULL || pdu == NULL) {
-    return FALSE;
+    return false;
   }
 
   /*
@@ -138,20 +138,20 @@ boolean_t pdcp_serialize_control_plane_data_pdu_with_SRB_sn_buffer(unsigned char
   uint8_t sequence_number = pdu->sn;
   pdu_buffer[0] = sequence_number & 0x1F; // 5bit sn
 
-  return TRUE;
+  return true;
 }
 
 /*
  * Fills the incoming buffer with the fields of the header for long sn
  *
  * @param pdu_buffer PDCP PDU buffer
- * @return TRUE on success, FALSE otherwise
+ * @return true on success, false otherwise
  */
-boolean_t pdcp_serialize_user_plane_data_pdu_with_long_sn_buffer(unsigned char* pdu_buffer, \
-    pdcp_user_plane_data_pdu_header_with_long_sn* pdu)
+bool pdcp_serialize_user_plane_data_pdu_with_long_sn_buffer(unsigned char* pdu_buffer,
+                                                            pdcp_user_plane_data_pdu_header_with_long_sn* pdu)
 {
   if (pdu_buffer == NULL || pdu == NULL) {
-    return FALSE;
+    return false;
   }
 
   /*
@@ -170,7 +170,7 @@ boolean_t pdcp_serialize_user_plane_data_pdu_with_long_sn_buffer(unsigned char*
     pdu_buffer[0] |= 0x80; // set the first bit as 1
   }
 
-  return TRUE;
+  return true;
 }
 
 /*
@@ -178,13 +178,14 @@ boolean_t pdcp_serialize_user_plane_data_pdu_with_long_sn_buffer(unsigned char*
  *
  * @param pdu_buffer The buffer that PDU will be serialized into
  * @param pdu A status report header
- * @return TRUE on success, FALSE otherwise
+ * @return true on success, false otherwise
  */
-boolean_t pdcp_serialize_control_pdu_for_pdcp_status_report(unsigned char* pdu_buffer, \
-    uint8_t bitmap[512], pdcp_control_pdu_for_pdcp_status_report* pdu)
+bool pdcp_serialize_control_pdu_for_pdcp_status_report(unsigned char* pdu_buffer,
+                                                       uint8_t bitmap[512],
+                                                       pdcp_control_pdu_for_pdcp_status_report* pdu)
 {
   if (pdu_buffer == NULL || pdu == NULL) {
-    return FALSE;
+    return false;
   }
 
   /*
@@ -205,6 +206,6 @@ boolean_t pdcp_serialize_control_pdu_for_pdcp_status_report(unsigned char* pdu_b
    */
   memcpy(pdu_buffer + 2, bitmap, 512);
 
-  return TRUE;
+  return true;
 }
 
diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.h b/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.h
index 8b5ebe7287c52ddbb15409edceec218569127b0d..423f69afc9cdfb47041c5b19852244fd75391a18 100644
--- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.h
+++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.h
@@ -142,18 +142,18 @@ uint8_t pdcp_get_sequence_number_of_pdu_with_SRB_sn(unsigned char* pdu_buffer);
  * Fills the incoming buffer with the fields of the header for SRB1
  *
  * @param pdu_buffer PDCP PDU buffer
- * @return TRUE on success, FALSE otherwise
+ * @return true on success, false otherwise
  */
-boolean_t pdcp_serialize_control_plane_data_pdu_with_SRB_sn_buffer(unsigned char* pdu_buffer, \
-    pdcp_control_plane_data_pdu_header* pdu);
+bool pdcp_serialize_control_plane_data_pdu_with_SRB_sn_buffer(unsigned char* pdu_buffer,
+                                                              pdcp_control_plane_data_pdu_header* pdu);
 /*
  * Fills the incoming buffer with the fields of the header for long SN (RLC UM and AM)
  *
  * @param pdu_buffer PDCP PDU buffer
- * @return TRUE on success, FALSE otherwise
+ * @return true on success, false otherwise
  */
-boolean_t pdcp_serialize_user_plane_data_pdu_with_long_sn_buffer(unsigned char* pdu_buffer, \
-    pdcp_user_plane_data_pdu_header_with_long_sn* pdu);
+bool pdcp_serialize_user_plane_data_pdu_with_long_sn_buffer(unsigned char* pdu_buffer,
+                                                            pdcp_user_plane_data_pdu_header_with_long_sn* pdu);
 
 /*
  * Fills the incoming status report header with given value of bitmap
@@ -162,10 +162,11 @@ boolean_t pdcp_serialize_user_plane_data_pdu_with_long_sn_buffer(unsigned char*
  * @param FMS First Missing PDCP SN
  * @param bitmap Received/Missing sequence number bitmap
  * @param pdu A status report header
- * @return TRUE on success, FALSE otherwise
+ * @return true on success, false otherwise
  */
-boolean_t pdcp_serialize_control_pdu_for_pdcp_status_report(unsigned char* pdu_buffer, \
-    uint8_t bitmap[512], pdcp_control_pdu_for_pdcp_status_report* pdu);
+bool pdcp_serialize_control_pdu_for_pdcp_status_report(unsigned char* pdu_buffer,
+                                                       uint8_t bitmap[512],
+                                                       pdcp_control_pdu_for_pdcp_status_report* pdu);
 
 int pdcp_netlink_dequeue_element(const protocol_ctxt_t* const  ctxt_pP,
                                  struct pdcp_netlink_element_s **data_ppP);
diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.c
index cdc583ef217873df5f794f6f9359136d1c2a1a33..31beb3a9e0663dff64ba6f2c3b0750b3b93217bf 100644
--- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.c
+++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.c
@@ -33,12 +33,12 @@
 /*
  * Initializes sequence numbering state
  * @param pdcp_entity The PDCP entity to be initialized
- * @return boolean_t TRUE on success, FALSE otherwise
+ * @return bool true on success, false otherwise
  */
-boolean_t pdcp_init_seq_numbers(pdcp_t* pdcp_entity)
+bool pdcp_init_seq_numbers(pdcp_t* pdcp_entity)
 {
   if (pdcp_entity == NULL) {
-    return FALSE;
+    return false;
   }
 
   /* Sequence number state variables */
@@ -55,34 +55,34 @@ boolean_t pdcp_init_seq_numbers(pdcp_t* pdcp_entity)
   // Shall UE and eNB behave differently on initialization? (see 7.1.e)
   pdcp_entity->last_submitted_pdcp_rx_sn = 4095;
 
-  return TRUE;
+  return true;
 }
 
-boolean_t pdcp_is_seq_num_size_valid(pdcp_t* pdcp_entity)
+bool pdcp_is_seq_num_size_valid(pdcp_t* pdcp_entity)
 {
   if (pdcp_entity == NULL) {
-    return FALSE;
+    return false;
   }
 
   // Check if the size of SN is valid (see 3GPP TS 36.323 v10.1.0 item 6.3.2)
   if (pdcp_entity->seq_num_size != 5 && pdcp_entity->seq_num_size != 7 && pdcp_entity->seq_num_size != 12) {
     LOG_W(PDCP, "Incoming SN size is invalid! (Expected: {5 | 7 | 12}, Received: %d\n", pdcp_entity->seq_num_size);
-    return FALSE;
+    return false;
   }
 
-  return TRUE;
+  return true;
 }
 
 /**
  * Check if SN number is in the range according to SN size
  */
-boolean_t pdcp_is_seq_num_valid(uint16_t seq_num, uint8_t seq_num_size)
+bool pdcp_is_seq_num_valid(uint16_t seq_num, uint8_t seq_num_size)
 {
   if (seq_num >= 0 && seq_num <= pdcp_calculate_max_seq_num_for_given_size(seq_num_size)) {
-    return TRUE;
+    return true;
   }
 
-  return FALSE;
+  return false;
 }
 
 uint16_t pdcp_calculate_max_seq_num_for_given_size(uint8_t seq_num_size)
@@ -96,7 +96,7 @@ uint16_t pdcp_calculate_max_seq_num_for_given_size(uint8_t seq_num_size)
 
 uint16_t pdcp_get_next_tx_seq_number(pdcp_t* pdcp_entity)
 {
-  if (pdcp_is_seq_num_size_valid(pdcp_entity) == FALSE) {
+  if (pdcp_is_seq_num_size_valid(pdcp_entity) == false) {
     return -1;
   }
 
@@ -118,10 +118,10 @@ uint16_t pdcp_get_next_tx_seq_number(pdcp_t* pdcp_entity)
   return pdcp_seq_num;
 }
 
-boolean_t pdcp_advance_rx_window(pdcp_t* pdcp_entity)
+bool pdcp_advance_rx_window(pdcp_t* pdcp_entity)
 {
-  if (pdcp_is_seq_num_size_valid(pdcp_entity) == FALSE) {
-    return FALSE;
+  if (pdcp_is_seq_num_size_valid(pdcp_entity) == false) {
+    return false;
   }
 
   /*
@@ -137,10 +137,10 @@ boolean_t pdcp_advance_rx_window(pdcp_t* pdcp_entity)
     pdcp_entity->next_pdcp_rx_sn++;
   }
 
-  return TRUE;
+  return true;
 }
 
-boolean_t pdcp_mark_current_pdu_as_received(uint16_t seq_num, pdcp_t* pdcp_entity)
+bool pdcp_mark_current_pdu_as_received(uint16_t seq_num, pdcp_t* pdcp_entity)
 {
   /*
    * Incoming sequence number and PDCP entity were already
@@ -158,5 +158,5 @@ boolean_t pdcp_mark_current_pdu_as_received(uint16_t seq_num, pdcp_t* pdcp_entit
   LOG_D(PDCP, "Marking %d. bit of %d. octet of status bitmap\n", (seq_num % 8) + 1, octet_index);
   util_mark_nth_bit_of_octet(&pdcp_entity->missing_pdu_bitmap[octet_index], seq_num % 8);
   util_print_binary_representation((uint8_t*)"Current state of relevant octet: ", pdcp_entity->missing_pdu_bitmap[octet_index]);
-  return TRUE;
+  return true;
 }
diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.h b/openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.h
index 172c9810e69c29ad81f911f6b61a72759cf9812e..bff98d1b00ed84b1356e69ad4e1cd55abb50acaf 100644
--- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.h
+++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.h
@@ -35,17 +35,17 @@
  * @param pdcp_entity The PDCP entity to be initialized
  * @return none
  */
-boolean_t pdcp_init_seq_numbers(pdcp_t* pdcp_entity);
+bool pdcp_init_seq_numbers(pdcp_t* pdcp_entity);
 /**
  * Checks if incoming PDCP entitiy pointer and relevant sequence number size is valid
- * @return TRUE (0x01) if it is valid, FALSE (0x00) otherwise
+ * @return true (0x01) if it is valid, false (0x00) otherwise
  */
-boolean_t pdcp_is_seq_num_size_valid(pdcp_t* pdcp_entity);
+bool pdcp_is_seq_num_size_valid(pdcp_t* pdcp_entity);
 /**
  * Check if SN number is in the range according to SN size
- * @return TRUE if it is valid, FALSE otherwise
+ * @return true if it is valid, false otherwise
  */
-boolean_t pdcp_is_seq_num_valid(uint16_t seq_num, uint8_t seq_num_size);
+bool pdcp_is_seq_num_valid(uint16_t seq_num, uint8_t seq_num_size);
 /**
  * Returns the maximum allowed sequence number value for given size of SN field
  * @return Max sequence number value
@@ -58,11 +58,11 @@ uint16_t pdcp_get_next_tx_seq_number(pdcp_t* pdcp_entity);
 /**
  * Advances the RX window state of given PDCP entity upon successfull receipt of a SDU
  */
-boolean_t pdcp_advance_rx_window(pdcp_t* pdcp_entity);
+bool pdcp_advance_rx_window(pdcp_t* pdcp_entity);
 /**
 * Updates missing PDU bitmap with incoming sequence number
-* @return TRUE if successful, FALSE otherwise
+* @return true if successful, false otherwise
 */
-boolean_t pdcp_mark_current_pdu_as_received(uint16_t seq_num, pdcp_t* pdcp_entity);
+bool pdcp_mark_current_pdu_as_received(uint16_t seq_num, pdcp_t* pdcp_entity);
 
 #endif
diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.c
index cf8218829fe605a51f47365c513a8832011fa635..79f6d688203620ee25802dd8e4471f6aaea85472 100644
--- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.c
+++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.c
@@ -130,9 +130,9 @@ void util_print_binary_representation(unsigned char* message, uint8_t octet)
  *
  * @param octet 8-bit data
  * @param index Index of bit to be set
- * @return TRUE on success, FALSE otherwise
+ * @return true on success, false otherwise
  */
-boolean_t util_mark_nth_bit_of_octet(uint8_t* octet, uint8_t index)
+bool util_mark_nth_bit_of_octet(uint8_t* octet, uint8_t index)
 {
   uint8_t mask = 0x80;
 
@@ -148,6 +148,6 @@ boolean_t util_mark_nth_bit_of_octet(uint8_t* octet, uint8_t index)
    */
   *octet |= mask;
 
-  return TRUE;
+  return true;
 }
 
diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.h b/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.h
index 49846c7a9fbd75bfbefb64f1d32af56cb958e262..89b8ff672f7824867fae61dcfdc8cf24ca1d81a6 100644
--- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.h
+++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.h
@@ -66,8 +66,8 @@ void util_print_binary_representation(unsigned char* message, uint8_t octet);
  *
  * @param octet Octet
  * @param index Index
- * @return TRUE on success, FALSE otherwise
+ * @return true on success, false otherwise
  */
-boolean_t util_mark_nth_bit_of_octet(uint8_t* octet, uint8_t index);
+bool util_mark_nth_bit_of_octet(uint8_t* octet, uint8_t index);
 
 #endif // PDCP_UTIL_H
diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c
index 4eb0907046aef6ef7301878a26b24df22ec2a83a..ddc7bf85e851f14fac0bdcac0c8279d0c391870d 100644
--- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c
+++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c
@@ -52,7 +52,7 @@ rlc_am_get_status_pdu_buffer_occupancy(
   rlc_sn_t sn_cursor = rlc_pP->vr_r;
   rlc_sn_t sn_prev = rlc_pP->vr_r;
   rlc_sn_t sn_end = rlc_pP->vr_ms;
-  boolean_t segment_loop_end    = false;
+  bool segment_loop_end    = false;
 
   if (sn_prev != sn_end) {
     while ((RLC_AM_DIFF_SN(sn_prev,rlc_pP->vr_r) < RLC_AM_DIFF_SN(sn_end,rlc_pP->vr_r)) && (cursor_p != NULL)) {
diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_entity.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_entity.h
index 1b6d8375655d00a98b5851daf8e40cc4c207535f..95c47943a49abcfc0501aa0e306178e4cbd1538c 100644
--- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_entity.h
+++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_entity.h
@@ -54,7 +54,7 @@ typedef struct rlc_am_entity_s {
 
   rb_id_t           rb_id;                              /*!< \brief Radio bearer identifier, for statistics and trace purpose. */
   logical_chan_id_t channel_id;                         /*!< \brief Transport channel identifier. */
-  boolean_t         is_data_plane;                      /*!< \brief To know if the RLC belongs to a data radio bearer or a signalling radio bearer, for statistics and trace purpose. */
+  bool              is_data_plane;                      /*!< \brief To know if the RLC belongs to a data radio bearer or a signalling radio bearer, for statistics and trace purpose. */
 
   rlc_buffer_occupancy_t sdu_buffer_occupancy;               /*!< \brief Number of bytes of unsegmented SDUs. */
   rlc_buffer_occupancy_t status_buffer_occupancy;            /*!< \brief Number of bytes of control PDUs waiting for transmission. */
@@ -76,7 +76,7 @@ typedef struct rlc_am_entity_s {
   rlc_am_tx_data_pdu_management_t *tx_data_pdu_buffer;       /*!< \brief Transmission PDU data buffer. Used also for retransmissions */
   signed int      retrans_num_pdus;                          /*!< \brief Number of PDUs in the retransmission buffer. */
   signed int      retrans_num_bytes_to_retransmit;           /*!< \brief Number of bytes in the retransmission buffer to be retransmitted. Only payload is taken into account */
-  boolean_t       force_poll;                                /*!< \brief force poll due to t_poll_retransmit time-out. */
+  bool            force_poll;                                /*!< \brief force poll due to t_poll_retransmit time-out. */
 
   //---------------------------------------------------------------------
   // RX BUFFERS
@@ -186,8 +186,8 @@ typedef struct rlc_am_entity_s {
   // note occupancy of other buffers is deducted from nb elements in lists
   rlc_buffer_occupancy_t  buffer_occupancy_retransmission_buffer;   /*!< \brief Number of PDUs. */
 
-  boolean_t               initialized;                               /*!< \brief Boolean for rlc_am_entity_t struct initialization. */
-  boolean_t               configured;                               /*!< \brief Boolean for rlc_am_entity_t struct  configuration. */
+  bool                    initialized;                               /*!< \brief Boolean for rlc_am_entity_t struct initialization. */
+  bool                    configured;                               /*!< \brief Boolean for rlc_am_entity_t struct  configuration. */
 } rlc_am_entity_t;
 /** @} */
 #    endif
diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.c
index cb09f24855aa789cffdea78b3d4851a08e54f901..8ff29fa44bfe944e1c859ec79e04a0fb5bcec5e5 100644
--- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.c
+++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.c
@@ -32,7 +32,7 @@ rlc_am_init(
   const protocol_ctxt_t* const  ctxt_pP,
   rlc_am_entity_t *const        rlc_pP)
 {
-  if (rlc_pP->initialized == TRUE) {
+  if (rlc_pP->initialized == true) {
     LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[AM INIT] INITIALIZATION ALREADY DONE, DOING NOTHING\n",
           PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP));
   } else {
@@ -79,7 +79,7 @@ rlc_am_init(
 
     rlc_pP->last_absolute_subframe_status_indication = 0xFFFFFFFF; // any value > 1
 
-    rlc_pP->initialized                  = TRUE;
+    rlc_pP->initialized                  = true;
   }
 }
 //-----------------------------------------------------------------------------
@@ -134,7 +134,7 @@ rlc_am_reestablish(
 
   rlc_pP->last_absolute_subframe_status_indication = 0xFFFFFFFF; // any value > 1
 
-  rlc_pP->initialized                  = TRUE;
+  rlc_pP->initialized                  = true;
 
 }
 
@@ -197,7 +197,7 @@ rlc_am_configure(
   const uint32_t                t_reorderingP,
   const uint32_t                t_status_prohibitP)
 {
-  if (rlc_pP->configured == TRUE) {
+  if (rlc_pP->configured == true) {
     LOG_I(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[RECONFIGURE] max_retx_threshold %d poll_pdu %d poll_byte %d t_poll_retransmit %d t_reordering %d t_status_prohibit %d\n",
           PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP),
           max_retx_thresholdP,
@@ -235,7 +235,7 @@ rlc_am_configure(
     rlc_am_init_timer_reordering     (ctxt_pP, rlc_pP, t_reorderingP);
     rlc_am_init_timer_status_prohibit(ctxt_pP, rlc_pP, t_status_prohibitP);
 
-    rlc_pP->configured = TRUE;
+    rlc_pP->configured = true;
   }
 
 }
diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.c
index 0957c20bdfc2ba6ae64811edbfcf11fdd3369285..a5f0b4f9ef096ecd1b1a8e78da076dc3141d23d3 100644
--- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.c
+++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.c
@@ -183,12 +183,10 @@ rlc_am_send_sdu (
   }
 }
 //-----------------------------------------------------------------------------
-void
-rlc_am_reassemble_pdu(
-  const protocol_ctxt_t *const ctxt_pP,
-  rlc_am_entity_t *const      rlc_pP,
-  mem_block_t *const          tb_pP,
-  boolean_t free_rlc_pdu) {
+void rlc_am_reassemble_pdu(const protocol_ctxt_t *const ctxt_pP,
+                           rlc_am_entity_t *const      rlc_pP,
+                           mem_block_t *const          tb_pP,
+                           bool free_rlc_pdu) {
   int i,j;
   rlc_am_pdu_info_t *pdu_info        = &((rlc_am_rx_pdu_management_t *)(tb_pP->data))->pdu_info;
   LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[REASSEMBLY PDU] TRY REASSEMBLY PDU SN=%03d\n",
diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.h
index bf9bd58fb52887b4b2f1cfdd08b2c1fe44bce3a3..839e7d9304fbce3cb2371017018b19f9921e97c7 100644
--- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.h
+++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.h
@@ -57,14 +57,14 @@ void rlc_am_reassembly   (const protocol_ctxt_t* const ctxtP, rlc_am_entity_t *
 */
 void rlc_am_send_sdu     (const protocol_ctxt_t* const ctxtP, rlc_am_entity_t * const rlc_pP);
 
-/*! \fn void rlc_am_reassemble_pdu(const protocol_ctxt_t* const ctxtP, rlc_am_entity_t * const rlc_pP, const  mem_block_t* const tb_pP,boolean_t free_rlc_pdu)
+/*! \fn void rlc_am_reassemble_pdu(const protocol_ctxt_t* const ctxtP, rlc_am_entity_t * const rlc_pP, const  mem_block_t* const tb_pP, bool free_rlc_pdu)
 * \brief    Reassembly a RLC AM PDU, depending of the content of this PDU, data will be reassemblied to the current output SDU, the current will be sent to higher layers or not, after or before the reassembly, or no send of SDU will be triggered, depending on FI field in PDU header.
 * \param[in]  ctxtP                       Running context.
 * \param[in]  rlc_pP                      RLC AM protocol instance pointer.
 * \param[in]  tb_pP                       RLC AM PDU embedded in a mem_block_t.
 * \param[in]  free_rlc_pdu                Flag for freeing RLC AM PDU after reassembly.
 */
-void rlc_am_reassemble_pdu(const protocol_ctxt_t* const ctxtP, rlc_am_entity_t * const rlc_pP, mem_block_t* const tb_pP,boolean_t free_rlc_pdu);
+void rlc_am_reassemble_pdu(const protocol_ctxt_t* const ctxtP, rlc_am_entity_t * const rlc_pP, mem_block_t* const tb_pP, bool free_rlc_pdu);
 /** @} */
 #endif
 
diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.c
index 916d1513b0f1f1f0c65ddac2c9bc64a89eb81169..a749aa035e1e161e2cc76b998a126b225cec9289 100644
--- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.c
+++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.c
@@ -328,7 +328,7 @@ rlc_am_receive_process_data_pdu (
   rlc_am_pdu_info_t*  pdu_info_p         = &((rlc_am_rx_pdu_management_t*)(tb_pP->data))->pdu_info;
   rlc_am_pdu_sn_10_t* rlc_am_pdu_sn_10_p = (rlc_am_pdu_sn_10_t*)first_byte_pP;
   rlc_am_rx_pdu_status_t pdu_status		= RLC_AM_DATA_PDU_STATUS_OK;
-  boolean_t		reassemble = false;
+  bool reassemble = false;
 
   if (rlc_am_get_data_pdu_infos(ctxt_pP,rlc_pP, rlc_am_pdu_sn_10_p, tb_size_in_bytesP, pdu_info_p) >= 0) {
 
diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.c
index 56b37e1e3953e1e4bcb6af5514ff111966b06b69..7129307739a376f470b6c12ce91422bf67fb8525 100644
--- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.c
+++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.c
@@ -29,13 +29,12 @@
 #include "LAYER2/MAC/mac_extern.h"
 #include "common/utils/LOG/log.h"
 //-----------------------------------------------------------------------------
-boolean_t rlc_am_nack_pdu (
-  const protocol_ctxt_t* const  ctxt_pP,
-  rlc_am_entity_t *const rlc_pP,
-  const rlc_sn_t snP,
-  const rlc_sn_t prev_nack_snP,
-  sdu_size_t so_startP,
-  sdu_size_t so_endP)
+bool rlc_am_nack_pdu(const protocol_ctxt_t* const  ctxt_pP,
+                     rlc_am_entity_t *const rlc_pP,
+                     const rlc_sn_t snP,
+                     const rlc_sn_t prev_nack_snP,
+                     sdu_size_t so_startP,
+                     sdu_size_t so_endP)
 {
   // 5.2.1 Retransmission
   // ...
@@ -54,8 +53,8 @@ boolean_t rlc_am_nack_pdu (
   rlc_am_tx_data_pdu_management_t *tx_data_pdu_buffer_p = &rlc_pP->tx_data_pdu_buffer[snP % RLC_AM_WINDOW_SIZE];
   //int          pdu_sdu_index;
   //int          sdu_index;
-  boolean_t status = TRUE;
-  boolean_t retx_count_increment = FALSE;
+  bool status = true;
+  bool retx_count_increment = false;
   sdu_size_t pdu_data_to_retx = 0;
 
   if (mb_p != NULL) {
@@ -63,7 +62,7 @@ boolean_t rlc_am_nack_pdu (
     if(so_startP > so_endP) {
       LOG_E(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[NACK-PDU] ERROR NACK MISSING PDU, so_startP %d, so_endP %d\n",
             PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP),so_startP, so_endP);
-      status = FALSE;
+      status = false;
     }
     // Handle full PDU NACK first
     else if ((so_startP == 0) && (so_endP == 0x7FFF)) {
@@ -71,9 +70,7 @@ boolean_t rlc_am_nack_pdu (
     		pdu_data_to_retx = tx_data_pdu_buffer_p->payload_size;
             /* Increment VtReTxNext if this is the first NACK or if some segments have already been transmitted */
             if ((tx_data_pdu_buffer_p->flags.retransmit == 0) || (tx_data_pdu_buffer_p->nack_so_start))
-            {
-            	retx_count_increment = TRUE;
-            }
+              retx_count_increment = true;
 
             tx_data_pdu_buffer_p->nack_so_start = 0;
             tx_data_pdu_buffer_p->num_holes     = 0;
@@ -89,11 +86,11 @@ boolean_t rlc_am_nack_pdu (
     	      if(tx_data_pdu_buffer_p->nack_so_start >= tx_data_pdu_buffer_p->payload_size){
               LOG_E(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[NACK-PDU] ERROR NACK MISSING PDU, nack_so_start %d, payload_size %d\n",
                     PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP),tx_data_pdu_buffer_p->nack_so_start, tx_data_pdu_buffer_p->payload_size);
-    	        status = FALSE;
+              status = false;
     	      }
     	}
     	else {
-    		status = FALSE;
+        status = false;
     	}
     }
     else if (tx_data_pdu_buffer_p->flags.max_retransmit == 0) {
@@ -107,9 +104,8 @@ boolean_t rlc_am_nack_pdu (
 	    	if (prev_nack_snP != snP) {
 	    		/* New NACK_SN with SO */
                 /* check whether a new segment is to be placed in Retransmission Buffer, then increment vrReTx */
-                if ((tx_data_pdu_buffer_p->flags.retransmit == 0) || (so_startP < tx_data_pdu_buffer_p->nack_so_start)) {
-                	retx_count_increment = TRUE;
-                }
+                if ((tx_data_pdu_buffer_p->flags.retransmit == 0) || (so_startP < tx_data_pdu_buffer_p->nack_so_start))
+                  retx_count_increment = true;
 
 	            tx_data_pdu_buffer_p->num_holes     = 1;
 	            tx_data_pdu_buffer_p->retx_hole_index = 0;
@@ -129,21 +125,18 @@ boolean_t rlc_am_nack_pdu (
 		            tx_data_pdu_buffer_p->nack_so_stop = so_endP;
 		            tx_data_pdu_buffer_p->num_holes ++;
 		            pdu_data_to_retx = so_endP - so_startP + 1;
+          } else {
+            status = false;
 	    		}
-	    		else {
-	    			status = FALSE;
-	    		}
-	    	}
-	    	else {
-	    		status = FALSE;
+        } else {
+          status = false;
 	    	}
 		}
 		else {
-			status = FALSE;
+      status = false;
 		}
-    }
-    else {
-    	status = FALSE;
+    } else {
+      status = false;
     }
 
     if (status) {
@@ -175,17 +168,16 @@ boolean_t rlc_am_nack_pdu (
     LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[NACK-PDU] ERROR NACK MISSING PDU SN %05d\n",
           PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP),
           snP);
-    status = FALSE;
+    status = false;
   }
 
   return status;
 }
 //-----------------------------------------------------------------------------
-void rlc_am_ack_pdu (
-  const protocol_ctxt_t* const  ctxt_pP,
-  rlc_am_entity_t *const rlc_pP,
-  const rlc_sn_t snP,
-  boolean_t free_pdu)
+void rlc_am_ack_pdu(const protocol_ctxt_t* const  ctxt_pP,
+                    rlc_am_entity_t *const rlc_pP,
+                    const rlc_sn_t snP,
+                    bool free_pdu)
 {
   mem_block_t* mb_p         = rlc_pP->tx_data_pdu_buffer[snP % RLC_AM_WINDOW_SIZE].mem_block;
   rlc_am_tx_data_pdu_management_t *tx_data_pdu_buffer = &rlc_pP->tx_data_pdu_buffer[snP % RLC_AM_WINDOW_SIZE];
@@ -283,7 +275,7 @@ mem_block_t* rlc_am_retransmit_get_am_segment(
 	sdu_size_t     retx_so_start,retx_so_stop; //starting and ending SO for retransmission in this PDU
 	rlc_sn_t sn = pdu_mngt->sn;
 	uint16_t	header_so_part;
-	boolean_t fi_start, fi_end;
+	bool fi_start, fi_end;
 	uint8_t sdu_index = 0;
 	uint8_t sdu_segment_index = 0;
 	uint8_t num_LIs_pdu_segment = pdu_mngt->nb_sdus - 1;
@@ -377,11 +369,11 @@ mem_block_t* rlc_am_retransmit_get_am_segment(
 		/* Set FI part to false if SO Start and SO End are different from PDU boundaries */
 		if (retx_so_start)
 		{
-			fi_start = FALSE;
+			fi_start = false;
 		}
 		if (retx_so_stop < pdu_mngt->payload_size - 1)
 		{
-			fi_end = FALSE;
+			fi_end = false;
 		}
 
 		/* Header content is filled at the end */
@@ -423,7 +415,7 @@ mem_block_t* rlc_am_retransmit_get_am_segment(
 			else
 			{
 				/* if retx_so_start is still not included then set data_size with full original PDU data size */
-				/* Set fi_start to FALSE in this case */
+				/* Set fi_start to false in this case */
 				data_size = pdu_mngt->payload_size;
 			}
 			sdu_index ++;
@@ -432,7 +424,7 @@ mem_block_t* rlc_am_retransmit_get_am_segment(
 		if (retx_so_start == data_size)
 		{
 			/* Set FI Start if retx_so_start = cumulated data size */
-			fi_start = TRUE;
+			fi_start = true;
 			/* there must be at least one SDU more */
 //Assertion(eNB)_PRAN_DesignDocument_annex No.778
             if(sdu_index >= pdu_mngt->nb_sdus)
@@ -464,8 +456,8 @@ mem_block_t* rlc_am_retransmit_get_am_segment(
 		}
 		else if (retx_so_start != 0)
 		{
-			/* in all other cases set fi_start to FALSE if it SO Start is not 0 */
-			fi_start = FALSE;
+			/* in all other cases set fi_start to false if it SO Start is not 0 */
+			fi_start = false;
 		}
 
 		/* Set first SDU portion of the segment */
@@ -582,10 +574,10 @@ mem_block_t* rlc_am_retransmit_get_am_segment(
 				"RLC AM Tx PDU Segment Data Error: retx_so_stop=%d OriginalPDUDataLength=%d SOStart=%d SegmentLength=%d numLISegment=%d numLIPDU=%d sn=%d LcId=%d !\n",
 				retx_so_stop,pdu_mngt->payload_size,retx_so_start,*payload_sizeP,num_LIs_pdu_segment,pdu_mngt->nb_sdus - 1,sn,rlc_pP->channel_id);
 */
-		/* init FI End to FALSE if retx_so_stop is not end of PDU */
+		/* init FI End to false if retx_so_stop is not end of PDU */
 		if (retx_so_stop != pdu_mngt->payload_size - 1)
 		{
-			fi_end = FALSE;
+			fi_end = false;
 		}
 
 		/* Check consistency between sdus_segment_size and payload_sizeP */
@@ -596,7 +588,7 @@ mem_block_t* rlc_am_retransmit_get_am_segment(
 			data_size += sdus_segment_size[i];
 			if ((retx_so_stop == data_size - 1) && (i < num_LIs_pdu_segment))
 			{
-				fi_end = TRUE;
+				fi_end = true;
 			}
 		}
 //Assertion(eNB)_PRAN_DesignDocument_annex No.782
@@ -665,7 +657,7 @@ mem_block_t* rlc_am_retransmit_get_am_segment(
 			pdu_mngt->nack_so_start = pdu_mngt->hole_so_start[pdu_mngt->retx_hole_index];
 		}
 
-		/* Content is supposed to be init with 0 so with FIStart=FIEnd=TRUE */
+		/* Content is supposed to be init with 0 so with FIStart=FIEnd=true */
 		RLC_AM_PDU_SET_D_C(*pdu_segment_header_p);
 		RLC_AM_PDU_SET_RF(*pdu_segment_header_p);
 		/* Change FI */
diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.h
index fc5268931420556c41a4f0ca2af8d25d38f29bad..c34d06337da71763d9d27bf3a1bb46c8cbe8c4cc 100644
--- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.h
+++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.h
@@ -35,7 +35,7 @@
 #    ifndef __RLC_AM_RETRANSMIT_H__
 #        define __RLC_AM_RETRANSMIT_H__
 //-----------------------------------------------------------------------------
-/*! \fn boolean_t  rlc_am_nack_pdu (const protocol_ctxt_t* const  ctxt_pP, rlc_am_entity_t *rlcP, int16_t snP, int16_t prev_nack_snP,sdu_size_t so_startP, sdu_size_t so_endP)
+/*! \fn bool  rlc_am_nack_pdu (const protocol_ctxt_t* const  ctxt_pP, rlc_am_entity_t *rlcP, int16_t snP, int16_t prev_nack_snP,sdu_size_t so_startP, sdu_size_t so_endP)
 * \brief      The RLC AM PDU which have the sequence number snP is marked NACKed with segment offset fields.
 * \param[in]  ctxtP        Running context.
 * \param[in]  rlcP         RLC AM protocol instance pointer.
@@ -46,13 +46,12 @@
 * \return                  OK/KO
 * \note It may appear a new hole in the retransmission buffer depending on the segment offset informations. Depending on the state of the retransmission buffer, negative confirmation can be sent to higher layers about the drop by the RLC AM instance of a particular SDU.
 */
-boolean_t         rlc_am_nack_pdu (
-                              const protocol_ctxt_t* const  ctxt_pP,
-                              rlc_am_entity_t *const rlcP,
-                              const rlc_sn_t snP,
-							  const rlc_sn_t prev_nack_snP,
-                              sdu_size_t so_startP,
-                              sdu_size_t so_endP);
+bool rlc_am_nack_pdu(const protocol_ctxt_t* const  ctxt_pP,
+                     rlc_am_entity_t *const rlcP,
+                     const rlc_sn_t snP,
+                     const rlc_sn_t prev_nack_snP,
+                     sdu_size_t so_startP,
+                     sdu_size_t so_endP);
 
 /*! \fn void rlc_am_ack_pdu (const protocol_ctxt_t* const  ctxt_pP,rlc_am_entity_t *rlcP, rlc_sn_t snP)
 * \brief      The RLC AM PDU which have the sequence number snP is marked ACKed.
@@ -62,11 +61,10 @@ boolean_t         rlc_am_nack_pdu (
 * \param[in]  free_pdu     Boolean indicating that the PDU can be freed because smaller than new vtA.
 * \note                    Depending on the state of the retransmission buffer, positive confirmation can be sent to higher layers about the receiving by the peer RLC AM instance of a particular SDU.
 */
-void         rlc_am_ack_pdu (
-                              const protocol_ctxt_t* const  ctxt_pP,
-                              rlc_am_entity_t *const rlcP,
-                              const rlc_sn_t snP,
-							  boolean_t free_pdu);
+void rlc_am_ack_pdu(const protocol_ctxt_t* const  ctxt_pP,
+                    rlc_am_entity_t *const rlcP,
+                    const rlc_sn_t snP,
+							      bool free_pdu);
 
 /*! \fn mem_block_t* rlc_am_retransmit_get_copy (const protocol_ctxt_t* const  ctxt_pP, rlc_am_entity_t *rlcP, rlc_sn_t snP)
 * \brief      The RLC AM PDU which have the sequence number snP is marked ACKed.
diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.c
index 4a065539013f323cb16a146cf2dd07b975ff7a6d..bd578abab2a817d0f97e34eb575d5930ea362cff 100644
--- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.c
+++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.c
@@ -31,14 +31,13 @@
 #include "common/utils/LOG/log.h"
 
 
-boolean_t rlc_am_rx_check_vr_reassemble(
-		  const protocol_ctxt_t* const ctxt_pP,
-		  const rlc_am_entity_t* const rlc_pP)
+bool rlc_am_rx_check_vr_reassemble(const protocol_ctxt_t* const ctxt_pP,
+                                   const rlc_am_entity_t* const rlc_pP)
 {
 	mem_block_t*       cursor_p                    = rlc_pP->receiver_buffer.head;
 	rlc_am_rx_pdu_management_t * pdu_cursor_mgnt_p = NULL;
 	sdu_size_t          next_waited_so = 0;
-	boolean_t reassemble = FALSE;
+	bool reassemble = false;
 
 	if (cursor_p != NULL) {
 
@@ -48,7 +47,7 @@ boolean_t rlc_am_rx_check_vr_reassemble(
 		if (sn_ref != rlc_pP->vr_r) {
 			/* Case vrR has advanced from head : most likely case */
 
-			reassemble = TRUE;
+			reassemble = true;
 			/* Handle first SN if it is made of PDU segments : set them all to be reassembled */
 			if (pdu_info_p->rf) {
 				pdu_cursor_mgnt_p = (rlc_am_rx_pdu_management_t *) (cursor_p->data);
@@ -58,7 +57,7 @@ boolean_t rlc_am_rx_check_vr_reassemble(
                 {
                    LOG_E(RLC, "AM Rx Check Reassembly head SN=%d with PDU segments != vrR=%d should be fully received LCID=%d\n",
                          sn_ref,rlc_pP->vr_r,rlc_pP->channel_id);
-                   return FALSE;
+                   return false;
                 }
 /*
 				AssertFatal(pdu_cursor_mgnt_p->all_segments_received > 0,"AM Rx Check Reassembly head SN=%d with PDU segments != vrR=%d should be fully received LCID=%d\n",
@@ -94,7 +93,7 @@ boolean_t rlc_am_rx_check_vr_reassemble(
               {
                  LOG_E(RLC, "AM Rx Check Reassembly vr=%d should be partly received SNHead=%d LCID=%d\n",
                        rlc_pP->vr_r,sn_ref,rlc_pP->channel_id);
-                 return FALSE;
+                 return false;
               }
 /*
 				AssertFatal(pdu_cursor_mgnt_p->all_segments_received == 0,"AM Rx Check Reassembly vr=%d should be partly received SNHead=%d LCID=%d\n",
@@ -123,7 +122,7 @@ boolean_t rlc_am_rx_check_vr_reassemble(
             {
                LOG_E(RLC, "AM Rx Check Reassembly SNHead=vr=%d should be partly received LCID=%d\n",
                      rlc_pP->vr_r,rlc_pP->channel_id);
-               return FALSE;
+               return false;
             }
 /*
 			AssertFatal(pdu_cursor_mgnt_p->all_segments_received == 0,"AM Rx Check Reassembly SNHead=vr=%d should be partly received LCID=%d\n",
@@ -132,7 +131,7 @@ boolean_t rlc_am_rx_check_vr_reassemble(
 			while ((cursor_p != NULL) && (pdu_info_p->sn == rlc_pP->vr_r) && (pdu_info_p->so == next_waited_so)) {
 				if (pdu_cursor_mgnt_p->segment_reassembled == RLC_AM_RX_PDU_SEGMENT_REASSEMBLE_NO) {
 					pdu_cursor_mgnt_p->segment_reassembled = RLC_AM_RX_PDU_SEGMENT_REASSEMBLE_PENDING;
-					reassemble = TRUE;
+					reassemble = true;
 				}
 				next_waited_so += pdu_info_p->payload_size;
 				cursor_p = cursor_p->next;
@@ -157,7 +156,7 @@ mem_block_t * create_new_segment_from_pdu(
 	int16_t  new_li_list[RLC_AM_MAX_SDU_IN_PDU];
 	int16_t header_size = 0;
 	uint8_t	num_li = 0;
-	boolean_t fi_start, fi_end, lsf;
+	bool fi_start, fi_end, lsf;
 
 	/* Init some PDU Segment header fixed parameters */
 	fi_start = !((pdu_rx_info_p->fi & 0x2) >> 1);
@@ -170,11 +169,11 @@ mem_block_t * create_new_segment_from_pdu(
 		header_size = RLC_AM_PDU_SEGMENT_HEADER_MIN_SIZE;
 
 		if (so_offset) {
-			fi_start = FALSE;
+			fi_start = false;
 		}
 		if (so_offset + data_length_to_copy != pdu_rx_info_p->payload_size) {
-			fi_end = FALSE;
-			lsf = FALSE;
+			fi_end = false;
+			lsf = false;
 		}
 	} // end no LI in original segment
 	else {
@@ -185,7 +184,7 @@ mem_block_t * create_new_segment_from_pdu(
 
 		/* set LSF to false if we know that end of the original segment will not be copied */
 		if (so_offset + data_length_to_copy != pdu_rx_info_p->payload_size) {
-			lsf = FALSE;
+			lsf = false;
 		}
 
 		/* catch the first LI containing so_offset */
@@ -223,7 +222,7 @@ mem_block_t * create_new_segment_from_pdu(
 				num_li = j;
 				/* set FI End if remaining size = 0  */
 				if (remaining_size == 0) {
-					fi_end = TRUE;
+					fi_end = true;
 				}
 			}
 		}
@@ -263,7 +262,7 @@ mem_block_t * create_new_segment_from_pdu(
 		}
 
 		/* Fill Header part in the buffer */
-		/* Content is supposed to be init with 0 so with FIStart=FIEnd=TRUE */
+		/* Content is supposed to be init with 0 so with FIStart=FIEnd=true */
 		/* copy first two bytes from original: D/C + RF + FI + E+ SN*/
 		memset(pdu_segment_header_p, 0, header_size);
 		RLC_AM_PDU_SET_D_C(*pdu_segment_header_p);
@@ -1106,7 +1105,7 @@ rlc_am_rx_list_reassemble_rlc_sdus(
   do {
     if (rlc_am_rx_pdu_management_p->all_segments_received > 0) {
       cursor_p = list2_remove_head(&rlc_pP->receiver_buffer);
-      rlc_am_reassemble_pdu(ctxt_pP, rlc_pP, cursor_p,TRUE);
+      rlc_am_reassemble_pdu(ctxt_pP, rlc_pP, cursor_p, true);
       rlc_am_rx_old_pdu_management = rlc_am_rx_pdu_management_p;
       cursor_p = list2_get_head(&rlc_pP->receiver_buffer);
 
@@ -1123,7 +1122,7 @@ rlc_am_rx_list_reassemble_rlc_sdus(
     else if (rlc_am_rx_pdu_management_p->segment_reassembled == RLC_AM_RX_PDU_SEGMENT_REASSEMBLE_PENDING) {
     	rlc_am_rx_pdu_management_p->segment_reassembled = RLC_AM_RX_PDU_SEGMENT_REASSEMBLED;
 
-        rlc_am_reassemble_pdu(ctxt_pP, rlc_pP, cursor_p,FALSE);
+        rlc_am_reassemble_pdu(ctxt_pP, rlc_pP, cursor_p, false);
         rlc_am_rx_old_pdu_management = rlc_am_rx_pdu_management_p;
         cursor_p = cursor_p->next;
 
diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.h
index fd8704964d1a5fd0f752f0454f80a4ffafb604a6..18e423312cba1a53f40e1198eb2486ebacecfc54 100644
--- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.h
+++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.h
@@ -61,13 +61,13 @@ rlc_am_rx_pdu_status_t rlc_am_rx_list_check_duplicate_insert_pdu(const protocol_
 */
 signed int rlc_am_rx_list_insert_pdu(const protocol_ctxt_t* const ctxt_pP, rlc_am_entity_t* const rlcP,  mem_block_t* const tbP);
 
-/*! \fn boolean_t rlc_am_rx_check_vr_reassemble(const protocol_ctxt_t* const ctxt_pP,const rlc_am_entity_t* const rlc_pP)
+/*! \fn bool rlc_am_rx_check_vr_reassemble(const protocol_ctxt_t* const ctxt_pP,const rlc_am_entity_t* const rlc_pP)
 * \brief      Check if reassembly taking into account potential new vrR value
 * \param[in]  ctxt_pP        Running context.
 * \param[in]  rlcP         RLC AM protocol instance pointer.
-* \return     TRUE if reassembly must be done, FALSE else
+* \return     true if reassembly must be done, false else
 */
-boolean_t rlc_am_rx_check_vr_reassemble(const protocol_ctxt_t* const ctxt_pP,const rlc_am_entity_t* const rlc_pP);
+bool rlc_am_rx_check_vr_reassemble(const protocol_ctxt_t* const ctxt_pP,const rlc_am_entity_t* const rlc_pP);
 
 /*! \fn void rlc_am_rx_check_all_byte_segments(const protocol_ctxt_t* const ctxt_pP, rlc_am_entity_t* const rlcP, mem_block_t* const tbP)
 * \brief      Check if all sub-segments of a PDU are received, if yes then call rlc_am_rx_mark_all_segments_received() procedure.
diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.c
index ed81e119acb2eb4e72a4d53d1373c8d18565ed64..9e7c3338f813eed7e4cd0022da57770d06fa3ab8 100644
--- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.c
+++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.c
@@ -32,12 +32,11 @@
 #include "common/utils/LOG/log.h"
 
 //-----------------------------------------------------------------------------
-void rlc_am_pdu_polling (
-  const protocol_ctxt_t* const  ctxt_pP,
-  rlc_am_entity_t *const rlc_pP,
-  rlc_am_pdu_sn_10_t *const pdu_pP,
-  const int16_t payload_sizeP,
-  boolean_t is_new_pdu)
+void rlc_am_pdu_polling(const protocol_ctxt_t* const  ctxt_pP,
+                        rlc_am_entity_t *const rlc_pP,
+                        rlc_am_pdu_sn_10_t *const pdu_pP,
+                        const int16_t payload_sizeP,
+                        bool is_new_pdu)
 {
   // 5.2.2 Polling
   // An AM RLC entity can poll its peer AM RLC entity in order to trigger STATUS reporting at the peer AM RLC entity.
diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.h
index dc754d08e498b61024e00dffd194c4a4aa44da5e..1e472302c82effd27fdf38c92218d65e3a91c897 100644
--- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.h
+++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.h
@@ -36,14 +36,14 @@
 #        define __RLC_AM_SEGMENT_H__
 //-----------------------------------------------------------------------------
 
-/*! \fn void rlc_am_pdu_polling (const protocol_ctxt_t* const  ctxt_pP, rlc_am_entity_t *const rlcP, rlc_am_pdu_sn_10_t *pduP, int16_t payload_sizeP,boolean_t is_new_pdu)
+/*! \fn void rlc_am_pdu_polling (const protocol_ctxt_t* const  ctxt_pP, rlc_am_entity_t *const rlcP, rlc_am_pdu_sn_10_t *pduP, int16_t payload_sizeP, bool is_new_pdu)
 * \brief      Set or not the poll bit in the PDU header depending on RLC AM protocol variables.
 * \param[in]  ctxt_pP          Running context.
 * \param[in]  rlcP           RLC AM protocol instance pointer.
 * \param[in]  pduP           Pointer on the header of the PDU in order to be able to set the poll bit if necessary.
 * \param[in]  payload_sizeP  Size of the payload of the PDU.
 */
-void rlc_am_pdu_polling (const protocol_ctxt_t* const  ctxt_pP, rlc_am_entity_t *const rlcP, rlc_am_pdu_sn_10_t *pduP, int16_t payload_sizeP,boolean_t is_new_pdu);
+void rlc_am_pdu_polling (const protocol_ctxt_t* const  ctxt_pP, rlc_am_entity_t *const rlcP, rlc_am_pdu_sn_10_t *pduP, int16_t payload_sizeP, bool is_new_pdu);
 
 /*! \fn void rlc_am_segment_10 (const protocol_ctxt_t* const  ctxt_pP, rlc_am_entity_t * const rlcP)
 * \brief      Segment a PDU with 10 bits sequence number, based on segmentation information given by MAC (size to transmit).
diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.c
index 02a0247a03d2e8a3c8dc0e498a364838506d33bf..f1e6c961e704ee5ce26cf9a5b1dce2d1512cb02c 100644
--- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.c
+++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.c
@@ -237,7 +237,7 @@ rlc_am_receive_process_control_pdu(
   rlc_sn_t        nack_sn,prev_nack_sn;
   sdu_size_t    data_cnf_so_stop = 0x7FFF;
   unsigned int nack_index;
-  boolean_t status = TRUE;
+  bool status = true;
 
   if (rlc_am_get_control_pdu_infos(rlc_am_pdu_sn_10_p, tb_size_in_bytes_pP, &rlc_pP->control_pdu_info) >= 0) {
     rlc_am_tx_buffer_display(ctxt_pP, rlc_pP, " TX BUFFER BEFORE PROCESS OF STATUS PDU");
@@ -282,7 +282,7 @@ rlc_am_receive_process_control_pdu(
     if (RLC_AM_DIFF_SN(rlc_pP->vt_s,rlc_pP->vt_a) >= RLC_AM_DIFF_SN(ack_sn,rlc_pP->vt_a)) {
       if (rlc_pP->control_pdu_info.num_nack == 0) {
         while (sn_cursor != ack_sn) {
-          rlc_am_ack_pdu(ctxt_pP, rlc_pP, sn_cursor,TRUE);
+          rlc_am_ack_pdu(ctxt_pP, rlc_pP, sn_cursor, true);
           sn_cursor = RLC_AM_NEXT_SN(sn_cursor);
         }
 
@@ -294,7 +294,7 @@ rlc_am_receive_process_control_pdu(
         prev_nack_sn = 0x3FFF;
 
         while (sn_cursor != nack_sn) {
-          rlc_am_ack_pdu(ctxt_pP, rlc_pP, sn_cursor,TRUE);
+          rlc_am_ack_pdu(ctxt_pP, rlc_pP, sn_cursor, true);
           sn_cursor = RLC_AM_NEXT_SN(sn_cursor);
         }
 
@@ -316,7 +316,7 @@ rlc_am_receive_process_control_pdu(
             rlc_am_ack_pdu(ctxt_pP,
                            rlc_pP,
                            sn_cursor,
-                           FALSE);
+                           false);
           } else {
             status = rlc_am_nack_pdu (ctxt_pP,
                                       rlc_pP,
@@ -348,13 +348,13 @@ rlc_am_receive_process_control_pdu(
       LOG_E(RLC, PROTOCOL_RLC_AM_CTXT_FMT" WARNING CONTROL PDU ACK SN %d OUT OF WINDOW vtA=%d vtS=%d\n",
             PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP),ack_sn,rlc_pP->vt_a,rlc_pP->vt_s);
       *tb_size_in_bytes_pP = 0;
-      status = FALSE;
+      status = false;
     }
   } else {
     LOG_E(RLC, PROTOCOL_RLC_AM_CTXT_FMT" ERROR IN DECODING CONTROL PDU\n",
           PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP));
     *tb_size_in_bytes_pP = 0;
-    status = FALSE;
+    status = false;
   }
 
   if (status) {
@@ -480,8 +480,8 @@ rlc_am_send_status_pdu(
   int                           waited_so             = 0;
   mem_block_t                  *tb_p                  = NULL;
   sdu_size_t                    pdu_size              = 0;
-  boolean_t           status_report_completed = false;
-  boolean_t           segment_loop_end    = false;
+  bool                          status_report_completed = false;
+  bool                          segment_loop_end    = false;
   memset(&control_pdu_info, 0, sizeof(rlc_am_control_pdu_info_t));
   LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[SEND-STATUS] nb_bits_to_transmit %d (15 already allocated for header)\n",
         PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP),
diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_test.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_test.c
index 7a95a62787a58c65e114ca76bf4723e2c9c15ade..e898a601c2c7759ac41a12fffd947e4556d29b33 100644
--- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_test.c
+++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_test.c
@@ -1170,7 +1170,7 @@ void rlc_am_v9_3_0_test(void)
 {
   //     initscr();
   //     cbreak();
-  //     keypad(stdscr, TRUE);
+  //     keypad(stdscr, true);
   // under test
   pool_buffer_init();
   set_comp_log(RLC, LOG_ERR, LOG_MED, 1);
diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_poll_retransmit.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_poll_retransmit.c
index 969ed2d7a54815a085786c84c4aece717c5e087a..7aead2f30a46aa64a9e79207db673ed9af911aed 100644
--- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_poll_retransmit.c
+++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_poll_retransmit.c
@@ -111,7 +111,7 @@ rlc_am_check_timer_poll_retransmit(
 	  }
 
 
-      rlc_pP->force_poll= TRUE;
+      rlc_pP->force_poll = true;
       //BugFix : new ms_time_out is computed when next poll is transmitter
     }
   }
diff --git a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.c b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.c
index 4e3fffe176e3ba32917a38bf44c9d13e21536fc8..f079696aa911d8491cb6b0bf1e9db3e0c4d58763 100644
--- a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.c
+++ b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.c
@@ -31,13 +31,11 @@
 #include "list.h"
 #include "LAYER2/MAC/mac_extern.h"
 //-----------------------------------------------------------------------------
-void
-rlc_tm_send_sdu (
-  const protocol_ctxt_t* const  ctxt_pP,
-  rlc_tm_entity_t * const rlc_pP,
-  const boolean_t         error_indicationP,
-  uint8_t * const         srcP,
-  const sdu_size_t        length_in_bitsP)
+void rlc_tm_send_sdu(const protocol_ctxt_t* const ctxt_pP,
+                     rlc_tm_entity_t *      const rlc_pP,
+                     const bool                   error_indicationP,
+                     uint8_t *              const srcP,
+                     const sdu_size_t             length_in_bitsP)
 {
   int             length_in_bytes;
 #if DEBUG_RLC_TM_DISPLAY_ASCII_DATA
diff --git a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.h b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.h
index d2bab33b1a428fe703cac72a8fd094c5b9f35a0c..de7b9b8170673969f6713ba3b59983de27f03e90 100644
--- a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.h
+++ b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.h
@@ -51,7 +51,7 @@
 /*! \fn void rlc_tm_send_sdu (
 *        const protocol_ctxt_t* const  ctxt_pP,
 *        rlc_tm_entity_t * const rlc_pP,
-*        const boolean_t         error_indicationP,
+*        const bool            error_indicationP,
 *        uint8_t * const         srcP,
 *        const sdu_size_t        length_in_bitsP)
 * \brief    Send SDU if any reassemblied to upper layer.
@@ -60,12 +60,11 @@
 * \param[in]  srcP                SDU data pointer.
 * \param[in]  length_in_bitsP     Length of SDU in bits.
 */
-void rlc_tm_send_sdu (
-                 const protocol_ctxt_t* const  ctxt_pP,
-                 rlc_tm_entity_t * const rlc_pP,
-                 const boolean_t         error_indicationP,
-                 uint8_t * const         srcP,
-                 const sdu_size_t        length_in_bitsP);
+void rlc_tm_send_sdu(const protocol_ctxt_t* const  ctxt_pP,
+                     rlc_tm_entity_t * const rlc_pP,
+                     const bool         error_indicationP,
+                     uint8_t * const         srcP,
+                     const sdu_size_t        length_in_bitsP);
 
 /*! \fn void rlc_tm_no_segment (const protocol_ctxt_t* const  ctxt_pP, rlc_tm_entity_t * const rlcP)
 * \brief    Schedule a SDU to be transmited by lower layers.
diff --git a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_entity.h b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_entity.h
index 1a13982df65fd2bac70d02dae4452c7ea0711e0c..3c2f1804bec6eff71530fc36032252d772b45f24 100644
--- a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_entity.h
+++ b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_entity.h
@@ -40,14 +40,13 @@
 * \brief Structure containing a RLC TM instance protocol variables, allocation variables, buffers and other miscellaneous variables.
 */
 typedef struct rlc_tm_entity {
-  boolean_t            allocation;         /*!< \brief Boolean for rlc_tm_entity_t struct allocation. */
+  bool                 allocation;         /*!< \brief Boolean for rlc_tm_entity_t struct allocation. */
   rlc_protocol_state_t protocol_state;     /*!< \brief Protocol state, can be RLC_NULL_STATE, RLC_DATA_TRANSFER_READY_STATE, RLC_LOCAL_SUSPEND_STATE. */
-  boolean_t            is_uplink_downlink; /*!< \brief Is this instance is a transmitter, a receiver or both? */
-  boolean_t            is_data_plane;      /*!< \brief To know if the RLC belongs to a data radio bearer or a signalling radio bearer, for statistics and trace purpose. */
+  bool                 is_uplink_downlink; /*!< \brief Is this instance is a transmitter, a receiver or both? */
+  bool                 is_data_plane;      /*!< \brief To know if the RLC belongs to a data radio bearer or a signalling radio bearer, for statistics and trace purpose. */
   // for stats and trace purpose :
   logical_chan_id_t    channel_id;         /*!< \brief Transport channel identifier. */
   rb_id_t              rb_id;              /*!< \brief Radio bearer identifier, for statistics and trace purpose. */
-  //boolean_t            is_enb;             /*!< \brief To know if the RLC belongs to a eNB or UE. */
   //-----------------------------
   // tranmission
   //-----------------------------
diff --git a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.c b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.c
index 22e6f4d78d1a4d1b8d0dc4c855216bda7068caed..a838b2a00663e0ebb6706605b1379232da9d51de 100644
--- a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.c
+++ b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.c
@@ -133,10 +133,9 @@ rlc_tm_cleanup (
 }
 
 //-----------------------------------------------------------------------------
-void rlc_tm_configure(
-  const protocol_ctxt_t* const  ctxt_pP,
-  rlc_tm_entity_t * const rlcP,
-  const boolean_t is_uplink_downlinkP)
+void rlc_tm_configure(const protocol_ctxt_t* const  ctxt_pP,
+                      rlc_tm_entity_t * const rlcP,
+                      const bool is_uplink_downlinkP)
 {
   rlcP->is_uplink_downlink = is_uplink_downlinkP;
   rlc_tm_reset_state_variables (ctxt_pP, rlcP);
diff --git a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.h b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.h
index 57e2116a724969c37e538659628791263cb6ebb8..f315a0311ae3badd25a06753b4974abed62b8c38 100644
--- a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.h
+++ b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.h
@@ -78,27 +78,24 @@ void rlc_tm_init (
 * \brief    Reset protocol variables and state variables to initial values.
 * \param[in]  rlcP                      RLC TM protocol instance pointer.
 */
-void rlc_tm_reset_state_variables (
-                        const protocol_ctxt_t* const  ctxt_pP,
-                        rlc_tm_entity_t * const rlcP);
+void rlc_tm_reset_state_variables(const protocol_ctxt_t* const ctxt_pP,
+                                  rlc_tm_entity_t * const rlcP);
 
 /*! \fn void rlc_tm_cleanup(rlc_tm_entity_t * const rlcP)
 * \brief    Free all allocated memory (lists and buffers) previously allocated by this RLC TM instance.
 * \param[in]  rlcP                      RLC TM protocol instance pointer.
 */
-void rlc_tm_cleanup(
-                        rlc_tm_entity_t * const rlcP);
+void rlc_tm_cleanup(rlc_tm_entity_t * const rlcP);
 
-/*! \fn void rlc_tm_configure(const protocol_ctxt_t* const  ctxt_pP,rlc_tm_entity_t * const rlcP, const boolean_t is_uplink_downlinkP)
+/*! \fn void rlc_tm_configure(const protocol_ctxt_t* const  ctxt_pP,rlc_tm_entity_t * const rlcP, const bool is_uplink_downlinkP)
 * \brief    Configure RLC TM protocol parameters.
 * \param[in]  rlcP                      RLC TM protocol instance pointer.
 * \param[in]  is_uplink_downlinkP       Is this instance is TRANSMITTER_ONLY,
 RECEIVER_ONLY, or TRANSMITTER_AND_RECEIVER.
 */
-void rlc_tm_configure(
-                        const protocol_ctxt_t* const  ctxt_pP,
-                        rlc_tm_entity_t * const rlcP,
-                        const boolean_t is_uplink_downlinkP);
+void rlc_tm_configure(const protocol_ctxt_t* const  ctxt_pP,
+                      rlc_tm_entity_t * const rlcP,
+                      const bool is_uplink_downlinkP);
 
 /*! \fn void rlc_tm_set_debug_infos(const protocol_ctxt_t* const  ctxt_pP, rlc_tm_entity_t * const rlcP, const rb_id_t rb_idP, const srb_flag_t srb_flagP)
 * \brief    Set debug informations for a RLC TM protocol instance, these informations are only for trace purpose.
diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.c b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.c
index bec815ac5da6a93d4c96daaeaae2a4a611e69282..f2cb4f09b1e3227851a004c8d0271021ab101523 100644
--- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.c
+++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.c
@@ -263,7 +263,7 @@ rlc_um_init (
     }
 
     rlc_pP->first_pdu = 1;
-    rlc_pP->initialized = TRUE;
+    rlc_pP->initialized = true;
   }
 }
 //-----------------------------------------------------------------------------
diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_entity.h b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_entity.h
index 3250ac85b85c925cfaea642af929f200eecd4752..7bfa3d60ffe6f8c4ba104c9357f9689dd22d21de 100644
--- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_entity.h
+++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_entity.h
@@ -53,12 +53,11 @@ typedef struct rlc_um_timer_s {
 */
 
 typedef struct rlc_um_entity_s {
-  boolean_t            initialized;        /*!< \brief Boolean for rlc_am_entity_t struct initialization. */
-  boolean_t            is_uplink_downlink; /*!< \brief Is this instance is a transmitter, a receiver or both? */
+  bool                 initialized;        /*!< \brief Boolean for rlc_am_entity_t struct initialization. */
+  bool                 is_uplink_downlink; /*!< \brief Is this instance is a transmitter, a receiver or both? */
   rlc_protocol_state_t protocol_state;     /*!< \brief Protocol state, can be RLC_NULL_STATE, RLC_DATA_TRANSFER_READY_STATE, RLC_LOCAL_SUSPEND_STATE. */
-  boolean_t            is_data_plane;      /*!< \brief To know if the RLC belongs to a data radio bearer or a signalling radio bearer, for statistics and trace purpose. */
-  //boolean_t            is_enb;             /*!< \brief To know if the RLC belongs to a eNB or UE. */
-  boolean_t            is_mxch;            /*!< \brief To know if the RLC belongs to a MBMS bearer. */
+  bool                 is_data_plane;      /*!< \brief To know if the RLC belongs to a data radio bearer or a signalling radio bearer, for statistics and trace purpose. */
+  bool                 is_mxch;            /*!< \brief To know if the RLC belongs to a MBMS bearer. */
   //-----------------------------
   // PROTOCOL VARIABLES
   //-----------------------------
@@ -114,7 +113,7 @@ typedef struct rlc_um_entity_s {
   //-----------------------------
   // STATISTICS
   //-----------------------------
-  boolean_t         first_pdu;                        /*!< \brief Act as a boolean, tells if the next PDU is the first PDU to be received. */
+  bool              first_pdu;                        /*!< \brief Act as a boolean, tells if the next PDU is the first PDU to be received. */
 
   unsigned int stat_tx_pdcp_sdu;                      /*!< \brief Number of SDUs received from upper layers. */
   unsigned int stat_tx_pdcp_bytes;                    /*!< \brief Number of SDU bytes received from upper layers. */
diff --git a/openair2/LAYER2/RLC/rlc.c b/openair2/LAYER2/RLC/rlc.c
index b9dcf0414b99024195fe1a6bdc26f4ba7e10ef06..ec90817500d55bdf30b901518754e05f7a08f9cb 100644
--- a/openair2/LAYER2/RLC/rlc.c
+++ b/openair2/LAYER2/RLC/rlc.c
@@ -41,13 +41,12 @@
 #include "common/ran_context.h"
 extern RAN_CONTEXT_t RC;
 
-extern boolean_t pdcp_data_ind(
-  const protocol_ctxt_t *const ctxt_pP,
-  const srb_flag_t srb_flagP,
-  const MBMS_flag_t MBMS_flagP,
-  const rb_id_t rb_idP,
-  const sdu_size_t sdu_buffer_sizeP,
-  mem_block_t *const sdu_buffer_pP);
+extern bool pdcp_data_ind(const protocol_ctxt_t *const ctxt_pP,
+                          const srb_flag_t srb_flagP,
+                          const MBMS_flag_t MBMS_flagP,
+                          const rb_id_t rb_idP,
+                          const sdu_size_t sdu_buffer_sizeP,
+                          mem_block_t *const sdu_buffer_pP);
 
 #define DEBUG_RLC_PDCP_INTERFACE 1
 //#define TRACE_RLC_PAYLOAD 1
@@ -397,7 +396,7 @@ rlc_op_status_t rlc_data_req     (const protocol_ctxt_t *const ctxt_pP,
 
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RLC_DATA_REQ,VCD_FUNCTION_IN);
 
-  if (MBMS_flagP == TRUE) {
+  if (MBMS_flagP == true) {
     if (ctxt_pP->enb_flag) {
       log_ch_id = rlc_mbms_enb_get_lcid_by_rb_id(ctxt_pP->module_id,rb_idP);
       mbms_id_p = &rlc_mbms_lcid2service_session_id_eNB[ctxt_pP->module_id][log_ch_id];
diff --git a/openair2/LAYER2/RLC/rlc.h b/openair2/LAYER2/RLC/rlc.h
index 1e5b7947d7a384f209776fce7a9af2136e3eda04..1e17ff96bfcfa2a8060040dba9465b4a23163f2b 100644
--- a/openair2/LAYER2/RLC/rlc.h
+++ b/openair2/LAYER2/RLC/rlc.h
@@ -107,7 +107,7 @@ typedef  struct {
   rlc_buffer_occupancy_t       pdus_in_buffer;  /*!< \brief Number of PDUs buffered in RLC protocol instance (OBSOLETE). */
   frame_t                      head_sdu_creation_time;           /*!< \brief Head SDU creation time. */
   sdu_size_t                   head_sdu_remaining_size_to_send;  /*!< \brief remaining size of sdu: could be the total size or the remaining size of already segmented sdu */
-  boolean_t                    head_sdu_is_segmented;     /*!< \brief 0 if head SDU has not been segmented, 1 if already segmented */
+  bool                         head_sdu_is_segmented;     /*!< \brief 0 if head SDU has not been segmented, 1 if already segmented */
 } mac_rlc_status_resp_t;
 
 
diff --git a/openair2/LAYER2/RLC/rlc_mac.c b/openair2/LAYER2/RLC/rlc_mac.c
index 89cbe4c406c0e34dc0c981ffd9e66d6c634c56a7..0e1cb89fd7145262489f9c44269f4bc2c80826ee 100644
--- a/openair2/LAYER2/RLC/rlc_mac.c
+++ b/openair2/LAYER2/RLC/rlc_mac.c
@@ -425,8 +425,8 @@ rlc_buffer_occupancy_t mac_rlc_get_buffer_occupancy_ind(
   /* Assumptions : for UE only */
   /* At each TTI, Buffer Occupancy is first computed in mac_rlc_status_ind called by MAC ue_scheduler() function */
   /* Then this function is called during MAC multiplexing ue_get_sdu(), and it may be call several times for the same bearer if it is in AM mode and there are several PDU types to transmit */
-  //AssertFatal(enb_flagP == FALSE,"RLC Tx mac_rlc_get_buffer_occupancy_ind function is not implemented for eNB LcId=%d\n", channel_idP);
-  if(enb_flagP != FALSE) {
+  //AssertFatal(enb_flagP == false,"RLC Tx mac_rlc_get_buffer_occupancy_ind function is not implemented for eNB LcId=%d\n", channel_idP);
+  if(enb_flagP != false) {
     LOG_E(RLC, "Tx mac_rlc_get_buffer_occupancy_ind function is not implemented for eNB LcId=%u\n", channel_idP);
     return 0;
   }
diff --git a/openair2/LAYER2/RLC/rlc_rrc.c b/openair2/LAYER2/RLC/rlc_rrc.c
index 4313f379fe0f9e5475dbd8053215f0c73567f5d8..ed9af5efb2541c46d87c8a30637c46b06565022e 100644
--- a/openair2/LAYER2/RLC/rlc_rrc.c
+++ b/openair2/LAYER2/RLC/rlc_rrc.c
@@ -480,7 +480,7 @@ rlc_op_status_t rrc_rlc_remove_rlc   (
   /* for no gcc warnings */
   (void)lcid;
 
-  if (MBMS_flagP == TRUE) {
+  if (MBMS_flagP == true) {
     if (ctxt_pP->enb_flag) {
       lcid = rlc_mbms_enb_get_lcid_by_rb_id(ctxt_pP->module_id,rb_idP);
       mbms_id_p = &rlc_mbms_lcid2service_session_id_eNB[ctxt_pP->module_id][lcid];
@@ -581,7 +581,7 @@ rlc_union_t *rrc_rlc_add_rlc   (
   rlc_mbms_id_t         *mbms_id_p  = NULL;
   logical_chan_id_t      lcid            = 0;
 
-  if (MBMS_flagP == FALSE) {
+  if (MBMS_flagP == false) {
     //AssertFatal (rb_idP < NB_RB_MAX, "RB id is too high (%u/%d)!\n", rb_idP, NB_RB_MAX);
     //AssertFatal (chan_idP < RLC_MAX_LC, "LC id is too high (%u/%d)!\n", chan_idP, RLC_MAX_LC);
     if(rb_idP >= NB_RB_MAX) {
@@ -595,7 +595,7 @@ rlc_union_t *rrc_rlc_add_rlc   (
     }
   }
 
-  if (MBMS_flagP == TRUE) {
+  if (MBMS_flagP == true) {
     if (ctxt_pP->enb_flag) {
       lcid = rlc_mbms_enb_get_lcid_by_rb_id(ctxt_pP->module_id,rb_idP);
       mbms_id_p = &rlc_mbms_lcid2service_session_id_eNB[ctxt_pP->module_id][lcid];
@@ -640,11 +640,11 @@ rlc_union_t *rrc_rlc_add_rlc   (
   } else if (h_rc == HASH_TABLE_KEY_NOT_EXISTS) {
     rlc_union_p = calloc(1, sizeof(rlc_union_t));
     h_rc = hashtable_insert(rlc_coll_p, key, rlc_union_p);
-    if(MBMS_flagP != TRUE)
+    if(MBMS_flagP != true)
     	h_lcid_rc = hashtable_insert(rlc_coll_p, key_lcid, rlc_union_p);
 
     if ((h_rc == HASH_TABLE_OK) && (h_lcid_rc == HASH_TABLE_OK)) {
-      if (MBMS_flagP == TRUE) {
+      if (MBMS_flagP == true) {
         LOG_I(RLC, PROTOCOL_CTXT_FMT" RLC service id %u session id %u rrc_rlc_add_rlc\n",
               PROTOCOL_CTXT_ARGS(ctxt_pP),
               mbms_id_p->service_id,
diff --git a/openair2/LAYER2/nr_pdcp/nr_pdcp_entity.c b/openair2/LAYER2/nr_pdcp/nr_pdcp_entity.c
index 7e1ddb62bd87ab94100d7863029897f1916dd86d..480b651593f0bdc027ecb438eb4cd4ddd4a7add9 100644
--- a/openair2/LAYER2/nr_pdcp/nr_pdcp_entity.c
+++ b/openair2/LAYER2/nr_pdcp/nr_pdcp_entity.c
@@ -27,6 +27,7 @@
 
 #include "nr_pdcp_security_nea2.h"
 #include "nr_pdcp_integrity_nia2.h"
+#include "nr_pdcp_integrity_nia1.h"
 #include "nr_pdcp_sdu.h"
 
 #include "LOG/log.h"
@@ -240,16 +241,21 @@ static void nr_pdcp_entity_set_security(nr_pdcp_entity_t *entity,
   }
 
   if (integrity_algorithm != 0 && integrity_algorithm != -1) {
-    if (integrity_algorithm != 2) {
-      LOG_E(PDCP, "FATAL: only nia2 supported for the moment\n");
-      exit(1);
-    }
     entity->has_integrity = 1;
     if (entity->free_integrity != NULL)
       entity->free_integrity(entity->integrity_context);
-    entity->integrity_context = nr_pdcp_integrity_nia2_init(entity->integrity_key);
-    entity->integrity = nr_pdcp_integrity_nia2_integrity;
-    entity->free_integrity = nr_pdcp_integrity_nia2_free_integrity;
+    if (integrity_algorithm == 2) {
+      entity->integrity_context = nr_pdcp_integrity_nia2_init(entity->integrity_key);
+      entity->integrity = nr_pdcp_integrity_nia2_integrity;
+      entity->free_integrity = nr_pdcp_integrity_nia2_free_integrity;
+    } else if (integrity_algorithm == 1) {
+      entity->integrity_context = nr_pdcp_integrity_nia1_init(entity->integrity_key);
+      entity->integrity = nr_pdcp_integrity_nia1_integrity;
+      entity->free_integrity = nr_pdcp_integrity_nia1_free_integrity;
+    } else {
+      LOG_E(PDCP, "FATAL: only nia1 and nia2 supported for the moment\n");
+      exit(1);
+    }
   }
 
   if (ciphering_algorithm == 0) {
diff --git a/openair2/LAYER2/nr_pdcp/nr_pdcp_integrity_nia1.c b/openair2/LAYER2/nr_pdcp/nr_pdcp_integrity_nia1.c
new file mode 100644
index 0000000000000000000000000000000000000000..08ec95993703e6ae6ab25d3383dbc5c2a9e69ece
--- /dev/null
+++ b/openair2/LAYER2/nr_pdcp/nr_pdcp_integrity_nia1.c
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+#include "nr_pdcp_integrity_nia1.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdint.h>
+#include <openssl/cmac.h>
+
+#include "UTIL/OSA/osa_defs.h"
+
+int stream_compute_integrity_eia1(stream_cipher_t *stream_cipher, uint8_t out[4]);
+
+void *nr_pdcp_integrity_nia1_init(unsigned char *integrity_key)
+{
+  stream_cipher_t *ret;
+
+  ret = calloc(1, sizeof(*ret)); if (ret == NULL) abort();
+  ret->key = malloc(16); if (ret->key == NULL) abort();
+  memcpy(ret->key, integrity_key, 16);
+  ret->key_length = 16;   /* unused */
+
+  return ret;
+}
+
+void nr_pdcp_integrity_nia1_integrity(void *integrity_context,
+                            unsigned char *out,
+                            unsigned char *buffer, int length,
+                            int bearer, int count, int direction)
+{
+  stream_cipher_t *ctx = integrity_context;
+
+  ctx->message = buffer;
+  ctx->count = count;
+  ctx->bearer = bearer-1;
+  ctx->direction = direction;
+  ctx->blength = length * 8;
+
+  stream_compute_integrity_eia1(ctx, out);
+}
+
+void nr_pdcp_integrity_nia1_free_integrity(void *integrity_context)
+{
+  stream_cipher_t *ctx = integrity_context;
+  free(ctx->key);
+  free(ctx);
+}
diff --git a/openair2/LAYER2/nr_pdcp/nr_pdcp_integrity_nia1.h b/openair2/LAYER2/nr_pdcp/nr_pdcp_integrity_nia1.h
new file mode 100644
index 0000000000000000000000000000000000000000..5c44bad4a7dbdeb2e515b6f3d7dd850b0b1f2764
--- /dev/null
+++ b/openair2/LAYER2/nr_pdcp/nr_pdcp_integrity_nia1.h
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+#ifndef _NR_PDCP_INTEGRITY_NIA1_H_
+#define _NR_PDCP_INTEGRITY_NIA1_H_
+
+void *nr_pdcp_integrity_nia1_init(unsigned char *integrity_key);
+
+void nr_pdcp_integrity_nia1_integrity(void *integrity_context,
+                            unsigned char *out,
+                            unsigned char *buffer, int length,
+                            int bearer, int count, int direction);
+
+void nr_pdcp_integrity_nia1_free_integrity(void *integrity_context);
+
+#endif /* _NR_PDCP_INTEGRITY_NIA1_H_ */
diff --git a/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c b/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c
index b5cea6bdb99e2c48eafbff91e4ad92f9680ca691..9598bf1ad6a4d8b6407aec0455e214aeb6cb847a 100644
--- a/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c
+++ b/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c
@@ -274,9 +274,8 @@ static void do_pdcp_data_ind(
   if (rb != NULL) {
     rb->recv_pdu(rb, (char *)sdu_buffer->data, sdu_buffer_size);
   } else {
-    LOG_E(PDCP, "%s:%d:%s: fatal: no RB found (rb_id %ld, srb_flag %d)\n",
+    LOG_E(PDCP, "%s:%d:%s: no RB found (rb_id %ld, srb_flag %d)\n",
           __FILE__, __LINE__, __FUNCTION__, rb_id, srb_flagP);
-    exit(1);
   }
 
   nr_pdcp_manager_unlock(nr_pdcp_ue_manager);
@@ -360,15 +359,14 @@ static void enqueue_pdcp_data_ind(
   if (pthread_mutex_unlock(&pq.m) != 0) abort();
 }
 
-boolean_t pdcp_data_ind(
-  const protocol_ctxt_t *const  ctxt_pP,
-  const srb_flag_t srb_flagP,
-  const MBMS_flag_t MBMS_flagP,
-  const rb_id_t rb_id,
-  const sdu_size_t sdu_buffer_size,
-  mem_block_t *const sdu_buffer,
-  const uint32_t *const srcID,
-  const uint32_t *const dstID)
+bool pdcp_data_ind(const protocol_ctxt_t *const  ctxt_pP,
+                   const srb_flag_t srb_flagP,
+                   const MBMS_flag_t MBMS_flagP,
+                   const rb_id_t rb_id,
+                   const sdu_size_t sdu_buffer_size,
+                   mem_block_t *const sdu_buffer,
+                   const uint32_t *const srcID,
+                   const uint32_t *const dstID)
 {
   enqueue_pdcp_data_ind(ctxt_pP,
                         srb_flagP,
@@ -439,7 +437,7 @@ static void *enb_tun_read_thread(void *_)
     ctxt.rnti = rnti;
 
     uint8_t qfi = 7;
-    boolean_t rqi = 0;
+    bool rqi = 0;
     int pdusession_id = 10;
 
     sdap_data_req(&ctxt, SRB_FLAG_NO, rb_id, RLC_MUI_UNDEFINED,
@@ -485,7 +483,7 @@ static void *ue_tun_read_thread(void *_)
 
     ctxt.rnti = rnti;
 
-    boolean_t dc = SDAP_HDR_UL_DATA_PDU;
+    bool dc = SDAP_HDR_UL_DATA_PDU;
     uint8_t qfi = 7;
     int pdusession_id = 10;
 
@@ -859,7 +857,7 @@ void pdcp_run(const protocol_ctxt_t *const  ctxt_pP)
                              RRC_DCCH_DATA_REQ(msg_p).mode,
                              NULL, NULL);
 
-      if (result != TRUE)
+      if (result != true)
         LOG_E(PDCP, "PDCP data request failed!\n");
       result = itti_free(ITTI_MSG_ORIGIN_ID(msg_p), RRC_DCCH_DATA_REQ(msg_p).sdu_p);
       AssertFatal(result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
@@ -951,7 +949,7 @@ static void add_drb_am(int is_gnb, int rnti, struct NR_DRB_ToAddMod *s,
   int has_sdap = 0;
   int has_sdapULheader=0;
   int has_sdapDLheader=0;
-  boolean_t is_sdap_DefaultDRB = false;
+  bool is_sdap_DefaultDRB = false;
   NR_QFI_t *mappedQFIs2Add = NULL;
   uint8_t mappedQFIs2AddCount=0;
   if (s->cnAssociation->present == NR_DRB_ToAddMod__cnAssociation_PR_eps_BearerIdentity)
@@ -977,11 +975,6 @@ static void add_drb_am(int is_gnb, int rnti, struct NR_DRB_ToAddMod *s,
     exit(1);
   }
 
-  if (drb_id != 1) {
-    LOG_E(PDCP, "%s:%d:%s: fatal, bad drb id %d\n",
-          __FILE__, __LINE__, __FUNCTION__, drb_id);
-    exit(1);
-  }
 
   nr_pdcp_manager_lock(nr_pdcp_ue_manager);
   ue = nr_pdcp_manager_get_ue(nr_pdcp_ue_manager, rnti);
@@ -1039,20 +1032,18 @@ static void add_drb(int is_gnb, int rnti, struct NR_DRB_ToAddMod *s,
   LOG_I(PDCP, "%s:%s:%d: added DRB for UE RNTI %x\n", __FILE__, __FUNCTION__, __LINE__, rnti);
 }
 
-boolean_t nr_rrc_pdcp_config_asn1_req(
-  const protocol_ctxt_t *const  ctxt_pP,
-  NR_SRB_ToAddModList_t  *const srb2add_list,
-  NR_DRB_ToAddModList_t  *const drb2add_list,
-  NR_DRB_ToReleaseList_t *const drb2release_list,
-  const uint8_t                   security_modeP,
-  uint8_t                  *const kRRCenc,
-  uint8_t                  *const kRRCint,
-  uint8_t                  *const kUPenc,
-  uint8_t                  *const kUPint
-  ,LTE_PMCH_InfoList_r9_t  *pmch_InfoList_r9
-  ,rb_id_t                 *const defaultDRB,
-  struct NR_CellGroupConfig__rlc_BearerToAddModList *rlc_bearer2add_list)
-  //struct NR_RLC_Config     *rlc_Config)
+bool nr_rrc_pdcp_config_asn1_req(const protocol_ctxt_t *const  ctxt_pP,
+                                 NR_SRB_ToAddModList_t  *const srb2add_list,
+                                 NR_DRB_ToAddModList_t  *const drb2add_list,
+                                 NR_DRB_ToReleaseList_t *const drb2release_list,
+                                 const uint8_t                   security_modeP,
+                                 uint8_t                  *const kRRCenc,
+                                 uint8_t                  *const kRRCint,
+                                 uint8_t                  *const kUPenc,
+                                 uint8_t                  *const kUPint,
+                                 LTE_PMCH_InfoList_r9_t  *pmch_InfoList_r9,
+                                 rb_id_t                 *const defaultDRB,
+                                 struct NR_CellGroupConfig__rlc_BearerToAddModList *rlc_bearer2add_list)
 {
   int rnti = ctxt_pP->rnti;
   int i;
@@ -1110,17 +1101,16 @@ boolean_t nr_rrc_pdcp_config_asn1_req(
 }
 
 /* Dummy function due to dependency from LTE libraries */
-boolean_t rrc_pdcp_config_asn1_req(
-  const protocol_ctxt_t *const  ctxt_pP,
-  LTE_SRB_ToAddModList_t  *const srb2add_list,
-  LTE_DRB_ToAddModList_t  *const drb2add_list,
-  LTE_DRB_ToReleaseList_t *const drb2release_list,
-  const uint8_t                   security_modeP,
-  uint8_t                  *const kRRCenc,
-  uint8_t                  *const kRRCint,
-  uint8_t                  *const kUPenc
-  ,LTE_PMCH_InfoList_r9_t  *pmch_InfoList_r9
-  ,rb_id_t                 *const defaultDRB)
+bool rrc_pdcp_config_asn1_req(const protocol_ctxt_t *const  ctxt_pP,
+                              LTE_SRB_ToAddModList_t  *const srb2add_list,
+                              LTE_DRB_ToAddModList_t  *const drb2add_list,
+                              LTE_DRB_ToReleaseList_t *const drb2release_list,
+                              const uint8_t                   security_modeP,
+                              uint8_t                  *const kRRCenc,
+                              uint8_t                  *const kRRCint,
+                              uint8_t                  *const kUPenc,
+                              LTE_PMCH_InfoList_r9_t  *pmch_InfoList_r9,
+                              rb_id_t                 *const defaultDRB)
 {
   return 0;
 }
@@ -1225,8 +1215,7 @@ uint64_t get_pdcp_optmask(void)
   return pdcp_optmask;
 }
 
-boolean_t pdcp_remove_UE(
-  const protocol_ctxt_t *const  ctxt_pP)
+bool pdcp_remove_UE(const protocol_ctxt_t *const ctxt_pP)
 {
   int rnti = ctxt_pP->rnti;
 
@@ -1281,13 +1270,12 @@ void pdcp_config_set_security(
   nr_pdcp_manager_unlock(nr_pdcp_ue_manager);
 }
 
-static boolean_t pdcp_data_req_srb(
-  protocol_ctxt_t  *ctxt_pP,
-  const rb_id_t rb_id,
-  const mui_t muiP,
-  const confirm_t confirmP,
-  const sdu_size_t sdu_buffer_size,
-  unsigned char *const sdu_buffer)
+static bool pdcp_data_req_srb(protocol_ctxt_t  *ctxt_pP,
+                              const rb_id_t rb_id,
+                              const mui_t muiP,
+                              const confirm_t confirmP,
+                              const sdu_size_t sdu_buffer_size,
+                              unsigned char *const sdu_buffer)
 {
   LOG_D(PDCP, "%s() called, size %d\n", __func__, sdu_buffer_size);
   nr_pdcp_ue_t *ue;
@@ -1328,13 +1316,12 @@ static boolean_t pdcp_data_req_srb(
 }
 
 
-static boolean_t pdcp_data_req_drb(
-  protocol_ctxt_t  *ctxt_pP,
-  const rb_id_t rb_id,
-  const mui_t muiP,
-  const confirm_t confirmP,
-  const sdu_size_t sdu_buffer_size,
-  unsigned char *const sdu_buffer)
+static bool pdcp_data_req_drb(protocol_ctxt_t  *ctxt_pP,
+                              const rb_id_t rb_id,
+                              const mui_t muiP,
+                              const confirm_t confirmP,
+                              const sdu_size_t sdu_buffer_size,
+                              unsigned char *const sdu_buffer)
 {
   LOG_D(PDCP, "%s() called, size %d\n", __func__, sdu_buffer_size);
   nr_pdcp_ue_t *ue;
@@ -1374,19 +1361,16 @@ static boolean_t pdcp_data_req_drb(
   return 1;
 }
 
-boolean_t cu_f1u_data_req(
-  protocol_ctxt_t  *ctxt_pP,
-  const srb_flag_t srb_flagP,
-  const rb_id_t rb_id,
-  const mui_t muiP,
-  const confirm_t confirmP,
-  const sdu_size_t sdu_buffer_size,
-  unsigned char *const sdu_buffer,
-  const pdcp_transmission_mode_t mode
-  ,const uint32_t *const sourceL2Id
-  ,const uint32_t *const destinationL2Id
-  ) {
-
+bool cu_f1u_data_req(protocol_ctxt_t  *ctxt_pP,
+                     const srb_flag_t srb_flagP,
+                     const rb_id_t rb_id,
+                     const mui_t muiP,
+                     const confirm_t confirmP,
+                     const sdu_size_t sdu_buffer_size,
+                     unsigned char *const sdu_buffer,
+                     const pdcp_transmission_mode_t mode,
+                     const uint32_t *const sourceL2Id,
+                     const uint32_t *const destinationL2Id) {
   //Force instance id to 0, OAI incoherent instance management
   ctxt_pP->instance=0;
   mem_block_t *memblock = get_free_mem_block(sdu_buffer_size, __func__);
@@ -1403,18 +1387,16 @@ boolean_t cu_f1u_data_req(
   return ret;
 }
 
-boolean_t pdcp_data_req(
-  protocol_ctxt_t  *ctxt_pP,
-  const srb_flag_t srb_flagP,
-  const rb_id_t rb_id,
-  const mui_t muiP,
-  const confirm_t confirmP,
-  const sdu_size_t sdu_buffer_size,
-  unsigned char *const sdu_buffer,
-  const pdcp_transmission_mode_t mode
-  ,const uint32_t *const sourceL2Id
-  ,const uint32_t *const destinationL2Id
-  )
+bool pdcp_data_req(protocol_ctxt_t  *ctxt_pP,
+                   const srb_flag_t srb_flagP,
+                   const rb_id_t rb_id,
+                   const mui_t muiP,
+                   const confirm_t confirmP,
+                   const sdu_size_t sdu_buffer_size,
+                   unsigned char *const sdu_buffer,
+                   const pdcp_transmission_mode_t mode,
+                   const uint32_t *const sourceL2Id,
+                   const uint32_t *const destinationL2Id)
 {
   if (srb_flagP) {
    return pdcp_data_req_srb(ctxt_pP, rb_id, muiP, confirmP, sdu_buffer_size, sdu_buffer);
diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_entity.c b/openair2/LAYER2/nr_rlc/nr_rlc_entity.c
index fefe2fc77d4bf6a4ca606343133579cd4f2ecc2c..1883bbdd6cc0400debd3465cca665c34b82005bc 100644
--- a/openair2/LAYER2/nr_rlc/nr_rlc_entity.c
+++ b/openair2/LAYER2/nr_rlc/nr_rlc_entity.c
@@ -77,14 +77,15 @@ nr_rlc_entity_t *new_nr_rlc_entity_am(
   ret->sn_modulus = 1 << ret->sn_field_length;
   ret->window_size = ret->sn_modulus / 2;
 
-  ret->common.recv_pdu        = nr_rlc_entity_am_recv_pdu;
-  ret->common.buffer_status   = nr_rlc_entity_am_buffer_status;
-  ret->common.generate_pdu    = nr_rlc_entity_am_generate_pdu;
-  ret->common.recv_sdu        = nr_rlc_entity_am_recv_sdu;
-  ret->common.set_time        = nr_rlc_entity_am_set_time;
-  ret->common.discard_sdu     = nr_rlc_entity_am_discard_sdu;
-  ret->common.reestablishment = nr_rlc_entity_am_reestablishment;
-  ret->common.delete          = nr_rlc_entity_am_delete;
+  ret->common.recv_pdu           = nr_rlc_entity_am_recv_pdu;
+  ret->common.buffer_status      = nr_rlc_entity_am_buffer_status;
+  ret->common.generate_pdu       = nr_rlc_entity_am_generate_pdu;
+  ret->common.recv_sdu           = nr_rlc_entity_am_recv_sdu;
+  ret->common.set_time           = nr_rlc_entity_am_set_time;
+  ret->common.discard_sdu        = nr_rlc_entity_am_discard_sdu;
+  ret->common.reestablishment    = nr_rlc_entity_am_reestablishment;
+  ret->common.delete             = nr_rlc_entity_am_delete;
+  ret->common.available_tx_space = nr_rlc_entity_am_available_tx_space;
 
   ret->common.deliver_sdu                  = deliver_sdu;
   ret->common.deliver_sdu_data             = deliver_sdu_data;
@@ -127,14 +128,15 @@ nr_rlc_entity_t *new_nr_rlc_entity_um(
   ret->sn_modulus = 1 << ret->sn_field_length;
   ret->window_size = ret->sn_modulus / 2;
 
-  ret->common.recv_pdu        = nr_rlc_entity_um_recv_pdu;
-  ret->common.buffer_status   = nr_rlc_entity_um_buffer_status;
-  ret->common.generate_pdu    = nr_rlc_entity_um_generate_pdu;
-  ret->common.recv_sdu        = nr_rlc_entity_um_recv_sdu;
-  ret->common.set_time        = nr_rlc_entity_um_set_time;
-  ret->common.discard_sdu     = nr_rlc_entity_um_discard_sdu;
-  ret->common.reestablishment = nr_rlc_entity_um_reestablishment;
-  ret->common.delete          = nr_rlc_entity_um_delete;
+  ret->common.recv_pdu           = nr_rlc_entity_um_recv_pdu;
+  ret->common.buffer_status      = nr_rlc_entity_um_buffer_status;
+  ret->common.generate_pdu       = nr_rlc_entity_um_generate_pdu;
+  ret->common.recv_sdu           = nr_rlc_entity_um_recv_sdu;
+  ret->common.set_time           = nr_rlc_entity_um_set_time;
+  ret->common.discard_sdu        = nr_rlc_entity_um_discard_sdu;
+  ret->common.reestablishment    = nr_rlc_entity_um_reestablishment;
+  ret->common.delete             = nr_rlc_entity_um_delete;
+  ret->common.available_tx_space = nr_rlc_entity_um_available_tx_space;
 
   ret->common.deliver_sdu                  = deliver_sdu;
   ret->common.deliver_sdu_data             = deliver_sdu_data;
@@ -158,14 +160,15 @@ nr_rlc_entity_t *new_nr_rlc_entity_tm(
 
   ret->tx_maxsize = tx_maxsize;
 
-  ret->common.recv_pdu        = nr_rlc_entity_tm_recv_pdu;
-  ret->common.buffer_status   = nr_rlc_entity_tm_buffer_status;
-  ret->common.generate_pdu    = nr_rlc_entity_tm_generate_pdu;
-  ret->common.recv_sdu        = nr_rlc_entity_tm_recv_sdu;
-  ret->common.set_time        = nr_rlc_entity_tm_set_time;
-  ret->common.discard_sdu     = nr_rlc_entity_tm_discard_sdu;
-  ret->common.reestablishment = nr_rlc_entity_tm_reestablishment;
-  ret->common.delete          = nr_rlc_entity_tm_delete;
+  ret->common.recv_pdu           = nr_rlc_entity_tm_recv_pdu;
+  ret->common.buffer_status      = nr_rlc_entity_tm_buffer_status;
+  ret->common.generate_pdu       = nr_rlc_entity_tm_generate_pdu;
+  ret->common.recv_sdu           = nr_rlc_entity_tm_recv_sdu;
+  ret->common.set_time           = nr_rlc_entity_tm_set_time;
+  ret->common.discard_sdu        = nr_rlc_entity_tm_discard_sdu;
+  ret->common.reestablishment    = nr_rlc_entity_tm_reestablishment;
+  ret->common.delete             = nr_rlc_entity_tm_delete;
+  ret->common.available_tx_space = nr_rlc_entity_tm_available_tx_space;
 
   ret->common.deliver_sdu                  = deliver_sdu;
   ret->common.deliver_sdu_data             = deliver_sdu_data;
diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_entity.h b/openair2/LAYER2/nr_rlc/nr_rlc_entity.h
index b9b638fe0784385c78ced73865ed2148c491ef1a..5cd3bee650835ee66702814655b4eb27e3c3a681 100644
--- a/openair2/LAYER2/nr_rlc/nr_rlc_entity.h
+++ b/openair2/LAYER2/nr_rlc/nr_rlc_entity.h
@@ -50,6 +50,8 @@ typedef struct nr_rlc_entity_t {
 
   void (*delete)(struct nr_rlc_entity_t *entity);
 
+  int (*available_tx_space)(struct nr_rlc_entity_t *entity);
+
   /* callbacks provided to the RLC module */
   void (*deliver_sdu)(void *deliver_sdu_data, struct nr_rlc_entity_t *entity,
                       char *buf, int size);
diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_entity_am.c b/openair2/LAYER2/nr_rlc/nr_rlc_entity_am.c
index 2382db267fe68283e8ba2c251ec7d49966246daa..91e2bed11ae1705dae6d1cc23aa704c06bf90e52 100644
--- a/openair2/LAYER2/nr_rlc/nr_rlc_entity_am.c
+++ b/openair2/LAYER2/nr_rlc/nr_rlc_entity_am.c
@@ -1910,3 +1910,9 @@ void nr_rlc_entity_am_delete(nr_rlc_entity_t *_entity)
   clear_entity(entity);
   free(entity);
 }
+
+int nr_rlc_entity_am_available_tx_space(nr_rlc_entity_t *_entity)
+{
+  nr_rlc_entity_am_t *entity = (nr_rlc_entity_am_t *)_entity;
+  return entity->tx_maxsize - entity->tx_size;
+}
diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_entity_am.h b/openair2/LAYER2/nr_rlc/nr_rlc_entity_am.h
index 57ae1a3485698dd7056e87d97b01b51f35ac001d..4c626c4826b68941b80d73107038dbd53f7d638f 100644
--- a/openair2/LAYER2/nr_rlc/nr_rlc_entity_am.h
+++ b/openair2/LAYER2/nr_rlc/nr_rlc_entity_am.h
@@ -99,5 +99,6 @@ void nr_rlc_entity_am_set_time(nr_rlc_entity_t *entity, uint64_t now);
 void nr_rlc_entity_am_discard_sdu(nr_rlc_entity_t *_entity, int sdu_id);
 void nr_rlc_entity_am_reestablishment(nr_rlc_entity_t *_entity);
 void nr_rlc_entity_am_delete(nr_rlc_entity_t *entity);
+int nr_rlc_entity_am_available_tx_space(nr_rlc_entity_t *entity);
 
 #endif /* _NR_RLC_ENTITY_AM_H_ */
diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_entity_tm.c b/openair2/LAYER2/nr_rlc/nr_rlc_entity_tm.c
index 75408276d18e688491313d3e8fb589fcb754b68d..f85edbba0ff623a14011e8ab8636eecc2b7958fc 100644
--- a/openair2/LAYER2/nr_rlc/nr_rlc_entity_tm.c
+++ b/openair2/LAYER2/nr_rlc/nr_rlc_entity_tm.c
@@ -174,3 +174,9 @@ void nr_rlc_entity_tm_delete(nr_rlc_entity_t *_entity)
   clear_entity(entity);
   free(entity);
 }
+
+int nr_rlc_entity_tm_available_tx_space(nr_rlc_entity_t *_entity)
+{
+  nr_rlc_entity_tm_t *entity = (nr_rlc_entity_tm_t *)_entity;
+  return entity->tx_maxsize - entity->tx_size;
+}
diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_entity_tm.h b/openair2/LAYER2/nr_rlc/nr_rlc_entity_tm.h
index 7c8c7e40a01cabb2b013f83469f0e9d91c4ed124..79187037999141f8722be3358298f90383550767 100644
--- a/openair2/LAYER2/nr_rlc/nr_rlc_entity_tm.h
+++ b/openair2/LAYER2/nr_rlc/nr_rlc_entity_tm.h
@@ -51,5 +51,6 @@ void nr_rlc_entity_tm_set_time(nr_rlc_entity_t *entity, uint64_t now);
 void nr_rlc_entity_tm_discard_sdu(nr_rlc_entity_t *_entity, int sdu_id);
 void nr_rlc_entity_tm_reestablishment(nr_rlc_entity_t *_entity);
 void nr_rlc_entity_tm_delete(nr_rlc_entity_t *entity);
+int nr_rlc_entity_tm_available_tx_space(nr_rlc_entity_t *entity);
 
 #endif /* _NR_RLC_ENTITY_TM_H_ */
diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_entity_um.c b/openair2/LAYER2/nr_rlc/nr_rlc_entity_um.c
index b34a7dc89410f621ca0a3fc68980a7648e13355e..5f2fd592a06672a1b26007d0ae119627114a5eb1 100644
--- a/openair2/LAYER2/nr_rlc/nr_rlc_entity_um.c
+++ b/openair2/LAYER2/nr_rlc/nr_rlc_entity_um.c
@@ -695,3 +695,9 @@ void nr_rlc_entity_um_delete(nr_rlc_entity_t *_entity)
   clear_entity(entity);
   free(entity);
 }
+
+int nr_rlc_entity_um_available_tx_space(nr_rlc_entity_t *_entity)
+{
+  nr_rlc_entity_um_t *entity = (nr_rlc_entity_um_t *)_entity;
+  return entity->tx_maxsize - entity->tx_size;
+}
diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_entity_um.h b/openair2/LAYER2/nr_rlc/nr_rlc_entity_um.h
index 21063a1ea18f08abc2e00d0aedd1f09fc4b86d6a..c40e72ada1da249f718fd3641fd8e830037c21b8 100644
--- a/openair2/LAYER2/nr_rlc/nr_rlc_entity_um.h
+++ b/openair2/LAYER2/nr_rlc/nr_rlc_entity_um.h
@@ -75,5 +75,6 @@ void nr_rlc_entity_um_set_time(nr_rlc_entity_t *entity, uint64_t now);
 void nr_rlc_entity_um_discard_sdu(nr_rlc_entity_t *_entity, int sdu_id);
 void nr_rlc_entity_um_reestablishment(nr_rlc_entity_t *_entity);
 void nr_rlc_entity_um_delete(nr_rlc_entity_t *entity);
+int nr_rlc_entity_um_available_tx_space(nr_rlc_entity_t *entity);
 
 #endif /* _NR_RLC_ENTITY_UM_H_ */
diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c
index 0a8e03fc1e871f1c4d0813e7a0794437ecf28d1b..4bd4ea75fd74895afb6e51191188cb7c51be1458 100644
--- a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c
+++ b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c
@@ -101,6 +101,7 @@ void nr_drb_config(struct NR_RLC_Config *rlc_Config, NR_RLC_Config_PR rlc_config
   switch (rlc_config_pr){
     case NR_RLC_Config_PR_um_Bi_Directional:
       // RLC UM Bi-directional Bearer configuration
+      LOG_I(RLC, "RLC UM Bi-directional Bearer configuration selected \n");
       rlc_Config->choice.um_Bi_Directional                            = calloc(1, sizeof(*rlc_Config->choice.um_Bi_Directional));
       rlc_Config->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength  = calloc(1, sizeof(*rlc_Config->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength));
       *rlc_Config->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength = NR_SN_FieldLengthUM_size12;
@@ -123,7 +124,7 @@ void nr_drb_config(struct NR_RLC_Config *rlc_Config, NR_RLC_Config_PR rlc_config
       rlc_Config->choice.am->dl_AM_RLC.t_StatusProhibit = NR_T_StatusProhibit_ms15;
       break;
     default:
-      LOG_E (RLC, "Error in %s: RLC config type %d is not handled\n", __FUNCTION__, rlc_config_pr);
+      AssertFatal(0, "RLC config type %d not handled\n", rlc_config_pr);
       break;
     }
 
@@ -213,10 +214,12 @@ tbs_size_t mac_rlc_data_req(
   }
 
   if (rb != NULL) {
+    LOG_D(RLC, "MAC PDU to get created for channel_idP:%d \n", channel_idP);
     rb->set_time(rb, nr_rlc_current_time);
     maxsize = tb_sizeP;
     ret = rb->generate_pdu(rb, buffer_pP, maxsize);
   } else {
+    LOG_D(RLC, "MAC PDU failed to get created for channel_idP:%d \n", channel_idP);
     ret = 0;
   }
 
@@ -394,6 +397,35 @@ rlc_op_status_t rlc_data_req     (const protocol_ctxt_t *const ctxt_pP,
   return RLC_OP_STATUS_OK;
 }
 
+int nr_rlc_get_available_tx_space(
+  const rnti_t            rntiP,
+  const logical_chan_id_t channel_idP)
+{
+  nr_rlc_ue_t *ue;
+  nr_rlc_entity_t *rb;
+  int ret;
+
+  nr_rlc_manager_lock(nr_rlc_ue_manager);
+  ue = nr_rlc_manager_get_ue(nr_rlc_ue_manager, rntiP);
+
+  switch (channel_idP) {
+  case 1 ... 3: rb = ue->srb[channel_idP - 1]; break;
+  case 4 ... 8: rb = ue->drb[channel_idP - 4]; break;
+  default:      rb = NULL;                     break;
+  }
+
+  if (rb != NULL) {
+    ret = rb->available_tx_space(rb);
+  } else {
+    LOG_E(RLC, "[%s] Radio Bearer (channel ID %d) is NULL for UE with rntiP %x\n", __FUNCTION__, channel_idP, rntiP);
+    ret = -1;
+  }
+
+  nr_rlc_manager_unlock(nr_rlc_ue_manager);
+
+  return ret;
+}
+
 int rlc_module_init(int enb_flag)
 {
   static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.h b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.h
index 6b3c2281637d00454f7706fa61b562ebcf11abf5..92fbba9bec8071d0c43b25aec631cf1fab62d459 100644
--- a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.h
+++ b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.h
@@ -46,4 +46,8 @@ void nr_rlc_bearer_init(NR_RLC_BearerConfig_t *RLC_BearerConfig, NR_RLC_BearerCo
 
 void nr_drb_config(struct NR_RLC_Config *rlc_Config, NR_RLC_Config_PR rlc_config_pr);
 
-void nr_rlc_bearer_init_ul_spec(struct NR_LogicalChannelConfig *mac_LogicalChannelConfig);
\ No newline at end of file
+void nr_rlc_bearer_init_ul_spec(struct NR_LogicalChannelConfig *mac_LogicalChannelConfig);
+
+int nr_rlc_get_available_tx_space(
+  const rnti_t            rntiP,
+  const logical_chan_id_t channel_idP);
diff --git a/openair2/LAYER2/nr_rlc/tests/test14.txt.gz b/openair2/LAYER2/nr_rlc/tests/test14.txt.gz
index 45e54651eb317c3b7695cfcab7428fe43172227b..53cea67c98d98e91baa4bfcd40518b523ef5a21f 100644
Binary files a/openair2/LAYER2/nr_rlc/tests/test14.txt.gz and b/openair2/LAYER2/nr_rlc/tests/test14.txt.gz differ
diff --git a/openair2/LAYER2/nr_rlc/tests/test15.txt.gz b/openair2/LAYER2/nr_rlc/tests/test15.txt.gz
index ddb895d56f0fe88f0ceffb9a100359413292f2b7..61fa01663479944ed13d1c30ee2c3adbe5a70cb1 100644
Binary files a/openair2/LAYER2/nr_rlc/tests/test15.txt.gz and b/openair2/LAYER2/nr_rlc/tests/test15.txt.gz differ
diff --git a/openair2/LAYER2/nr_rlc/tests/test8.txt.gz b/openair2/LAYER2/nr_rlc/tests/test8.txt.gz
index c20d43c63b331c2de77e0484922c1b0c1957eb7c..461ae1aebad7294daa7445179da725cbe6e722d0 100644
Binary files a/openair2/LAYER2/nr_rlc/tests/test8.txt.gz and b/openair2/LAYER2/nr_rlc/tests/test8.txt.gz differ
diff --git a/openair2/LAYER2/nr_rlc/tests/test9.txt.gz b/openair2/LAYER2/nr_rlc/tests/test9.txt.gz
index 27590b7d71c435e04cd19603d90cc0c9c0798597..938fcd6ddcb9a2bcf4bbd2206725a7c35e2a2b79 100644
Binary files a/openair2/LAYER2/nr_rlc/tests/test9.txt.gz and b/openair2/LAYER2/nr_rlc/tests/test9.txt.gz differ
diff --git a/openair2/LAYER2/rlc_v2/rlc_oai_api.c b/openair2/LAYER2/rlc_v2/rlc_oai_api.c
index 2a6f00c13c49610de35312f286135352603411aa..11ae770e3ecdd8944c56b04713803124ebd41136 100644
--- a/openair2/LAYER2/rlc_v2/rlc_oai_api.c
+++ b/openair2/LAYER2/rlc_v2/rlc_oai_api.c
@@ -1065,3 +1065,15 @@ void du_rlc_data_req(const protocol_ctxt_t *const ctxt_pP,
 		sdu_sizeP,
 		sdu_pP, NULL, NULL);
 }
+
+/* HACK to be removed: nr_rlc_get_available_tx_space is needed by
+ * openair3/ocp-gtpu/gtp_itf.cpp which is compiled in lte-softmodem
+ * so let's put a dummy nr_rlc_get_available_tx_space here
+ */
+int nr_rlc_get_available_tx_space(
+  const rnti_t            rntiP,
+  const logical_chan_id_t channel_idP)
+{
+  abort();
+  return 0;
+}
diff --git a/openair2/M2AP/m2ap_common.h b/openair2/M2AP/m2ap_common.h
index 95da064b4abdfc1882ade115e9d400a370147d4f..0a6895fcb7f3aa08226e7f2aaad22e9b36b4e9ea 100644
--- a/openair2/M2AP/m2ap_common.h
+++ b/openair2/M2AP/m2ap_common.h
@@ -55,11 +55,6 @@
 # define M2AP_PORT 36423
 #endif
 
-#ifndef TRUE
-#define TRUE 1
-#define FALSE 0
-#endif
-
 extern int asn1_xer_print;
 
 #if defined(ENB_MODE)
diff --git a/openair2/NETWORK_DRIVER/MESH/device.c b/openair2/NETWORK_DRIVER/MESH/device.c
index f63408259c88dce75fa338b4820d86cd2c74ee4e..d86e32e56189c4f8f8767bac58bace8d9023c966 100644
--- a/openair2/NETWORK_DRIVER/MESH/device.c
+++ b/openair2/NETWORK_DRIVER/MESH/device.c
@@ -198,7 +198,8 @@ int nas_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
 
     // End debug information
     netif_stop_queue(dev);
-#if  LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0) ||  (defined RHEL_RELEASE_CODE && RHEL_RELEASE_CODE>=1796)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0) \
+    || (defined RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= 1796 && RHEL_RELEASE_CODE != 2403)
     netif_trans_update(dev);
 #else
     dev->trans_start = jiffies;
@@ -267,7 +268,8 @@ void nas_tx_timeout(struct net_device *dev)
   printk("TX_TIMEOUT: begin\n");
   //  (struct nas_priv *)(dev->priv)->stats.tx_errors++;
   (priv->stats).tx_errors++;
-#if  LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0) ||  (defined RHEL_RELEASE_CODE && RHEL_RELEASE_CODE>=1796)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0) \
+    || (defined RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= 1796 && RHEL_RELEASE_CODE != 2403)
   netif_trans_update(dev);
 #else
   dev->trans_start = jiffies;
@@ -285,7 +287,8 @@ static const struct net_device_ops nasmesh_netdev_ops = {
   .ndo_set_mac_address  = NULL,
   .ndo_set_config     = nas_set_config,
   .ndo_do_ioctl       = nas_CTL_ioctl,
-#if (defined RHEL_RELEASE_CODE && RHEL_RELEASE_CODE>=1797 && LINUX_VERSION_CODE <= KERNEL_VERSION(3,11,0))
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(3,11,0) \
+    || (defined RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= 1797 && RHEL_RELEASE_CODE != 2403)
   .extended.ndo_change_mtu   = nas_change_mtu,
 #else
   .ndo_change_mtu   = nas_change_mtu,
diff --git a/openair2/NETWORK_DRIVER/UE_IP/device.c b/openair2/NETWORK_DRIVER/UE_IP/device.c
index 0ff9a73925789f7f26be0f0e6a6e5226a10bf305..bf858a0005db261f9aace3bbf014c6f44ea744f8 100644
--- a/openair2/NETWORK_DRIVER/UE_IP/device.c
+++ b/openair2/NETWORK_DRIVER/UE_IP/device.c
@@ -239,7 +239,8 @@ int ue_ip_hard_start_xmit(struct sk_buff *skb_pP, struct net_device *dev_pP) {
 
     // End debug information
     netif_stop_queue(dev_pP);
-#if  LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0) || (defined RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= 1796)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0) \
+    || (defined RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= 1796 && RHEL_RELEASE_CODE != 2403)
     netif_trans_update(dev_pP);
 #else
     dev_pP->trans_start = jiffies;
@@ -315,7 +316,8 @@ void ue_ip_tx_timeout(struct net_device *dev_pP)
   printk("[UE_IP_DRV][%s] begin\n", __FUNCTION__);
   //  (ue_ip_priv_t *)(dev_pP->priv_p)->stats.tx_errors++;
   (priv_p->stats).tx_errors++;
-#if  LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0) || (defined RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= 1796)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0) \
+    || (defined RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= 1796 && RHEL_RELEASE_CODE != 2403)
   netif_trans_update(dev_pP);
 #else
   dev_pP->trans_start = jiffies;
@@ -333,7 +335,7 @@ static const struct net_device_ops ue_ip_netdev_ops = {
   .ndo_set_mac_address    = ue_ip_set_mac_address,
   .ndo_set_config         = ue_ip_set_config,
   .ndo_do_ioctl           = NULL,
-#if (defined RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= 1797)
+#if defined RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= 1797 && RHEL_RELEASE_CODE != 2403
   .extended.ndo_change_mtu         = ue_ip_change_mtu,
 #else
   .ndo_change_mtu   = ue_ip_change_mtu,
diff --git a/openair2/NR_PHY_INTERFACE/NR_IF_Module.c b/openair2/NR_PHY_INTERFACE/NR_IF_Module.c
index c860d847d952c66453232aca40006badc5c272c5..47705082d1c0b12fdd28a2321c401c9a8d43e322 100644
--- a/openair2/NR_PHY_INTERFACE/NR_IF_Module.c
+++ b/openair2/NR_PHY_INTERFACE/NR_IF_Module.c
@@ -77,7 +77,7 @@ void handle_nr_rach(NR_UL_IND_t *UL_info)
   bool in_timewindow = frame_diff == 0 || (frame_diff == 1 && UL_info->slot < 7);
 
   if (UL_info->rach_ind.number_of_pdus > 0 && in_timewindow) {
-    LOG_D(MAC,"UL_info[Frame %d, Slot %d] Calling initiate_ra_proc RACH:SFN/SLOT:%d/%d\n",
+    LOG_A(MAC,"UL_info[Frame %d, Slot %d] Calling initiate_ra_proc RACH:SFN/SLOT:%d/%d\n",
           UL_info->frame, UL_info->slot, UL_info->rach_ind.sfn, UL_info->rach_ind.slot);
     for (int i = 0; i < UL_info->rach_ind.number_of_pdus; i++) {
       UL_info->rach_ind.number_of_pdus--;
@@ -215,6 +215,41 @@ void handle_nr_ulsch(NR_UL_IND_t *UL_info)
   UL_info->crc_ind.number_crcs = 0;
 }
 
+void handle_nr_srs(NR_UL_IND_t *UL_info) {
+
+  if(NFAPI_MODE == NFAPI_MODE_PNF) {
+    if (UL_info->srs_ind.number_of_pdus > 0) {
+      LOG_D(PHY,"PNF Sending UL_info->srs_ind.number_of_pdus: %d, SFN/SF:%d.%d \n",
+            UL_info->srs_ind.number_of_pdus, UL_info->frame, UL_info->slot);
+      oai_nfapi_nr_srs_indication(&UL_info->srs_ind);
+      UL_info->srs_ind.number_of_pdus = 0;
+    }
+    return;
+  }
+
+  const module_id_t module_id = UL_info->module_id;
+  const frame_t frame = UL_info->srs_ind.sfn;
+  const sub_frame_t slot = UL_info->srs_ind.slot;
+  const int num_srs = UL_info->srs_ind.number_of_pdus;
+  const nfapi_nr_srs_indication_pdu_t *srs_list = UL_info->srs_ind.pdu_list;
+
+  for (int i = 0; i < num_srs; i++) {
+    const nfapi_nr_srs_indication_pdu_t *srs_ind = &srs_list[i];
+    LOG_D(NR_PHY, "(%d.%d) UL_info->srs_ind.pdu_list[%d].rnti: 0x%04x\n", frame, slot, i, srs_ind->rnti);
+    handle_nr_srs_measurements(module_id,
+                               frame,
+                               slot,
+                               srs_ind->rnti,
+                               srs_ind->timing_advance,
+                               srs_ind->num_symbols,
+                               srs_ind->wide_band_snr,
+                               srs_ind->num_reported_symbols,
+                               srs_ind->reported_symbol_list);
+  }
+
+  UL_info->srs_ind.number_of_pdus = 0;
+}
+
 static void free_unqueued_nfapi_indications(nfapi_nr_rach_indication_t *rach_ind,
                                             nfapi_nr_uci_indication_t *uci_ind,
                                             nfapi_nr_rx_data_indication_t *rx_ind,
@@ -372,9 +407,6 @@ static void match_crc_rx_pdu(nfapi_nr_rx_data_indication_t *rx_ind, nfapi_nr_crc
 
 void NR_UL_indication(NR_UL_IND_t *UL_info) {
   AssertFatal(UL_info!=NULL,"UL_info is null\n");
-#ifdef DUMP_FAPI
-  dump_ul(UL_info);
-#endif
   module_id_t      module_id   = UL_info->module_id;
   int              CC_id       = UL_info->CC_id;
   NR_Sched_Rsp_t   *sched_info = &NR_Sched_INFO[module_id][CC_id];
@@ -434,6 +466,7 @@ void NR_UL_indication(NR_UL_IND_t *UL_info) {
   // clear UL DCI prior to handling ULSCH
   mac->UL_dci_req[CC_id].numPdus = 0;
   handle_nr_ulsch(UL_info);
+  handle_nr_srs(UL_info);
 
   if (get_softmodem_params()->emulate_l1) {
     free_unqueued_nfapi_indications(rach_ind, uci_ind, rx_ind, crc_ind);
diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c
index 958786df8b51c1ae0ad860c7f1dd7614256f51e8..5c51c4a1cd1d6c933c782854979d73e8746800b0 100644
--- a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c
+++ b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c
@@ -67,17 +67,6 @@ queue_t nr_tx_req_queue;
 queue_t nr_ul_dci_req_queue;
 queue_t nr_ul_tti_req_queue;
 
-static slot_rnti_mcs_s slot_rnti_mcs[NUM_NFAPI_SLOT];
-
-//static int get_mcs_from_sinr(float sinr);
-//static int get_cqi_from_mcs(void);
-static void read_channel_param(const nfapi_nr_dl_tti_pdsch_pdu_rel15_t * pdu, int sf, int index);
-//static bool did_drop_transport_block(int slot, uint16_t rnti);
-static float get_bler_val(uint8_t mcs, int sinr);
-static bool should_drop_transport_block(int slot, uint16_t rnti);
-static void save_pdsch_pdu_for_crnti(nfapi_nr_dl_tti_request_t *dl_tti_request);
-static inline bool is_channel_modeling(void);
-
 void nrue_init_standalone_socket(int tx_port, int rx_port)
 {
   {
@@ -940,7 +929,7 @@ static void enqueue_nr_nfapi_msg(void *buffer, ssize_t len, nfapi_p7_message_hea
     return;
 }
 
-static void save_pdsch_pdu_for_crnti(nfapi_nr_dl_tti_request_t *dl_tti_request)
+void save_pdsch_pdu_for_crnti(nfapi_nr_dl_tti_request_t *dl_tti_request)
 {
   int count_sent = 0;
   NR_UE_MAC_INST_t *mac = get_mac_inst(0);
@@ -1115,6 +1104,10 @@ int8_t handle_dlsch(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_t *u
   return 0;
 }
 
+int8_t handle_csirs_measurements(module_id_t module_id, frame_t frame, int slot, fapi_nr_csirs_measurements_t *csirs_measurements) {
+  return nr_ue_process_csirs_measurements(module_id, frame, slot, csirs_measurements);
+}
+
 void update_harq_status(module_id_t module_id, uint8_t harq_pid, uint8_t ack_nack) {
 
   NR_UE_MAC_INST_t *mac = get_mac_inst(module_id);
@@ -1240,7 +1233,7 @@ int nr_ue_dl_indication(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_
                                          (dl_info->rx_ind->rx_indication_body+i)->ssb_pdu.ssb_length,
                                          (dl_info->rx_ind->rx_indication_body+i)->ssb_pdu.ssb_start_subcarrier,
                                          (dl_info->rx_ind->rx_indication_body+i)->ssb_pdu.cell_id)) << FAPI_NR_RX_PDU_TYPE_SSB;
-	    free((dl_info->rx_ind->rx_indication_body+i)->ssb_pdu.pdu);
+            free((dl_info->rx_ind->rx_indication_body+i)->ssb_pdu.pdu);
             break;
           case FAPI_NR_RX_PDU_TYPE_SIB:
             ret_mask |= (handle_bcch_dlsch(dl_info->module_id,
@@ -1255,6 +1248,12 @@ int nr_ue_dl_indication(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_
           case FAPI_NR_RX_PDU_TYPE_RAR:
             ret_mask |= (handle_dlsch(dl_info, ul_time_alignment, i)) << FAPI_NR_RX_PDU_TYPE_RAR;
             break;
+          case FAPI_NR_CSIRS_IND:
+            ret_mask |= (handle_csirs_measurements(dl_info->module_id,
+                                                   dl_info->frame,
+                                                   dl_info->slot,
+                                                   &(dl_info->rx_ind->rx_indication_body+i)->csirs_measurements)) << FAPI_NR_CSIRS_IND;
+            break;
           default:
             break;
         }
@@ -1444,243 +1443,3 @@ void RCconfig_nrUE_prs(void *cfg)
     }
   }
 }
-
-/*
-static int get_mcs_from_sinr(float sinr)
-{
-  if (sinr < (nr_bler_data[0].bler_table[0][0]))
-  {
-    LOG_D(NR_MAC, "The SINR found is smaller than first MCS table\n");
-    return 0;
-  }
-
-  if (sinr > (nr_bler_data[NR_NUM_MCS-1].bler_table[nr_bler_data[NR_NUM_MCS-1].length - 1][0]))
-  {
-    LOG_D(NR_MAC, "The SINR found is larger than last MCS table\n");
-    return NR_NUM_MCS-1;
-  }
-
-  for (int n = NR_NUM_MCS-1; n >= 0; n--)
-  {
-    CHECK_INDEX(nr_bler_data, n);
-    float largest_sinr = (nr_bler_data[n].bler_table[nr_bler_data[n].length - 1][0]);
-    float smallest_sinr = (nr_bler_data[n].bler_table[0][0]);
-    if (sinr < largest_sinr && sinr > smallest_sinr)
-    {
-      LOG_D(NR_MAC, "The SINR found in MCS %d table\n", n);
-      return n;
-    }
-  }
-  LOG_E(NR_MAC, "Unable to get an MCS value.\n");
-  abort();
-}
-
-static int get_cqi_from_mcs(void)
-{
-  static const int mcs_to_cqi[] = {0, 1, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8,
-                                   9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15};
-  assert(NUM_ELEMENTS(mcs_to_cqi) == NR_NUM_MCS);
-  int slot = 0;
-  while (slot < NUM_NFAPI_SLOT)
-  {
-    if (slot_rnti_mcs[slot].latest)
-    {
-      int num_pdus = slot_rnti_mcs[slot].num_pdus;
-      if (num_pdus <= 0)
-      {
-        LOG_E(NR_MAC, "%s: slot_rnti_mcs[%d].num_pdus = 0\n", __FUNCTION__, slot);
-        abort();
-      }
-
-      CHECK_INDEX(slot_rnti_mcs[slot].mcs, num_pdus);
-      int mcs = get_mcs_from_sinr(slot_rnti_mcs[slot].sinr);
-      CHECK_INDEX(mcs_to_cqi, mcs);
-      int cqi = mcs_to_cqi[mcs];
-      LOG_D(NR_MAC, "SINR: %f -> MCS: %d -> CQI: %d\n", slot_rnti_mcs[slot].sinr, mcs, cqi);
-      return cqi;
-    }
-    slot++;
-  }
-  LOG_E(NR_MAC, "Unable to get CQI value because no MCS found\n");
-  abort();
-}
-*/
-
-static void read_channel_param(const nfapi_nr_dl_tti_pdsch_pdu_rel15_t * pdu, int slot, int index)
-{
-  if (pdu == NULL)
-  {
-    LOG_E(NR_MAC,"PDU NULL\n");
-    abort();
-  }
-
-  /* This function is executed for every pdsch pdu type in a dl_tti_request. We save
-     the assocaited MCS and RNTI value for each. The 'index' passed in is a count of
-     how many times we have called this function for a particular dl_tti_request. It
-     allows us to save MCS/RNTI data in correct indicies when multiple pdsch pdu's are received.*/
-  for (int i = 0; i < NUM_NFAPI_SLOT; i++)
-  {
-    slot_rnti_mcs[i].latest = false;
-  }
-
-  CHECK_INDEX(slot_rnti_mcs[slot].rnti, index);
-  CHECK_INDEX(slot_rnti_mcs[slot].mcs, index);
-  CHECK_INDEX(slot_rnti_mcs[slot].drop_flag, index);
-  slot_rnti_mcs[slot].rnti[index] = pdu->rnti;
-  slot_rnti_mcs[slot].mcs[index] = pdu->mcsIndex[0];
-  slot_rnti_mcs[slot].rvIndex[index] = pdu->rvIndex[0];
-  slot_rnti_mcs[slot].drop_flag[index] = false;
-  slot_rnti_mcs[slot].num_pdus = index+1; //index starts at 0 so we incrament to get num of pdus
-  slot_rnti_mcs[slot].latest = true;
-  LOG_D(NR_MAC, "Adding MCS %d and RNTI %x for slot_rnti_mcs[%d]\n", slot_rnti_mcs[slot].mcs[index], slot_rnti_mcs[slot].rnti[index], slot);
-
-  return;
-}
-
-/*
-static bool did_drop_transport_block(int slot, uint16_t rnti)
-{
-  int num_pdus = slot_rnti_mcs[slot].num_pdus;
-  if (num_pdus <= 0)
-  {
-    LOG_E(MAC, "Problem, the PDU size is <= 0. We dropped this packet\n");
-    return true;
-  }
-  CHECK_INDEX(slot_rnti_mcs[slot].rnti, num_pdus);
-  CHECK_INDEX(slot_rnti_mcs[slot].drop_flag, num_pdus);
-  for (int n = 0; n < num_pdus; n++)
-  {
-    if (slot_rnti_mcs[slot].rnti[n] == rnti && slot_rnti_mcs[slot].drop_flag[n])
-    {
-      return true;
-    }
-  }
-  return false;
-}
-*/
-
-static float get_bler_val(uint8_t mcs, int sinr)
-{
-  // 4th col = dropped packets, 5th col = total packets
-  float bler_val = 0.0;
-  CHECK_INDEX(nr_bler_data, mcs);
-  LOG_D(NR_MAC, "sinr %d min %d max %d\n", sinr,
-                (int)(nr_bler_data[mcs].bler_table[0][0] * 10),
-                (int)(nr_bler_data[mcs].bler_table[nr_bler_data[mcs].length - 1][0] * 10)
-  );
-
-  if (sinr < (int)(nr_bler_data[mcs].bler_table[0][0] * 10))
-  {
-    LOG_D(NR_MAC, "MCS %d table. SINR is smaller than lowest SINR, bler_val is set based on lowest SINR in table\n", mcs);
-    bler_val = nr_bler_data[mcs].bler_table[0][4] / nr_bler_data[mcs].bler_table[0][5];
-    return bler_val;
-  }
-  if (sinr > (int)(nr_bler_data[mcs].bler_table[nr_bler_data[mcs].length - 1][0] * 10))
-  {
-    LOG_D(NR_MAC, "MCS %d table. SINR is greater than largest SINR. bler_val is set based on largest SINR in table\n", mcs);
-    bler_val = nr_bler_data[mcs].bler_table[(nr_bler_data[mcs].length - 1)][4] / nr_bler_data[mcs].bler_table[(nr_bler_data[mcs].length - 1)][5];
-    return bler_val;
-  }
-  // Loop through bler table to find sinr_index
-  for (int i = 0; i < nr_bler_data[mcs].length; i++)
-  {
-    int temp_sinr = (int)(nr_bler_data[mcs].bler_table[i][0] * 10);
-    if (temp_sinr == sinr)
-    {
-      bler_val = nr_bler_data[mcs].bler_table[i][4] / nr_bler_data[mcs].bler_table[i][5];
-      return bler_val;
-    }
-    // Linear interpolation when SINR is between indices
-    if (temp_sinr > sinr)
-    {
-      float bler_val1 = nr_bler_data[mcs].bler_table[i - 1][4] / nr_bler_data[mcs].bler_table[i - 1][5];
-      float bler_val2 = nr_bler_data[mcs].bler_table[i][4] / nr_bler_data[mcs].bler_table[i][5];
-      LOG_D(NR_MAC, "sinr %d min %f max %f\n", sinr, bler_val1, bler_val2);
-      return ((bler_val1 + bler_val2) / 2);
-    }
-  }
-  LOG_E(NR_MAC, "NO SINR INDEX FOUND!\n");
-  abort();
-
-}
-
-static inline bool is_channel_modeling(void)
-{
-  /* TODO: For now we enable channel modeling based on the node_number.
-     Replace with a command line option to enable/disable channel modeling.
-     The LTE UE will crash when channel modeling is conducted for NSA
-     mode. It does not crash for LTE mode. We have not implemented channel
-     modeling for NSA mode yet. For now, we ensure only do do channel modeling
-     in LTE/NR mode. */
-  return get_softmodem_params()->node_number == 0 && !get_softmodem_params()->nsa;
-}
-
-static bool should_drop_transport_block(int slot, uint16_t rnti)
-{
-  if (!is_channel_modeling())
-  {
-    return false;
-  }
-
-  /* We want to avoid dropping setup messages because this would be pathological. */
-  NR_UE_MAC_INST_t *mac = get_mac_inst(0);
-  if (mac->ra.ra_state < RA_SUCCEEDED)
-  {
-    LOG_D(NR_MAC, "Not dropping because MAC state: %d", mac->ra.ra_state);
-    return false;
-  }
-
-  /* Get block error rate (bler_val) from table based on every saved
-     MCS and SINR to be used as the cutoff rate for dropping packets.
-     Generate random uniform vairable to compare against bler_val. */
-  int num_pdus = slot_rnti_mcs[slot].num_pdus;
-  assert(slot < 20 && slot >= 0);
-  LOG_D(NR_MAC, "rnti: %x  num_pdus %d state %d slot %u sinr %f\n",
-        rnti, num_pdus, mac->ra.ra_state, slot, slot_rnti_mcs[slot].sinr);
-  assert(num_pdus > 0);
-  CHECK_INDEX(slot_rnti_mcs[slot].rnti, num_pdus);
-  CHECK_INDEX(slot_rnti_mcs[slot].mcs, num_pdus);
-  CHECK_INDEX(slot_rnti_mcs[slot].drop_flag, num_pdus);
-  int n = 0;
-  uint8_t mcs = 99;
-  for (n = 0; n < num_pdus; n++)
-  {
-    if (slot_rnti_mcs[slot].rnti[n] == rnti)
-    {
-      mcs = slot_rnti_mcs[slot].mcs[n];
-    }
-    if (mcs != 99)
-    {
-      /* Use MCS to get the bler value. Since there can be multiple MCS
-         values for a particular slot, we verify that all PDUs are not
-         flagged for drop before returning. If even one is flagged for drop
-         we return immediately because we drop the entire packet. */
-
-      LOG_D(NR_MAC, "rnti: %x mcs %u slot %u sinr %f\n",
-        slot_rnti_mcs[slot].rnti[n], mcs, slot, slot_rnti_mcs[slot].sinr);
-
-      float bler_val;
-      if (slot_rnti_mcs[slot].rvIndex[n] != 0)
-        bler_val = 0;
-      else
-        bler_val = get_bler_val(mcs, ((int)(slot_rnti_mcs[slot].sinr * 10)));
-      double drop_cutoff = ((double) rand() / (RAND_MAX));
-      assert(drop_cutoff <= 1);
-      LOG_D(NR_MAC, "SINR = %f, Bler_val = %f, MCS = %"PRIu8"\n", slot_rnti_mcs[slot].sinr, bler_val, slot_rnti_mcs[slot].mcs[n]);
-      if (drop_cutoff <= bler_val)
-      {
-        slot_rnti_mcs[slot].drop_flag[n] = true;
-        LOG_T(NR_MAC, "We are dropping this packet. Bler_val = %f, MCS = %"PRIu8", slot = %d\n", bler_val, slot_rnti_mcs[slot].mcs[n], slot);
-        return slot_rnti_mcs[slot].drop_flag[n];
-      }
-    }
-
-  }
-
-  if (mcs == 99)
-  {
-    LOG_E(NR_MAC, "NO MCS Found for rnti %x. slot_rnti_mcs[%d].mcs[%d] \n", rnti, slot, n);
-    abort();
-  }
-  return false;
-}
diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h
index 3eacf87e0618f907345fc96c08b3e715511398d7..45ac8e2a7d46ee5316c8059fa29804e74b978ff0 100755
--- a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h
+++ b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h
@@ -40,45 +40,12 @@
 #include "openair2/PHY_INTERFACE/queue_t.h"
 #include "nfapi_nr_interface_scf.h"
 #include "openair2/NR_PHY_INTERFACE/NR_IF_Module.h"
+#include "NR_Packet_Drop.h"
 
-#define NR_NUM_MCS 29
-#define NUM_SINR 100
-#define NUM_BLER_COL 13
-#define NUM_NFAPI_SLOT 20
-#define NR_NUM_LAYER 1
+extern slot_rnti_mcs_s slot_rnti_mcs[NUM_NFAPI_SLOT];
 
 typedef struct NR_UL_TIME_ALIGNMENT NR_UL_TIME_ALIGNMENT_t;
 
-typedef struct nr_phy_channel_params_t
-{
-    uint16_t sfn_slot;
-    uint16_t message_id;
-    uint16_t nb_of_sinrs;
-    float sinr[NR_NUM_LAYER];
-    // Incomplete, need all channel parameters
-} nr_phy_channel_params_t;
-
-typedef struct
-{
-    uint8_t slot;
-    uint16_t rnti[256];
-    uint8_t mcs[256];
-    uint8_t rvIndex[256];
-    float sinr;
-    uint16_t num_pdus;
-    bool drop_flag[256];
-    bool latest;
-
-} slot_rnti_mcs_s;
-
-typedef struct
-{
-    uint16_t length;
-    float bler_table[NUM_SINR][NUM_BLER_COL];
-} nr_bler_struct;
-
-extern nr_bler_struct nr_bler_data[NR_NUM_MCS];
-
 typedef enum {
   ONLY_PUSCH,
   NOT_PUSCH,
diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_Packet_Drop.c b/openair2/NR_UE_PHY_INTERFACE/NR_Packet_Drop.c
new file mode 100644
index 0000000000000000000000000000000000000000..97938c6b0272f8ef231bbb5a2c9101fefb18281f
--- /dev/null
+++ b/openair2/NR_UE_PHY_INTERFACE/NR_Packet_Drop.c
@@ -0,0 +1,183 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+#include <stdio.h>
+#include "openair2/NR_UE_PHY_INTERFACE/NR_Packet_Drop.h"
+#include "executables/softmodem-common.h"
+#include "NR_MAC_UE/mac_proto.h"
+
+slot_rnti_mcs_s slot_rnti_mcs[NUM_NFAPI_SLOT];
+void read_channel_param(const nfapi_nr_dl_tti_pdsch_pdu_rel15_t * pdu, int slot, int index)
+{
+  if (pdu == NULL)
+  {
+    LOG_E(NR_MAC,"PDU NULL\n");
+    abort();
+  }
+
+  /* This function is executed for every pdsch pdu type in a dl_tti_request. We save
+     the assocaited MCS and RNTI value for each. The 'index' passed in is a count of
+     how many times we have called this function for a particular dl_tti_request. It
+     allows us to save MCS/RNTI data in correct indicies when multiple pdsch pdu's are received.*/
+  for (int i = 0; i < NUM_NFAPI_SLOT; i++)
+  {
+    slot_rnti_mcs[i].latest = false;
+  }
+
+  CHECK_INDEX(slot_rnti_mcs[slot].rnti, index);
+  CHECK_INDEX(slot_rnti_mcs[slot].mcs, index);
+  CHECK_INDEX(slot_rnti_mcs[slot].drop_flag, index);
+  slot_rnti_mcs[slot].rnti[index] = pdu->rnti;
+  slot_rnti_mcs[slot].mcs[index] = pdu->mcsIndex[0];
+  slot_rnti_mcs[slot].rvIndex[index] = pdu->rvIndex[0];
+  slot_rnti_mcs[slot].drop_flag[index] = false;
+  slot_rnti_mcs[slot].num_pdus = index+1; //index starts at 0 so we incrament to get num of pdus
+  slot_rnti_mcs[slot].latest = true;
+  LOG_D(NR_MAC, "Adding MCS %d and RNTI %x for slot_rnti_mcs[%d]\n", slot_rnti_mcs[slot].mcs[index], slot_rnti_mcs[slot].rnti[index], slot);
+
+  return;
+}
+
+extern nr_bler_struct nr_bler_data[NR_NUM_MCS];
+float get_bler_val(uint8_t mcs, int sinr)
+{
+  // 4th col = dropped packets, 5th col = total packets
+  float bler_val = 0.0;
+  CHECK_INDEX(nr_bler_data, mcs);
+  LOG_D(NR_MAC, "sinr %d min %d max %d\n", sinr,
+                (int)(nr_bler_data[mcs].bler_table[0][0] * 10),
+                (int)(nr_bler_data[mcs].bler_table[nr_bler_data[mcs].length - 1][0] * 10)
+  );
+
+  if (sinr < (int)(nr_bler_data[mcs].bler_table[0][0] * 10))
+  {
+    LOG_D(NR_MAC, "MCS %d table. SINR is smaller than lowest SINR, bler_val is set based on lowest SINR in table\n", mcs);
+    bler_val = nr_bler_data[mcs].bler_table[0][4] / nr_bler_data[mcs].bler_table[0][5];
+    return bler_val;
+  }
+  if (sinr > (int)(nr_bler_data[mcs].bler_table[nr_bler_data[mcs].length - 1][0] * 10))
+  {
+    LOG_D(NR_MAC, "MCS %d table. SINR is greater than largest SINR. bler_val is set based on largest SINR in table\n", mcs);
+    bler_val = nr_bler_data[mcs].bler_table[(nr_bler_data[mcs].length - 1)][4] / nr_bler_data[mcs].bler_table[(nr_bler_data[mcs].length - 1)][5];
+    return bler_val;
+  }
+  // Loop through bler table to find sinr_index
+  for (int i = 0; i < nr_bler_data[mcs].length; i++)
+  {
+    int temp_sinr = (int)(nr_bler_data[mcs].bler_table[i][0] * 10);
+    if (temp_sinr == sinr)
+    {
+      bler_val = nr_bler_data[mcs].bler_table[i][4] / nr_bler_data[mcs].bler_table[i][5];
+      return bler_val;
+    }
+    // Linear interpolation when SINR is between indices
+    if (temp_sinr > sinr)
+    {
+      float bler_val1 = nr_bler_data[mcs].bler_table[i - 1][4] / nr_bler_data[mcs].bler_table[i - 1][5];
+      float bler_val2 = nr_bler_data[mcs].bler_table[i][4] / nr_bler_data[mcs].bler_table[i][5];
+      LOG_D(NR_MAC, "sinr %d min %f max %f\n", sinr, bler_val1, bler_val2);
+      return ((bler_val1 + bler_val2) / 2);
+    }
+  }
+  LOG_E(NR_MAC, "NO SINR INDEX FOUND!\n");
+  abort();
+
+}
+
+bool is_channel_modeling(void)
+{
+  /* TODO: For now we enable channel modeling based on the node_number.
+     Replace with a command line option to enable/disable channel modeling.
+     The LTE UE will crash when channel modeling is conducted for NSA
+     mode. It does not crash for LTE mode. We have not implemented channel
+     modeling for NSA mode yet. For now, we ensure only do do channel modeling
+     in LTE/NR mode. */
+  return get_softmodem_params()->node_number == 0 && !get_softmodem_params()->nsa;
+}
+
+bool should_drop_transport_block(int slot, uint16_t rnti)
+{
+  if (!is_channel_modeling())
+  {
+    return false;
+  }
+
+  /* We want to avoid dropping setup messages because this would be pathological. */
+  NR_UE_MAC_INST_t *mac = get_mac_inst(0);
+  if (mac->ra.ra_state < RA_SUCCEEDED)
+  {
+    LOG_D(NR_MAC, "Not dropping because MAC state: %d", mac->ra.ra_state);
+    return false;
+  }
+
+  /* Get block error rate (bler_val) from table based on every saved
+     MCS and SINR to be used as the cutoff rate for dropping packets.
+     Generate random uniform vairable to compare against bler_val. */
+  int num_pdus = slot_rnti_mcs[slot].num_pdus;
+  assert(slot < 20 && slot >= 0);
+  LOG_D(NR_MAC, "rnti: %x  num_pdus %d state %d slot %u sinr %f\n",
+        rnti, num_pdus, mac->ra.ra_state, slot, slot_rnti_mcs[slot].sinr);
+  assert(num_pdus > 0);
+  CHECK_INDEX(slot_rnti_mcs[slot].rnti, num_pdus);
+  CHECK_INDEX(slot_rnti_mcs[slot].mcs, num_pdus);
+  CHECK_INDEX(slot_rnti_mcs[slot].drop_flag, num_pdus);
+  int n = 0;
+  uint8_t mcs = 99;
+  for (n = 0; n < num_pdus; n++)
+  {
+    if (slot_rnti_mcs[slot].rnti[n] == rnti)
+    {
+      mcs = slot_rnti_mcs[slot].mcs[n];
+    }
+    if (mcs != 99)
+    {
+      /* Use MCS to get the bler value. Since there can be multiple MCS
+         values for a particular slot, we verify that all PDUs are not
+         flagged for drop before returning. If even one is flagged for drop
+         we return immediately because we drop the entire packet. */
+
+      LOG_D(NR_MAC, "rnti: %x mcs %u slot %u sinr %f\n",
+        slot_rnti_mcs[slot].rnti[n], mcs, slot, slot_rnti_mcs[slot].sinr);
+
+      float bler_val;
+      if (slot_rnti_mcs[slot].rvIndex[n] != 0)
+        bler_val = 0;
+      else
+        bler_val = get_bler_val(mcs, ((int)(slot_rnti_mcs[slot].sinr * 10)));
+      double drop_cutoff = ((double) rand() / (RAND_MAX));
+      assert(drop_cutoff <= 1);
+      LOG_D(NR_MAC, "SINR = %f, Bler_val = %f, MCS = %"PRIu8"\n", slot_rnti_mcs[slot].sinr, bler_val, slot_rnti_mcs[slot].mcs[n]);
+      if (drop_cutoff <= bler_val)
+      {
+        slot_rnti_mcs[slot].drop_flag[n] = true;
+        LOG_T(NR_MAC, "We are dropping this packet. Bler_val = %f, MCS = %"PRIu8", slot = %d\n", bler_val, slot_rnti_mcs[slot].mcs[n], slot);
+        return slot_rnti_mcs[slot].drop_flag[n];
+      }
+    }
+
+  }
+
+  if (mcs == 99)
+  {
+    LOG_E(NR_MAC, "NO MCS Found for rnti %x. slot_rnti_mcs[%d].mcs[%d] \n", rnti, slot, n);
+    abort();
+  }
+  return false;
+}
diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_Packet_Drop.h b/openair2/NR_UE_PHY_INTERFACE/NR_Packet_Drop.h
new file mode 100644
index 0000000000000000000000000000000000000000..549eb5c2e38288be8f69bc01ddf34c5d31843256
--- /dev/null
+++ b/openair2/NR_UE_PHY_INTERFACE/NR_Packet_Drop.h
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+#ifndef __NR_CHAN_MODEL_H__
+#define __NR_CHAN_MODEL_H__
+
+#include <platform_types.h>
+#include <nfapi_nr_interface_scf.h>
+#include <openair1/PHY/thread_NR_UE.h>
+#include "openair2/NR_PHY_INTERFACE/NR_IF_Module.h"
+
+#define NR_NUM_MCS 29
+#define NUM_SINR 100
+#define NUM_BLER_COL 13
+#define NUM_NFAPI_SLOT 20
+#define NR_NUM_LAYER 1
+#define MAX_CHAN_PARAMS 256
+
+typedef struct nr_phy_channel_params_t
+{
+    uint16_t sfn_slot;
+    uint16_t message_id;
+    uint16_t nb_of_sinrs;
+    float sinr[NR_NUM_LAYER];
+} nr_phy_channel_params_t;
+
+typedef struct
+{
+    uint8_t slot;
+    uint16_t rnti[MAX_CHAN_PARAMS];
+    uint8_t mcs[MAX_CHAN_PARAMS];
+    uint8_t rvIndex[MAX_CHAN_PARAMS];
+    float sinr;
+    uint16_t num_pdus;
+    bool drop_flag[MAX_CHAN_PARAMS];
+    bool latest;
+} slot_rnti_mcs_s;
+
+typedef struct
+{
+    uint16_t length;
+    float bler_table[NUM_SINR][NUM_BLER_COL];
+} nr_bler_struct;
+
+void read_channel_param(const nfapi_nr_dl_tti_pdsch_pdu_rel15_t * pdu, int sf, int index);
+void save_pdsch_pdu_for_crnti(nfapi_nr_dl_tti_request_t *dl_tti_request);
+float get_bler_val(uint8_t mcs, int sinr);
+bool should_drop_transport_block(int slot, uint16_t rnti);
+bool is_channel_modeling(void);
+
+#endif
diff --git a/openair2/PHY_INTERFACE/phy_stub_UE.c b/openair2/PHY_INTERFACE/phy_stub_UE.c
index c4650f18f3a93e8c7e1878bbc5e687b6b0da81b2..cd57ea9ff101ea225e6169408cc5e5fad5d3d255 100644
--- a/openair2/PHY_INTERFACE/phy_stub_UE.c
+++ b/openair2/PHY_INTERFACE/phy_stub_UE.c
@@ -1956,7 +1956,7 @@ static int get_mcs_from_sinr(float sinr)
 
 static int get_cqi_from_mcs(void)
 {
-  static const int mcs_to_cqi[] = {0, 1, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15};
+  static const int mcs_to_cqi[] = {0, 1, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15};
   assert(NUM_ELEMENTS(mcs_to_cqi) == NUM_MCS);
   int sf = 0;
   while(sf < NUM_NFAPI_SUBFRAME)
diff --git a/openair2/PHY_INTERFACE/phy_stub_UE.h b/openair2/PHY_INTERFACE/phy_stub_UE.h
index d68d1dffdd91a25371c7193521bd2ae68f8a3298..fe0e7be12e171a12c9858bdbf38cd6dfaf94b9f9 100644
--- a/openair2/PHY_INTERFACE/phy_stub_UE.h
+++ b/openair2/PHY_INTERFACE/phy_stub_UE.h
@@ -21,7 +21,7 @@
 //#include "openair1/PHY/LTE_TRANSPORT/defs.h"
 #include "queue_t.h"
 
-#define NUM_MCS 28
+#define NUM_MCS 29
 #define NUM_SINR 100
 #define NUM_BLER_COL 13
 #define LTE_NUM_LAYER 1
diff --git a/openair2/RRC/LITE/rrc_common.c b/openair2/RRC/LITE/rrc_common.c
index a4239e857d97acc5e9b41ea07599c93f1e94f691..f0c4e94c9990b5af3f631110ec21f5ab88bd951d 100644
--- a/openair2/RRC/LITE/rrc_common.c
+++ b/openair2/RRC/LITE/rrc_common.c
@@ -306,7 +306,7 @@ rrc_rx_tx(
       LOG_D(RRC,"SFN.SN %d.%d => release timer %d/%d\n",ctxt_pP->frame,ctxt_pP->subframe,
 	    ue_context_p->ue_context.ue_release_timer,ue_context_p->ue_context.ue_release_timer_thres);
       if ((ctxt_pP->frame == 0) && (ctxt_pP->subframe==0)) {
-	if (ue_context_p->ue_context.Initialue_identity_s_TMSI.presence == TRUE) {
+	if (ue_context_p->ue_context.Initialue_identity_s_TMSI.presence == true) {
 	  LOG_I(RRC,"UE rnti %x:S-TMSI %x failure timer %d/20000\n",
 		ue_context_p->ue_context.rnti,
 		ue_context_p->ue_context.Initialue_identity_s_TMSI.m_tmsi,
diff --git a/openair2/RRC/LTE/L2_interface.c b/openair2/RRC/LTE/L2_interface.c
index 0a63acc8fb8882ded746feaa3316a3b626859503..c12d2aa873e3e55e2160037f9ce5f28a9a922410 100644
--- a/openair2/RRC/LTE/L2_interface.c
+++ b/openair2/RRC/LTE/L2_interface.c
@@ -299,7 +299,7 @@ mac_rrc_data_ind(
   const uint8_t        *sduP,
   const sdu_size_t      sdu_lenP,
   const uint8_t         mbsfn_sync_areaP,
-  const boolean_t   brOption
+  const bool            brOption
 )
 //--------------------------------------------------------------------------
 {
diff --git a/openair2/RRC/LTE/L2_interface_common.c b/openair2/RRC/LTE/L2_interface_common.c
index 1993fe7de0973278c63cde20d1f247a174371f9b..660bd91dda8d99d05a8051f0a22724d71fed188a 100644
--- a/openair2/RRC/LTE/L2_interface_common.c
+++ b/openair2/RRC/LTE/L2_interface_common.c
@@ -58,7 +58,7 @@ rrc_data_req(
 {
   if(sdu_sizeP == 255) {
     LOG_I(RRC,"sdu_sizeP == 255");
-    return FALSE;
+    return false;
   }
 
   MessageDef *message_p;
@@ -94,7 +94,7 @@ rrc_data_req(
   if (ctxt_pP->enb_flag && NODE_IS_CU(RC.rrc[ctxt_pP->module_id]->node_type))
     pdcp_run(ctxt_pP);
 
-  return TRUE; // TODO should be changed to a CNF message later, currently RRC lite does not used the returned value anyway.
+  return true; // TODO should be changed to a CNF message later, currently RRC lite does not used the returned value anyway.
 }
 
 //------------------------------------------------------------------------------
diff --git a/openair2/RRC/LTE/L2_interface_ue.c b/openair2/RRC/LTE/L2_interface_ue.c
index 534030864a295a2a59c95366ae448a0d66e5363f..850ecf1b588132179bf79ad30b97bfe708b26bd4 100644
--- a/openair2/RRC/LTE/L2_interface_ue.c
+++ b/openair2/RRC/LTE/L2_interface_ue.c
@@ -298,7 +298,7 @@ rrc_data_req_ue(
       TASK_PDCP_UE,
       ctxt_pP->instance,
       message_p);
-    return TRUE; // TODO should be changed to a CNF message later, currently RRC lite does not used the returned value anyway.
+    return true; // TODO should be changed to a CNF message later, currently RRC lite does not used the returned value anyway.
   }
 }
 
diff --git a/openair2/RRC/LTE/MESSAGES/asn1_msg.c b/openair2/RRC/LTE/MESSAGES/asn1_msg.c
index bd09540627aba805ec9a02378ece258cbefc442d..e5024e35055a289e9a09c87bddb1383f0508557f 100644
--- a/openair2/RRC/LTE/MESSAGES/asn1_msg.c
+++ b/openair2/RRC/LTE/MESSAGES/asn1_msg.c
@@ -343,7 +343,7 @@ uint8_t do_MIB_SL(const protocol_ctxt_t *const ctxt_pP, const uint8_t eNB_index,
 
   if (in_coverage > 0 ) {
     //in coverage
-    mib_sl->inCoverage_r12 = TRUE;
+    mib_sl->inCoverage_r12 = true;
     mib_sl->sl_Bandwidth_r12 = *UE_rrc_inst[ctxt_pP->module_id].sib2[eNB_index]->freqInfo.ul_Bandwidth;
 
     if (UE_rrc_inst[ctxt_pP->module_id].sib1[eNB_index]->tdd_Config) {
@@ -366,7 +366,7 @@ uint8_t do_MIB_SL(const protocol_ctxt_t *const ctxt_pP, const uint8_t eNB_index,
   } else {
     //Todo - out of coverage for V2X
     // Todo - UE has a selected SyncRef UE
-    mib_sl->inCoverage_r12 = FALSE;
+    mib_sl->inCoverage_r12 = false;
     //set sl-Bandwidth, subframeAssignmentSL and reserved from the pre-configured parameters
   }
 
@@ -989,7 +989,7 @@ uint8_t do_SIB1(rrc_eNB_carrier_data_t *carrier,
   sib1_1250->nonCriticalExtension = NULL;
   ////Rel1310
   if ((configuration->schedulingInfoSIB1_BR_r13[CC_id] != 0) &&
-      (brOption==TRUE)) {
+      (brOption==true)) {
     sib1_1250->nonCriticalExtension = calloc(1, sizeof(LTE_SystemInformationBlockType1_v1310_IEs_t));
     memset(sib1_1250->nonCriticalExtension, 0, sizeof(LTE_SystemInformationBlockType1_v1310_IEs_t));
     LTE_SystemInformationBlockType1_v1310_IEs_t *sib1_1310 = sib1_1250->nonCriticalExtension;
@@ -1279,7 +1279,7 @@ uint8_t do_SIB23(uint8_t Mod_id,
   *sib2 = &sib2_part->choice.sib2;
   *sib3 = &sib3_part->choice.sib3;
 
-  if ((configuration->eMBMS_configured > 0) && (brOption==FALSE)) {
+  if ((configuration->eMBMS_configured > 0) && (brOption==false)) {
     sib13_part = CALLOC(1,sizeof(struct LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member));
     memset(sib13_part,0,sizeof(struct LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member));
     sib13_part->present = LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib13_v920;
@@ -1331,10 +1331,8 @@ uint8_t do_SIB23(uint8_t Mod_id,
     (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.ext1 = calloc(1, sizeof(struct LTE_RACH_ConfigCommon__ext1));
     memset((*sib2)->radioResourceConfigCommon.rach_ConfigCommon.ext1, 0, sizeof(struct LTE_RACH_ConfigCommon__ext1));
 
-    if (rrconfig->preambleTransMax_CE_r13) {
-      (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.ext1->preambleTransMax_CE_r13 = calloc(1, sizeof(LTE_PreambleTransMax_t));
-      *(*sib2)->radioResourceConfigCommon.rach_ConfigCommon.ext1->preambleTransMax_CE_r13 = *rrconfig->preambleTransMax_CE_r13; // to be re-initialized when we find the enum
-    } else (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.ext1->preambleTransMax_CE_r13 = NULL;
+    (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.ext1->preambleTransMax_CE_r13 = calloc(1, sizeof(LTE_PreambleTransMax_t));
+    *(*sib2)->radioResourceConfigCommon.rach_ConfigCommon.ext1->preambleTransMax_CE_r13 = rrconfig->preambleTransMax_CE_r13; // to be re-initialized when we find the enum
 
     (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.ext1->rach_CE_LevelInfoList_r13 = calloc(1, sizeof(LTE_RACH_CE_LevelInfoList_r13_t));
     memset((*sib2)->radioResourceConfigCommon.rach_ConfigCommon.ext1->rach_CE_LevelInfoList_r13, 0, sizeof(LTE_RACH_CE_LevelInfoList_r13_t));
@@ -2783,7 +2781,7 @@ do_RRCConnectionSetup(
   mac_MainConfig->ul_SCH_Config->maxHARQ_Tx = maxHARQ_Tx; // max number of UL HARQ transmission
   mac_MainConfig->ul_SCH_Config->periodicBSR_Timer = periodicBSR_Timer;
   mac_MainConfig->ul_SCH_Config->retxBSR_Timer = LTE_RetxBSR_Timer_r12_sf320; // LTE_RetxBSR_Timer_r12_sf5120  // regular BSR timer
-  mac_MainConfig->ul_SCH_Config->ttiBundling = 0; // FALSE
+  mac_MainConfig->ul_SCH_Config->ttiBundling = 0; // false
   //* timeAlignmentTimerDedicated *//
   mac_MainConfig->timeAlignmentTimerDedicated = LTE_TimeAlignmentTimer_infinity;
   //* DRX Config *//
@@ -3137,7 +3135,7 @@ uint8_t do_RRCConnectionSetup_BR(
   //mac_MainConfig->ul_SCH_Config->maxHARQ_Tx = maxHARQ_Tx;
   mac_MainConfig->ul_SCH_Config->periodicBSR_Timer = periodicBSR_Timer;
   mac_MainConfig->ul_SCH_Config->retxBSR_Timer = LTE_RetxBSR_Timer_r12_sf320;
-  mac_MainConfig->ul_SCH_Config->ttiBundling = 0; // FALSE
+  mac_MainConfig->ul_SCH_Config->ttiBundling = 0; // false
   mac_MainConfig->timeAlignmentTimerDedicated = LTE_TimeAlignmentTimer_infinity;
   mac_MainConfig->drx_Config = NULL;
   mac_MainConfig->phr_Config = CALLOC(1, sizeof(*mac_MainConfig->phr_Config));
diff --git a/openair2/RRC/LTE/defs_NB_IoT.h b/openair2/RRC/LTE/defs_NB_IoT.h
index 37a26086b55902a4818aa37f3841bf27d7139780..b98dbe22ccdc64b79682a215570df2684a384ea7 100644
--- a/openair2/RRC/LTE/defs_NB_IoT.h
+++ b/openair2/RRC/LTE/defs_NB_IoT.h
@@ -148,7 +148,7 @@ typedef struct UE_RRC_INFO_NB_IoT_s {
 //Measurement Report not supported in NB-IoT
 
 #define PAYLOAD_SIZE_MAX 1024
-#define RRC_BUF_SIZE 512
+#define RRC_BUF_SIZE 1024
 #define UNDEF_SECURITY_MODE 0xff
 #define NO_SECURITY_MODE 0x20
 
@@ -156,7 +156,7 @@ typedef struct UE_RRC_INFO_NB_IoT_s {
 #define RRC_TRANSACTION_IDENTIFIER_NUMBER  3
 
 typedef struct UE_S_TMSI_NB_IoT_s {
-  boolean_t  presence;
+  bool       presence;
   mme_code_t mme_code;
   m_tmsi_t   m_tmsi;
 } __attribute__ ((__packed__)) UE_S_TMSI_NB_IoT;
diff --git a/openair2/RRC/LTE/rrc_UE.c b/openair2/RRC/LTE/rrc_UE.c
index 9b37853ed2b2ac5503f29632e66e9f88cf3bbf99..577ee3effdf3dc90d3ee696958d451d4f9e74d79 100644
--- a/openair2/RRC/LTE/rrc_UE.c
+++ b/openair2/RRC/LTE/rrc_UE.c
@@ -4351,8 +4351,8 @@ void rrc_ue_generate_nrMeasurementReport(protocol_ctxt_t *const ctxt_pP, uint8_t
         AssertFatal(size >= 0, "do_nrMeasurementReport failed \n");
         LOG_I(RRC, "[UE %d] Frame %d : Generating Measurement Report for eNB %d\n",
               ctxt_pP->module_id, ctxt_pP->frame, eNB_index);
-        int result = pdcp_data_req(ctxt_pP,  SRB_FLAG_YES, DCCH, rrc_mui++, 0, size, buffer, PDCP_TRANSMISSION_MODE_DATA,NULL, NULL);
-        AssertFatal (result == TRUE, "PDCP data request failed!\n");
+        const bool result = pdcp_data_req(ctxt_pP,  SRB_FLAG_YES, DCCH, rrc_mui++, 0, size, buffer, PDCP_TRANSMISSION_MODE_DATA,NULL, NULL);
+        AssertFatal (result == true, "PDCP data request failed!\n");
       }
     }
   }
@@ -4370,7 +4370,6 @@ void rrc_ue_generate_MeasurementReport(protocol_ctxt_t *const ctxt_pP, uint8_t e
   long             nElem, nElem1;
   float            rsrp_filtered, rsrq_filtered;
   static frame_t   pframe=0;
-  int              result;
   nElem = 98;
   nElem1 = 35;
   target_eNB_offset = UE_rrc_inst[ctxt_pP->module_id].Info[0].handoverTarget; // eNB_offset of target eNB: used to obtain the mod_id of target eNB
@@ -4420,8 +4419,8 @@ void rrc_ue_generate_MeasurementReport(protocol_ctxt_t *const ctxt_pP, uint8_t e
         AssertFatal(size >= 0, "do_MeasurementReport failed \n");
         LOG_I(RRC, "[UE %d] Frame %d : Generating Measurement Report for eNB %d. Size is %zu\n",
               ctxt_pP->module_id, ctxt_pP->frame, eNB_index, size);
-        result = pdcp_data_req(ctxt_pP,  SRB_FLAG_YES, DCCH, rrc_mui++, 0, size, buffer, PDCP_TRANSMISSION_MODE_DATA,NULL, NULL);
-        AssertFatal (result == TRUE, "PDCP data request failed!\n");
+        const bool result = pdcp_data_req(ctxt_pP,  SRB_FLAG_YES, DCCH, rrc_mui++, 0, size, buffer, PDCP_TRANSMISSION_MODE_DATA,NULL, NULL);
+        AssertFatal (result == true, "PDCP data request failed!\n");
         //LOG_D(RRC, "[UE %d] Frame %d Sending MeasReport (%d bytes) through DCCH%d to PDCP \n",ue_mod_idP,frameP, size, DCCH);
       }
 
diff --git a/openair2/RRC/LTE/rrc_defs.h b/openair2/RRC/LTE/rrc_defs.h
index f537dcbbd2bc8f6312da98955a10e855e7fb7c8b..22c8a14863e69c6b2f4aaf18bcaf857a57db2692 100644
--- a/openair2/RRC/LTE/rrc_defs.h
+++ b/openair2/RRC/LTE/rrc_defs.h
@@ -316,7 +316,7 @@ typedef enum SL_TRIGGER_e {
 #define MAX_MEAS_ID 7
 
 #define PAYLOAD_SIZE_MAX 1024
-#define RRC_BUF_SIZE 512
+#define RRC_BUF_SIZE 1024
 #define UNDEF_SECURITY_MODE 0xff
 #define NO_SECURITY_MODE 0x20
 
@@ -367,7 +367,7 @@ typedef struct UE_RRC_INFO_s {
 } __attribute__ ((__packed__)) UE_RRC_INFO;
 
 typedef struct UE_S_TMSI_s {
-  boolean_t  presence;
+  bool       presence;
   mme_code_t mme_code;
   m_tmsi_t   m_tmsi;
 } __attribute__ ((__packed__)) UE_S_TMSI;
@@ -484,7 +484,7 @@ typedef struct MEASUREMENT_INFO_s {
 typedef struct {
   char Payload[RRC_BUFFER_SIZE_MAX];
   char Header[RRC_HEADER_SIZE_MAX];
-  char payload_size;
+  uint16_t payload_size;
 } RRC_BUFFER;
 #define RRC_BUFFER_SIZE sizeof(RRC_BUFFER)
 
@@ -931,7 +931,7 @@ typedef struct UE_RRC_INST_s {
 } UE_RRC_INST;
 
 typedef struct UE_PF_PO_s {
-  boolean_t enable_flag;  /* flag indicate whether current object is used */
+  bool      enable_flag;  /* flag indicate whether current object is used */
   uint16_t ue_index_value;  /* UE index value */
   uint8_t PF_min;  /* minimal value of Paging Frame (PF) */
   uint8_t PO;  /* Paging Occasion (PO) */
diff --git a/openair2/RRC/LTE/rrc_eNB.c b/openair2/RRC/LTE/rrc_eNB.c
index ea98d3169d50f6dcebe186bce87546040a4d9fcd..8be30175e1173b82675f02c44b842ee7da70b3ea 100644
--- a/openair2/RRC/LTE/rrc_eNB.c
+++ b/openair2/RRC/LTE/rrc_eNB.c
@@ -150,7 +150,7 @@ init_SI(
   LTE_SystemInformationBlockType1_v1310_IEs_t *sib1_v13ext=(LTE_SystemInformationBlockType1_v1310_IEs_t *)NULL;
   LOG_D(RRC,"%s()\n\n\n\n",__FUNCTION__);
 
-  if(configuration->radioresourceconfig[CC_id].mbms_dedicated_serving_cell == TRUE) {
+  if(configuration->radioresourceconfig[CC_id].mbms_dedicated_serving_cell == true) {
     LOG_A(RRC, "Configuring MIB FeMBMS (N_RB_DL %d)\n",
           (int)configuration->N_RB_DL[CC_id]);
     RC.rrc[ctxt_pP->module_id]->carrier[CC_id].MIB_FeMBMS = (uint8_t *) malloc16(4);
@@ -266,7 +266,7 @@ init_SI(
     carrier->sizeof_SIB1 = do_SIB1(&rrc->carrier[CC_id],
                                    ctxt_pP->module_id,
                                    CC_id,
-                                   FALSE,
+                                   false,
                                    configuration
                                   );
     AssertFatal(carrier->sizeof_SIB1 != 255,"FATAL, RC.rrc[enb_mod_idP].carrier[CC_id].sizeof_SIB1 == 255");
@@ -276,7 +276,7 @@ init_SI(
       RC.rrc[ctxt_pP->module_id]->carrier[CC_id].SIB1_BR = (uint8_t *) malloc16(32);
       RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sizeof_SIB1_BR = do_SIB1(&RC.rrc[ctxt_pP->module_id]->carrier[CC_id],
           ctxt_pP->module_id,
-          CC_id, TRUE, configuration);
+          CC_id, true, configuration);
     }
   }
 
@@ -285,7 +285,7 @@ init_SI(
     AssertFatal(carrier->SIB23!=NULL,"cannot allocate memory for SIB");
     carrier->sizeof_SIB23 = do_SIB23(ctxt_pP->module_id,
                                      CC_id,
-                                     FALSE,
+                                     false,
                                      configuration
                                     );
     LOG_I(RRC,"do_SIB23, size %d \n ", carrier->sizeof_SIB23);
@@ -295,7 +295,7 @@ init_SI(
     if (configuration->schedulingInfoSIB1_BR_r13[CC_id]>0) {
       carrier->SIB23_BR = (uint8_t *) malloc16(64);
       AssertFatal(carrier->SIB23_BR!=NULL,"cannot allocate memory for SIB");
-      carrier->sizeof_SIB23_BR = do_SIB23(ctxt_pP->module_id, CC_id, TRUE, configuration);
+      carrier->sizeof_SIB23_BR = do_SIB23(ctxt_pP->module_id, CC_id, true, configuration);
     }
 
     LOG_T(RRC, PROTOCOL_RRC_CTXT_FMT" SIB2/3 Contents (partial)\n",
@@ -661,7 +661,7 @@ rrc_eNB_get_next_transaction_identifier(
 ////-----------------------------------------------------------------------------
 //{
 //
-//    boolean_t      reg = FALSE;
+//    bool      reg = false;
 //    module_id_t    i;
 //
 //    AssertFatal(enb_mod_idP < NB_eNB_INST, "eNB index invalid (%d/%d)!", enb_mod_idP, NB_eNB_INST);
@@ -669,12 +669,12 @@ rrc_eNB_get_next_transaction_identifier(
 //    for (i = 0; i < MAX_MOBILES_PER_ENB; i++) {
 //        if (RC.rrc[enb_mod_idP]->Info.UE_info[i] == UE_identity) {
 //            // UE_identity already registered
-//            reg = TRUE;
+//            reg = true;
 //            break;
 //        }
 //    }
 //
-//    if (reg == FALSE) {
+//    if (reg == false) {
 //        return (UE_MODULE_INVALID);
 //    } else
 //        return (i);
@@ -713,7 +713,7 @@ rrc_eNB_ue_context_stmsi_exist(
           m_tmsiP, mme_codeP, ue_context_p,
           ue_context_p->ue_context.rnti);
 
-    if (ue_context_p->ue_context.Initialue_identity_s_TMSI.presence == TRUE) {
+    if (ue_context_p->ue_context.Initialue_identity_s_TMSI.presence == true) {
       printf("=> S-TMSI %x, MME %x\n",
              ue_context_p->ue_context.Initialue_identity_s_TMSI.m_tmsi,
              ue_context_p->ue_context.Initialue_identity_s_TMSI.mme_code);
@@ -976,28 +976,24 @@ rrc_eNB_free_UE(
   put_UE_in_freelist(enb_mod_idP, rnti, 1);
 }
 
-void remove_UE_from_freelist(module_id_t mod_id, rnti_t rnti) {
+void put_UE_in_freelist(module_id_t mod_id, rnti_t rnti, bool removeFlag) {
   eNB_MAC_INST                             *eNB_MAC = RC.mac[mod_id];
   pthread_mutex_lock(&lock_ue_freelist);
-  UE_free_list_t                           *free_list = &eNB_MAC->UE_free_list;
-  free_list->UE_free_ctrl[free_list->head_freelist].rnti = 0;
-  free_list->head_freelist = (free_list->head_freelist + 1) % (NUMBER_OF_UE_MAX+1);
-  free_list->num_UEs--;
-  pthread_mutex_unlock(&lock_ue_freelist);
-}
-
-void put_UE_in_freelist(module_id_t mod_id, rnti_t rnti, boolean_t removeFlag) {
-  UE_free_list_t                           *free_list = NULL;
-  eNB_MAC_INST                             *eNB_MAC = RC.mac[mod_id];
-  pthread_mutex_lock(&lock_ue_freelist);
-  free_list = &eNB_MAC->UE_free_list;
-  free_list->UE_free_ctrl[free_list->tail_freelist].rnti = rnti;
-  free_list->UE_free_ctrl[free_list->tail_freelist].removeContextFlg = removeFlag;
-  free_list->UE_free_ctrl[free_list->tail_freelist].raFlag = 0;
-  free_list->num_UEs++;
+  LOG_I(PHY,"add ue %d in fre list, context flag: %d\n", rnti, removeFlag);
+  int i;
+  for (i=0; i < sizeofArray(eNB_MAC->UE_free_ctrl); i++) 
+    if (eNB_MAC->UE_free_ctrl[i].rnti == 0)
+      break;
+  if (i==sizeofArray(eNB_MAC->UE_free_ctrl)) {
+    LOG_E(PHY,"List of UE to free is full\n");
+    pthread_mutex_unlock(&lock_ue_freelist);
+    return;
+  }
+  eNB_MAC->UE_free_ctrl[i].rnti = rnti;
+  eNB_MAC->UE_free_ctrl[i].removeContextFlg = removeFlag;
+  eNB_MAC->UE_free_ctrl[i].raFlag = 0;
   eNB_MAC->UE_release_req.ue_release_request_body.ue_release_request_TLVs_list[eNB_MAC->UE_release_req.ue_release_request_body.number_of_TLVs].rnti = rnti;
   eNB_MAC->UE_release_req.ue_release_request_body.number_of_TLVs++;
-  free_list->tail_freelist = (free_list->tail_freelist + 1) % (NUMBER_OF_UE_MAX+1);
   pthread_mutex_unlock(&lock_ue_freelist);
 }
 
@@ -1007,104 +1003,47 @@ extern void clean_eNb_ulsch(LTE_eNB_ULSCH_t *ulsch);
 extern void clean_eNb_dlsch(LTE_eNB_DLSCH_t *dlsch);
 
 void release_UE_in_freeList(module_id_t mod_id) {
-  int i, j, CC_id, pdu_number;
-  protocol_ctxt_t                           ctxt;
-  nfapi_ul_config_request_body_t           *ul_req_tmp = NULL;
   PHY_VARS_eNB                             *eNB_PHY = NULL;
-  struct rrc_eNB_ue_context_s              *ue_context_pP = NULL;
   eNB_MAC_INST                             *eNB_MAC = RC.mac[mod_id];
-  boolean_t                                 remove_UEContext;
-  rnti_t                                    rnti;
-  int                                       head, tail, ue_num;
   pthread_mutex_lock(&lock_ue_freelist);
-  head = eNB_MAC->UE_free_list.head_freelist;
-  tail = eNB_MAC->UE_free_list.tail_freelist;
 
-  if(head == tail) {
-    pthread_mutex_unlock(&lock_ue_freelist);
-    return;
-  }
-
-  if(tail < head) {
-    tail = head + eNB_MAC->UE_free_list.num_UEs;
-  }
-
-  pthread_mutex_unlock(&lock_ue_freelist);
-
-  for(ue_num = head; ue_num < tail; ue_num++) {
-    ue_num = ue_num % (NUMBER_OF_UE_MAX+1);
-    rnti = eNB_MAC->UE_free_list.UE_free_ctrl[ue_num].rnti;
+  for(int ue_num = 0; ue_num < sizeofArray(eNB_MAC->UE_free_ctrl) ; ue_num++) {
+    rnti_t rnti = eNB_MAC->UE_free_ctrl[ue_num].rnti;
 
     if(rnti != 0) {
-      remove_UEContext = eNB_MAC->UE_free_list.UE_free_ctrl[ue_num].removeContextFlg;
+      protocol_ctxt_t  ctxt;
       PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, mod_id, ENB_FLAG_YES, rnti, 0, 0,mod_id);
 
-      for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) {
+      for (int CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) {
         eNB_PHY = RC.eNB[mod_id][CC_id];
         int id;
         // clean ULSCH entries for rnti
-        id = find_ulsch(rnti,eNB_PHY,eNB_MAC->UE_free_list.UE_free_ctrl[ue_num].raFlag ? SEARCH_EXIST_RA : SEARCH_EXIST);
+        id = find_ulsch(rnti,eNB_PHY,eNB_MAC->UE_free_ctrl[ue_num].raFlag ? SEARCH_EXIST_RA : SEARCH_EXIST);
 
         if (id>=0) clean_eNb_ulsch(eNB_PHY->ulsch[id]);
 
         // clean DLSCH entries for rnti
-        id = find_dlsch(rnti,eNB_PHY,eNB_MAC->UE_free_list.UE_free_ctrl[ue_num].raFlag ? SEARCH_EXIST_RA : SEARCH_EXIST);
+        id = find_dlsch(rnti,eNB_PHY,eNB_MAC->UE_free_ctrl[ue_num].raFlag ? SEARCH_EXIST_RA : SEARCH_EXIST);
 
         if (id>=0) clean_eNb_dlsch(eNB_PHY->dlsch[id][0]);
 
         // clean UCI entries for rnti
-        for (i=0; i<NUMBER_OF_UCI_MAX; i++) {
+        for (int i=0; i<NUMBER_OF_UCI_MAX; i++) {
           if(eNB_PHY->uci_vars[i].rnti == rnti) {
             LOG_I(MAC, "clean eNb uci_vars[%d] UE %x \n",i, rnti);
             memset(&eNB_PHY->uci_vars[i],0,sizeof(LTE_eNB_UCI));
           }
         }
 
-        /*
-              for (i=0; i<MAX_MOBILES_PER_ENB; i++) {
-                ulsch = eNB_PHY->ulsch[i];
-
-                if((ulsch != NULL) && (ulsch->rnti == rnti)) {
-                  void clean_eNb_ulsch(LTE_eNB_ULSCH_t *ulsch);
-                  LOG_I(RRC, "clean_eNb_ulsch ulsch[%d] UE %x\n", i, rnti);
-                  clean_eNb_ulsch(ulsch);
-                }
-
-                dlsch = eNB_PHY->dlsch[i][0];
-
-                if((dlsch != NULL) && (dlsch->rnti == rnti)) {
-                  void clean_eNb_dlsch(LTE_eNB_DLSCH_t *dlsch);
-                  LOG_I(RRC, "clean_eNb_dlsch dlsch[%d] UE %x \n", i, rnti);
-                  clean_eNb_dlsch(dlsch);
-                }
-              }
-
-              ulsch = eNB_PHY->ulsch[i];
-
-              if((ulsch != NULL) && (ulsch->rnti == rnti)) {
-                void clean_eNb_ulsch(LTE_eNB_ULSCH_t *ulsch);
-                LOG_I(RRC, "clean_eNb_ulsch ulsch[%d] UE %x\n", i, rnti);
-                clean_eNb_ulsch(ulsch);
-              }
-
-              for (i=0; i<NUMBER_OF_UCI_MAX; i++) {
-                if(eNB_PHY->uci_vars[i].rnti == rnti) {
-                  LOG_I(MAC, "clean eNb uci_vars[%d] UE %x \n",i, rnti);
-                  memset(&eNB_PHY->uci_vars[i],0,sizeof(LTE_eNB_UCI));
-                }
-              }
-        */
-
         if (flexran_agent_get_rrc_xface(mod_id)) {
-          flexran_agent_get_rrc_xface(mod_id)->flexran_agent_notify_ue_state_change(
-            mod_id, rnti, PROTOCOL__FLEX_UE_STATE_CHANGE_TYPE__FLUESC_DEACTIVATED);
+          flexran_agent_get_rrc_xface(mod_id)->flexran_agent_notify_ue_state_change( mod_id, rnti, PROTOCOL__FLEX_UE_STATE_CHANGE_TYPE__FLUESC_DEACTIVATED);
         }
 
-        for(j = 0; j < 10; j++) {
-          ul_req_tmp = &eNB_MAC->UL_req_tmp[CC_id][j].ul_config_request_body;
+        for(int j = 0; j < 10; j++) {
+          nfapi_ul_config_request_body_t *ul_req_tmp  = &eNB_MAC->UL_req_tmp[CC_id][j].ul_config_request_body;
 
           if(ul_req_tmp) {
-            pdu_number = ul_req_tmp->number_of_pdus;
+            int pdu_number = ul_req_tmp->number_of_pdus;
 
             for(int pdu_index = pdu_number-1; pdu_index >= 0; pdu_index--) {
               if((ul_req_tmp->ul_config_pdu_list[pdu_index].ulsch_pdu.ulsch_pdu_rel8.rnti == rnti) ||
@@ -1126,7 +1065,8 @@ void release_UE_in_freeList(module_id_t mod_id) {
       }
 
       if (!NODE_IS_CU(RC.rrc[mod_id]->node_type)) {
-        rrc_mac_remove_ue(mod_id,rnti);
+	if (!eNB_MAC->UE_free_ctrl[ue_num].raFlag)
+	    rrc_mac_remove_ue(mod_id,rnti);
         rrc_rlc_remove_ue(&ctxt);
         pdcp_remove_UE(&ctxt);
       } else {
@@ -1139,19 +1079,20 @@ void release_UE_in_freeList(module_id_t mod_id) {
         itti_send_msg_to_task(TASK_CU_F1, mod_id, m);
       }
 
-      if(remove_UEContext) {
-        ue_context_pP = rrc_eNB_get_ue_context(RC.rrc[mod_id],rnti);
-
+      if(eNB_MAC->UE_free_ctrl[ue_num].removeContextFlg) {
+	struct rrc_eNB_ue_context_s *ue_context_pP = rrc_eNB_get_ue_context(RC.rrc[mod_id],rnti);
         if(ue_context_pP) {
+          LOG_I(PHY, "remove RNTI %04x\n", rnti);
           rrc_eNB_remove_ue_context(&ctxt,RC.rrc[mod_id],
                                     (struct rrc_eNB_ue_context_s *) ue_context_pP);
         }
       }
 
-      LOG_I(RRC, "[release_UE_in_freeList] remove UE %x from freeList\n", rnti);
-      remove_UE_from_freelist(mod_id, rnti);
+      LOG_I(RRC, "[release_UE_in_freeList] remove UE %x from freeList ra context: %d\n", rnti, eNB_MAC->UE_free_ctrl[ue_num].raFlag);
+      eNB_MAC->UE_free_ctrl[ue_num].rnti = 0;
     }
   }
+  pthread_mutex_unlock(&lock_ue_freelist);
 }
 
 int rrc_eNB_previous_SRB2(rrc_eNB_ue_context_t         *ue_context_pP) {
@@ -1678,7 +1619,7 @@ rrc_eNB_process_RRCConnectionReestablishmentComplete(
   ue_context_pP->ue_context.rnti               = ctxt_pP->rnti;
 
   if (EPC_MODE_ENABLED) {
-    uint8_t send_security_mode_command = FALSE;
+    uint8_t send_security_mode_command = false;
     rrc_pdcp_config_security(
       ctxt_pP,
       ue_context_pP,
@@ -2332,7 +2273,7 @@ rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(const protocol_ctxt_t *co
         // PDCP
         PDCP_rlc_AM = CALLOC(1, sizeof(*PDCP_rlc_AM));
         DRB_pdcp_config->rlc_AM = PDCP_rlc_AM;
-        PDCP_rlc_AM->statusReportRequired = FALSE;
+        PDCP_rlc_AM->statusReportRequired = false;
         break;
 
       default :
@@ -2590,7 +2531,7 @@ rrc_eNB_modify_dedicatedRRCConnectionReconfiguration(const protocol_ctxt_t *cons
 
         PDCP_rlc_AM = CALLOC(1, sizeof(*PDCP_rlc_AM));
         DRB_pdcp_config->rlc_AM = PDCP_rlc_AM;
-        PDCP_rlc_AM->statusReportRequired = FALSE;
+        PDCP_rlc_AM->statusReportRequired = false;
         break;
 
       default :
@@ -2951,7 +2892,7 @@ void rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t
 #ifdef RRC_DEFAULT_RAB_IS_AM // EXMIMO_IOT
   PDCP_rlc_AM = CALLOC(1, sizeof(*PDCP_rlc_AM));
   DRB_pdcp_config->rlc_AM = PDCP_rlc_AM;
-  PDCP_rlc_AM->statusReportRequired = FALSE;
+  PDCP_rlc_AM->statusReportRequired = false;
 #else
   PDCP_rlc_UM = CALLOC(1, sizeof(*PDCP_rlc_UM));
   DRB_pdcp_config->rlc_UM = PDCP_rlc_UM;
@@ -3347,7 +3288,7 @@ void rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t
     ReportConfig_NR->reportConfig.choice.reportConfigInterRAT.triggerType.choice.event.eventId.present = LTE_ReportConfigInterRAT__triggerType__event__eventId_PR_eventB1_NR_r15;
     ReportConfig_NR->reportConfig.choice.reportConfigInterRAT.triggerType.choice.event.eventId.choice.eventB1_NR_r15.b1_ThresholdNR_r15.present = LTE_ThresholdNR_r15_PR_nr_RSRP_r15;
     ReportConfig_NR->reportConfig.choice.reportConfigInterRAT.triggerType.choice.event.eventId.choice.eventB1_NR_r15.b1_ThresholdNR_r15.choice.nr_RSRP_r15 = 0;
-    ReportConfig_NR->reportConfig.choice.reportConfigInterRAT.triggerType.choice.event.eventId.choice.eventB1_NR_r15.reportOnLeave_r15 = FALSE;
+    ReportConfig_NR->reportConfig.choice.reportConfigInterRAT.triggerType.choice.event.eventId.choice.eventB1_NR_r15.reportOnLeave_r15 = false;
     ReportConfig_NR->reportConfig.choice.reportConfigInterRAT.triggerType.choice.event.hysteresis = 2;
     ReportConfig_NR->reportConfig.choice.reportConfigInterRAT.triggerType.choice.event.timeToTrigger = LTE_TimeToTrigger_ms80;
     ReportConfig_NR->reportConfig.choice.reportConfigInterRAT.maxReportCells = 4;
@@ -3361,9 +3302,9 @@ void rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t
 
     if (ReportConfig_NR->reportConfig.choice.reportConfigInterRAT.ext7->reportQuantityCellNR_r15 == NULL) exit(1);
 
-    ReportConfig_NR->reportConfig.choice.reportConfigInterRAT.ext7->reportQuantityCellNR_r15->ss_rsrp = TRUE;
-    ReportConfig_NR->reportConfig.choice.reportConfigInterRAT.ext7->reportQuantityCellNR_r15->ss_rsrq = TRUE;
-    ReportConfig_NR->reportConfig.choice.reportConfigInterRAT.ext7->reportQuantityCellNR_r15->ss_sinr = TRUE;
+    ReportConfig_NR->reportConfig.choice.reportConfigInterRAT.ext7->reportQuantityCellNR_r15->ss_rsrp = true;
+    ReportConfig_NR->reportConfig.choice.reportConfigInterRAT.ext7->reportQuantityCellNR_r15->ss_rsrq = true;
+    ReportConfig_NR->reportConfig.choice.reportConfigInterRAT.ext7->reportQuantityCellNR_r15->ss_sinr = true;
     ASN_SEQUENCE_ADD(&ReportConfig_list->list, ReportConfig_NR);
     LOG_A(RRC, "Generating RRCCConnectionReconfigurationRequest (NRUE Measurement Report Request).\n");
   }
@@ -3714,7 +3655,7 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt
 #ifdef RRC_DEFAULT_RAB_IS_AM // EXMIMO_IOT
   PDCP_rlc_AM = CALLOC(1, sizeof(*PDCP_rlc_AM));
   DRB_pdcp_config->rlc_AM = PDCP_rlc_AM;
-  PDCP_rlc_AM->statusReportRequired = FALSE;
+  PDCP_rlc_AM->statusReportRequired = 0; // FALSE
 #else
   PDCP_rlc_UM = CALLOC(1, sizeof(*PDCP_rlc_UM));
   DRB_pdcp_config->rlc_UM = PDCP_rlc_UM;
@@ -5052,7 +4993,7 @@ check_handovers(
         && ue_context_p->ue_context.handover_info != NULL &&
         ue_context_p->ue_context.handover_info->forwarding_state == FORWARDING_NO_EMPTY ) {
       MessageDef   *msg_p;
-      int    result;
+      bool result;
       protocol_ctxt_t  ctxt;
 
       do {
@@ -5090,7 +5031,7 @@ check_handovers(
                                       GTPV1U_ENB_DATA_FORWARDING_IND (msg_p).mode, NULL, NULL
                                      );
 
-              if (result != TRUE) {
+              if (result != true) {
                 LOG_E(RRC, "target enb send data forwarding buffer to PDCP request failed!\n");
               } else {
                 LOG_D(RRC, "target enb send data forwarding buffer to PDCP!\n");
@@ -5158,7 +5099,7 @@ check_handovers(
                                       GTPV1U_ENB_END_MARKER_IND (msg_p).mode, NULL, NULL
                                      );
 
-              if (result != TRUE) {
+              if (result != true) {
                 LOG_E(RRC, "target enb send spgw buffer to PDCP request failed!\n");
               } else {
                 LOG_D(RRC, "target enb send spgw buffer to PDCP!\n");
@@ -5390,7 +5331,7 @@ rrc_eNB_generate_HO_RRCConnectionReconfiguration(const protocol_ctxt_t *const ct
 #ifdef RRC_DEFAULT_RAB_IS_AM // EXMIMO_IOT
   PDCP_rlc_AM = CALLOC(1, sizeof(*PDCP_rlc_AM));
   DRB_pdcp_config->rlc_AM = PDCP_rlc_AM;
-  PDCP_rlc_AM->statusReportRequired = FALSE;
+  PDCP_rlc_AM->statusReportRequired = 0; // FALSE
 #else
   PDCP_rlc_UM = CALLOC(1, sizeof(*PDCP_rlc_UM));
   DRB_pdcp_config->rlc_UM = PDCP_rlc_UM;
@@ -6280,10 +6221,7 @@ rrc_eNB_configure_rbs_handover(struct rrc_eNB_ue_context_s *ue_context_p, protoc
       ctxt_pP,
       ue_context_p,
       ue_context_p->ue_context.kenb);
-    rrc_pdcp_config_security(
-      ctxt_pP,
-      ue_context_p,
-      FALSE);
+    rrc_pdcp_config_security(ctxt_pP, ue_context_p, false);
   }
 
   // Add a new user (called during the HO procedure)
@@ -6361,9 +6299,9 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete(
 
     UE_sched_ctrl_t *UE_scheduling_control = &(RC.mac[module_id]->UE_info.UE_sched_ctrl[UE_id_mac]);
 
-    if (UE_scheduling_control->cdrx_waiting_ack == TRUE) {
-      UE_scheduling_control->cdrx_waiting_ack = FALSE;
-      UE_scheduling_control->cdrx_configured = TRUE; // Set to TRUE when RRC Connection Reconfiguration is received
+    if (UE_scheduling_control->cdrx_waiting_ack == true) {
+      UE_scheduling_control->cdrx_waiting_ack = false;
+      UE_scheduling_control->cdrx_configured = true; // Set to TRUE when RRC Connection Reconfiguration is received
       LOG_I(RRC, "CDRX configuration activated after RRC Connection Reconfiguration Complete reception\n");
     }
   }
@@ -6627,7 +6565,7 @@ rrc_eNB_generate_RRCConnectionSetup(
 )
 //-----------------------------------------------------------------------------
 {
-  boolean_t is_mtc = ctxt_pP->brOption;
+  bool is_mtc = ctxt_pP->brOption;
   LTE_LogicalChannelConfig_t             *SRB1_logicalChannelConfig;  //,*SRB2_logicalChannelConfig;
   LTE_SRB_ToAddModList_t                **SRB_configList;
   LTE_SRB_ToAddMod_t                     *SRB1_config;
@@ -7249,6 +7187,7 @@ rrc_eNB_decode_ccch(
                 LOG_I(RRC," S-TMSI exists, ue_context_p %p, old rnti %x => %x\n",ue_context_p,ue_context_p->ue_context.rnti,ctxt_pP->rnti);
 
                 if (!NODE_IS_CU(RC.rrc[ctxt_pP->module_id]->node_type)) {
+		  LOG_I(PHY, "remove RNTI %04x\n", ue_context_p->ue_context.rnti);
                   rrc_mac_remove_ue(ctxt_pP->module_id, ue_context_p->ue_context.rnti);
                 } else {
                   MessageDef *m = itti_alloc_new_message(TASK_RRC_ENB, 0, F1AP_UE_CONTEXT_RELEASE_CMD);
@@ -7284,7 +7223,7 @@ rrc_eNB_decode_ccch(
                   LOG_E(RRC, "%s:%d:%s: rrc_eNB_get_next_free_ue_context returned NULL\n", __FILE__, __LINE__, __FUNCTION__);
 
                 if (ue_context_p != NULL) {
-                  ue_context_p->ue_context.Initialue_identity_s_TMSI.presence = TRUE;
+                  ue_context_p->ue_context.Initialue_identity_s_TMSI.presence = true;
                   ue_context_p->ue_context.Initialue_identity_s_TMSI.mme_code = mme_code;
                   ue_context_p->ue_context.Initialue_identity_s_TMSI.m_tmsi = m_tmsi;
                 } else {
@@ -8766,7 +8705,7 @@ void rrc_subframe_process(protocol_ctxt_t *const ctxt_pP, const int CC_id) {
 
     if ((ctxt_pP->frame&127) == 0 && ctxt_pP->subframe ==0) {
       if (fd) {
-        if (ue_context_p->ue_context.Initialue_identity_s_TMSI.presence == TRUE) {
+        if (ue_context_p->ue_context.Initialue_identity_s_TMSI.presence == true) {
           fprintf(fd,"RRC UE rnti %x: S-TMSI %x failure timer %d/8\n",
                 ue_context_p->ue_context.rnti,
                 ue_context_p->ue_context.Initialue_identity_s_TMSI.m_tmsi,
diff --git a/openair2/RRC/LTE/rrc_eNB_GTPV1U.c b/openair2/RRC/LTE/rrc_eNB_GTPV1U.c
index 575a38ee3d9ddf56102f35fad5a74a3b96b0598f..64b5594dd9e100343c681b747c910d14969747fa 100644
--- a/openair2/RRC/LTE/rrc_eNB_GTPV1U.c
+++ b/openair2/RRC/LTE/rrc_eNB_GTPV1U.c
@@ -84,23 +84,20 @@ rrc_eNB_process_GTPV1U_CREATE_TUNNEL_RESP(
 }
 
 //------------------------------------------------------------------------------
-boolean_t
-gtpv_data_req(
-  const protocol_ctxt_t*   const ctxt_pP,
-  const rb_id_t                  rb_idP,
-  const mui_t                    muiP,
-  const confirm_t                confirmP,
-  const sdu_size_t               sdu_sizeP,
-  uint8_t*                 const buffer_pP,
-  const pdcp_transmission_mode_t modeP,
-  uint32_t task_id
-)
+bool gtpv_data_req(const protocol_ctxt_t*   const ctxt_pP,
+                   const rb_id_t                  rb_idP,
+                   const mui_t                    muiP,
+                   const confirm_t                confirmP,
+                   const sdu_size_t               sdu_sizeP,
+                   uint8_t*                 const buffer_pP,
+                   const pdcp_transmission_mode_t modeP,
+                   uint32_t task_id)
 //------------------------------------------------------------------------------
 {
   if(sdu_sizeP == 0)
   {
     LOG_I(GTPU,"gtpv_data_req sdu_sizeP == 0");
-    return FALSE;
+    return false;
   }
   LOG_D(GTPU,"gtpv_data_req ue rnti %x sdu_sizeP %d rb id %ld", ctxt_pP->rnti, sdu_sizeP, rb_idP);
   MessageDef *message_p;
@@ -129,7 +126,7 @@ gtpv_data_req(
     GTPV1U_ENB_DATA_FORWARDING_IND (message_p).eNB_index = ctxt_pP->eNB_index;
     
     itti_send_msg_to_task (TASK_DATA_FORWARDING, ctxt_pP->instance, message_p);
-    return TRUE; // TODO should be changed to a CNF message later, currently RRC lite does not used the returned value anyway.
+    return true; // TODO should be changed to a CNF message later, currently RRC lite does not used the returned value anyway.
   } else if (task_id == TASK_END_MARKER){
     
     LOG_I(GTPU,"gtpv_data_req task_id = TASK_END_MARKER\n");
@@ -152,23 +149,22 @@ gtpv_data_req(
     GTPV1U_ENB_END_MARKER_IND (message_p).eNB_index = ctxt_pP->eNB_index;
     
     itti_send_msg_to_task (TASK_END_MARKER, ctxt_pP->instance, message_p);
-    return TRUE; // TODO should be changed to a CNF message later, currently RRC lite does not used the returned value anyway.
+    return true; // TODO should be changed to a CNF message later, currently RRC lite does not used the returned value anyway.
   }
   LOG_E(RRC, "Impossible state\n");
-  return FALSE;
+  return false;
 }
 
-boolean_t gtpv_data_req_new (
-  protocol_ctxt_t  *ctxt,
-  const srb_flag_t     srb_flagP,
-  const rb_id_t        rb_idP,
-  const mui_t          muiP,
-  const confirm_t      confirmP,
-  const sdu_size_t     sdu_buffer_sizeP,
-  unsigned char *const sdu_buffer_pP,
-  const pdcp_transmission_mode_t modeP,
-  const uint32_t *sourceL2Id,
-  const uint32_t *destinationL2Id) {
+bool gtpv_data_req_new(protocol_ctxt_t  *ctxt,
+                       const srb_flag_t     srb_flagP,
+                       const rb_id_t        rb_idP,
+                       const mui_t          muiP,
+                       const confirm_t      confirmP,
+                       const sdu_size_t     sdu_buffer_sizeP,
+                       unsigned char *const sdu_buffer_pP,
+                       const pdcp_transmission_mode_t modeP,
+                       const uint32_t *sourceL2Id,
+                       const uint32_t *destinationL2Id) {
   int task;
 
   if (sdu_buffer_sizeP==0)
diff --git a/openair2/RRC/LTE/rrc_eNB_GTPV1U.h b/openair2/RRC/LTE/rrc_eNB_GTPV1U.h
index ab789099caeee90bee21c38ce0e9eea9c6160cb9..f991cbd5f62bb46f3c4da73c93de2cc5db80a8ec 100644
--- a/openair2/RRC/LTE/rrc_eNB_GTPV1U.h
+++ b/openair2/RRC/LTE/rrc_eNB_GTPV1U.h
@@ -60,16 +60,13 @@ void rrc_eNB_send_GTPV1U_ENB_DELETE_TUNNEL_REQ(
   rrc_eNB_ue_context_t* ue_context_pP
 );
 
-boolean_t
-gtpv_data_req(
-  const protocol_ctxt_t*   const ctxt_pP,
-  const rb_id_t                  rb_idP,
-  const mui_t                    muiP,
-  const confirm_t                confirmP,
-  const sdu_size_t               sdu_sizeP,
-  uint8_t*                 const buffer_pP,
-  const pdcp_transmission_mode_t modeP,
-  uint32_t task_id
-);
+bool gtpv_data_req(const protocol_ctxt_t*   const ctxt_pP,
+                   const rb_id_t                  rb_idP,
+                   const mui_t                    muiP,
+                   const confirm_t                confirmP,
+                   const sdu_size_t               sdu_sizeP,
+                   uint8_t*                 const buffer_pP,
+                   const pdcp_transmission_mode_t modeP,
+                   uint32_t task_id);
 
 #endif /* RRC_ENB_GTPV1U_H_ */
diff --git a/openair2/RRC/LTE/rrc_eNB_S1AP.c b/openair2/RRC/LTE/rrc_eNB_S1AP.c
index f24c9ab1b616df1c3cf5d781c4feb515c435ffbf..aefbc0183157fb5189a834f830f8e42b8f34d1ac 100644
--- a/openair2/RRC/LTE/rrc_eNB_S1AP.c
+++ b/openair2/RRC/LTE/rrc_eNB_S1AP.c
@@ -402,15 +402,13 @@ static e_LTE_SecurityAlgorithmConfig__integrityProtAlgorithm rrc_eNB_select_inte
  *\param mod_id Instance ID of eNB.
  *\param ue_index Instance ID of UE in the eNB.
  *\param security_capabilities The security capabilities received from S1AP.
- *\return TRUE if at least one algorithm has been changed else FALSE.
+ *\return true if at least one algorithm has been changed else false.
  */
 int
-rrc_eNB_process_security(
-  const protocol_ctxt_t *const ctxt_pP,
-  rrc_eNB_ue_context_t *const ue_context_pP,
-  security_capabilities_t *security_capabilities_pP
-) {
-  boolean_t                                             changed = FALSE;
+rrc_eNB_process_security(const protocol_ctxt_t *const ctxt_pP,
+                         rrc_eNB_ue_context_t *const ue_context_pP,
+                         security_capabilities_t *security_capabilities_pP) {
+  bool                                                  changed = false;
   LTE_CipheringAlgorithm_r12_t                          cipheringAlgorithm;
   e_LTE_SecurityAlgorithmConfig__integrityProtAlgorithm integrityProtAlgorithm;
   /* Save security parameters */
@@ -428,14 +426,14 @@ rrc_eNB_process_security(
 
   if (ue_context_pP->ue_context.ciphering_algorithm != cipheringAlgorithm) {
     ue_context_pP->ue_context.ciphering_algorithm = cipheringAlgorithm;
-    changed = TRUE;
+    changed = true;
   }
 
   integrityProtAlgorithm = rrc_eNB_select_integrity (ue_context_pP->ue_context.security_capabilities.integrity_algorithms);
 
   if (ue_context_pP->ue_context.integrity_algorithm != integrityProtAlgorithm) {
     ue_context_pP->ue_context.integrity_algorithm = integrityProtAlgorithm;
-    changed = TRUE;
+    changed = true;
   }
 
   LOG_I (RRC, "[eNB %d][UE %x] Selected security algorithms (%p): %lx, %x, %s\n",
@@ -532,7 +530,7 @@ rrc_pdcp_config_security(
       pdcp_p,
       DCCH,
       DCCH+2,
-      (send_security_mode_command == TRUE)  ?
+      (send_security_mode_command == true)  ?
       0 | (ue_context_pP->ue_context.integrity_algorithm << 4) :
       (ue_context_pP->ue_context.ciphering_algorithm )         |
       (ue_context_pP->ue_context.integrity_algorithm << 4),
@@ -960,12 +958,12 @@ int rrc_eNB_process_S1AP_INITIAL_CONTEXT_SETUP_REQ(MessageDef *msg_p, const char
       ue_context_p,
       S1AP_INITIAL_CONTEXT_SETUP_REQ(msg_p).security_key);
     {
-      uint8_t send_security_mode_command = TRUE;
+      uint8_t send_security_mode_command = true;
 #ifndef EXMIMO_IOT
 
       if ((ue_context_p->ue_context.ciphering_algorithm == SecurityAlgorithmConfig__cipheringAlgorithm_eea0)
           && (ue_context_p->ue_context.integrity_algorithm == INTEGRITY_ALGORITHM_NONE)) {
-        send_security_mode_command = FALSE;
+        send_security_mode_command = false;
       }
 
 #endif
@@ -978,7 +976,7 @@ int rrc_eNB_process_S1AP_INITIAL_CONTEXT_SETUP_REQ(MessageDef *msg_p, const char
         rrc_eNB_generate_SecurityModeCommand (
           &ctxt,
           ue_context_p);
-        send_security_mode_command = FALSE;
+        send_security_mode_command = false;
         // apply ciphering after RRC security command mode
         rrc_pdcp_config_security(
           &ctxt,
@@ -1414,19 +1412,19 @@ int rrc_eNB_process_S1AP_E_RAB_MODIFY_REQ(MessageDef *msg_p, const char *msg_nam
     /* Save e RAB information for later */
     {
       int j;
-      boolean_t is_treated[S1AP_MAX_E_RAB] = {FALSE};
+      bool is_treated[S1AP_MAX_E_RAB] = {false};
       uint8_t nb_of_failed_e_rabs = 0;
 
       // keep the previous bearer
       // the index for the rec
       for (i = 0; i < S1AP_E_RAB_MODIFY_REQ (msg_p).nb_e_rabs_tomodify; i++) {
-        if (is_treated[i] == TRUE) {
+        if (is_treated[i] == true) {
           // already treated
           continue;
         }
 
         for (j = i+1; j < S1AP_E_RAB_MODIFY_REQ (msg_p).nb_e_rabs_tomodify; j++) {
-          if (is_treated[j] == FALSE &&
+          if (is_treated[j] == false &&
               S1AP_E_RAB_MODIFY_REQ(msg_p).e_rab_modify_params[j].e_rab_id == S1AP_E_RAB_MODIFY_REQ(msg_p).e_rab_modify_params[i].e_rab_id) {
             // handle multiple E-RAB ID
             ue_context_p->ue_context.modify_e_rab[j].status = E_RAB_STATUS_NEW;
@@ -1434,12 +1432,12 @@ int rrc_eNB_process_S1AP_E_RAB_MODIFY_REQ(MessageDef *msg_p, const char *msg_nam
             ue_context_p->ue_context.modify_e_rab[j].cause = S1AP_CAUSE_RADIO_NETWORK;
             ue_context_p->ue_context.modify_e_rab[j].cause_value = 31;//S1ap_CauseRadioNetwork_multiple_E_RAB_ID_instances;
             nb_of_failed_e_rabs++;
-            is_treated[i] = TRUE;
-            is_treated[j] = TRUE;
+            is_treated[i] = true;
+            is_treated[j] = true;
           }
         }
 
-        if (is_treated[i] == TRUE) {
+        if (is_treated[i] == true) {
           // handle multiple E-RAB ID
           ue_context_p->ue_context.modify_e_rab[i].status = E_RAB_STATUS_NEW;
           ue_context_p->ue_context.modify_e_rab[i].param.e_rab_id = S1AP_E_RAB_MODIFY_REQ(msg_p).e_rab_modify_params[i].e_rab_id;
@@ -1456,7 +1454,7 @@ int rrc_eNB_process_S1AP_E_RAB_MODIFY_REQ(MessageDef *msg_p, const char *msg_nam
           ue_context_p->ue_context.modify_e_rab[i].cause = S1AP_CAUSE_NAS;
           ue_context_p->ue_context.modify_e_rab[i].cause_value = 3;//S1ap_CauseNas_unspecified;
           nb_of_failed_e_rabs++;
-          is_treated[i] = TRUE;
+          is_treated[i] = true;
           continue;
         }
 
@@ -1474,19 +1472,19 @@ int rrc_eNB_process_S1AP_E_RAB_MODIFY_REQ(MessageDef *msg_p, const char *msg_nam
             ue_context_p->ue_context.modify_e_rab[i].param.nas_pdu.buffer = S1AP_E_RAB_MODIFY_REQ(msg_p).e_rab_modify_params[i].nas_pdu.buffer;
             ue_context_p->ue_context.modify_e_rab[i].param.sgw_addr = ue_context_p->ue_context.e_rab[j].param.sgw_addr;
             ue_context_p->ue_context.modify_e_rab[i].param.gtp_teid = ue_context_p->ue_context.e_rab[j].param.gtp_teid;
-            is_treated[i] = TRUE;
+            is_treated[i] = true;
             break;
           }
         }
 
-        if (is_treated[i] == FALSE) {
+        if (is_treated[i] == false) {
           // handle Unknown E-RAB ID
           ue_context_p->ue_context.modify_e_rab[i].status = E_RAB_STATUS_NEW;
           ue_context_p->ue_context.modify_e_rab[i].param.e_rab_id = S1AP_E_RAB_MODIFY_REQ(msg_p).e_rab_modify_params[i].e_rab_id;
           ue_context_p->ue_context.modify_e_rab[i].cause = S1AP_CAUSE_RADIO_NETWORK;
           ue_context_p->ue_context.modify_e_rab[i].cause_value = 30;//S1ap_CauseRadioNetwork_unknown_E_RAB_ID;
           nb_of_failed_e_rabs++;
-          is_treated[i] = TRUE;
+          is_treated[i] = true;
         }
       }
 
@@ -1824,8 +1822,8 @@ int rrc_eNB_process_PAGING_IND(MessageDef *msg_p, const char *msg_name, instance
           uint8_t i = 0;
 
           for (i = 0; i < MAX_MOBILES_PER_ENB; i++) {
-            if ((UE_PF_PO[CC_id][i].enable_flag == TRUE && UE_PF_PO[CC_id][i].ue_index_value == (uint16_t)(S1AP_PAGING_IND(msg_p).ue_index_value))
-                || (UE_PF_PO[CC_id][i].enable_flag != TRUE)) {
+            if ((UE_PF_PO[CC_id][i].enable_flag == true && UE_PF_PO[CC_id][i].ue_index_value == (uint16_t)(S1AP_PAGING_IND(msg_p).ue_index_value))
+                || (UE_PF_PO[CC_id][i].enable_flag != true)) {
               /* set T = min(Tc,Tue) */
               UE_PF_PO[CC_id][i].T = T;
               /* set UE_ID */
@@ -1845,12 +1843,12 @@ int rrc_eNB_process_PAGING_IND(MessageDef *msg_p, const char *msg_name, instance
                 UE_PF_PO[CC_id][i].PO = (frame_type==FDD) ? (4*(i_s&1)+(5*(i_s>>1))) : ((i_s&1)+(5*(i_s>>1)));
               }
 
-              if (UE_PF_PO[CC_id][i].enable_flag == TRUE) {
+              if (UE_PF_PO[CC_id][i].enable_flag == true) {
                 //paging exist UE log
                 LOG_D(RRC,"[eNB %ld] CC_id %d In S1AP_PAGING_IND: Update exist UE %d, T %d, PF %d, PO %d\n", instance, CC_id, UE_PF_PO[CC_id][i].ue_index_value, T, UE_PF_PO[CC_id][i].PF_min, UE_PF_PO[CC_id][i].PO);
               } else {
                 /* set enable_flag */
-                UE_PF_PO[CC_id][i].enable_flag = TRUE;
+                UE_PF_PO[CC_id][i].enable_flag = true;
                 //paging new UE log
                 LOG_D(RRC,"[eNB %ld] CC_id %d In S1AP_PAGING_IND: Insert a new UE %d, T %d, PF %d, PO %d\n", instance, CC_id, UE_PF_PO[CC_id][i].ue_index_value, T, UE_PF_PO[CC_id][i].PF_min, UE_PF_PO[CC_id][i].PO);
               }
diff --git a/openair2/RRC/LTE/rrc_proto.h b/openair2/RRC/LTE/rrc_proto.h
index f0456005f5270a5a073aabe8134c87243d758e3e..7bd3fbf758c7f0d3f2d92f0d51c3a743c569a13d 100644
--- a/openair2/RRC/LTE/rrc_proto.h
+++ b/openair2/RRC/LTE/rrc_proto.h
@@ -457,7 +457,7 @@ mac_rrc_data_ind(
   const uint8_t        *sduP,
   const sdu_size_t      sdu_lenP,
   const uint8_t         mbsfn_sync_areaP,
-  const boolean_t   brOption
+  const bool            brOption
 );
 
 int8_t
@@ -685,7 +685,7 @@ extern RRC_release_list_t   rrc_release_info;
 extern pthread_mutex_t      lock_ue_freelist;
 
 void remove_UE_from_freelist(module_id_t mod_id, rnti_t rnti);
-void put_UE_in_freelist(module_id_t mod_id, rnti_t rnti, boolean_t removeFlag);
+void put_UE_in_freelist(module_id_t mod_id, rnti_t rnti, bool removeFlag);
 void release_UE_in_freeList(module_id_t mod_id);
 
 /** @}*/
diff --git a/openair2/RRC/NR/L2_nr_interface.c b/openair2/RRC/NR/L2_nr_interface.c
index cd87dfd55488cdc453bef0b897abe0a6ccc8c451..ab9e3984d8ac366652ab412e2e7903b8c2aaf8a3 100644
--- a/openair2/RRC/NR/L2_nr_interface.c
+++ b/openair2/RRC/NR/L2_nr_interface.c
@@ -49,102 +49,6 @@
 
 extern RAN_CONTEXT_t RC;
 
-int generate_pdcch_ConfigSIB1(NR_PDCCH_ConfigSIB1_t *pdcch_ConfigSIB1,
-                              long ssbSubcarrierSpacing,
-                              long subCarrierSpacingCommon,
-                              channel_bandwidth_t min_channel_bw) {
-
-  nr_ssb_and_cset_mux_pattern_type_t mux_pattern = 0;
-
-  switch (ssbSubcarrierSpacing) {
-
-    case NR_SubcarrierSpacing_kHz15:
-      if (subCarrierSpacingCommon == NR_SubcarrierSpacing_kHz15) {
-        pdcch_ConfigSIB1->controlResourceSetZero = rand() % TABLE_38213_13_1_NUM_INDEXES;
-        mux_pattern = table_38213_13_1_c1[pdcch_ConfigSIB1->controlResourceSetZero];
-      } else if (subCarrierSpacingCommon == NR_SubcarrierSpacing_kHz30) {
-        pdcch_ConfigSIB1->controlResourceSetZero = rand() % TABLE_38213_13_2_NUM_INDEXES;
-        mux_pattern = table_38213_13_2_c1[pdcch_ConfigSIB1->controlResourceSetZero];
-      } else {
-        AssertFatal(true,"Invalid subCarrierSpacingCommon\n");
-      }
-      break;
-
-    case NR_SubcarrierSpacing_kHz30:
-      if (subCarrierSpacingCommon == NR_SubcarrierSpacing_kHz15) {
-
-        if ( (min_channel_bw == bw_5MHz) || (min_channel_bw == bw_10MHz) ) {
-          pdcch_ConfigSIB1->controlResourceSetZero = rand() % TABLE_38213_13_3_NUM_INDEXES;
-          mux_pattern = table_38213_13_3_c1[pdcch_ConfigSIB1->controlResourceSetZero];
-        } else if (min_channel_bw == bw_40MHz) {
-          pdcch_ConfigSIB1->controlResourceSetZero = rand() % TABLE_38213_13_5_NUM_INDEXES;
-          mux_pattern = table_38213_13_5_c1[pdcch_ConfigSIB1->controlResourceSetZero];
-        } else {
-          AssertFatal(true,"Invalid min_bandwidth\n");
-        }
-
-      } else if (subCarrierSpacingCommon == NR_SubcarrierSpacing_kHz30) {
-
-        if ( (min_channel_bw == bw_5MHz) || (min_channel_bw == bw_10MHz) ) {
-          pdcch_ConfigSIB1->controlResourceSetZero = rand() % TABLE_38213_13_4_NUM_INDEXES;
-          mux_pattern = table_38213_13_4_c1[pdcch_ConfigSIB1->controlResourceSetZero];
-        } else if (min_channel_bw == bw_40MHz) {
-          pdcch_ConfigSIB1->controlResourceSetZero = rand() % TABLE_38213_13_6_NUM_INDEXES;
-          mux_pattern = table_38213_13_6_c1[pdcch_ConfigSIB1->controlResourceSetZero];
-        } else {
-          AssertFatal(true,"Invalid min_bandwidth\n");
-        }
-
-      } else {
-        AssertFatal(true,"Invalid subCarrierSpacingCommon\n");
-      }
-      break;
-
-    case NR_SubcarrierSpacing_kHz120:
-      if (subCarrierSpacingCommon == NR_SubcarrierSpacing_kHz60) {
-        pdcch_ConfigSIB1->controlResourceSetZero = rand() % TABLE_38213_13_7_NUM_INDEXES;
-        mux_pattern = table_38213_13_7_c1[pdcch_ConfigSIB1->controlResourceSetZero];
-      } else if (subCarrierSpacingCommon == NR_SubcarrierSpacing_kHz120) {
-        pdcch_ConfigSIB1->controlResourceSetZero = rand() % TABLE_38213_13_8_NUM_INDEXES;
-        mux_pattern = table_38213_13_8_c1[pdcch_ConfigSIB1->controlResourceSetZero];
-      } else {
-        AssertFatal(true,"Invalid subCarrierSpacingCommon\n");
-      }
-      break;
-
-    case NR_SubcarrierSpacing_kHz240:
-      if (subCarrierSpacingCommon == NR_SubcarrierSpacing_kHz60) {
-        pdcch_ConfigSIB1->controlResourceSetZero = rand() % TABLE_38213_13_9_NUM_INDEXES;
-        mux_pattern = table_38213_13_9_c1[pdcch_ConfigSIB1->controlResourceSetZero];
-      } else if (subCarrierSpacingCommon == NR_SubcarrierSpacing_kHz120) {
-        pdcch_ConfigSIB1->controlResourceSetZero = rand() % TABLE_38213_13_10_NUM_INDEXES;
-        mux_pattern = table_38213_13_10_c1[pdcch_ConfigSIB1->controlResourceSetZero];
-      } else {
-        AssertFatal(true,"Invalid subCarrierSpacingCommon\n");
-      }
-      break;
-
-    default:
-      AssertFatal(true,"Invalid ssbSubcarrierSpacing\n");
-      break;
-  }
-
-
-  frequency_range_t frequency_range = FR1;
-  if(ssbSubcarrierSpacing>=60) {
-    frequency_range = FR2;
-  }
-
-  pdcch_ConfigSIB1->searchSpaceZero = 0;
-  if(mux_pattern == NR_SSB_AND_CSET_MUX_PATTERN_TYPE1 && frequency_range == FR1){
-    pdcch_ConfigSIB1->searchSpaceZero = rand() % TABLE_38213_13_11_NUM_INDEXES;
-  }
-  if(mux_pattern == NR_SSB_AND_CSET_MUX_PATTERN_TYPE1 && frequency_range == FR2){
-    pdcch_ConfigSIB1->searchSpaceZero = rand() % TABLE_38213_13_12_NUM_INDEXES;
-  }
-
-  return 0;
-}
 
 int
 nr_rrc_mac_remove_ue(module_id_t mod_idP,
@@ -168,7 +72,7 @@ nr_rrc_data_req(
 {
   if(sdu_sizeP == 255) {
     LOG_D(RRC,"sdu_sizeP == 255");
-    return FALSE;
+    return false;
   }
 
   MessageDef *message_p;
@@ -204,93 +108,98 @@ nr_rrc_data_req(
   if (ctxt_pP->enb_flag && NODE_IS_CU(RC.nrrrc[ctxt_pP->module_id]->node_type))
     pdcp_run(ctxt_pP);
 
-  return TRUE; // TODO should be changed to a CNF message later, currently RRC lite does not used the returned value anyway.
+  return true; // TODO should be changed to a CNF message later, currently RRC lite does not used the returned value anyway.
 }
 
-int    mac_rrc_nr_data_req(const module_id_t Mod_idP,
-                           const int         CC_id,
-                           const frame_t     frameP,
-                           const rb_id_t     Srb_id,
-                           const rnti_t      rnti,
-                           const uint8_t     Nb_tb,
-                           uint8_t *const    buffer_pP ){
+uint16_t mac_rrc_nr_data_req(const module_id_t Mod_idP,
+                             const int         CC_id,
+                             const frame_t     frameP,
+                             const rb_id_t     Srb_id,
+                             const rnti_t      rnti,
+                             const uint8_t     Nb_tb,
+                             uint8_t *const    buffer_pP ){
 
 #ifdef DEBUG_RRC
   LOG_D(RRC,"[eNB %d] mac_rrc_data_req to SRB ID=%ld\n",Mod_idP,Srb_id);
 #endif
 
-    // MIBCH
-    if ((Srb_id & RAB_OFFSET) == MIBCH) {
-
-      asn_enc_rval_t enc_rval;
-      uint8_t sfn_msb = (uint8_t)((frameP>>4)&0x3f);
-      rrc_gNB_carrier_data_t *carrier = &RC.nrrrc[Mod_idP]->carrier;
-      NR_BCCH_BCH_Message_t *mib = &carrier->mib;
-
-        // Currently we are getting the pdcch_ConfigSIB1 from the configuration file.
-        // Uncomment this function for a dynamic pdcch_ConfigSIB1.
-        //channel_bandwidth_t min_channel_bw = bw_10MHz; // Must be obtained based on TS 38.101-1 Table 5.3.5-1
-        //generate_pdcch_ConfigSIB1(carrier->pdcch_ConfigSIB1,
-        //                          *carrier->servingcellconfigcommon->ssbSubcarrierSpacing,
-        //                          carrier->mib.message.choice.mib->subCarrierSpacingCommon,
-        //                          min_channel_bw);
-
-        mib->message.choice.mib->pdcch_ConfigSIB1.controlResourceSetZero = carrier->pdcch_ConfigSIB1->controlResourceSetZero;
-        mib->message.choice.mib->pdcch_ConfigSIB1.searchSpaceZero = carrier->pdcch_ConfigSIB1->searchSpaceZero;
-
-        mib->message.choice.mib->systemFrameNumber.buf[0] = sfn_msb << 2;
-        enc_rval = uper_encode_to_buffer(&asn_DEF_NR_BCCH_BCH_Message,
-                                         NULL,
-                                         (void *) mib,
-                                         carrier->MIB,
-                                         24);
-        LOG_D(NR_RRC, "Encoded MIB for frame %d sfn_msb %d (%p), bits %lu\n", frameP, sfn_msb, carrier->MIB,
-              enc_rval.encoded);
-        buffer_pP[0] = carrier->MIB[0];
-        buffer_pP[1] = carrier->MIB[1];
-        buffer_pP[2] = carrier->MIB[2];
-        LOG_D(NR_RRC, "MIB PDU buffer_pP[0]=%x , buffer_pP[1]=%x, buffer_pP[2]=%x\n", buffer_pP[0], buffer_pP[1],
-              buffer_pP[2]);
-        AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n",
-                     enc_rval.failed_type->name, enc_rval.encoded);
-        return (3);
-    }
+  // MIBCH
+  if ((Srb_id & RAB_OFFSET) == MIBCH) {
+
+    asn_enc_rval_t enc_rval;
+    uint8_t sfn_msb = (uint8_t)((frameP>>4)&0x3f);
+    rrc_gNB_carrier_data_t *carrier = &RC.nrrrc[Mod_idP]->carrier;
+    NR_BCCH_BCH_Message_t *mib = &carrier->mib;
+
+    mib->message.choice.mib->pdcch_ConfigSIB1.controlResourceSetZero = carrier->pdcch_ConfigSIB1->controlResourceSetZero;
+    mib->message.choice.mib->pdcch_ConfigSIB1.searchSpaceZero = carrier->pdcch_ConfigSIB1->searchSpaceZero;
+
+    mib->message.choice.mib->systemFrameNumber.buf[0] = sfn_msb << 2;
+    enc_rval = uper_encode_to_buffer(&asn_DEF_NR_BCCH_BCH_Message,
+                                     NULL,
+                                     (void *) mib,
+                                     carrier->MIB,
+                                     24);
+    LOG_D(NR_RRC, "Encoded MIB for frame %d sfn_msb %d (%p), bits %lu\n", frameP, sfn_msb, carrier->MIB,
+          enc_rval.encoded);
+    buffer_pP[0] = carrier->MIB[0];
+    buffer_pP[1] = carrier->MIB[1];
+    buffer_pP[2] = carrier->MIB[2];
+    LOG_D(NR_RRC, "MIB PDU buffer_pP[0]=%x , buffer_pP[1]=%x, buffer_pP[2]=%x\n", buffer_pP[0], buffer_pP[1],
+          buffer_pP[2]);
+    AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n",
+                 enc_rval.failed_type->name, enc_rval.encoded);
+    return 3;
+  }
 
   // TODO BCCH SIB1 SIBs
-  if ((Srb_id & RAB_OFFSET ) == BCCH) {
-    memcpy(&buffer_pP[0],
-           RC.nrrrc[Mod_idP]->carrier.SIB1,
-           RC.nrrrc[Mod_idP]->carrier.sizeof_SIB1);
-
+  if ((Srb_id & RAB_OFFSET) == BCCH) {
+    memcpy(&buffer_pP[0], RC.nrrrc[Mod_idP]->carrier.SIB1, RC.nrrrc[Mod_idP]->carrier.sizeof_SIB1);
     return RC.nrrrc[Mod_idP]->carrier.sizeof_SIB1;
   }
 
   // CCCH
-  if( (Srb_id & RAB_OFFSET ) == CCCH) {
+  if ((Srb_id & RAB_OFFSET) == CCCH) {
+    LOG_D(NR_RRC,"[gNB %d] Frame %d CCCH request (Srb_id %ld)\n", Mod_idP, frameP, Srb_id);
 
     char *payload_pP;
-    uint8_t Sdu_size = 0;
     struct rrc_gNB_ue_context_s *ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[Mod_idP], rnti);
 
     LOG_D(NR_RRC,"[gNB %d] Frame %d CCCH request (Srb_id %ld)\n", Mod_idP, frameP, Srb_id);
+    if (ue_context_p == NULL) {
+      LOG_E(NR_RRC,"[gNB %d] Frame %d CCCH request but no ue_context\n", Mod_idP, frameP);
+      return 0;
+    }
 
-    AssertFatal(ue_context_p!=NULL,"failed to get ue_context, rnti %x\n",rnti);
-    int payload_size = ue_context_p->ue_context.Srb0.Tx_buffer.payload_size;
-
+    uint16_t payload_size = ue_context_p->ue_context.Srb0.Tx_buffer.payload_size;
     // check if data is there for MAC
     if (payload_size > 0) {
       payload_pP = ue_context_p->ue_context.Srb0.Tx_buffer.Payload;
       LOG_D(NR_RRC,"[gNB %d] CCCH has %d bytes (dest: %p, src %p)\n", Mod_idP, payload_size, buffer_pP, payload_pP);
       // Fill buffer
       memcpy((void *)buffer_pP, (void*)payload_pP, payload_size);
-      Sdu_size = payload_size;
       ue_context_p->ue_context.Srb0.Tx_buffer.payload_size = 0;
     }
-    return Sdu_size;
+    return payload_size;
   }
 
-  return(0);
+  return 0;
+}
+
+int8_t nr_mac_rrc_bwp_switch_req(const module_id_t     module_idP,
+                                 const frame_t         frameP,
+                                 const sub_frame_t     sub_frameP,
+                                 const rnti_t          rntiP,
+                                 const int             dl_bwp_id,
+                                 const int             ul_bwp_id) {
 
+  struct rrc_gNB_ue_context_s *ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[module_idP], rntiP);
+
+  protocol_ctxt_t ctxt;
+  PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, module_idP, GNB_FLAG_YES, rntiP, frameP, sub_frameP, 0);
+  nr_rrc_reconfiguration_req(ue_context_p, &ctxt, dl_bwp_id, ul_bwp_id);
+
+  return 0;
 }
 
 int8_t nr_mac_rrc_data_ind(const module_id_t     module_idP,
@@ -302,7 +211,7 @@ int8_t nr_mac_rrc_data_ind(const module_id_t     module_idP,
                            const rb_id_t         srb_idP,
                            const uint8_t        *sduP,
                            const sdu_size_t      sdu_lenP,
-                           const boolean_t   brOption) {
+                           const bool            brOption) {
 
   if (NODE_IS_DU(RC.nrrrc[module_idP]->node_type)) {
     LOG_W(RRC,"[DU %d][RAPROC] Received SDU for CCCH on SRB %ld length %d for UE id %d RNTI %x \n",
@@ -312,6 +221,7 @@ int8_t nr_mac_rrc_data_ind(const module_id_t     module_idP,
     // call do_RRCSetup like full procedure and extract masterCellGroup
     NR_CellGroupConfig_t cellGroupConfig;
     NR_ServingCellConfigCommon_t *scc=RC.nrrrc[module_idP]->carrier.servingcellconfigcommon;
+    NR_ServingCellConfig_t *servingcellconfigdedicated = RC.nrrrc[module_idP]->configuration.scd;
     memset(&cellGroupConfig,0,sizeof(cellGroupConfig));
 
     struct rrc_gNB_ue_context_s *ue_context_p = rrc_gNB_allocate_new_UE_context(RC.nrrrc[module_idP]);
@@ -321,16 +231,16 @@ int8_t nr_mac_rrc_data_ind(const module_id_t     module_idP,
     ue_context_p->ue_context.Srb0.Active        = 1;
     RB_INSERT(rrc_nr_ue_tree_s, &RC.nrrrc[module_idP]->rrc_ue_head, ue_context_p);
 
-    fill_initial_cellGroupConfig(ue_context_p->local_uid,&cellGroupConfig,scc, &RC.nrrrc[module_idP]->configuration);
+    fill_initial_cellGroupConfig(ue_context_p->local_uid,&cellGroupConfig,scc,servingcellconfigdedicated,&RC.nrrrc[module_idP]->configuration);
 
     MessageDef* tmp=itti_alloc_new_message_sized(TASK_RRC_GNB, 0, F1AP_INITIAL_UL_RRC_MESSAGE, sizeof(f1ap_initial_ul_rrc_message_t) + sdu_lenP);
     f1ap_initial_ul_rrc_message_t *msg = &F1AP_INITIAL_UL_RRC_MESSAGE(tmp);
 
     asn_enc_rval_t enc_rval = uper_encode_to_buffer(&asn_DEF_NR_CellGroupConfig,
-						    NULL,
-						    (void *)&cellGroupConfig,
-						    msg->du2cu_rrc_container,
-						    1024); //sizeof(msg->du2cu_rrc_container));
+                                                    NULL,
+                                                    (void *)&cellGroupConfig,
+                                                    msg->du2cu_rrc_container,
+                                                    F1AP_MAX_DU2CU_RRC_LENGTH);
 
     if (enc_rval.encoded == -1) {
       LOG_E(F1AP,"Could not encoded cellGroupConfig, failed element %s\n",enc_rval.failed_type->name);
@@ -343,7 +253,8 @@ int8_t nr_mac_rrc_data_ind(const module_id_t     module_idP,
     memcpy(msg->rrc_container, sduP, sdu_lenP);
     msg->rrc_container_length=sdu_lenP;
     itti_send_msg_to_task(TASK_DU_F1, 0, tmp);
-    return(0);
+
+    return 0;
   }
 
   protocol_ctxt_t ctxt;
@@ -356,7 +267,6 @@ int8_t nr_mac_rrc_data_ind(const module_id_t     module_idP,
       nr_rrc_gNB_decode_ccch(&ctxt, sduP, sdu_lenP, NULL, CC_id);
     }
   }
-
   return 0;
 }
 
diff --git a/openair2/RRC/NR/MESSAGES/asn1_msg.c b/openair2/RRC/NR/MESSAGES/asn1_msg.c
index 8e8959c5974689ca2a2405a72940e7312351898d..687784cafc82229b996d6beaa7b52ec6f57c33b0 100755
--- a/openair2/RRC/NR/MESSAGES/asn1_msg.c
+++ b/openair2/RRC/NR/MESSAGES/asn1_msg.c
@@ -40,7 +40,9 @@
 #include <asn_internal.h> /* for _ASN_DEFAULT_STACK_MAX */
 #include <per_encoder.h>
 #include <nr/nr_common.h>
+#include <softmodem-common.h>
 
+#include "executables/softmodem-common.h"
 #include "LAYER2/nr_rlc/nr_rlc_oai_api.h"
 #include "asn1_msg.h"
 #include "../nr_rrc_proto.h"
@@ -197,8 +199,7 @@ int xer_nr_sprint (char *string, size_t string_size, asn_TYPE_descriptor_t *td,
 uint8_t do_MIB_NR(gNB_RRC_INST *rrc,uint32_t frame) { 
 
   asn_enc_rval_t enc_rval;
-  rrc_gNB_carrier_data_t *carrier = &rrc->carrier;  
-  const gNB_RrcConfigurationReq *configuration = &rrc->configuration;
+  rrc_gNB_carrier_data_t *carrier = &rrc->carrier;
 
   NR_BCCH_BCH_Message_t *mib = &carrier->mib;
   NR_ServingCellConfigCommon_t *scc = carrier->servingcellconfigcommon;
@@ -225,11 +226,14 @@ uint8_t do_MIB_NR(gNB_RRC_INST *rrc,uint32_t frame) {
   AssertFatal(scc->ssbSubcarrierSpacing != NULL, "scc->ssbSubcarrierSpacing is null\n");
   int band = *scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0];
   frequency_range_t frequency_range = band<100?FR1:FR2;
-  int ssb_subcarrier_offset;
-  if(frequency_range == FR1)
-    ssb_subcarrier_offset = (configuration->ssb_SubcarrierOffset<24) ? (configuration->ssb_SubcarrierOffset<<*scc->ssbSubcarrierSpacing) : configuration->ssb_SubcarrierOffset;
-  else
-    ssb_subcarrier_offset = configuration->ssb_SubcarrierOffset;
+  int ssb_subcarrier_offset = 31; // default value for NSA
+  if (get_softmodem_params()->sa) {
+    uint32_t absolute_diff = (*scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB - scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA);
+    int scs_scaling = scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA < 600000 ? 3 : 1;
+    ssb_subcarrier_offset = (absolute_diff/scs_scaling)%24;
+    if(frequency_range == FR2)
+      ssb_subcarrier_offset >>= 1; // this assumes 120kHz SCS for SSB and subCarrierSpacingCommon (only option supported by OAI for now)
+  }
   mib->message.choice.mib->ssb_SubcarrierOffset = ssb_subcarrier_offset&15;
 
   /*
@@ -302,9 +306,8 @@ uint8_t do_MIB_NR(gNB_RRC_INST *rrc,uint32_t frame) {
   return((enc_rval.encoded+7)/8);
 }
 
-uint8_t do_SIB1_NR(rrc_gNB_carrier_data_t *carrier, 
-	               gNB_RrcConfigurationReq *configuration
-                  ) {
+uint16_t do_SIB1_NR(rrc_gNB_carrier_data_t *carrier, gNB_RrcConfigurationReq *configuration) {
+
   asn_enc_rval_t enc_rval;
 
   NR_BCCH_DL_SCH_Message_t *sib1_message = CALLOC(1,sizeof(NR_BCCH_DL_SCH_Message_t));
@@ -403,7 +406,6 @@ uint8_t do_SIB1_NR(rrc_gNB_carrier_data_t *carrier,
   NR_BWP_DownlinkCommon_t  *initialDownlinkBWP=&ServCellCom->downlinkConfigCommon.initialDownlinkBWP;
   initialDownlinkBWP->genericParameters=
     configuration->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters;
-  
 
   for(int i = 0; i< configuration->scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.count; i++) {
     asn1cSequenceAdd(ServCellCom->downlinkConfigCommon.frequencyInfoDL.frequencyBandList.list,
@@ -411,7 +413,6 @@ uint8_t do_SIB1_NR(rrc_gNB_carrier_data_t *carrier,
     nrMultiBandInfo->freqBandIndicatorNR = configuration->scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[i];
   }
 
-
   int scs_scaling0 = 1<<(configuration->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.subcarrierSpacing);
   int scs_scaling  = scs_scaling0;
   int scs_scaling2 = scs_scaling0;
@@ -520,7 +521,6 @@ uint8_t do_SIB1_NR(rrc_gNB_carrier_data_t *carrier,
   ss7->searchSpaceType->choice.common=calloc(1,sizeof(*ss7->searchSpaceType->choice.common));
   ss7->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0 = calloc(1,sizeof(*ss7->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0));
 
-  
   asn1cCallocOne(initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->searchSpaceSIB1,  0);
   asn1cCallocOne(initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->searchSpaceOtherSystemInformation, 7);
   asn1cCallocOne(initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->pagingSearchSpace, 5);
@@ -660,12 +660,9 @@ uint8_t do_SIB1_NR(rrc_gNB_carrier_data_t *carrier,
                                    (void *)sib1_message,
                                    carrier->SIB1,
                                    NR_MAX_SIB_LENGTH/8);
-  AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n",
+  AssertFatal(enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n",
                enc_rval.failed_type->name, enc_rval.encoded);
-
-  if (enc_rval.encoded==-1) {
-    return(-1);
-  }
+  AssertFatal(enc_rval.encoded <= NR_MAX_SIB_LENGTH, "ASN1 encoded length %zd bits. 3GPP TS 38.331 section 5.2.1 - The physical layer imposes a limit to the maximum size a SIB can take. The maximum SIB1 or SI message size is 2976 bits.\n", enc_rval.encoded);
 
   return((enc_rval.encoded+7)/8);
 }
@@ -988,139 +985,206 @@ uint8_t do_RRCReject(uint8_t Mod_id,
     return((enc_rval.encoded+7)/8);
 }
 
-// TODO: Implement to b_SRS = 1 and b_SRS = 2
-long rrc_get_max_nr_csrs(uint8_t max_rbs, long b_SRS) {
-
-  if(b_SRS>0) {
-    LOG_E(NR_RRC,"rrc_get_max_nr_csrs(): Not implemented yet for b_SRS>0\n");
-    return 0; // This c_srs is always valid
+void fill_default_downlinkBWP(NR_BWP_Downlink_t *bwp,
+                              int bwp_loop,
+                              NR_ServingCellConfig_t *servingcellconfigdedicated,
+                              NR_ServingCellConfigCommon_t *scc,
+                              const gNB_RrcConfigurationReq *configuration) {
+
+  /// BWP common configuration
+  bwp->bwp_Common = calloc(1,sizeof(*bwp->bwp_Common));
+  if(servingcellconfigdedicated->downlinkBWP_ToAddModList &&
+     bwp_loop < servingcellconfigdedicated->downlinkBWP_ToAddModList->list.count) {
+    bwp->bwp_Id = servingcellconfigdedicated->downlinkBWP_ToAddModList->list.array[bwp_loop]->bwp_Id;
+    bwp->bwp_Common->genericParameters.locationAndBandwidth = servingcellconfigdedicated->downlinkBWP_ToAddModList->list.array[bwp_loop]->bwp_Common->genericParameters.locationAndBandwidth;
+    bwp->bwp_Common->genericParameters.subcarrierSpacing = servingcellconfigdedicated->downlinkBWP_ToAddModList->list.array[bwp_loop]->bwp_Common->genericParameters.subcarrierSpacing;
+    bwp->bwp_Common->genericParameters.cyclicPrefix = servingcellconfigdedicated->downlinkBWP_ToAddModList->list.array[bwp_loop]->bwp_Common->genericParameters.cyclicPrefix;
+  } else {
+    bwp->bwp_Id=bwp_loop+1;
+    bwp->bwp_Common->genericParameters.locationAndBandwidth = PRBalloc_to_locationandbandwidth(scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth,0);
+    bwp->bwp_Common->genericParameters.subcarrierSpacing = scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.subcarrierSpacing;
+    bwp->bwp_Common->genericParameters.cyclicPrefix = scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.cyclicPrefix;
   }
 
-  const uint16_t m_SRS[64] = { 4, 8, 12, 16, 16, 20, 24, 24, 28, 32, 36, 40, 48, 48, 52, 56, 60, 64, 72, 72, 76, 80, 88,
-                               96, 96, 104, 112, 120, 120, 120, 128, 128, 128, 132, 136, 144, 144, 144, 144, 152, 160,
-                               160, 160, 168, 176, 184, 192, 192, 192, 192, 208, 216, 224, 240, 240, 240, 240, 256, 256,
-                               256, 264, 272, 272, 272 };
-
-  long c_srs = 0;
-  uint16_t m = 4;
-  for(int c = 1; c<64; c++) {
-    if(m_SRS[c]>m && m_SRS[c]<max_rbs) {
-      c_srs = c;
-      m = m_SRS[c];
-    }
-  }
+  bwp->bwp_Common->pdcch_ConfigCommon=calloc(1,sizeof(*bwp->bwp_Common->pdcch_ConfigCommon));
+  bwp->bwp_Common->pdcch_ConfigCommon->present = NR_SetupRelease_PDCCH_ConfigCommon_PR_setup;
+  bwp->bwp_Common->pdcch_ConfigCommon->choice.setup = calloc(1,sizeof(*bwp->bwp_Common->pdcch_ConfigCommon->choice.setup));
+  bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->controlResourceSetZero=NULL;
+  bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonControlResourceSet=calloc(1,sizeof(*bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonControlResourceSet));
+
+  int curr_bwp = NRRIV2BW(bwp->bwp_Common->genericParameters.locationAndBandwidth,MAX_BWP_SIZE);
 
-  return c_srs;
+  NR_ControlResourceSet_t *coreset = calloc(1,sizeof(*coreset));
+  uint64_t bitmap = get_ssb_bitmap(scc);
+  rrc_coreset_config(coreset, bwp->bwp_Id, curr_bwp, bitmap);
+
+  bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonControlResourceSet = coreset;
+  bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->searchSpaceZero=NULL;
+  bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList=NULL;
+  bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList=calloc(1,sizeof(*bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList));
+
+  NR_SearchSpace_t *ss=calloc(1,sizeof(*ss));
+  ss->searchSpaceId = (bwp->bwp_Id<<1)-1 + 7; // To uniquely identify each SearchSpace lets derive it from the BWPId
+  ss->controlResourceSetId=calloc(1,sizeof(*ss->controlResourceSetId));
+  *ss->controlResourceSetId=coreset->controlResourceSetId;
+  ss->monitoringSlotPeriodicityAndOffset = calloc(1,sizeof(*ss->monitoringSlotPeriodicityAndOffset));
+  ss->monitoringSlotPeriodicityAndOffset->present = NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
+  ss->duration=NULL;
+  ss->monitoringSymbolsWithinSlot = calloc(1,sizeof(*ss->monitoringSymbolsWithinSlot));
+  ss->monitoringSymbolsWithinSlot->buf = calloc(1,2);
+  // should be '1100 0000 0000 00'B (LSB first!), first two symols in slot, adjust if needed
+  ss->monitoringSymbolsWithinSlot->buf[1] = 0;
+  ss->monitoringSymbolsWithinSlot->buf[0] = (1<<7);
+  ss->monitoringSymbolsWithinSlot->size = 2;
+  ss->monitoringSymbolsWithinSlot->bits_unused = 2;
+  ss->nrofCandidates = calloc(1,sizeof(*ss->nrofCandidates));
+  ss->nrofCandidates->aggregationLevel1 = NR_SearchSpace__nrofCandidates__aggregationLevel1_n0;
+  ss->nrofCandidates->aggregationLevel2 = NR_SearchSpace__nrofCandidates__aggregationLevel2_n2;
+  ss->nrofCandidates->aggregationLevel4 = NR_SearchSpace__nrofCandidates__aggregationLevel4_n1;
+  ss->nrofCandidates->aggregationLevel8 = NR_SearchSpace__nrofCandidates__aggregationLevel8_n0;
+  ss->nrofCandidates->aggregationLevel16 = NR_SearchSpace__nrofCandidates__aggregationLevel16_n0;
+  ss->searchSpaceType = calloc(1,sizeof(*ss->searchSpaceType));
+  ss->searchSpaceType->present = NR_SearchSpace__searchSpaceType_PR_common;
+  ss->searchSpaceType->choice.common=calloc(1,sizeof(*ss->searchSpaceType->choice.common));
+  ss->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0 = calloc(1,sizeof(*ss->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0));
+
+  ASN_SEQUENCE_ADD(&bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList->list,ss);
+
+  bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->searchSpaceSIB1=NULL;
+  bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->searchSpaceOtherSystemInformation=NULL;
+  bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->pagingSearchSpace=NULL;
+  bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->ra_SearchSpace=NULL;
+  bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->ext1=NULL;
+  bwp->bwp_Common->pdsch_ConfigCommon=calloc(1,sizeof(*bwp->bwp_Common->pdsch_ConfigCommon));
+  bwp->bwp_Common->pdsch_ConfigCommon->present = NR_SetupRelease_PDSCH_ConfigCommon_PR_setup;
+  bwp->bwp_Common->pdsch_ConfigCommon->choice.setup = calloc(1,sizeof(*bwp->bwp_Common->pdsch_ConfigCommon->choice.setup));
+  bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList = calloc(1,sizeof(*bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList));
+
+  // Prepare PDSCH-TimeDomainResourceAllocation list
+  nr_rrc_config_dl_tda(scc,
+                       bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList,
+                       curr_bwp);
+
+  /// BWP dedicated configuration
+  bwp->bwp_Dedicated=calloc(1,sizeof(*bwp->bwp_Dedicated));
+  bwp->bwp_Dedicated->pdcch_Config=calloc(1,sizeof(*bwp->bwp_Dedicated->pdcch_Config));
+  bwp->bwp_Dedicated->pdcch_Config->present = NR_SetupRelease_PDCCH_Config_PR_setup;
+  bwp->bwp_Dedicated->pdcch_Config->choice.setup = calloc(1,sizeof(*bwp->bwp_Dedicated->pdcch_Config->choice.setup));
+  bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList = calloc(1,sizeof(*bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList));
+  bwp->bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList = calloc(1,sizeof(*bwp->bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList));
+
+  NR_ControlResourceSet_t *coreset2 = calloc(1,sizeof(*coreset2));
+  rrc_coreset_config(coreset2, bwp->bwp_Id, curr_bwp, bitmap);
+  ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList->list, coreset2);
+
+  bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList = calloc(1,sizeof(*bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList));
+  NR_SearchSpace_t *ss2 = calloc(1,sizeof(*ss2));
+  ss2->searchSpaceId=(bwp->bwp_Id<<1) + 7; // To uniquely identify each SearchSpace lets derive it from the BWPId
+  ss2->controlResourceSetId=calloc(1,sizeof(*ss2->controlResourceSetId));
+  *ss2->controlResourceSetId=coreset2->controlResourceSetId;
+  ss2->monitoringSlotPeriodicityAndOffset=calloc(1,sizeof(*ss2->monitoringSlotPeriodicityAndOffset));
+  ss2->monitoringSlotPeriodicityAndOffset->present = NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
+  ss2->monitoringSlotPeriodicityAndOffset->choice.sl1=(NULL_t)0;
+  ss2->duration=NULL;
+  ss2->monitoringSymbolsWithinSlot = calloc(1,sizeof(*ss2->monitoringSymbolsWithinSlot));
+  ss2->monitoringSymbolsWithinSlot->buf = calloc(1,2);
+  ss2->monitoringSymbolsWithinSlot->size = 2;
+  ss2->monitoringSymbolsWithinSlot->buf[0]=0x80;
+  ss2->monitoringSymbolsWithinSlot->buf[1]=0x0;
+  ss2->monitoringSymbolsWithinSlot->bits_unused = 2;
+  ss2->nrofCandidates=calloc(1,sizeof(*ss2->nrofCandidates));
+  ss2->nrofCandidates->aggregationLevel1 = NR_SearchSpace__nrofCandidates__aggregationLevel1_n0;
+  ss2->nrofCandidates->aggregationLevel2 = NR_SearchSpace__nrofCandidates__aggregationLevel2_n2;
+  ss2->nrofCandidates->aggregationLevel4 = NR_SearchSpace__nrofCandidates__aggregationLevel4_n1;
+  ss2->nrofCandidates->aggregationLevel8 = NR_SearchSpace__nrofCandidates__aggregationLevel8_n0;
+  ss2->nrofCandidates->aggregationLevel16 = NR_SearchSpace__nrofCandidates__aggregationLevel16_n0;
+  ss2->searchSpaceType=calloc(1,sizeof(*ss2->searchSpaceType));
+  ss2->searchSpaceType->present = NR_SearchSpace__searchSpaceType_PR_ue_Specific;
+  ss2->searchSpaceType->choice.ue_Specific = calloc(1,sizeof(*ss2->searchSpaceType->choice.ue_Specific));
+  ss2->searchSpaceType->choice.ue_Specific->dci_Formats=NR_SearchSpace__searchSpaceType__ue_Specific__dci_Formats_formats0_1_And_1_1;
+  ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList->list, ss2);
+
+  bwp->bwp_Dedicated->pdsch_Config=calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config));
+  bwp->bwp_Dedicated->pdsch_Config->present = NR_SetupRelease_PDSCH_Config_PR_setup;
+  bwp->bwp_Dedicated->pdsch_Config->choice.setup = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup));
+  bwp->bwp_Dedicated->pdsch_Config->choice.setup->dataScramblingIdentityPDSCH = NULL;
+  bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA));
+  bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->present= NR_SetupRelease_DMRS_DownlinkConfig_PR_setup;
+  bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup));
+  bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type=NULL;
+  bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->maxLength=NULL;
+  bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition));
+  *bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition = NR_DMRS_DownlinkConfig__dmrs_AdditionalPosition_pos1;
+  bwp->bwp_Dedicated->pdsch_Config->choice.setup->resourceAllocation = NR_PDSCH_Config__resourceAllocation_resourceAllocationType1;
+  bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.present = NR_PDSCH_Config__prb_BundlingType_PR_staticBundling;
+  bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling));
+  bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling->bundleSize =
+      calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling->bundleSize));
+  *bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling->bundleSize = NR_PDSCH_Config__prb_BundlingType__staticBundling__bundleSize_wideband;
+  bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList=calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList));
+  NR_TCI_State_t *tcic = calloc(1,sizeof(*tcic));
+  tcic->tci_StateId=0;
+  tcic->qcl_Type1.cell=NULL;
+  tcic->qcl_Type1.bwp_Id=NULL;
+  tcic->qcl_Type1.referenceSignal.present = NR_QCL_Info__referenceSignal_PR_ssb;
+  tcic->qcl_Type1.referenceSignal.choice.ssb = 0;
+  tcic->qcl_Type1.qcl_Type=NR_QCL_Info__qcl_Type_typeD;
+  ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList->list,tcic);
 }
 
+void fill_default_uplinkBWP(NR_BWP_Uplink_t *ubwp,
+                            int bwp_loop,
+                            NR_ServingCellConfig_t *servingcellconfigdedicated,
+                            NR_ServingCellConfigCommon_t *scc,
+                            const gNB_RrcConfigurationReq *configuration,
+                            int uid) {
+
+  /// BWP common configuration
+  ubwp->bwp_Common = calloc(1,sizeof(*ubwp->bwp_Common));
+  if(servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList &&
+     bwp_loop < servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.count) {
+    ubwp->bwp_Id = servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[bwp_loop]->bwp_Id;
+    ubwp->bwp_Common->genericParameters.locationAndBandwidth = servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[bwp_loop]->bwp_Common->genericParameters.locationAndBandwidth;
+    ubwp->bwp_Common->genericParameters.subcarrierSpacing = servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[bwp_loop]->bwp_Common->genericParameters.subcarrierSpacing;
+    ubwp->bwp_Common->genericParameters.cyclicPrefix = servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[bwp_loop]->bwp_Common->genericParameters.cyclicPrefix;
+  } else {
+    ubwp->bwp_Id=bwp_loop+1;
+    ubwp->bwp_Common->genericParameters.locationAndBandwidth = PRBalloc_to_locationandbandwidth(scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth,0);
+    ubwp->bwp_Common->genericParameters.subcarrierSpacing = scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.subcarrierSpacing;
+    ubwp->bwp_Common->genericParameters.cyclicPrefix = scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.cyclicPrefix;
+  }
 
-void fill_initial_SpCellConfig(int uid,
-                               NR_SpCellConfig_t *SpCellConfig,
-                               NR_ServingCellConfigCommon_t *scc,
-                               const gNB_RrcConfigurationReq *configuration)
-{
-  // This assert will never happen in the current implementation because NUMBER_OF_UE_MAX = 4.
-  // However, if in the future NUMBER_OF_UE_MAX is increased, it will be necessary to improve the allocation of SRS resources,
-  // where the startPosition = 2 or 3 and sl160 = 17, 17, 27 ... 157 only give us 30 different allocations.
-  AssertFatal(uid>=0 && uid<30, "gNB cannot allocate the SRS resources\n");
+  int curr_bwp = NRRIV2BW(ubwp->bwp_Common->genericParameters.locationAndBandwidth,MAX_BWP_SIZE);
 
-  int curr_bwp = NRRIV2BW(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth,MAX_BWP_SIZE);
-  SpCellConfig->servCellIndex = NULL;
-  SpCellConfig->reconfigurationWithSync = NULL;
-  SpCellConfig->rlmInSyncOutOfSyncThreshold = NULL;
-  SpCellConfig->rlf_TimersAndConstants = NULL;
-  SpCellConfig->spCellConfigDedicated = calloc(1,sizeof(*SpCellConfig->spCellConfigDedicated));
-  SpCellConfig->spCellConfigDedicated->uplinkConfig = calloc(1,sizeof(*SpCellConfig->spCellConfigDedicated->uplinkConfig));
-  NR_BWP_UplinkDedicated_t *initialUplinkBWP = calloc(1,sizeof(*initialUplinkBWP));
-  SpCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP = initialUplinkBWP;
-  initialUplinkBWP->pucch_Config = calloc(1,sizeof(*initialUplinkBWP->pucch_Config));
-  initialUplinkBWP->pucch_Config->present = NR_SetupRelease_PUCCH_Config_PR_setup;
+  ubwp->bwp_Common->rach_ConfigCommon  = NULL;
+  ubwp->bwp_Common->pusch_ConfigCommon = scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon;
+  ubwp->bwp_Common->pucch_ConfigCommon = scc->uplinkConfigCommon->initialUplinkBWP->pucch_ConfigCommon;
+
+  /// BWP dedicated configuration
+  ubwp->bwp_Dedicated = calloc(1,sizeof(*ubwp->bwp_Dedicated));
+
+  // PUCCH config
+  ubwp->bwp_Dedicated->pucch_Config = calloc(1,sizeof(*ubwp->bwp_Dedicated->pucch_Config));
+  ubwp->bwp_Dedicated->pucch_Config->present = NR_SetupRelease_PUCCH_Config_PR_setup;
   NR_PUCCH_Config_t *pucch_Config = calloc(1,sizeof(*pucch_Config));
-  initialUplinkBWP->pucch_Config->choice.setup=pucch_Config;
+  ubwp->bwp_Dedicated->pucch_Config->choice.setup=pucch_Config;
+
   pucch_Config->resourceSetToAddModList = calloc(1,sizeof(*pucch_Config->resourceSetToAddModList));
   pucch_Config->resourceSetToReleaseList = NULL;
-  NR_PUCCH_ResourceSet_t *pucchresset0=calloc(1,sizeof(*pucchresset0));
-  NR_PUCCH_ResourceSet_t *pucchresset1=calloc(1,sizeof(*pucchresset1));
-  pucchresset0->pucch_ResourceSetId = 0;
-  NR_PUCCH_ResourceId_t *pucchresset0id0=calloc(1,sizeof(*pucchresset0id0));
-  *pucchresset0id0=0;
-  ASN_SEQUENCE_ADD(&pucchresset0->resourceList.list,pucchresset0id0);
-  pucchresset0->maxPayloadSize=NULL;
-  ASN_SEQUENCE_ADD(&pucch_Config->resourceSetToAddModList->list,pucchresset0);
-  
-  pucchresset1->pucch_ResourceSetId = 1;
-  NR_PUCCH_ResourceId_t *pucchresset1id0=calloc(1,sizeof(*pucchresset1id0));
-  *pucchresset1id0=1;
-  ASN_SEQUENCE_ADD(&pucchresset1->resourceList.list,pucchresset1id0);
-  pucchresset1->maxPayloadSize=NULL;
-  ASN_SEQUENCE_ADD(&pucch_Config->resourceSetToAddModList->list,pucchresset1);
-
   pucch_Config->resourceToAddModList = calloc(1,sizeof(*pucch_Config->resourceToAddModList));
   pucch_Config->resourceToReleaseList = NULL;
-  // configure one single PUCCH0 opportunity for initial connection procedure
-  // one symbol (13)
-  NR_PUCCH_Resource_t *pucchres0=calloc(1,sizeof(*pucchres0));
-  pucchres0->pucch_ResourceId=0;
-  //pucchres0->startingPRB=0;
-  pucchres0->startingPRB=(8+uid) % (curr_bwp/2);
-  LOG_D(NR_RRC, "pucchres0->startPRB %ld uid %d curr_bwp %d\n", pucchres0->startingPRB, uid, curr_bwp);
-  pucchres0->intraSlotFrequencyHopping=NULL;
-  pucchres0->secondHopPRB=NULL;
-  pucchres0->format.present= NR_PUCCH_Resource__format_PR_format0;
-  pucchres0->format.choice.format0=calloc(1,sizeof(*pucchres0->format.choice.format0));
-  pucchres0->format.choice.format0->initialCyclicShift=0;
-  pucchres0->format.choice.format0->nrofSymbols=1;
-  pucchres0->format.choice.format0->startingSymbolIndex=13;
-  ASN_SEQUENCE_ADD(&pucch_Config->resourceToAddModList->list,pucchres0);
-
-  NR_PUCCH_Resource_t *pucchres2=calloc(1,sizeof(*pucchres2));
-  pucchres2->pucch_ResourceId=1;
-  pucchres2->startingPRB=0;
-  pucchres2->intraSlotFrequencyHopping=NULL;
-  pucchres2->secondHopPRB=NULL;
-  pucchres2->format.present= NR_PUCCH_Resource__format_PR_format2;
-  pucchres2->format.choice.format2=calloc(1,sizeof(*pucchres2->format.choice.format2));
-  pucchres2->format.choice.format2->nrofPRBs=8;
-  pucchres2->format.choice.format2->nrofSymbols=1;
-  pucchres2->format.choice.format2->startingSymbolIndex=13;
-  ASN_SEQUENCE_ADD(&pucch_Config->resourceToAddModList->list,pucchres2);
-
-  pucch_Config->format2=calloc(1,sizeof(*pucch_Config->format2));
-  pucch_Config->format2->present=NR_SetupRelease_PUCCH_FormatConfig_PR_setup;
-  NR_PUCCH_FormatConfig_t *pucchfmt2 = calloc(1,sizeof(*pucchfmt2));
-  pucch_Config->format2->choice.setup = pucchfmt2;
-  pucchfmt2->interslotFrequencyHopping=NULL;
-  pucchfmt2->additionalDMRS=NULL;
-  pucchfmt2->maxCodeRate=calloc(1,sizeof(*pucchfmt2->maxCodeRate));
-  *pucchfmt2->maxCodeRate=NR_PUCCH_MaxCodeRate_zeroDot35;
-  pucchfmt2->nrofSlots=NULL;
-  pucchfmt2->pi2BPSK=NULL;
-  pucchfmt2->simultaneousHARQ_ACK_CSI=calloc(1,sizeof(*pucchfmt2->simultaneousHARQ_ACK_CSI));
-  *pucchfmt2->simultaneousHARQ_ACK_CSI=NR_PUCCH_FormatConfig__simultaneousHARQ_ACK_CSI_true;
-  
-  pucch_Config->spatialRelationInfoToAddModList = calloc(1,sizeof(*pucch_Config->spatialRelationInfoToAddModList));
-  NR_PUCCH_SpatialRelationInfo_t *pucchspatial = calloc(1,sizeof(*pucchspatial));
-  pucchspatial->pucch_SpatialRelationInfoId = 1;
-  pucchspatial->servingCellId = NULL;
-  if(configuration->do_CSIRS) {
-    pucchspatial->referenceSignal.present = NR_PUCCH_SpatialRelationInfo__referenceSignal_PR_csi_RS_Index;
-    pucchspatial->referenceSignal.choice.csi_RS_Index = 0;
-  }
-  else {
-    pucchspatial->referenceSignal.present = NR_PUCCH_SpatialRelationInfo__referenceSignal_PR_ssb_Index;
-    pucchspatial->referenceSignal.choice.ssb_Index = 0;
-  }
-  pucchspatial->pucch_PathlossReferenceRS_Id = 0;
-  pucchspatial->p0_PUCCH_Id = 1;
-  pucchspatial->closedLoopIndex = NR_PUCCH_SpatialRelationInfo__closedLoopIndex_i0;
-  ASN_SEQUENCE_ADD(&pucch_Config->spatialRelationInfoToAddModList->list,pucchspatial);
+  config_pucch_resset0(pucch_Config, uid, curr_bwp, NULL);
+  config_pucch_resset1(pucch_Config, NULL);
+  set_pucch_power_config(pucch_Config, configuration->do_CSIRS);
 
+  scheduling_request_config(scc, pucch_Config);
+  set_dl_DataToUL_ACK(pucch_Config, configuration->minRXTXTIME);
 
-  initialUplinkBWP->pusch_Config = calloc(1,sizeof(*initialUplinkBWP->pusch_Config));
-  initialUplinkBWP->pusch_Config->present = NR_SetupRelease_PUSCH_Config_PR_setup;
+  // PUSCH config
+  ubwp->bwp_Dedicated->pusch_Config = calloc(1,sizeof(*ubwp->bwp_Dedicated->pusch_Config));
+  ubwp->bwp_Dedicated->pusch_Config->present = NR_SetupRelease_PUSCH_Config_PR_setup;
   NR_PUSCH_Config_t *pusch_Config = calloc(1,sizeof(*pusch_Config));
-  initialUplinkBWP->pusch_Config->choice.setup = pusch_Config;
-  pusch_Config->dataScramblingIdentityPUSCH = NULL;
+  ubwp->bwp_Dedicated->pusch_Config->choice.setup = pusch_Config;
   pusch_Config->txConfig=calloc(1,sizeof(*pusch_Config->txConfig));
   *pusch_Config->txConfig= NR_PUSCH_Config__txConfig_codebook;
   pusch_Config->dmrs_UplinkForPUSCH_MappingTypeA = NULL;
@@ -1129,8 +1193,8 @@ void fill_initial_SpCellConfig(int uid,
   pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup = calloc(1,sizeof(*pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup));
   NR_DMRS_UplinkConfig_t *NR_DMRS_UplinkConfig = pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup;
   NR_DMRS_UplinkConfig->dmrs_Type = NULL;
-  NR_DMRS_UplinkConfig->dmrs_AdditionalPosition = NULL; /*calloc(1,sizeof(*NR_DMRS_UplinkConfig->dmrs_AdditionalPosition));
-  *NR_DMRS_UplinkConfig->dmrs_AdditionalPosition = NR_DMRS_UplinkConfig__dmrs_AdditionalPosition_pos0;*/
+  NR_DMRS_UplinkConfig->dmrs_AdditionalPosition = calloc(1,sizeof(*NR_DMRS_UplinkConfig->dmrs_AdditionalPosition));
+  *NR_DMRS_UplinkConfig->dmrs_AdditionalPosition = NR_DMRS_UplinkConfig__dmrs_AdditionalPosition_pos0;
   NR_DMRS_UplinkConfig->phaseTrackingRS=NULL;
   NR_DMRS_UplinkConfig->maxLength=NULL;
   NR_DMRS_UplinkConfig->transformPrecodingDisabled = calloc(1,sizeof(*NR_DMRS_UplinkConfig->transformPrecodingDisabled));
@@ -1142,7 +1206,7 @@ void fill_initial_SpCellConfig(int uid,
   pusch_Config->pusch_PowerControl->msg3_Alpha = calloc(1,sizeof(*pusch_Config->pusch_PowerControl->msg3_Alpha));
   *pusch_Config->pusch_PowerControl->msg3_Alpha = NR_Alpha_alpha1;
   pusch_Config->pusch_PowerControl->p0_NominalWithoutGrant = calloc(1,sizeof(*pusch_Config->pusch_PowerControl->p0_NominalWithoutGrant));
-  *pusch_Config->pusch_PowerControl->p0_NominalWithoutGrant = -76;
+  *pusch_Config->pusch_PowerControl->p0_NominalWithoutGrant = -98;
   pusch_Config->pusch_PowerControl->p0_AlphaSets = calloc(1,sizeof(*pusch_Config->pusch_PowerControl->p0_AlphaSets));
   NR_P0_PUSCH_AlphaSet_t *aset = calloc(1,sizeof(*aset));
   aset->p0_PUSCH_AlphaSetId=0;
@@ -1187,11 +1251,30 @@ void fill_initial_SpCellConfig(int uid,
   pusch_Config->rbg_Size=NULL;
   pusch_Config->uci_OnPUSCH=NULL;
   pusch_Config->tp_pi2BPSK=NULL;
+  uint8_t transform_precoding = NR_PUSCH_Config__transformPrecoder_disabled;
+  if (pusch_Config->transformPrecoder == NULL) {
+    if (scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg3_transformPrecoder != NULL)
+      transform_precoding = NR_PUSCH_Config__transformPrecoder_enabled;
+  }
+  else {
+    transform_precoding = *pusch_Config->transformPrecoder;
+  }
+  if (transform_precoding == NR_PUSCH_Config__transformPrecoder_enabled) {
+    // Enable DMRS uplink config for transform precoding enabled
+    NR_DMRS_UplinkConfig->transformPrecodingEnabled = calloc(1,sizeof(*NR_DMRS_UplinkConfig->transformPrecodingEnabled));
+    NR_DMRS_UplinkConfig->transformPrecodingEnabled->nPUSCH_Identity = NULL;
+    NR_DMRS_UplinkConfig->transformPrecodingEnabled->sequenceGroupHopping = NULL;
+    NR_DMRS_UplinkConfig->transformPrecodingEnabled->sequenceHopping = NULL;
+    NR_DMRS_UplinkConfig->transformPrecodingEnabled->ext1 = NULL;
+    LOG_I(NR_RRC,"Transform precoding enabled\n");
+  }
 
-  initialUplinkBWP->srs_Config = calloc(1,sizeof(*initialUplinkBWP->srs_Config));
-  initialUplinkBWP->srs_Config->present = NR_SetupRelease_SRS_Config_PR_setup;
+  // SRS config
+  ubwp->bwp_Dedicated->configuredGrantConfig = NULL;
+  ubwp->bwp_Dedicated->srs_Config = calloc(1,sizeof(*ubwp->bwp_Dedicated->srs_Config));
+  ubwp->bwp_Dedicated->srs_Config->present = NR_SetupRelease_SRS_Config_PR_setup;
   NR_SRS_Config_t *srs_Config = calloc(1,sizeof(*srs_Config));
-  initialUplinkBWP->srs_Config->choice.setup=srs_Config;
+  ubwp->bwp_Dedicated->srs_Config->choice.setup = srs_Config;
   srs_Config->srs_ResourceSetToReleaseList=NULL;
   srs_Config->srs_ResourceSetToAddModList=calloc(1,sizeof(*srs_Config->srs_ResourceSetToAddModList));
   NR_SRS_ResourceSet_t *srs_resset0=calloc(1,sizeof(*srs_resset0));
@@ -1201,21 +1284,13 @@ void fill_initial_SpCellConfig(int uid,
   *srs_resset0_id=0;
   ASN_SEQUENCE_ADD(&srs_resset0->srs_ResourceIdList->list,srs_resset0_id);
   srs_Config->srs_ResourceToReleaseList=NULL;
-
-  if (configuration->do_SRS) {
-    srs_resset0->resourceType.present =  NR_SRS_ResourceSet__resourceType_PR_periodic;
-    srs_resset0->resourceType.choice.periodic = calloc(1,sizeof(*srs_resset0->resourceType.choice.periodic));
-    srs_resset0->resourceType.choice.periodic->associatedCSI_RS = NULL;
-  } else {
-    srs_resset0->resourceType.present =  NR_SRS_ResourceSet__resourceType_PR_aperiodic;
-    srs_resset0->resourceType.choice.aperiodic = calloc(1,sizeof(*srs_resset0->resourceType.choice.aperiodic));
-    srs_resset0->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger=1;
-    srs_resset0->resourceType.choice.aperiodic->csi_RS=NULL;
-    srs_resset0->resourceType.choice.aperiodic->slotOffset= calloc(1,sizeof(*srs_resset0->resourceType.choice.aperiodic->slotOffset));
-    *srs_resset0->resourceType.choice.aperiodic->slotOffset=2;
-    srs_resset0->resourceType.choice.aperiodic->ext1=NULL;
-  }
-
+  srs_resset0->resourceType.present =  NR_SRS_ResourceSet__resourceType_PR_aperiodic;
+  srs_resset0->resourceType.choice.aperiodic = calloc(1,sizeof(*srs_resset0->resourceType.choice.aperiodic));
+  srs_resset0->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger=1;
+  srs_resset0->resourceType.choice.aperiodic->csi_RS=NULL;
+  srs_resset0->resourceType.choice.aperiodic->slotOffset= calloc(1,sizeof(*srs_resset0->resourceType.choice.aperiodic->slotOffset));
+  *srs_resset0->resourceType.choice.aperiodic->slotOffset=2;
+  srs_resset0->resourceType.choice.aperiodic->ext1=NULL;
   srs_resset0->usage=NR_SRS_ResourceSet__usage_codebook;
   srs_resset0->alpha = calloc(1,sizeof(*srs_resset0->alpha));
   *srs_resset0->alpha = NR_Alpha_alpha1;
@@ -1234,28 +1309,17 @@ void fill_initial_SpCellConfig(int uid,
   srs_res0->transmissionComb.choice.n2=calloc(1,sizeof(*srs_res0->transmissionComb.choice.n2));
   srs_res0->transmissionComb.choice.n2->combOffset_n2=0;
   srs_res0->transmissionComb.choice.n2->cyclicShift_n2=0;
-  srs_res0->resourceMapping.startPosition = 2 + uid%2;
+  srs_res0->resourceMapping.startPosition=2;
   srs_res0->resourceMapping.nrofSymbols=NR_SRS_Resource__resourceMapping__nrofSymbols_n1;
   srs_res0->resourceMapping.repetitionFactor=NR_SRS_Resource__resourceMapping__repetitionFactor_n1;
   srs_res0->freqDomainPosition=0;
   srs_res0->freqDomainShift=0;
+  srs_res0->freqHopping.c_SRS=0;
   srs_res0->freqHopping.b_SRS=0;
   srs_res0->freqHopping.b_hop=0;
-  srs_res0->freqHopping.c_SRS = rrc_get_max_nr_csrs(
-      NRRIV2BW(scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, 275),
-      srs_res0->freqHopping.b_SRS);
   srs_res0->groupOrSequenceHopping=NR_SRS_Resource__groupOrSequenceHopping_neither;
-
-  if (configuration->do_SRS) {
-    srs_res0->resourceType.present= NR_SRS_Resource__resourceType_PR_periodic;
-    srs_res0->resourceType.choice.periodic=calloc(1,sizeof(*srs_res0->resourceType.choice.periodic));
-    srs_res0->resourceType.choice.periodic->periodicityAndOffset_p.present = NR_SRS_PeriodicityAndOffset_PR_sl160;
-    srs_res0->resourceType.choice.periodic->periodicityAndOffset_p.choice.sl160 = 17 + (uid>1)*10; // 17/17/.../147/157 are mixed slots
-  } else {
-    srs_res0->resourceType.present= NR_SRS_Resource__resourceType_PR_aperiodic;
-    srs_res0->resourceType.choice.aperiodic=calloc(1,sizeof(*srs_res0->resourceType.choice.aperiodic));
-  }
-
+  srs_res0->resourceType.present= NR_SRS_Resource__resourceType_PR_aperiodic;
+  srs_res0->resourceType.choice.aperiodic=calloc(1,sizeof(*srs_res0->resourceType.choice.aperiodic));
   srs_res0->sequenceId=40;
   srs_res0->spatialRelationInfo=calloc(1,sizeof(*srs_res0->spatialRelationInfo));
   srs_res0->spatialRelationInfo->servingCellId=NULL;
@@ -1263,31 +1327,124 @@ void fill_initial_SpCellConfig(int uid,
   srs_res0->spatialRelationInfo->referenceSignal.choice.csi_RS_Index=0;
   ASN_SEQUENCE_ADD(&srs_Config->srs_ResourceToAddModList->list,srs_res0);
 
-  // configure Scheduling request
-  // 40 slot period 
-  pucch_Config->schedulingRequestResourceToAddModList = calloc(1,sizeof(*pucch_Config->schedulingRequestResourceToAddModList));
-  NR_SchedulingRequestResourceConfig_t *schedulingRequestResourceConfig = calloc(1,sizeof(*schedulingRequestResourceConfig));
-  schedulingRequestResourceConfig->schedulingRequestResourceId = 1;
-  schedulingRequestResourceConfig->schedulingRequestID= 0;
-  schedulingRequestResourceConfig->periodicityAndOffset = calloc(1,sizeof(*schedulingRequestResourceConfig->periodicityAndOffset));
-  schedulingRequestResourceConfig->periodicityAndOffset->present = NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl40;
-  AssertFatal(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.subcarrierSpacing==NR_SubcarrierSpacing_kHz30,
-              "SCS != 30kHz\n");
-
-  schedulingRequestResourceConfig->periodicityAndOffset->choice.sl40 = 8;
-  schedulingRequestResourceConfig->resource = calloc(1,sizeof(*schedulingRequestResourceConfig->resource));
-  *schedulingRequestResourceConfig->resource = 0;
-  ASN_SEQUENCE_ADD(&pucch_Config->schedulingRequestResourceToAddModList->list,schedulingRequestResourceConfig);
-
- pucch_Config->dl_DataToUL_ACK = calloc(1,sizeof(*pucch_Config->dl_DataToUL_ACK));
- long *delay[8];
- for (int i=0;i<8;i++) {
-   delay[i] = calloc(1,sizeof(*delay[i]));
-   AssertFatal(configuration->minRXTXTIME >= 2 && configuration->minRXTXTIME < 7,
-               "minRXTXTIME is %d but should be within [2,7)\n", configuration->minRXTXTIME);
-   *delay[i] = i + configuration->minRXTXTIME;
-   ASN_SEQUENCE_ADD(&pucch_Config->dl_DataToUL_ACK->list,delay[i]);
- }
+  ubwp->bwp_Dedicated->beamFailureRecoveryConfig = NULL;
+}
+
+void fill_initial_SpCellConfig(int uid,
+                               NR_CellGroupConfig_t *cellGroupConfig,
+                               NR_ServingCellConfigCommon_t *scc,
+                               NR_ServingCellConfig_t *servingcellconfigdedicated,
+                               const gNB_RrcConfigurationReq *configuration) {
+
+  NR_SpCellConfig_t *SpCellConfig = cellGroupConfig->spCellConfig;
+
+  // This assert will never happen in the current implementation because NUMBER_OF_UE_MAX = 4.
+  // However, if in the future NUMBER_OF_UE_MAX is increased, it will be necessary to improve the allocation of SRS resources,
+  // where the startPosition = 2 or 3 and sl160 = 17, 17, 27 ... 157 only give us 30 different allocations.
+  AssertFatal(uid>=0 && uid<30, "gNB cannot allocate the SRS resources\n");
+
+  int curr_bwp = NRRIV2BW(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth,MAX_BWP_SIZE);
+  SpCellConfig->servCellIndex = NULL;
+  SpCellConfig->reconfigurationWithSync = NULL;
+  SpCellConfig->rlmInSyncOutOfSyncThreshold = NULL;
+  SpCellConfig->rlf_TimersAndConstants = NULL;
+
+  SpCellConfig->spCellConfigDedicated = calloc(1,sizeof(*SpCellConfig->spCellConfigDedicated));
+  SpCellConfig->spCellConfigDedicated->uplinkConfig = calloc(1,sizeof(*SpCellConfig->spCellConfigDedicated->uplinkConfig));
+
+  NR_BWP_UplinkDedicated_t *initialUplinkBWP = calloc(1,sizeof(*initialUplinkBWP));
+  SpCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP = initialUplinkBWP;
+  initialUplinkBWP->pucch_Config = calloc(1,sizeof(*initialUplinkBWP->pucch_Config));
+  initialUplinkBWP->pucch_Config->present = NR_SetupRelease_PUCCH_Config_PR_setup;
+  NR_PUCCH_Config_t *pucch_Config = calloc(1,sizeof(*pucch_Config));
+  initialUplinkBWP->pucch_Config->choice.setup=pucch_Config;
+  pucch_Config->resourceSetToAddModList = calloc(1,sizeof(*pucch_Config->resourceSetToAddModList));
+  pucch_Config->resourceSetToReleaseList = NULL;
+  pucch_Config->resourceToAddModList = calloc(1,sizeof(*pucch_Config->resourceToAddModList));
+  pucch_Config->resourceToReleaseList = NULL;
+  config_pucch_resset0(pucch_Config, uid, curr_bwp, NULL);
+  config_pucch_resset1(pucch_Config, NULL);
+  set_pucch_power_config(pucch_Config, configuration->do_CSIRS);
+
+  initialUplinkBWP->pusch_Config = calloc(1,sizeof(*initialUplinkBWP->pusch_Config));
+  initialUplinkBWP->pusch_Config->present = NR_SetupRelease_PUSCH_Config_PR_setup;
+  NR_PUSCH_Config_t *pusch_Config = calloc(1,sizeof(*pusch_Config));
+  initialUplinkBWP->pusch_Config->choice.setup = pusch_Config;
+  pusch_Config->dataScramblingIdentityPUSCH = NULL;
+  pusch_Config->txConfig=calloc(1,sizeof(*pusch_Config->txConfig));
+  *pusch_Config->txConfig= NR_PUSCH_Config__txConfig_codebook;
+  pusch_Config->dmrs_UplinkForPUSCH_MappingTypeA = NULL;
+  pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB = calloc(1,sizeof(*pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB));
+  pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->present = NR_SetupRelease_DMRS_UplinkConfig_PR_setup;
+  pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup = calloc(1,sizeof(*pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup));
+  NR_DMRS_UplinkConfig_t *NR_DMRS_UplinkConfig = pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup;
+  NR_DMRS_UplinkConfig->dmrs_Type = NULL;
+  NR_DMRS_UplinkConfig->dmrs_AdditionalPosition = NULL; /*calloc(1,sizeof(*NR_DMRS_UplinkConfig->dmrs_AdditionalPosition));
+  *NR_DMRS_UplinkConfig->dmrs_AdditionalPosition = NR_DMRS_UplinkConfig__dmrs_AdditionalPosition_pos0;*/
+  NR_DMRS_UplinkConfig->phaseTrackingRS=NULL;
+  NR_DMRS_UplinkConfig->maxLength=NULL;
+  NR_DMRS_UplinkConfig->transformPrecodingDisabled = calloc(1,sizeof(*NR_DMRS_UplinkConfig->transformPrecodingDisabled));
+  NR_DMRS_UplinkConfig->transformPrecodingDisabled->scramblingID0 = NULL;
+  NR_DMRS_UplinkConfig->transformPrecodingDisabled->scramblingID1 = NULL;
+  NR_DMRS_UplinkConfig->transformPrecodingEnabled = NULL;
+  pusch_Config->pusch_PowerControl = calloc(1,sizeof(*pusch_Config->pusch_PowerControl));
+  pusch_Config->pusch_PowerControl->tpc_Accumulation = NULL;
+  pusch_Config->pusch_PowerControl->msg3_Alpha = calloc(1,sizeof(*pusch_Config->pusch_PowerControl->msg3_Alpha));
+  *pusch_Config->pusch_PowerControl->msg3_Alpha = NR_Alpha_alpha1;
+  pusch_Config->pusch_PowerControl->p0_NominalWithoutGrant = calloc(1,sizeof(*pusch_Config->pusch_PowerControl->p0_NominalWithoutGrant));
+  *pusch_Config->pusch_PowerControl->p0_NominalWithoutGrant = -76;
+  pusch_Config->pusch_PowerControl->p0_AlphaSets = calloc(1,sizeof(*pusch_Config->pusch_PowerControl->p0_AlphaSets));
+  NR_P0_PUSCH_AlphaSet_t *aset = calloc(1,sizeof(*aset));
+  aset->p0_PUSCH_AlphaSetId=0;
+  aset->p0=calloc(1,sizeof(*aset->p0));
+  *aset->p0 = 0;
+  aset->alpha=calloc(1,sizeof(*aset->alpha));
+  *aset->alpha=NR_Alpha_alpha1;
+  ASN_SEQUENCE_ADD(&pusch_Config->pusch_PowerControl->p0_AlphaSets->list,aset);
+  pusch_Config->pusch_PowerControl->pathlossReferenceRSToAddModList = calloc(1,sizeof(*pusch_Config->pusch_PowerControl->pathlossReferenceRSToAddModList));
+  NR_PUSCH_PathlossReferenceRS_t *plrefRS = calloc(1,sizeof(*plrefRS));
+  plrefRS->pusch_PathlossReferenceRS_Id=0;
+  plrefRS->referenceSignal.present = NR_PUSCH_PathlossReferenceRS__referenceSignal_PR_ssb_Index;
+  plrefRS->referenceSignal.choice.ssb_Index = 0;
+  ASN_SEQUENCE_ADD(&pusch_Config->pusch_PowerControl->pathlossReferenceRSToAddModList->list,plrefRS);
+  pusch_Config->pusch_PowerControl->pathlossReferenceRSToReleaseList = NULL;
+  pusch_Config->pusch_PowerControl->twoPUSCH_PC_AdjustmentStates = NULL;
+  pusch_Config->pusch_PowerControl->deltaMCS = NULL;
+  pusch_Config->pusch_PowerControl->sri_PUSCH_MappingToAddModList = calloc(1,sizeof(*pusch_Config->pusch_PowerControl->sri_PUSCH_MappingToAddModList));
+  NR_SRI_PUSCH_PowerControl_t *sriPUSCHPC=calloc(1,sizeof(*sriPUSCHPC));
+  sriPUSCHPC->sri_PUSCH_PowerControlId=0;
+  sriPUSCHPC->sri_PUSCH_PathlossReferenceRS_Id=0;
+  sriPUSCHPC->sri_P0_PUSCH_AlphaSetId=0;
+  sriPUSCHPC->sri_PUSCH_ClosedLoopIndex=NR_SRI_PUSCH_PowerControl__sri_PUSCH_ClosedLoopIndex_i0;
+  ASN_SEQUENCE_ADD(&pusch_Config->pusch_PowerControl->sri_PUSCH_MappingToAddModList->list,sriPUSCHPC);
+  pusch_Config->pusch_PowerControl->sri_PUSCH_MappingToReleaseList = NULL;
+  pusch_Config->frequencyHopping=NULL;
+  pusch_Config->frequencyHoppingOffsetLists=NULL;
+  pusch_Config->resourceAllocation = NR_PUSCH_Config__resourceAllocation_resourceAllocationType1;
+  pusch_Config->pusch_TimeDomainAllocationList = NULL;
+  pusch_Config->pusch_AggregationFactor=NULL;
+  pusch_Config->mcs_Table=NULL;
+  pusch_Config->mcs_TableTransformPrecoder=NULL;
+  pusch_Config->transformPrecoder= NULL;
+  if (scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg3_transformPrecoder == NULL) {
+    pusch_Config->transformPrecoder=calloc(1,sizeof(*pusch_Config->transformPrecoder));
+    *pusch_Config->transformPrecoder = NR_PUSCH_Config__transformPrecoder_disabled;
+  }
+  pusch_Config->codebookSubset=calloc(1,sizeof(*pusch_Config->codebookSubset));
+  *pusch_Config->codebookSubset = NR_PUSCH_Config__codebookSubset_nonCoherent;
+  pusch_Config->maxRank=calloc(1,sizeof(*pusch_Config->maxRank));
+  *pusch_Config->maxRank= 1;
+  pusch_Config->rbg_Size=NULL;
+  pusch_Config->uci_OnPUSCH=NULL;
+  pusch_Config->tp_pi2BPSK=NULL;
+
+  // We are using do_srs = 0 here because the periodic SRS will only be enabled in update_cellGroupConfig() if do_srs == 1
+  initialUplinkBWP->srs_Config = calloc(1,sizeof(*initialUplinkBWP->srs_Config));
+  config_srs(initialUplinkBWP->srs_Config, scc, uid, 0);
+
+  scheduling_request_config(scc, pucch_Config);
+
+  set_dl_DataToUL_ACK(pucch_Config, configuration->minRXTXTIME);
 
   SpCellConfig->spCellConfigDedicated->initialDownlinkBWP = calloc(1,sizeof(*SpCellConfig->spCellConfigDedicated->initialDownlinkBWP));
   NR_BWP_DownlinkDedicated_t *bwp_Dedicated = SpCellConfig->spCellConfigDedicated->initialDownlinkBWP;
@@ -1300,37 +1457,9 @@ void fill_initial_SpCellConfig(int uid,
   bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList = calloc(1,sizeof(*bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList));
 
   NR_ControlResourceSet_t *coreset = calloc(1,sizeof(*coreset));
-  coreset->controlResourceSetId=1;
-  // frequency domain resources depends on BWP size
-  // options are 24, 48 or 96
-  coreset->frequencyDomainResources.buf = calloc(1,6);
-  if (0) {
-     if (curr_bwp < 48)
-       coreset->frequencyDomainResources.buf[0] = 0xf0;
-     else
-       coreset->frequencyDomainResources.buf[0] = 0xff;
-     if (curr_bwp < 96)
-       coreset->frequencyDomainResources.buf[1] = 0;
-     else
-       coreset->frequencyDomainResources.buf[1] = 0xff;
-  } else {
-     coreset->frequencyDomainResources.buf[0] = 0xf0;
-     coreset->frequencyDomainResources.buf[1] = 0;
-  }
-  coreset->frequencyDomainResources.buf[2] = 0;
-  coreset->frequencyDomainResources.buf[3] = 0;
-  coreset->frequencyDomainResources.buf[4] = 0;
-  coreset->frequencyDomainResources.buf[5] = 0;
-  coreset->frequencyDomainResources.size = 6;
-  coreset->frequencyDomainResources.bits_unused = 3;
-  coreset->duration=1;
-  coreset->cce_REG_MappingType.present = NR_ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved;
-  coreset->precoderGranularity = NR_ControlResourceSet__precoderGranularity_sameAsREG_bundle;
-
-  coreset->tci_StatesPDCCH_ToAddList=NULL;
-  coreset->tci_StatesPDCCH_ToReleaseList = NULL;
-  coreset->tci_PresentInDCI = NULL;
-  coreset->pdcch_DMRS_ScramblingID = NULL;
+
+  uint64_t bitmap = get_ssb_bitmap(scc);
+  rrc_coreset_config(coreset, 0, curr_bwp, bitmap);
 
   ASN_SEQUENCE_ADD(&bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList->list,
                    coreset);
@@ -1341,7 +1470,7 @@ void fill_initial_SpCellConfig(int uid,
  
   ss2->searchSpaceId=2;
   ss2->controlResourceSetId=calloc(1,sizeof(*ss2->controlResourceSetId));
-  *ss2->controlResourceSetId=1;
+  *ss2->controlResourceSetId=coreset->controlResourceSetId;
   ss2->monitoringSlotPeriodicityAndOffset=calloc(1,sizeof(*ss2->monitoringSlotPeriodicityAndOffset));
   ss2->monitoringSlotPeriodicityAndOffset->present = NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
   ss2->monitoringSlotPeriodicityAndOffset->choice.sl1=(NULL_t)0;
@@ -1349,13 +1478,13 @@ void fill_initial_SpCellConfig(int uid,
   ss2->monitoringSymbolsWithinSlot = calloc(1,sizeof(*ss2->monitoringSymbolsWithinSlot));
   ss2->monitoringSymbolsWithinSlot->buf = calloc(1,2);
   ss2->monitoringSymbolsWithinSlot->size = 2;
-  ss2->monitoringSymbolsWithinSlot->bits_unused = 2;
   ss2->monitoringSymbolsWithinSlot->buf[0]=0x80;
   ss2->monitoringSymbolsWithinSlot->buf[1]=0x0;
+  ss2->monitoringSymbolsWithinSlot->bits_unused = 2;
   ss2->nrofCandidates=calloc(1,sizeof(*ss2->nrofCandidates));
   ss2->nrofCandidates->aggregationLevel1 = NR_SearchSpace__nrofCandidates__aggregationLevel1_n0;
   ss2->nrofCandidates->aggregationLevel2 = NR_SearchSpace__nrofCandidates__aggregationLevel2_n2;
-  ss2->nrofCandidates->aggregationLevel4 = NR_SearchSpace__nrofCandidates__aggregationLevel4_n0;
+  ss2->nrofCandidates->aggregationLevel4 = NR_SearchSpace__nrofCandidates__aggregationLevel4_n1;
   ss2->nrofCandidates->aggregationLevel8 = NR_SearchSpace__nrofCandidates__aggregationLevel8_n0;
   ss2->nrofCandidates->aggregationLevel16 = NR_SearchSpace__nrofCandidates__aggregationLevel16_n0;
   ss2->searchSpaceType=calloc(1,sizeof(*ss2->searchSpaceType));
@@ -1377,13 +1506,13 @@ void fill_initial_SpCellConfig(int uid,
   bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->maxLength=NULL;
 
   bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition = calloc(1,sizeof(*bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition));
- *bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition = NR_DMRS_DownlinkConfig__dmrs_AdditionalPosition_pos1;
- bwp_Dedicated->pdsch_Config->choice.setup->resourceAllocation = NR_PDSCH_Config__resourceAllocation_resourceAllocationType1;
- bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.present = NR_PDSCH_Config__prb_BundlingType_PR_staticBundling;
- bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling = calloc(1,sizeof(*bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling));
- bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling->bundleSize =
-   calloc(1,sizeof(*bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling->bundleSize));
- *bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling->bundleSize = NR_PDSCH_Config__prb_BundlingType__staticBundling__bundleSize_wideband;
+  *bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition = NR_DMRS_DownlinkConfig__dmrs_AdditionalPosition_pos1;
+  bwp_Dedicated->pdsch_Config->choice.setup->resourceAllocation = NR_PDSCH_Config__resourceAllocation_resourceAllocationType1;
+  bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.present = NR_PDSCH_Config__prb_BundlingType_PR_staticBundling;
+  bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling = calloc(1,sizeof(*bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling));
+  bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling->bundleSize =
+      calloc(1,sizeof(*bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling->bundleSize));
+  *bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling->bundleSize = NR_PDSCH_Config__prb_BundlingType__staticBundling__bundleSize_wideband;
 
   bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList=calloc(1,sizeof(*bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList));
   NR_TCI_State_t *tcic;
@@ -1405,50 +1534,20 @@ void fill_initial_SpCellConfig(int uid,
   SpCellConfig->spCellConfigDedicated->pdsch_ServingCellConfig->choice.setup = pdsch_servingcellconfig;
 
   if (configuration->do_CSIRS) {
- 
+
     SpCellConfig->spCellConfigDedicated->csi_MeasConfig=calloc(1,sizeof(*SpCellConfig->spCellConfigDedicated->csi_MeasConfig));
     SpCellConfig->spCellConfigDedicated->csi_MeasConfig->present = NR_SetupRelease_CSI_MeasConfig_PR_setup;
 
     NR_CSI_MeasConfig_t *csi_MeasConfig = calloc(1,sizeof(*csi_MeasConfig));
     SpCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup = csi_MeasConfig;
     int pdsch_AntennaPorts = configuration->pdsch_AntennaPorts.N1 * configuration->pdsch_AntennaPorts.N2 * configuration->pdsch_AntennaPorts.XP;
-    if (pdsch_AntennaPorts > 1) {
-      csi_MeasConfig->csi_IM_ResourceToAddModList = calloc(1,sizeof(*csi_MeasConfig->csi_IM_ResourceToAddModList));
-      NR_CSI_IM_Resource_t *imres0 = calloc(1,sizeof(*imres0));
-      imres0->csi_IM_ResourceId = 0; 
-      imres0->csi_IM_ResourceElementPattern = calloc(1,sizeof(*imres0->csi_IM_ResourceElementPattern));
-      imres0->csi_IM_ResourceElementPattern->present = NR_CSI_IM_Resource__csi_IM_ResourceElementPattern_PR_pattern1;
-      imres0->csi_IM_ResourceElementPattern->choice.pattern1 = calloc(1,sizeof(*imres0->csi_IM_ResourceElementPattern->choice.pattern1));
-      imres0->csi_IM_ResourceElementPattern->choice.pattern1->subcarrierLocation_p1 = NR_CSI_IM_Resource__csi_IM_ResourceElementPattern__pattern1__subcarrierLocation_p1_s4;
-      imres0->csi_IM_ResourceElementPattern->choice.pattern1->symbolLocation_p1 = 6;
-      imres0->freqBand = calloc(1,sizeof(*imres0->freqBand));
-      imres0->freqBand->startingRB = 0;
-      imres0->freqBand->nrofRBs = 108;
-      imres0->periodicityAndOffset = calloc(1,sizeof(*imres0->periodicityAndOffset));
-      imres0->periodicityAndOffset->present = NR_CSI_ResourcePeriodicityAndOffset_PR_slots320;
-      imres0->periodicityAndOffset->choice.slots320 = 0;
-      ASN_SEQUENCE_ADD(&csi_MeasConfig->csi_IM_ResourceToAddModList->list,imres0);
-      csi_MeasConfig->csi_IM_ResourceSetToAddModList = calloc(1,sizeof(*csi_MeasConfig->csi_IM_ResourceSetToAddModList));
-      NR_CSI_IM_ResourceSet_t *imset0 = calloc(1,sizeof(*imset0));
-      imset0->csi_IM_ResourceSetId = 0; 
-      NR_CSI_IM_ResourceId_t *res0 = calloc(1,sizeof(*res0));
-      *res0 = 0;
-      ASN_SEQUENCE_ADD(&imset0->csi_IM_Resources,res0);
-      ASN_SEQUENCE_ADD(&csi_MeasConfig->csi_IM_ResourceSetToAddModList->list,imset0);
-    }
-    else {
-      csi_MeasConfig->csi_IM_ResourceToAddModList = NULL;
-      csi_MeasConfig->csi_IM_ResourceSetToAddModList = NULL;
-    }
-
-    csi_MeasConfig->csi_IM_ResourceToReleaseList = NULL;
-    csi_MeasConfig->csi_IM_ResourceSetToReleaseList = NULL;
 
-    config_csirs(scc, csi_MeasConfig, uid, pdsch_AntennaPorts,curr_bwp,configuration->do_CSIRS);
+    config_csirs(scc, csi_MeasConfig, uid, pdsch_AntennaPorts, curr_bwp, configuration->do_CSIRS);
+    config_csiim(configuration->do_CSIRS, pdsch_AntennaPorts, curr_bwp, csi_MeasConfig);
 
     csi_MeasConfig->csi_SSB_ResourceSetToAddModList = calloc(1,sizeof(*csi_MeasConfig->csi_SSB_ResourceSetToAddModList));
     csi_MeasConfig->csi_SSB_ResourceSetToReleaseList = NULL;
-  
+
     NR_CSI_SSB_ResourceSet_t *ssbresset0 = calloc(1,sizeof(*ssbresset0));
     ssbresset0->csi_SSB_ResourceSetId=0;
 
@@ -1493,7 +1592,6 @@ void fill_initial_SpCellConfig(int uid,
    csires0->bwp_Id = 0;
    csires0->resourceType = NR_CSI_ResourceConfig__resourceType_periodic;
    ASN_SEQUENCE_ADD(&csi_MeasConfig->csi_ResourceConfigToAddModList->list,csires0);
- 
 
    NR_CSI_ResourceConfig_t *csires1 = calloc(1,sizeof(*csires1));
    csires1->csi_ResourceConfigId=1;
@@ -1501,7 +1599,7 @@ void fill_initial_SpCellConfig(int uid,
    csires1->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB = calloc(1,sizeof(*csires1->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB));
    csires1->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList = calloc(1,sizeof(*csires1->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList));
    NR_CSI_SSB_ResourceSetId_t *ssbres00 = calloc(1,sizeof(*ssbres00));
- *ssbres00 = 0;
+   *ssbres00 = 0;
    ASN_SEQUENCE_ADD(&csires1->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList->list,ssbres00);
    csires1->bwp_Id = 0;
    csires1->resourceType = NR_CSI_ResourceConfig__resourceType_periodic;
@@ -1521,8 +1619,8 @@ void fill_initial_SpCellConfig(int uid,
    }
 
    NR_PUCCH_CSI_Resource_t *pucchcsires1 = calloc(1,sizeof(*pucchcsires1));
-   pucchcsires1->uplinkBandwidthPartId=0;
-   pucchcsires1->pucch_Resource=1;
+   pucchcsires1->uplinkBandwidthPartId = 0;
+   pucchcsires1->pucch_Resource = *pucch_Config->resourceSetToAddModList->list.array[1]->resourceList.list.array[0];
    csi_MeasConfig->csi_ReportConfigToAddModList = calloc(1,sizeof(*csi_MeasConfig->csi_ReportConfigToAddModList));
    csi_MeasConfig->csi_ReportConfigToReleaseList = NULL;
    if (pdsch_AntennaPorts > 1) {
@@ -1537,7 +1635,7 @@ void fill_initial_SpCellConfig(int uid,
      csirep1->reportConfigType.present = NR_CSI_ReportConfig__reportConfigType_PR_periodic;
      csirep1->reportConfigType.choice.periodic = calloc(1,sizeof(*csirep1->reportConfigType.choice.periodic));
      csirep1->reportConfigType.choice.periodic->reportSlotConfig.present=NR_CSI_ReportPeriodicityAndOffset_PR_slots320;
-     csirep1->reportConfigType.choice.periodic->reportSlotConfig.choice.slots320 = (7 + (20 * uid)) % 320;
+     csirep1->reportConfigType.choice.periodic->reportSlotConfig.choice.slots320 = (7 + (30 * uid)) % 320;
      ASN_SEQUENCE_ADD(&csirep1->reportConfigType.choice.periodic->pucch_CSI_ResourceList.list,pucchcsires1);
      csirep1->reportQuantity.present = NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_PMI_CQI;
      csirep1->reportQuantity.choice.cri_RI_PMI_CQI=(NULL_t)0;
@@ -1546,8 +1644,8 @@ void fill_initial_SpCellConfig(int uid,
      *csirep1->reportFreqConfiguration->cqi_FormatIndicator=NR_CSI_ReportConfig__reportFreqConfiguration__cqi_FormatIndicator_widebandCQI;
      csirep1->reportFreqConfiguration->pmi_FormatIndicator = calloc(1,sizeof(*csirep1->reportFreqConfiguration->pmi_FormatIndicator));
      *csirep1->reportFreqConfiguration->pmi_FormatIndicator=NR_CSI_ReportConfig__reportFreqConfiguration__pmi_FormatIndicator_widebandPMI;
-     csirep1->reportFreqConfiguration->csi_ReportingBand = NULL; 
-/*calloc(1,sizeof(*csirep1->reportFreqConfiguration->csi_ReportingBand));
+     csirep1->reportFreqConfiguration->csi_ReportingBand = NULL;
+     /*calloc(1,sizeof(*csirep1->reportFreqConfiguration->csi_ReportingBand));
      csirep1->reportFreqConfiguration->csi_ReportingBand->present = NR_CSI_ReportConfig__reportFreqConfiguration__csi_ReportingBand_PR_subbands7;
      csirep1->reportFreqConfiguration->csi_ReportingBand->choice.subbands7.size=1;
      csirep1->reportFreqConfiguration->csi_ReportingBand->choice.subbands7.bits_unused=1;
@@ -1596,7 +1694,7 @@ void fill_initial_SpCellConfig(int uid,
    csirep2->reportConfigType.present = NR_CSI_ReportConfig__reportConfigType_PR_periodic;
    csirep2->reportConfigType.choice.periodic = calloc(1,sizeof(*csirep2->reportConfigType.choice.periodic));
    csirep2->reportConfigType.choice.periodic->reportSlotConfig.present=NR_CSI_ReportPeriodicityAndOffset_PR_slots320;
-   csirep2->reportConfigType.choice.periodic->reportSlotConfig.choice.slots320 = (27 + (20 * uid)) % 320;
+   csirep2->reportConfigType.choice.periodic->reportSlotConfig.choice.slots320 = (27 + (30 * uid)) % 320;
    ASN_SEQUENCE_ADD(&csirep2->reportConfigType.choice.periodic->pucch_CSI_ResourceList.list,pucchcsires1);
    csirep2->reportQuantity.present = NR_CSI_ReportConfig__reportQuantity_PR_cri_RSRP;
    csirep2->reportQuantity.choice.cri_RSRP=(NULL_t)0;
@@ -1618,6 +1716,7 @@ void fill_initial_SpCellConfig(int uid,
    csirep2->ext1 = NULL;
    ASN_SEQUENCE_ADD(&csi_MeasConfig->csi_ReportConfigToAddModList->list,csirep2);
  }
+
   pdsch_servingcellconfig->codeBlockGroupTransmission = NULL;
   pdsch_servingcellconfig->xOverhead = NULL;
   pdsch_servingcellconfig->nrofHARQ_ProcessesForPDSCH = calloc(1, sizeof(*pdsch_servingcellconfig->nrofHARQ_ProcessesForPDSCH));
@@ -1627,27 +1726,63 @@ void fill_initial_SpCellConfig(int uid,
   pdsch_servingcellconfig->ext1->maxMIMO_Layers = calloc(1,sizeof(*pdsch_servingcellconfig->ext1->maxMIMO_Layers));
   *pdsch_servingcellconfig->ext1->maxMIMO_Layers = 2;
 
-}
+  // Downlink BWPs
+  int n_dl_bwp = 0;
+  if (servingcellconfigdedicated &&
+      servingcellconfigdedicated->downlinkBWP_ToAddModList &&
+      servingcellconfigdedicated->downlinkBWP_ToAddModList->list.count > 0) {
+    n_dl_bwp = servingcellconfigdedicated->downlinkBWP_ToAddModList->list.count;
+  }
+  if(n_dl_bwp>0){
+    SpCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList = calloc(1,sizeof(*SpCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList));
+    for (int bwp_loop = 0; bwp_loop < n_dl_bwp; bwp_loop++) {
+      NR_BWP_Downlink_t *bwp = calloc(1, sizeof(*bwp));
+      fill_default_downlinkBWP(bwp, bwp_loop, servingcellconfigdedicated, scc, configuration);
+      ASN_SEQUENCE_ADD(&SpCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list,bwp);
+    }
+    SpCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id = calloc(1,sizeof(*SpCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id));
+    *SpCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id = servingcellconfigdedicated->firstActiveDownlinkBWP_Id ? *servingcellconfigdedicated->firstActiveDownlinkBWP_Id : 1;
+    SpCellConfig->spCellConfigDedicated->defaultDownlinkBWP_Id = calloc(1,sizeof(*SpCellConfig->spCellConfigDedicated->defaultDownlinkBWP_Id));
+    *SpCellConfig->spCellConfigDedicated->defaultDownlinkBWP_Id = servingcellconfigdedicated->defaultDownlinkBWP_Id ? *servingcellconfigdedicated->defaultDownlinkBWP_Id : 1;
+  }
 
-void fill_mastercellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig, NR_CellGroupConfig_t *ue_context_mastercellGroup,int use_rlc_um_for_drb) {
+  // Uplink BWPs
+  int n_ul_bwp = 0;
+  if (servingcellconfigdedicated && servingcellconfigdedicated->uplinkConfig &&
+      servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList &&
+      servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.count > 0) {
+    n_ul_bwp = servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.count;
+  }
+  if(n_ul_bwp>0) {
+    SpCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList = calloc(1,sizeof(*SpCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList));
+    for (int bwp_loop = 0; bwp_loop < n_ul_bwp; bwp_loop++) {
+      NR_BWP_Uplink_t *ubwp = calloc(1, sizeof(*ubwp));
+      fill_default_uplinkBWP(ubwp, bwp_loop, servingcellconfigdedicated, scc, configuration, uid);
+      ASN_SEQUENCE_ADD(&SpCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list, ubwp);
+    }
+    SpCellConfig->spCellConfigDedicated->uplinkConfig->firstActiveUplinkBWP_Id = calloc(1,sizeof(*SpCellConfig->spCellConfigDedicated->uplinkConfig->firstActiveUplinkBWP_Id));
+    *SpCellConfig->spCellConfigDedicated->uplinkConfig->firstActiveUplinkBWP_Id = servingcellconfigdedicated->uplinkConfig->firstActiveUplinkBWP_Id ? *servingcellconfigdedicated->uplinkConfig->firstActiveUplinkBWP_Id : 1;
+  }
 
-  cellGroupConfig->cellGroupId = 0;
-  cellGroupConfig->rlc_BearerToReleaseList = NULL;
-  cellGroupConfig->rlc_BearerToAddModList = calloc(1, sizeof(*cellGroupConfig->rlc_BearerToAddModList));
+  if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
+    xer_fprint(stdout, &asn_DEF_NR_SpCellConfig, (void *)SpCellConfig);
+  }
 
-  // RLC Bearer Config
-  // TS38.331 9.2.1 Default SRB configurations
-  NR_RLC_BearerConfig_t *rlc_BearerConfig                          = NULL;
-  NR_RLC_Config_t *rlc_Config                                      = NULL;
-  NR_LogicalChannelConfig_t *logicalChannelConfig                  = NULL;
-  long *logicalChannelGroup                                        = NULL;
+}
+
+NR_RLC_BearerConfig_t *get_SRB_RLC_BearerConfig(long channelId,
+                                                long priority,
+                                                e_NR_LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration bucketSizeDuration)
+{
+  NR_RLC_BearerConfig_t *rlc_BearerConfig = NULL;
   rlc_BearerConfig                                                 = calloc(1, sizeof(NR_RLC_BearerConfig_t));
-  rlc_BearerConfig->logicalChannelIdentity                         = 2;
+  rlc_BearerConfig->logicalChannelIdentity                         = channelId;
   rlc_BearerConfig->servedRadioBearer                              = calloc(1, sizeof(*rlc_BearerConfig->servedRadioBearer));
   rlc_BearerConfig->servedRadioBearer->present                     = NR_RLC_BearerConfig__servedRadioBearer_PR_srb_Identity;
-  rlc_BearerConfig->servedRadioBearer->choice.srb_Identity         = 2;
+  rlc_BearerConfig->servedRadioBearer->choice.srb_Identity         = channelId;
   rlc_BearerConfig->reestablishRLC                                 = NULL;
-  rlc_Config                                                       = calloc(1, sizeof(NR_RLC_Config_t));
+
+  NR_RLC_Config_t *rlc_Config                                      = calloc(1, sizeof(NR_RLC_Config_t));
   rlc_Config->present                                              = NR_RLC_Config_PR_am;
   rlc_Config->choice.am                                            = calloc(1, sizeof(*rlc_Config->choice.am));
   rlc_Config->choice.am->dl_AM_RLC.sn_FieldLength                  = calloc(1, sizeof(NR_SN_FieldLengthAM_t));
@@ -1661,12 +1796,14 @@ void fill_mastercellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig, NR_CellGr
   rlc_Config->choice.am->ul_AM_RLC.pollByte                        = NR_PollByte_infinity;
   rlc_Config->choice.am->ul_AM_RLC.maxRetxThreshold                = NR_UL_AM_RLC__maxRetxThreshold_t8;
   rlc_BearerConfig->rlc_Config                                     = rlc_Config;
-  logicalChannelConfig                                             = calloc(1, sizeof(NR_LogicalChannelConfig_t));
+
+  NR_LogicalChannelConfig_t *logicalChannelConfig                  = calloc(1, sizeof(NR_LogicalChannelConfig_t));
   logicalChannelConfig->ul_SpecificParameters                      = calloc(1, sizeof(*logicalChannelConfig->ul_SpecificParameters));
-  logicalChannelConfig->ul_SpecificParameters->priority            = 3;
+  logicalChannelConfig->ul_SpecificParameters->priority            = priority;
   logicalChannelConfig->ul_SpecificParameters->prioritisedBitRate  = NR_LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_infinity;
-  logicalChannelConfig->ul_SpecificParameters->bucketSizeDuration  = NR_LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms5;
-  logicalChannelGroup                                              = CALLOC(1, sizeof(long));
+  logicalChannelConfig->ul_SpecificParameters->bucketSizeDuration  = bucketSizeDuration;
+
+  long *logicalChannelGroup                                        = CALLOC(1, sizeof(long));
   *logicalChannelGroup                                             = 0;
   logicalChannelConfig->ul_SpecificParameters->logicalChannelGroup = logicalChannelGroup;
   logicalChannelConfig->ul_SpecificParameters->schedulingRequestID = CALLOC(1, sizeof(*logicalChannelConfig->ul_SpecificParameters->schedulingRequestID));
@@ -1674,153 +1811,156 @@ void fill_mastercellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig, NR_CellGr
   logicalChannelConfig->ul_SpecificParameters->logicalChannelSR_Mask = 0;
   logicalChannelConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = 0;
   rlc_BearerConfig->mac_LogicalChannelConfig                       = logicalChannelConfig;
-  ASN_SEQUENCE_ADD(&cellGroupConfig->rlc_BearerToAddModList->list, rlc_BearerConfig);
-  ASN_SEQUENCE_ADD(&ue_context_mastercellGroup->rlc_BearerToAddModList->list, rlc_BearerConfig);
 
-  // DRB Configuration
-  NR_RLC_BearerConfig_t *rlc_BearerConfig_drb                      = NULL;
-  NR_RLC_Config_t *rlc_Config_drb                                  = NULL;
-  NR_LogicalChannelConfig_t *logicalChannelConfig_drb              = NULL;
-  long *logicalChannelGroup_drb                                    = NULL;
-  rlc_BearerConfig_drb                                             = calloc(1, sizeof(NR_RLC_BearerConfig_t));
-  rlc_BearerConfig_drb->logicalChannelIdentity                     = 4;
-  rlc_BearerConfig_drb->servedRadioBearer                          = calloc(1, sizeof(*rlc_BearerConfig_drb->servedRadioBearer));
-  rlc_BearerConfig_drb->servedRadioBearer->present                 = NR_RLC_BearerConfig__servedRadioBearer_PR_drb_Identity;
-  rlc_BearerConfig_drb->servedRadioBearer->choice.drb_Identity     = 1;
-  rlc_BearerConfig_drb->reestablishRLC                             = NULL;
-  rlc_Config_drb                                                   = calloc(1, sizeof(NR_RLC_Config_t));
-
-  if (use_rlc_um_for_drb) nr_drb_config(rlc_Config_drb, NR_RLC_Config_PR_um_Bi_Directional);
-  else                    nr_drb_config(rlc_Config_drb, NR_RLC_Config_PR_am);
+  return rlc_BearerConfig;
+}
 
-  
-  rlc_BearerConfig_drb->rlc_Config                                 = rlc_Config_drb;
-  logicalChannelConfig_drb                                             = calloc(1, sizeof(NR_LogicalChannelConfig_t));
-  logicalChannelConfig_drb->ul_SpecificParameters                      = calloc(1, sizeof(*logicalChannelConfig_drb->ul_SpecificParameters));
-  logicalChannelConfig_drb->ul_SpecificParameters->priority            = 13;
-  logicalChannelConfig_drb->ul_SpecificParameters->prioritisedBitRate  = NR_LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_kBps8;
-  logicalChannelConfig_drb->ul_SpecificParameters->bucketSizeDuration  = NR_LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms100;
-  logicalChannelGroup_drb                                              = CALLOC(1, sizeof(long));
-  *logicalChannelGroup_drb                                             = 1;
-  logicalChannelConfig_drb->ul_SpecificParameters->logicalChannelGroup = logicalChannelGroup_drb;
-  logicalChannelConfig_drb->ul_SpecificParameters->schedulingRequestID = CALLOC(1, sizeof(*logicalChannelConfig_drb->ul_SpecificParameters->schedulingRequestID));
-  *logicalChannelConfig_drb->ul_SpecificParameters->schedulingRequestID = 0;
-  logicalChannelConfig_drb->ul_SpecificParameters->logicalChannelSR_Mask = 0;
-  logicalChannelConfig_drb->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = 0;
-  rlc_BearerConfig_drb->mac_LogicalChannelConfig                       = logicalChannelConfig_drb;
-  ASN_SEQUENCE_ADD(&cellGroupConfig->rlc_BearerToAddModList->list, rlc_BearerConfig_drb);
-  ASN_SEQUENCE_ADD(&ue_context_mastercellGroup->rlc_BearerToAddModList->list, rlc_BearerConfig_drb);
+NR_RLC_BearerConfig_t *get_DRB_RLC_BearerConfig(long lcChannelId, long drbId, NR_RLC_Config_PR rlc_conf, long priority)
+{
+  NR_RLC_BearerConfig_t *rlc_BearerConfig                  = calloc(1, sizeof(NR_RLC_BearerConfig_t));
+  rlc_BearerConfig->logicalChannelIdentity                 = lcChannelId;
+  rlc_BearerConfig->servedRadioBearer                      = calloc(1, sizeof(*rlc_BearerConfig->servedRadioBearer));
+  rlc_BearerConfig->servedRadioBearer->present             = NR_RLC_BearerConfig__servedRadioBearer_PR_drb_Identity;
+  rlc_BearerConfig->servedRadioBearer->choice.drb_Identity = drbId;
+  rlc_BearerConfig->reestablishRLC                         = NULL;
+
+  NR_RLC_Config_t *rlc_Config  = calloc(1, sizeof(NR_RLC_Config_t));
+  nr_drb_config(rlc_Config, rlc_conf);
+  rlc_BearerConfig->rlc_Config = rlc_Config;
+
+  NR_LogicalChannelConfig_t *logicalChannelConfig                 = calloc(1, sizeof(NR_LogicalChannelConfig_t));
+  logicalChannelConfig->ul_SpecificParameters                     = calloc(1, sizeof(*logicalChannelConfig->ul_SpecificParameters));
+  logicalChannelConfig->ul_SpecificParameters->priority           = priority;
+  logicalChannelConfig->ul_SpecificParameters->prioritisedBitRate = NR_LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_kBps8;
+  logicalChannelConfig->ul_SpecificParameters->bucketSizeDuration = NR_LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms100;
+
+  long *logicalChannelGroup                                          = CALLOC(1, sizeof(long));
+  *logicalChannelGroup                                               = 1;
+  logicalChannelConfig->ul_SpecificParameters->logicalChannelGroup   = logicalChannelGroup;
+  logicalChannelConfig->ul_SpecificParameters->schedulingRequestID   = CALLOC(1, sizeof(*logicalChannelConfig->ul_SpecificParameters->schedulingRequestID));
+  *logicalChannelConfig->ul_SpecificParameters->schedulingRequestID  = 0;
+  logicalChannelConfig->ul_SpecificParameters->logicalChannelSR_Mask = 0;
+  logicalChannelConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = 0;
+  rlc_BearerConfig->mac_LogicalChannelConfig                         = logicalChannelConfig;
+
+  return rlc_BearerConfig;
 }
 
+void fill_mastercellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig, NR_CellGroupConfig_t *ue_context_mastercellGroup, int use_rlc_um_for_drb, uint8_t configure_srb, uint8_t bearer_id_start, uint8_t nb_bearers_to_setup, long *priority) {
+
+  cellGroupConfig->cellGroupId = 0;
+  cellGroupConfig->rlc_BearerToReleaseList = NULL;
+  cellGroupConfig->rlc_BearerToAddModList = calloc(1, sizeof(*cellGroupConfig->rlc_BearerToAddModList));
+
+  // RLC Bearer Config
+  // TS38.331 9.2.1 Default SRB configurations
+  if (configure_srb){
+    NR_RLC_BearerConfig_t *rlc_BearerConfig = get_SRB_RLC_BearerConfig(2, 3, NR_LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms5);
+    ASN_SEQUENCE_ADD(&cellGroupConfig->rlc_BearerToAddModList->list, rlc_BearerConfig);
+    ASN_SEQUENCE_ADD(&ue_context_mastercellGroup->rlc_BearerToAddModList->list, rlc_BearerConfig);
+  }
+
+  // DRB Configuration
+  for (int i = bearer_id_start; i < bearer_id_start + nb_bearers_to_setup; i++ ){
+    const NR_RLC_Config_PR rlc_conf = use_rlc_um_for_drb ? NR_RLC_Config_PR_um_Bi_Directional : NR_RLC_Config_PR_am;
+    NR_RLC_BearerConfig_t *rlc_BearerConfig = get_DRB_RLC_BearerConfig(3 + i, i, rlc_conf, priority[i-bearer_id_start]);
+    ASN_SEQUENCE_ADD(&cellGroupConfig->rlc_BearerToAddModList->list, rlc_BearerConfig);
+    ASN_SEQUENCE_ADD(&ue_context_mastercellGroup->rlc_BearerToAddModList->list, rlc_BearerConfig);
+  }
+}
 
 void update_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig,
+                            const int uid,
                             NR_UE_NR_Capability_t *uecap,
                             const gNB_RrcConfigurationReq* configuration) {
 
   NR_SpCellConfig_t *SpCellConfig = cellGroupConfig->spCellConfig;
+
   if (SpCellConfig == NULL) return;
 
-  NR_ServingCellConfigCommon_t *scc = configuration->scc;
+  NR_ServingCellConfigCommon_t *scc = configuration ? configuration->scc : NULL;
 
-  NR_BWP_DownlinkDedicated_t *bwp_Dedicated = SpCellConfig->spCellConfigDedicated->initialDownlinkBWP;
-  set_dl_mcs_table(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.subcarrierSpacing,
-                   configuration->force_256qam_off ? NULL : uecap, SpCellConfig,bwp_Dedicated, scc);
-
-  struct NR_ServingCellConfig__downlinkBWP_ToAddModList *DL_BWP_list = SpCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList;
-  if (DL_BWP_list) {
-    for (int i=0; i<DL_BWP_list->list.count; i++){
-      NR_BWP_Downlink_t *bwp = DL_BWP_list->list.array[i];
-      int scs = bwp->bwp_Common->genericParameters.subcarrierSpacing;
-      set_dl_mcs_table(scs, configuration->force_256qam_off ? NULL : uecap, SpCellConfig, bwp->bwp_Dedicated, scc);
+  if(scc) {
+
+    // SRS configuration
+    if (configuration->do_SRS &&
+        SpCellConfig &&
+        SpCellConfig->spCellConfigDedicated &&
+        SpCellConfig->spCellConfigDedicated->uplinkConfig &&
+        SpCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP) {
+      if (!SpCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->srs_Config) {
+        SpCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->srs_Config =
+            calloc(1,sizeof(*SpCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->srs_Config));
+      }
+      config_srs(SpCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->srs_Config,
+                 scc,
+                 uid,
+                 configuration->do_SRS);
     }
+
+    // Set DL MCS table
+    NR_BWP_DownlinkDedicated_t *bwp_Dedicated = SpCellConfig->spCellConfigDedicated->initialDownlinkBWP;
+    set_dl_mcs_table(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.subcarrierSpacing,
+                     configuration->force_256qam_off ? NULL : uecap, SpCellConfig, bwp_Dedicated, scc);
+    struct NR_ServingCellConfig__downlinkBWP_ToAddModList *DL_BWP_list = SpCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList;
+    if (DL_BWP_list) {
+      for (int i=0; i<DL_BWP_list->list.count; i++){
+        NR_BWP_Downlink_t *bwp = DL_BWP_list->list.array[i];
+        int scs = bwp->bwp_Common->genericParameters.subcarrierSpacing;
+        set_dl_mcs_table(scs, configuration->force_256qam_off ? NULL : uecap, SpCellConfig, bwp->bwp_Dedicated, scc);
+      }
+    }
+
   }
 }
 
-
 void fill_initial_cellGroupConfig(int uid,
                                   NR_CellGroupConfig_t *cellGroupConfig,
                                   NR_ServingCellConfigCommon_t *scc,
+                                  NR_ServingCellConfig_t *servingcellconfigdedicated,
                                   const gNB_RrcConfigurationReq *configuration)
 {
-  NR_RLC_BearerConfig_t                            *rlc_BearerConfig     = NULL;
-  NR_RLC_Config_t                                  *rlc_Config           = NULL;
-  NR_LogicalChannelConfig_t                        *logicalChannelConfig = NULL;
   NR_MAC_CellGroupConfig_t                         *mac_CellGroupConfig  = NULL;
   NR_PhysicalCellGroupConfig_t	                   *physicalCellGroupConfig = NULL;
-  long *logicalChannelGroup = NULL;
   
   cellGroupConfig->cellGroupId = 0;
   
   /* Rlc Bearer Config */
   /* TS38.331 9.2.1	Default SRB configurations */
   cellGroupConfig->rlc_BearerToAddModList                          = calloc(1, sizeof(*cellGroupConfig->rlc_BearerToAddModList));
-  rlc_BearerConfig                                                 = calloc(1, sizeof(NR_RLC_BearerConfig_t));
-  rlc_BearerConfig->logicalChannelIdentity                         = 1;
-  rlc_BearerConfig->servedRadioBearer                              = calloc(1, sizeof(*rlc_BearerConfig->servedRadioBearer));
-  rlc_BearerConfig->servedRadioBearer->present                     = NR_RLC_BearerConfig__servedRadioBearer_PR_srb_Identity;
-  rlc_BearerConfig->servedRadioBearer->choice.srb_Identity         = 1;
-  rlc_BearerConfig->reestablishRLC                                 = NULL;
-  rlc_Config = calloc(1, sizeof(NR_RLC_Config_t));
-  rlc_Config->present                                              = NR_RLC_Config_PR_am;
-  rlc_Config->choice.am                                            = calloc(1, sizeof(*rlc_Config->choice.am));
-  rlc_Config->choice.am->dl_AM_RLC.sn_FieldLength                  = calloc(1, sizeof(NR_SN_FieldLengthAM_t));
-  *(rlc_Config->choice.am->dl_AM_RLC.sn_FieldLength)               = NR_SN_FieldLengthAM_size12;
-  rlc_Config->choice.am->dl_AM_RLC.t_Reassembly                    = NR_T_Reassembly_ms35;
-  rlc_Config->choice.am->dl_AM_RLC.t_StatusProhibit                = NR_T_StatusProhibit_ms0;
-  rlc_Config->choice.am->ul_AM_RLC.sn_FieldLength                  = calloc(1, sizeof(NR_SN_FieldLengthAM_t));
-  *(rlc_Config->choice.am->ul_AM_RLC.sn_FieldLength)               = NR_SN_FieldLengthAM_size12;
-  rlc_Config->choice.am->ul_AM_RLC.t_PollRetransmit                = NR_T_PollRetransmit_ms45;
-  rlc_Config->choice.am->ul_AM_RLC.pollPDU                         = NR_PollPDU_infinity;
-  rlc_Config->choice.am->ul_AM_RLC.pollByte                        = NR_PollByte_infinity;
-  rlc_Config->choice.am->ul_AM_RLC.maxRetxThreshold                = NR_UL_AM_RLC__maxRetxThreshold_t8;
-  rlc_BearerConfig->rlc_Config                                     = rlc_Config;
-  logicalChannelConfig                                             = calloc(1, sizeof(NR_LogicalChannelConfig_t));
-  logicalChannelConfig->ul_SpecificParameters                      = calloc(1, sizeof(*logicalChannelConfig->ul_SpecificParameters));
-  logicalChannelConfig->ul_SpecificParameters->priority            = 1;
-  logicalChannelConfig->ul_SpecificParameters->prioritisedBitRate  = NR_LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_infinity;
-  logicalChannelGroup                                              = CALLOC(1, sizeof(long));
-  *logicalChannelGroup                                             = 0;
-  logicalChannelConfig->ul_SpecificParameters->logicalChannelGroup = logicalChannelGroup;
-  logicalChannelConfig->ul_SpecificParameters->schedulingRequestID = CALLOC(1, sizeof(*logicalChannelConfig->ul_SpecificParameters->schedulingRequestID));
-  *logicalChannelConfig->ul_SpecificParameters->schedulingRequestID = 0;
-  logicalChannelConfig->ul_SpecificParameters->logicalChannelSR_Mask = 0;
-  logicalChannelConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = 0;
-  rlc_BearerConfig->mac_LogicalChannelConfig                       = logicalChannelConfig;
+  NR_RLC_BearerConfig_t *rlc_BearerConfig = get_SRB_RLC_BearerConfig(1, 1, NR_LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms1000);
   ASN_SEQUENCE_ADD(&cellGroupConfig->rlc_BearerToAddModList->list, rlc_BearerConfig);
   
   cellGroupConfig->rlc_BearerToReleaseList = NULL;
   
   /* mac CellGroup Config */
-  if (1) {
-    mac_CellGroupConfig                                                     = calloc(1, sizeof(*mac_CellGroupConfig));
-    if (1) {
-      mac_CellGroupConfig->schedulingRequestConfig                            = calloc(1, sizeof(*mac_CellGroupConfig->schedulingRequestConfig));
-      mac_CellGroupConfig->schedulingRequestConfig->schedulingRequestToAddModList = CALLOC(1,sizeof(*mac_CellGroupConfig->schedulingRequestConfig->schedulingRequestToAddModList));
-      struct NR_SchedulingRequestToAddMod *schedulingrequestlist;
-      schedulingrequestlist = CALLOC(1,sizeof(*schedulingrequestlist));
-      schedulingrequestlist->schedulingRequestId  = 0;
-      schedulingrequestlist->sr_ProhibitTimer = CALLOC(1,sizeof(*schedulingrequestlist->sr_ProhibitTimer));
-      *(schedulingrequestlist->sr_ProhibitTimer) = 0;
-      schedulingrequestlist->sr_TransMax      = NR_SchedulingRequestToAddMod__sr_TransMax_n64;
-      ASN_SEQUENCE_ADD(&(mac_CellGroupConfig->schedulingRequestConfig->schedulingRequestToAddModList->list),schedulingrequestlist);
-    }
-    mac_CellGroupConfig->bsr_Config                                         = calloc(1, sizeof(*mac_CellGroupConfig->bsr_Config));
-    mac_CellGroupConfig->bsr_Config->periodicBSR_Timer                      = NR_BSR_Config__periodicBSR_Timer_sf10;
-    mac_CellGroupConfig->bsr_Config->retxBSR_Timer                          = NR_BSR_Config__retxBSR_Timer_sf80;
-    mac_CellGroupConfig->tag_Config                                         = calloc(1, sizeof(*mac_CellGroupConfig->tag_Config));
-    mac_CellGroupConfig->tag_Config->tag_ToReleaseList = NULL;
-    mac_CellGroupConfig->tag_Config->tag_ToAddModList  = calloc(1,sizeof(*mac_CellGroupConfig->tag_Config->tag_ToAddModList));
-    struct NR_TAG *tag=calloc(1,sizeof(*tag));
-    tag->tag_Id             = 0;
-    tag->timeAlignmentTimer = NR_TimeAlignmentTimer_infinity;
-    ASN_SEQUENCE_ADD(&mac_CellGroupConfig->tag_Config->tag_ToAddModList->list,tag);
-    mac_CellGroupConfig->phr_Config                                         = calloc(1, sizeof(*mac_CellGroupConfig->phr_Config));
-    mac_CellGroupConfig->phr_Config->present                                = NR_SetupRelease_PHR_Config_PR_setup;
-    mac_CellGroupConfig->phr_Config->choice.setup                           = calloc(1, sizeof(*mac_CellGroupConfig->phr_Config->choice.setup));
-    mac_CellGroupConfig->phr_Config->choice.setup->phr_PeriodicTimer        = NR_PHR_Config__phr_PeriodicTimer_sf10;
-    mac_CellGroupConfig->phr_Config->choice.setup->phr_ProhibitTimer        = NR_PHR_Config__phr_ProhibitTimer_sf10;
-    mac_CellGroupConfig->phr_Config->choice.setup->phr_Tx_PowerFactorChange = NR_PHR_Config__phr_Tx_PowerFactorChange_dB1;
-  }
+  mac_CellGroupConfig                                                     = calloc(1, sizeof(*mac_CellGroupConfig));
+
+  mac_CellGroupConfig->bsr_Config                                         = calloc(1, sizeof(*mac_CellGroupConfig->bsr_Config));
+  mac_CellGroupConfig->bsr_Config->periodicBSR_Timer                      = NR_BSR_Config__periodicBSR_Timer_sf10;
+  mac_CellGroupConfig->bsr_Config->retxBSR_Timer                          = NR_BSR_Config__retxBSR_Timer_sf80;
+  mac_CellGroupConfig->tag_Config                                         = calloc(1, sizeof(*mac_CellGroupConfig->tag_Config));
+  mac_CellGroupConfig->tag_Config->tag_ToReleaseList = NULL;
+  mac_CellGroupConfig->tag_Config->tag_ToAddModList  = calloc(1,sizeof(*mac_CellGroupConfig->tag_Config->tag_ToAddModList));
+  struct NR_TAG *tag=calloc(1,sizeof(*tag));
+  tag->tag_Id             = 0;
+  tag->timeAlignmentTimer = NR_TimeAlignmentTimer_infinity;
+  ASN_SEQUENCE_ADD(&mac_CellGroupConfig->tag_Config->tag_ToAddModList->list,tag);
+  mac_CellGroupConfig->phr_Config                                         = calloc(1, sizeof(*mac_CellGroupConfig->phr_Config));
+  mac_CellGroupConfig->phr_Config->present                                = NR_SetupRelease_PHR_Config_PR_setup;
+  mac_CellGroupConfig->phr_Config->choice.setup                           = calloc(1, sizeof(*mac_CellGroupConfig->phr_Config->choice.setup));
+  mac_CellGroupConfig->phr_Config->choice.setup->phr_PeriodicTimer        = NR_PHR_Config__phr_PeriodicTimer_sf10;
+  mac_CellGroupConfig->phr_Config->choice.setup->phr_ProhibitTimer        = NR_PHR_Config__phr_ProhibitTimer_sf10;
+  mac_CellGroupConfig->phr_Config->choice.setup->phr_Tx_PowerFactorChange = NR_PHR_Config__phr_Tx_PowerFactorChange_dB1;
+
+  mac_CellGroupConfig->schedulingRequestConfig = calloc(1, sizeof(*mac_CellGroupConfig->schedulingRequestConfig));
+  mac_CellGroupConfig->schedulingRequestConfig->schedulingRequestToAddModList = CALLOC(1,sizeof(*mac_CellGroupConfig->schedulingRequestConfig->schedulingRequestToAddModList));
+  struct NR_SchedulingRequestToAddMod *schedulingrequestlist = CALLOC(1,sizeof(*schedulingrequestlist));
+  schedulingrequestlist->schedulingRequestId  = 0;
+  schedulingrequestlist->sr_ProhibitTimer = NULL;
+  schedulingrequestlist->sr_TransMax      = NR_SchedulingRequestToAddMod__sr_TransMax_n64;
+  ASN_SEQUENCE_ADD(&(mac_CellGroupConfig->schedulingRequestConfig->schedulingRequestToAddModList->list),schedulingrequestlist);
+
   cellGroupConfig->mac_CellGroupConfig                                      = mac_CellGroupConfig;
 
   physicalCellGroupConfig                                                   = calloc(1,sizeof(*physicalCellGroupConfig));
@@ -1830,19 +1970,20 @@ void fill_initial_cellGroupConfig(int uid,
   cellGroupConfig->physicalCellGroupConfig                                  = physicalCellGroupConfig;
   
   cellGroupConfig->spCellConfig                                             = calloc(1,sizeof(*cellGroupConfig->spCellConfig));
-  
-  fill_initial_SpCellConfig(uid,cellGroupConfig->spCellConfig,scc,configuration);
+
+  fill_initial_SpCellConfig(uid,cellGroupConfig,scc,servingcellconfigdedicated,configuration);
   
   cellGroupConfig->sCellToAddModList                                        = NULL;
   cellGroupConfig->sCellToReleaseList                                       = NULL;
 }
 
 //------------------------------------------------------------------------------
-int     do_RRCSetup(rrc_gNB_ue_context_t         *const ue_context_pP,
-                    uint8_t                      *const buffer,
-                    const uint8_t                transaction_id,
-                    OCTET_STRING_t               *masterCellGroup_from_DU,
-                    NR_ServingCellConfigCommon_t *scc,
+int16_t do_RRCSetup(rrc_gNB_ue_context_t          *const ue_context_pP,
+                    uint8_t                       *const buffer,
+                    const uint8_t                 transaction_id,
+                    OCTET_STRING_t                *masterCellGroup_from_DU,
+                    NR_ServingCellConfigCommon_t  *scc,
+                    NR_ServingCellConfig_t        *servingcellconfigdedicated,
                     const gNB_RrcConfigurationReq *configuration)
 //------------------------------------------------------------------------------
 {
@@ -1904,13 +2045,11 @@ int     do_RRCSetup(rrc_gNB_ue_context_t         *const ue_context_pP,
 		  &asn_DEF_NR_CellGroupConfig,   //might be added prefix later
 		  (void **)&cellGroupConfig,
 		  (uint8_t *)masterCellGroup_from_DU->buf,
-		  masterCellGroup_from_DU->size, 0, 0); 
-      
-      xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void*)cellGroupConfig);
+		  masterCellGroup_from_DU->size, 0, 0);
     }
     else {
       cellGroupConfig = calloc(1, sizeof(NR_CellGroupConfig_t));
-      fill_initial_cellGroupConfig(ue_context_pP->local_uid, cellGroupConfig, scc, configuration);
+      fill_initial_cellGroupConfig(ue_context_pP->local_uid,cellGroupConfig,scc,servingcellconfigdedicated,configuration);
 
       enc_rval = uper_encode_to_buffer(&asn_DEF_NR_CellGroupConfig,
 				       NULL,
@@ -1933,8 +2072,10 @@ int     do_RRCSetup(rrc_gNB_ue_context_t         *const ue_context_pP,
     ue_p->masterCellGroup = cellGroupConfig;
 
     if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
+      xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void*)cellGroupConfig);
       xer_fprint(stdout, &asn_DEF_NR_DL_CCCH_Message, (void *)&dl_ccch_msg);
     }
+
     enc_rval = uper_encode_to_buffer(&asn_DEF_NR_DL_CCCH_Message,
 				     NULL,
 				     (void *)&dl_ccch_msg,
@@ -1947,7 +2088,7 @@ int     do_RRCSetup(rrc_gNB_ue_context_t         *const ue_context_pP,
       return -1;
     }
     
-    LOG_I(NR_RRC,"RRCSetup Encoded %zd bits (%zd bytes)\n",
+    LOG_D(NR_RRC,"RRCSetup Encoded %zd bits (%zd bytes)\n",
             enc_rval.encoded,(enc_rval.encoded+7)/8);
     return((enc_rval.encoded+7)/8);
 }
@@ -2211,7 +2352,8 @@ int16_t do_RRCReconfiguration(
 
     if(cellGroupConfig!=NULL){
       update_cellGroupConfig(cellGroupConfig,
-                             ue_context_pP->ue_context.UE_Capability_nr,
+                             ue_context_pP->local_uid,
+                             ue_context_pP ? ue_context_pP->ue_context.UE_Capability_nr : NULL,
                              configuration);
 
       enc_rval = uper_encode_to_buffer(&asn_DEF_NR_CellGroupConfig,
@@ -2224,7 +2366,9 @@ int16_t do_RRCReconfiguration(
             enc_rval.failed_type->name, enc_rval.encoded);
         return -1;
       }
-      xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void*)cellGroupConfig);
+      if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
+        xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void *) cellGroupConfig);
+      }
       ie->nonCriticalExtension->masterCellGroup = calloc(1,sizeof(OCTET_STRING_t));
 
       ie->nonCriticalExtension->masterCellGroup->buf = masterCellGroup_buf;
@@ -2233,9 +2377,9 @@ int16_t do_RRCReconfiguration(
 
     dl_dcch_msg.message.choice.c1->choice.rrcReconfiguration->criticalExtensions.choice.rrcReconfiguration = ie;
 
-    //if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
-        xer_fprint(stdout, &asn_DEF_NR_DL_DCCH_Message, (void *)&dl_dcch_msg);
-    //}
+    if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
+      xer_fprint(stdout, &asn_DEF_NR_DL_DCCH_Message, (void *)&dl_dcch_msg);
+    }
 
     enc_rval = uper_encode_to_buffer(&asn_DEF_NR_DL_DCCH_Message,
                                     NULL,
diff --git a/openair2/RRC/NR/MESSAGES/asn1_msg.h b/openair2/RRC/NR/MESSAGES/asn1_msg.h
index 81563eb7cdf5df87651e0d4531f3172ca9ca0e7c..ea4b185f6b3d7c33458734976faf0198af36a674 100644
--- a/openair2/RRC/NR/MESSAGES/asn1_msg.h
+++ b/openair2/RRC/NR/MESSAGES/asn1_msg.h
@@ -73,9 +73,7 @@ uint8_t do_MIB_NR(gNB_RRC_INST *rrc,
 @param carrier pointer to Carrier information
 @param configuration Pointer Configuration Request structure  
 @return size of encoded bit stream in bytes*/
-uint8_t do_SIB1_NR(rrc_gNB_carrier_data_t *carrier,
-  gNB_RrcConfigurationReq *configuration
-                  );
+uint16_t do_SIB1_NR(rrc_gNB_carrier_data_t *carrier, gNB_RrcConfigurationReq *configuration);
 
 uint8_t do_SIB23_NR(rrc_gNB_carrier_data_t *carrier,
                     gNB_RrcConfigurationReq *configuration);
@@ -102,26 +100,36 @@ uint8_t do_RRCReject(uint8_t Mod_id,
                      uint8_t *const buffer);
 
 void fill_initial_SpCellConfig(int uid,
-                               NR_SpCellConfig_t *SpCellConfig,
+                               NR_CellGroupConfig_t *cellGroupConfig,
                                NR_ServingCellConfigCommon_t *scc,
+                               NR_ServingCellConfig_t *servingcellconfigdedicated,
                                const gNB_RrcConfigurationReq *configuration);
 
 void fill_initial_cellGroupConfig(int uid,
                                   NR_CellGroupConfig_t *cellGroupConfig,
                                   NR_ServingCellConfigCommon_t *scc,
+                                  NR_ServingCellConfig_t *servingcellconfigdedicated,
                                   const gNB_RrcConfigurationReq *configuration);
 
 void update_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig,
+                            const int uid,
                             NR_UE_NR_Capability_t *uecap,
                             const gNB_RrcConfigurationReq *configuration);
 
-void fill_mastercellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig, NR_CellGroupConfig_t *ue_context_mastercellGroup,int use_rlc_um_for_drb);
+void fill_mastercellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig,
+                                NR_CellGroupConfig_t *ue_context_mastercellGroup,
+                                int use_rlc_um_for_drb,
+                                uint8_t configure_srb,
+                                uint8_t bearer_id_start,
+                                uint8_t nb_bearers_to_setup,
+                                long *priority);
 
-int     do_RRCSetup(rrc_gNB_ue_context_t         *const ue_context_pP,
+int16_t do_RRCSetup(rrc_gNB_ue_context_t         *const ue_context_pP,
                     uint8_t                      *const buffer,
                     const uint8_t                transaction_id,
                     OCTET_STRING_t               *masterCellGroup_from_DU,
                     NR_ServingCellConfigCommon_t *scc,
+                    NR_ServingCellConfig_t       *servingcellconfigdedicated,
                     const gNB_RrcConfigurationReq *configuration);
 
 uint8_t do_NR_SecurityModeCommand(
diff --git a/openair2/RRC/NR/nr_rrc_config.c b/openair2/RRC/NR/nr_rrc_config.c
index af5e32336f967ad072a7dfaa7fa9dd1a693028b3..f67fb93c2344a1f3746097151a76e8fa41955824 100644
--- a/openair2/RRC/NR/nr_rrc_config.c
+++ b/openair2/RRC/NR/nr_rrc_config.c
@@ -34,6 +34,63 @@
 const uint8_t slotsperframe[5] = {10, 20, 40, 80, 160};
 
 
+void rrc_coreset_config(NR_ControlResourceSet_t *coreset,
+                        int bwp_id,
+                        int curr_bwp,
+                        uint64_t ssb_bitmap) {
+
+
+  // frequency domain resources depending on BWP size
+  coreset->frequencyDomainResources.buf = calloc(1,6);
+  coreset->frequencyDomainResources.buf[0] = (curr_bwp < 48) ? 0xf0 : 0xff;
+  coreset->frequencyDomainResources.buf[1] = (curr_bwp < 96) ? 0x00 : 0xff;
+  coreset->frequencyDomainResources.buf[2] = (curr_bwp < 144) ? 0x00 : 0xff;
+  coreset->frequencyDomainResources.buf[3] = (curr_bwp < 192) ? 0x00 : 0xff;
+  coreset->frequencyDomainResources.buf[4] = (curr_bwp < 240) ? 0x00 : 0xff;
+  coreset->frequencyDomainResources.buf[5] = 0x00;
+  coreset->frequencyDomainResources.size = 6;
+  coreset->frequencyDomainResources.bits_unused = 3;
+  coreset->duration = (curr_bwp < 48) ? 2 : 1;
+  coreset->cce_REG_MappingType.present = NR_ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved;
+  coreset->precoderGranularity = NR_ControlResourceSet__precoderGranularity_sameAsREG_bundle;
+
+  // The ID space is used across the BWPs of a Serving Cell as per 38.331
+  coreset->controlResourceSetId = bwp_id + 1;
+
+  coreset->tci_StatesPDCCH_ToAddList=calloc(1,sizeof(*coreset->tci_StatesPDCCH_ToAddList));
+  NR_TCI_StateId_t *tci[64];
+  for (int i=0;i<64;i++) {
+    if ((ssb_bitmap>>(63-i))&0x01){
+      tci[i]=calloc(1,sizeof(*tci[i]));
+      *tci[i] = i;
+      ASN_SEQUENCE_ADD(&coreset->tci_StatesPDCCH_ToAddList->list,tci[i]);
+    }
+  }
+  coreset->tci_StatesPDCCH_ToReleaseList = NULL;
+  coreset->tci_PresentInDCI = NULL;
+  coreset->pdcch_DMRS_ScramblingID = NULL;
+}
+
+uint64_t get_ssb_bitmap(NR_ServingCellConfigCommon_t *scc) {
+  uint64_t bitmap=0;
+  switch (scc->ssb_PositionsInBurst->present) {
+    case 1 :
+      bitmap = ((uint64_t) scc->ssb_PositionsInBurst->choice.shortBitmap.buf[0])<<56;
+      break;
+    case 2 :
+      bitmap = ((uint64_t) scc->ssb_PositionsInBurst->choice.mediumBitmap.buf[0])<<56;
+      break;
+    case 3 :
+      for (int i=0; i<8; i++) {
+        bitmap |= (((uint64_t) scc->ssb_PositionsInBurst->choice.longBitmap.buf[i])<<((7-i)*8));
+      }
+      break;
+    default:
+      AssertFatal(1==0,"SSB bitmap size value %d undefined (allowed values 1,2,3) \n", scc->ssb_PositionsInBurst->present);
+  }
+  return bitmap;
+}
+
 void set_csirs_periodicity(NR_NZP_CSI_RS_Resource_t *nzpcsi0, int uid, int nb_slots_per_period) {
 
   nzpcsi0->periodicityAndOffset = calloc(1,sizeof(*nzpcsi0->periodicityAndOffset));
@@ -81,7 +138,6 @@ void set_csirs_periodicity(NR_NZP_CSI_RS_Resource_t *nzpcsi0, int uid, int nb_sl
   }
 }
 
-
 void config_csirs(NR_ServingCellConfigCommon_t *servingcellconfigcommon,
                   NR_CSI_MeasConfig_t *csi_MeasConfig,
                   int uid,
@@ -159,7 +215,8 @@ void config_csirs(NR_ServingCellConfigCommon_t *servingcellconfigcommon,
     *nzpcsi0->powerControlOffsetSS = NR_NZP_CSI_RS_Resource__powerControlOffsetSS_db0;
     nzpcsi0->scramblingID = *servingcellconfigcommon->physCellId;
     set_csirs_periodicity(nzpcsi0, uid, nb_slots_per_period);
-    nzpcsi0->qcl_InfoPeriodicCSI_RS = NULL;
+    nzpcsi0->qcl_InfoPeriodicCSI_RS = calloc(1,sizeof(*nzpcsi0->qcl_InfoPeriodicCSI_RS));
+    *nzpcsi0->qcl_InfoPeriodicCSI_RS = 0;
     ASN_SEQUENCE_ADD(&csi_MeasConfig->nzp_CSI_RS_ResourceToAddModList->list,nzpcsi0);
   }
   else {
@@ -170,12 +227,234 @@ void config_csirs(NR_ServingCellConfigCommon_t *servingcellconfigcommon,
   csi_MeasConfig->nzp_CSI_RS_ResourceToReleaseList = NULL;
 }
 
+void set_csiim_offset(struct NR_CSI_ResourcePeriodicityAndOffset *periodicityAndOffset,
+                      struct NR_CSI_ResourcePeriodicityAndOffset *target_periodicityAndOffset) {
+
+  switch(periodicityAndOffset->present) {
+    case NR_CSI_ResourcePeriodicityAndOffset_PR_slots4:
+      periodicityAndOffset->choice.slots4 = target_periodicityAndOffset->choice.slots4;
+      break;
+    case NR_CSI_ResourcePeriodicityAndOffset_PR_slots5:
+      periodicityAndOffset->choice.slots5 = target_periodicityAndOffset->choice.slots5;
+      break;
+    case NR_CSI_ResourcePeriodicityAndOffset_PR_slots8:
+      periodicityAndOffset->choice.slots8 = target_periodicityAndOffset->choice.slots8;
+      break;
+    case NR_CSI_ResourcePeriodicityAndOffset_PR_slots10:
+      periodicityAndOffset->choice.slots10 = target_periodicityAndOffset->choice.slots10;
+      break;
+    case NR_CSI_ResourcePeriodicityAndOffset_PR_slots16:
+      periodicityAndOffset->choice.slots16 = target_periodicityAndOffset->choice.slots16;
+      break;
+    case NR_CSI_ResourcePeriodicityAndOffset_PR_slots20:
+      periodicityAndOffset->choice.slots20 = target_periodicityAndOffset->choice.slots20;
+      break;
+    case NR_CSI_ResourcePeriodicityAndOffset_PR_slots32:
+      periodicityAndOffset->choice.slots32 = target_periodicityAndOffset->choice.slots32;
+      break;
+    case NR_CSI_ResourcePeriodicityAndOffset_PR_slots40:
+      periodicityAndOffset->choice.slots40 = target_periodicityAndOffset->choice.slots40;
+      break;
+    case NR_CSI_ResourcePeriodicityAndOffset_PR_slots64:
+      periodicityAndOffset->choice.slots64 = target_periodicityAndOffset->choice.slots64;
+      break;
+    case NR_CSI_ResourcePeriodicityAndOffset_PR_slots80:
+      periodicityAndOffset->choice.slots80 = target_periodicityAndOffset->choice.slots80;
+      break;
+    case NR_CSI_ResourcePeriodicityAndOffset_PR_slots160:
+      periodicityAndOffset->choice.slots160 = target_periodicityAndOffset->choice.slots160;
+      break;
+    case NR_CSI_ResourcePeriodicityAndOffset_PR_slots320:
+      periodicityAndOffset->choice.slots320 = target_periodicityAndOffset->choice.slots320;
+      break;
+    case NR_CSI_ResourcePeriodicityAndOffset_PR_slots640:
+      periodicityAndOffset->choice.slots640 = target_periodicityAndOffset->choice.slots640;
+      break;
+    default:
+      AssertFatal(1==0,"CSI periodicity not among allowed values\n");
+  }
+
+}
+
+void config_csiim(int do_csirs, int dl_antenna_ports, int curr_bwp,
+                  NR_CSI_MeasConfig_t *csi_MeasConfig) {
+
+ if (do_csirs && dl_antenna_ports > 1) {
+   csi_MeasConfig->csi_IM_ResourceToAddModList = calloc(1,sizeof(*csi_MeasConfig->csi_IM_ResourceToAddModList));
+   NR_CSI_IM_Resource_t *imres = calloc(1,sizeof(*imres));
+   imres->csi_IM_ResourceId = 0;
+   NR_NZP_CSI_RS_Resource_t *nzpcsi = NULL;
+   for (int i=0; i<csi_MeasConfig->nzp_CSI_RS_ResourceToAddModList->list.count; i++){
+     nzpcsi = csi_MeasConfig->nzp_CSI_RS_ResourceToAddModList->list.array[i];
+     if (nzpcsi->nzp_CSI_RS_ResourceId == imres->csi_IM_ResourceId)
+       break;
+   }
+   AssertFatal(nzpcsi->nzp_CSI_RS_ResourceId == imres->csi_IM_ResourceId, "Couldn't find NZP CSI-RS corresponding to CSI-IM\n");
+   imres->csi_IM_ResourceElementPattern = calloc(1,sizeof(*imres->csi_IM_ResourceElementPattern));
+   imres->csi_IM_ResourceElementPattern->present = NR_CSI_IM_Resource__csi_IM_ResourceElementPattern_PR_pattern1;
+   imres->csi_IM_ResourceElementPattern->choice.pattern1 = calloc(1,sizeof(*imres->csi_IM_ResourceElementPattern->choice.pattern1));
+   // starting subcarrier is 4 in the following configuration
+   // this is ok for current possible CSI-RS configurations (using only the first 4 symbols)
+   // TODO needs a more dynamic setting if CSI-RS is changed
+   imres->csi_IM_ResourceElementPattern->choice.pattern1->subcarrierLocation_p1 = NR_CSI_IM_Resource__csi_IM_ResourceElementPattern__pattern1__subcarrierLocation_p1_s4;
+   imres->csi_IM_ResourceElementPattern->choice.pattern1->symbolLocation_p1 = nzpcsi->resourceMapping.firstOFDMSymbolInTimeDomain; // same symbol as CSI-RS
+   imres->freqBand = calloc(1,sizeof(*imres->freqBand));
+   imres->freqBand->startingRB = 0;
+   imres->freqBand->nrofRBs = ((curr_bwp>>2)+(curr_bwp%4>0))<<2;
+   imres->periodicityAndOffset = calloc(1,sizeof(*imres->periodicityAndOffset));
+   // same period and offset of the associated CSI-RS
+   imres->periodicityAndOffset->present = nzpcsi->periodicityAndOffset->present;
+   set_csiim_offset(imres->periodicityAndOffset, nzpcsi->periodicityAndOffset);
+   ASN_SEQUENCE_ADD(&csi_MeasConfig->csi_IM_ResourceToAddModList->list,imres);
+   csi_MeasConfig->csi_IM_ResourceSetToAddModList = calloc(1,sizeof(*csi_MeasConfig->csi_IM_ResourceSetToAddModList));
+   NR_CSI_IM_ResourceSet_t *imset = calloc(1,sizeof(*imset));
+   imset->csi_IM_ResourceSetId = 0;
+   NR_CSI_IM_ResourceId_t *res = calloc(1,sizeof(*res));
+   *res = imres->csi_IM_ResourceId;
+   ASN_SEQUENCE_ADD(&imset->csi_IM_Resources,res);
+   ASN_SEQUENCE_ADD(&csi_MeasConfig->csi_IM_ResourceSetToAddModList->list,imset);
+ }
+ else {
+   csi_MeasConfig->csi_IM_ResourceToAddModList = NULL;
+   csi_MeasConfig->csi_IM_ResourceSetToAddModList = NULL;
+ }
+
+ csi_MeasConfig->csi_IM_ResourceToReleaseList = NULL;
+ csi_MeasConfig->csi_IM_ResourceSetToReleaseList = NULL;
+}
+
+// TODO: Implement to b_SRS = 1 and b_SRS = 2
+long rrc_get_max_nr_csrs(const uint8_t max_rbs, const long b_SRS) {
+
+  if(b_SRS>0) {
+    LOG_E(NR_RRC,"rrc_get_max_nr_csrs(): Not implemented yet for b_SRS>0\n");
+    return 0; // This c_srs is always valid
+  }
+
+  const uint16_t m_SRS[64] = { 4, 8, 12, 16, 16, 20, 24, 24, 28, 32, 36, 40, 48, 48, 52, 56, 60, 64, 72, 72, 76, 80, 88,
+                               96, 96, 104, 112, 120, 120, 120, 128, 128, 128, 132, 136, 144, 144, 144, 144, 152, 160,
+                               160, 160, 168, 176, 184, 192, 192, 192, 192, 208, 216, 224, 240, 240, 240, 240, 256, 256,
+                               256, 264, 272, 272, 272 };
+
+  long c_srs = 0;
+  uint16_t m = 4;
+  for(int c = 1; c<64; c++) {
+    if(m_SRS[c]>m && m_SRS[c]<max_rbs) {
+      c_srs = c;
+      m = m_SRS[c];
+    }
+  }
+
+  return c_srs;
+}
+
+void config_srs(NR_SetupRelease_SRS_Config_t *setup_release_srs_Config,
+                const NR_ServingCellConfigCommon_t *servingcellconfigcommon,
+                const int uid,
+                const int do_srs) {
+
+  setup_release_srs_Config->present = NR_SetupRelease_SRS_Config_PR_setup;
+
+  NR_SRS_Config_t *srs_Config;
+  if (setup_release_srs_Config->choice.setup) {
+    srs_Config = setup_release_srs_Config->choice.setup;
+    if (srs_Config->srs_ResourceSetToReleaseList) {
+      free(srs_Config->srs_ResourceSetToReleaseList);
+    }
+    if (srs_Config->srs_ResourceSetToAddModList) {
+      free(srs_Config->srs_ResourceSetToAddModList);
+    }
+    if (srs_Config->srs_ResourceToReleaseList) {
+      free(srs_Config->srs_ResourceToReleaseList);
+    }
+    if (srs_Config->srs_ResourceToAddModList) {
+      free(srs_Config->srs_ResourceToAddModList);
+    }
+    free(srs_Config);
+  }
+
+  setup_release_srs_Config->choice.setup = calloc(1,sizeof(*setup_release_srs_Config->choice.setup));
+  srs_Config = setup_release_srs_Config->choice.setup;
+
+  srs_Config->srs_ResourceSetToReleaseList = NULL;
+
+  srs_Config->srs_ResourceSetToAddModList = calloc(1,sizeof(*srs_Config->srs_ResourceSetToAddModList));
+  NR_SRS_ResourceSet_t *srs_resset0 = calloc(1,sizeof(*srs_resset0));
+  srs_resset0->srs_ResourceSetId = 0;
+  srs_resset0->srs_ResourceIdList = calloc(1,sizeof(*srs_resset0->srs_ResourceIdList));
+  NR_SRS_ResourceId_t *srs_resset0_id = calloc(1,sizeof(*srs_resset0_id));
+  *srs_resset0_id = 0;
+  ASN_SEQUENCE_ADD(&srs_resset0->srs_ResourceIdList->list, srs_resset0_id);
+  srs_Config->srs_ResourceToReleaseList=NULL;
+  if (do_srs) {
+    srs_resset0->resourceType.present =  NR_SRS_ResourceSet__resourceType_PR_periodic;
+    srs_resset0->resourceType.choice.periodic = calloc(1,sizeof(*srs_resset0->resourceType.choice.periodic));
+    srs_resset0->resourceType.choice.periodic->associatedCSI_RS = NULL;
+  } else {
+    srs_resset0->resourceType.present =  NR_SRS_ResourceSet__resourceType_PR_aperiodic;
+    srs_resset0->resourceType.choice.aperiodic = calloc(1,sizeof(*srs_resset0->resourceType.choice.aperiodic));
+    srs_resset0->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger=1;
+    srs_resset0->resourceType.choice.aperiodic->csi_RS=NULL;
+    srs_resset0->resourceType.choice.aperiodic->slotOffset = calloc(1,sizeof(*srs_resset0->resourceType.choice.aperiodic->slotOffset));
+    *srs_resset0->resourceType.choice.aperiodic->slotOffset = 2;
+    srs_resset0->resourceType.choice.aperiodic->ext1 = NULL;
+  }
+  srs_resset0->usage=NR_SRS_ResourceSet__usage_codebook;
+  srs_resset0->alpha = calloc(1,sizeof(*srs_resset0->alpha));
+  *srs_resset0->alpha = NR_Alpha_alpha1;
+  srs_resset0->p0 = calloc(1,sizeof(*srs_resset0->p0));
+  *srs_resset0->p0 =-80;
+  srs_resset0->pathlossReferenceRS = NULL;
+  srs_resset0->srs_PowerControlAdjustmentStates = NULL;
+  ASN_SEQUENCE_ADD(&srs_Config->srs_ResourceSetToAddModList->list,srs_resset0);
+
+  srs_Config->srs_ResourceToReleaseList = NULL;
+
+  srs_Config->srs_ResourceToAddModList = calloc(1,sizeof(*srs_Config->srs_ResourceToAddModList));
+  NR_SRS_Resource_t *srs_res0=calloc(1,sizeof(*srs_res0));
+  srs_res0->srs_ResourceId = 0;
+  srs_res0->nrofSRS_Ports = NR_SRS_Resource__nrofSRS_Ports_port1;
+  srs_res0->ptrs_PortIndex = NULL;
+  srs_res0->transmissionComb.present = NR_SRS_Resource__transmissionComb_PR_n2;
+  srs_res0->transmissionComb.choice.n2 = calloc(1,sizeof(*srs_res0->transmissionComb.choice.n2));
+  srs_res0->transmissionComb.choice.n2->combOffset_n2 = 0;
+  srs_res0->transmissionComb.choice.n2->cyclicShift_n2 = 0;
+  srs_res0->resourceMapping.startPosition = 2 + uid%2;
+  srs_res0->resourceMapping.nrofSymbols = NR_SRS_Resource__resourceMapping__nrofSymbols_n1;
+  srs_res0->resourceMapping.repetitionFactor = NR_SRS_Resource__resourceMapping__repetitionFactor_n1;
+  srs_res0->freqDomainPosition = 0;
+  srs_res0->freqDomainShift = 0;
+  srs_res0->freqHopping.b_SRS = 0;
+  srs_res0->freqHopping.b_hop = 0;
+  srs_res0->freqHopping.c_SRS = servingcellconfigcommon ?
+                                rrc_get_max_nr_csrs(
+                                    NRRIV2BW(servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, 275),
+                                    srs_res0->freqHopping.b_SRS) : 0;
+  srs_res0->groupOrSequenceHopping = NR_SRS_Resource__groupOrSequenceHopping_neither;
+  if (do_srs) {
+    srs_res0->resourceType.present = NR_SRS_Resource__resourceType_PR_periodic;
+    srs_res0->resourceType.choice.periodic = calloc(1,sizeof(*srs_res0->resourceType.choice.periodic));
+    srs_res0->resourceType.choice.periodic->periodicityAndOffset_p.present = NR_SRS_PeriodicityAndOffset_PR_sl160;
+    srs_res0->resourceType.choice.periodic->periodicityAndOffset_p.choice.sl160 = 17 + (uid>1)*10; // 17/17/.../147/157 are mixed slots
+  } else {
+    srs_res0->resourceType.present = NR_SRS_Resource__resourceType_PR_aperiodic;
+    srs_res0->resourceType.choice.aperiodic = calloc(1,sizeof(*srs_res0->resourceType.choice.aperiodic));
+  }
+  srs_res0->sequenceId = 40;
+  srs_res0->spatialRelationInfo = calloc(1,sizeof(*srs_res0->spatialRelationInfo));
+  srs_res0->spatialRelationInfo->servingCellId = NULL;
+  srs_res0->spatialRelationInfo->referenceSignal.present = NR_SRS_SpatialRelationInfo__referenceSignal_PR_csi_RS_Index;
+  srs_res0->spatialRelationInfo->referenceSignal.choice.csi_RS_Index = 0;
+  ASN_SEQUENCE_ADD(&srs_Config->srs_ResourceToAddModList->list,srs_res0);
+}
+
 void prepare_sim_uecap(NR_UE_NR_Capability_t *cap,
                        NR_ServingCellConfigCommon_t *scc,
                        int numerology,
                        int rbsize,
                        int mcs_table) {
 
+  NR_Phy_Parameters_t *phy_Parameters = &cap->phy_Parameters;
   int band = *scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0];
   NR_BandNR_t *nr_bandnr = CALLOC(1,sizeof(NR_BandNR_t));
   nr_bandnr->bandNR = band;
@@ -189,8 +468,8 @@ void prepare_sim_uecap(NR_UE_NR_Capability_t *cap,
       *bandNRinfo->pdsch_256QAM_FR2 = NR_BandNR__pdsch_256QAM_FR2_supported;
     }
     else{
-      cap->phy_Parameters.phy_ParametersFR1 = CALLOC(1,sizeof(*cap->phy_Parameters.phy_ParametersFR1));
-      NR_Phy_ParametersFR1_t *phy_fr1 = cap->phy_Parameters.phy_ParametersFR1;
+      phy_Parameters->phy_ParametersFR1 = CALLOC(1,sizeof(*phy_Parameters->phy_ParametersFR1));
+      NR_Phy_ParametersFR1_t *phy_fr1 = phy_Parameters->phy_ParametersFR1;
       phy_fr1->pdsch_256QAM_FR1 = CALLOC(1,sizeof(*phy_fr1->pdsch_256QAM_FR1));
       *phy_fr1->pdsch_256QAM_FR1 = NR_Phy_ParametersFR1__pdsch_256QAM_FR1_supported;
     }
@@ -209,35 +488,45 @@ void prepare_sim_uecap(NR_UE_NR_Capability_t *cap,
     }
     fs_cc->supportedModulationOrderDL = CALLOC(1,sizeof(*fs_cc->supportedModulationOrderDL));
     *fs_cc->supportedModulationOrderDL = NR_ModulationOrder_qam256;
-    ASN_SEQUENCE_ADD(&fs->featureSetsDownlinkPerCC->list,
-                     fs_cc);
+    ASN_SEQUENCE_ADD(&fs->featureSetsDownlinkPerCC->list, fs_cc);
   }
+
+  phy_Parameters->phy_ParametersFRX_Diff = CALLOC(1,sizeof(*phy_Parameters->phy_ParametersFRX_Diff));
+  phy_Parameters->phy_ParametersFRX_Diff->pucch_F0_2WithoutFH = NULL;
 }
 
-void nr_rrc_config_dl_tda(NR_ServingCellConfigCommon_t *scc){
+void nr_rrc_config_dl_tda(NR_ServingCellConfigCommon_t *scc,
+                          NR_PDSCH_TimeDomainResourceAllocationList_t	*pdsch_TimeDomainAllocationList,
+                          int curr_bwp) {
 
   frame_type_t frame_type = get_frame_type(*scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0], *scc->ssbSubcarrierSpacing);
-  int curr_bwp = scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth;
+
   // coreset duration setting to be improved in the framework of RRC harmonization, potentially using a common function
   int len_coreset = 1;
   if (curr_bwp < 48)
     len_coreset = 2;
-  // setting default TDA for DL with
+  // setting default TDA for DL with TDA index 0
   struct NR_PDSCH_TimeDomainResourceAllocation *timedomainresourceallocation = CALLOC(1,sizeof(NR_PDSCH_TimeDomainResourceAllocation_t));
+  // k0: Slot offset between DCI and its scheduled PDSCH (see TS 38.214 clause 5.1.2.1) When the field is absent the UE applies the value 0.
+  //timedomainresourceallocation->k0 = calloc(1,sizeof(*timedomainresourceallocation->k0));
+  //*timedomainresourceallocation->k0 = 0;
   timedomainresourceallocation->mappingType = NR_PDSCH_TimeDomainResourceAllocation__mappingType_typeA;
   timedomainresourceallocation->startSymbolAndLength = get_SLIV(len_coreset,14-len_coreset); // basic slot configuration starting in symbol 1 til the end of the slot
-  ASN_SEQUENCE_ADD(&scc->downlinkConfigCommon->initialDownlinkBWP->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list,
-                   timedomainresourceallocation);
+  ASN_SEQUENCE_ADD(&pdsch_TimeDomainAllocationList->list, timedomainresourceallocation);
+  // setting TDA for CSI-RS symbol with index 1
+  struct NR_PDSCH_TimeDomainResourceAllocation *timedomainresourceallocation1 = CALLOC(1,sizeof(NR_PDSCH_TimeDomainResourceAllocation_t));
+  timedomainresourceallocation1->mappingType = NR_PDSCH_TimeDomainResourceAllocation__mappingType_typeA;
+  timedomainresourceallocation1->startSymbolAndLength = get_SLIV(len_coreset,14-len_coreset-1); // 1 symbol CSI-RS
+  ASN_SEQUENCE_ADD(&pdsch_TimeDomainAllocationList->list, timedomainresourceallocation1);
   if(frame_type==TDD) {
-    // TDD
     if(scc->tdd_UL_DL_ConfigurationCommon) {
       int dl_symb = scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofDownlinkSymbols;
       if(dl_symb > 1) {
-        timedomainresourceallocation = CALLOC(1,sizeof(NR_PDSCH_TimeDomainResourceAllocation_t));
-        timedomainresourceallocation->mappingType = NR_PDSCH_TimeDomainResourceAllocation__mappingType_typeA;
-        timedomainresourceallocation->startSymbolAndLength = get_SLIV(len_coreset,dl_symb-len_coreset); // mixed slot configuration starting in symbol 1 til the end of the dl allocation
-        ASN_SEQUENCE_ADD(&scc->downlinkConfigCommon->initialDownlinkBWP->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list,
-                         timedomainresourceallocation);
+        // mixed slot TDA with TDA index 2
+        struct NR_PDSCH_TimeDomainResourceAllocation *timedomainresourceallocation2 = CALLOC(1,sizeof(NR_PDSCH_TimeDomainResourceAllocation_t));
+        timedomainresourceallocation2->mappingType = NR_PDSCH_TimeDomainResourceAllocation__mappingType_typeA;
+        timedomainresourceallocation2->startSymbolAndLength = get_SLIV(len_coreset,dl_symb-len_coreset); // mixed slot configuration starting in symbol 1 til the end of the dl allocation
+        ASN_SEQUENCE_ADD(&pdsch_TimeDomainAllocationList->list, timedomainresourceallocation2);
       }
     }
   }
@@ -249,64 +538,250 @@ void nr_rrc_config_ul_tda(NR_ServingCellConfigCommon_t *scc, int min_fb_delay){
   //TODO change to accomodate for SRS
 
   frame_type_t frame_type = get_frame_type(*scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0], *scc->ssbSubcarrierSpacing);
-  int temp_min_delay = 6; // k2 = 2 or 3 won'r work as well as higher values
-  if(frame_type==TDD && scc->tdd_UL_DL_ConfigurationCommon) {
-
-    switch (scc->tdd_UL_DL_ConfigurationCommon->pattern1.dl_UL_TransmissionPeriodicity) {
-      case NR_TDD_UL_DL_Pattern__dl_UL_TransmissionPeriodicity_ms2p5:  // 30kHz SCS
-      case NR_TDD_UL_DL_Pattern__dl_UL_TransmissionPeriodicity_ms2:    // 60kHz SCS
-      case NR_TDD_UL_DL_Pattern__dl_UL_TransmissionPeriodicity_ms1p25: // 60kHz SCS
-      case NR_TDD_UL_DL_Pattern__dl_UL_TransmissionPeriodicity_ms1:    // 120kHz SCS
-      case NR_TDD_UL_DL_Pattern__dl_UL_TransmissionPeriodicity_ms0p625:    // 120kHz SCS
-      case NR_TDD_UL_DL_Pattern__dl_UL_TransmissionPeriodicity_ms0p5:    // 120kHz SCS
-        temp_min_delay = 2; 
-        break;
-    }
-  }
-
-  int k2 = (min_fb_delay<temp_min_delay)?temp_min_delay:min_fb_delay;
+  const int k2 = min_fb_delay;
 
   uint8_t DELTA[4]= {2,3,4,6}; // Delta parameter for Msg3
   int mu = scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.subcarrierSpacing;
 
+  // UL TDA index 0 is basic slot configuration starting in symbol 0 til the last but one symbol
   struct NR_PUSCH_TimeDomainResourceAllocation *pusch_timedomainresourceallocation = CALLOC(1,sizeof(struct NR_PUSCH_TimeDomainResourceAllocation));
   pusch_timedomainresourceallocation->k2  = CALLOC(1,sizeof(long));
   *pusch_timedomainresourceallocation->k2 = k2;
   pusch_timedomainresourceallocation->mappingType = NR_PUSCH_TimeDomainResourceAllocation__mappingType_typeB;
-  pusch_timedomainresourceallocation->startSymbolAndLength = get_SLIV(0,13); // basic slot configuration starting in symbol 0 til the last but one symbol
+  pusch_timedomainresourceallocation->startSymbolAndLength = get_SLIV(0,13);
   ASN_SEQUENCE_ADD(&scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list,pusch_timedomainresourceallocation); 
 
   if(frame_type==TDD) {
-      
-    // TDD
     if(scc->tdd_UL_DL_ConfigurationCommon) {
       int ul_symb = scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofUplinkSymbols;
-      pusch_timedomainresourceallocation = CALLOC(1,sizeof(struct NR_PUSCH_TimeDomainResourceAllocation));
-      pusch_timedomainresourceallocation->k2  = CALLOC(1,sizeof(long));
-      *pusch_timedomainresourceallocation->k2 = k2;
-      pusch_timedomainresourceallocation->mappingType = NR_PUSCH_TimeDomainResourceAllocation__mappingType_typeB;
-      pusch_timedomainresourceallocation->startSymbolAndLength = get_SLIV(14-ul_symb,ul_symb-1); // starting in fist ul symbol til the last but one
-      ASN_SEQUENCE_ADD(&scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list,pusch_timedomainresourceallocation);
-
-      // for msg3 in the mixed slot
-      int nb_periods_per_frame = get_nb_periods_per_frame(scc->tdd_UL_DL_ConfigurationCommon->pattern1.dl_UL_TransmissionPeriodicity);
-      int nb_slots_per_period = ((1<<mu) * 10)/nb_periods_per_frame;
-      struct NR_PUSCH_TimeDomainResourceAllocation *pusch_timedomainresourceallocation_msg3 = CALLOC(1,sizeof(struct NR_PUSCH_TimeDomainResourceAllocation));
-      pusch_timedomainresourceallocation_msg3->k2  = CALLOC(1,sizeof(long));
-      *pusch_timedomainresourceallocation_msg3->k2 = nb_slots_per_period - DELTA[mu];
-      if(*pusch_timedomainresourceallocation_msg3->k2 < min_fb_delay)
-        *pusch_timedomainresourceallocation_msg3->k2 += nb_slots_per_period;
-      AssertFatal(*pusch_timedomainresourceallocation_msg3->k2<33,"Computed k2 for msg3 %ld is larger than the range allowed by RRC (0..32)\n",
-                  *pusch_timedomainresourceallocation_msg3->k2);
-      pusch_timedomainresourceallocation_msg3->mappingType = NR_PUSCH_TimeDomainResourceAllocation__mappingType_typeB;
-      pusch_timedomainresourceallocation_msg3->startSymbolAndLength = get_SLIV(14-ul_symb,ul_symb-1); // starting in fist ul symbol til the last but one
-      ASN_SEQUENCE_ADD(&scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list,pusch_timedomainresourceallocation_msg3);
+      if (ul_symb>1) {
+        // UL TDA index 1 for mixed slot (TDD)
+        pusch_timedomainresourceallocation = CALLOC(1,sizeof(struct NR_PUSCH_TimeDomainResourceAllocation));
+        pusch_timedomainresourceallocation->k2  = CALLOC(1,sizeof(long));
+        *pusch_timedomainresourceallocation->k2 = k2;
+        pusch_timedomainresourceallocation->mappingType = NR_PUSCH_TimeDomainResourceAllocation__mappingType_typeB;
+        pusch_timedomainresourceallocation->startSymbolAndLength = get_SLIV(14-ul_symb,ul_symb-1); // starting in fist ul symbol til the last but one
+        ASN_SEQUENCE_ADD(&scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list,pusch_timedomainresourceallocation);
+
+        // UL TDA index 2 for msg3 in the mixed slot (TDD)
+        int nb_periods_per_frame = get_nb_periods_per_frame(scc->tdd_UL_DL_ConfigurationCommon->pattern1.dl_UL_TransmissionPeriodicity);
+        int nb_slots_per_period = ((1<<mu) * 10)/nb_periods_per_frame;
+        struct NR_PUSCH_TimeDomainResourceAllocation *pusch_timedomainresourceallocation_msg3 = CALLOC(1,sizeof(struct NR_PUSCH_TimeDomainResourceAllocation));
+        pusch_timedomainresourceallocation_msg3->k2  = CALLOC(1,sizeof(long));
+        *pusch_timedomainresourceallocation_msg3->k2 = nb_slots_per_period - DELTA[mu];
+        if(*pusch_timedomainresourceallocation_msg3->k2 < min_fb_delay)
+          *pusch_timedomainresourceallocation_msg3->k2 += nb_slots_per_period;
+        AssertFatal(*pusch_timedomainresourceallocation_msg3->k2<33,"Computed k2 for msg3 %ld is larger than the range allowed by RRC (0..32)\n",
+                    *pusch_timedomainresourceallocation_msg3->k2);
+        pusch_timedomainresourceallocation_msg3->mappingType = NR_PUSCH_TimeDomainResourceAllocation__mappingType_typeB;
+        pusch_timedomainresourceallocation_msg3->startSymbolAndLength = get_SLIV(14-ul_symb,ul_symb-1); // starting in fist ul symbol til the last but one
+        ASN_SEQUENCE_ADD(&scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list,pusch_timedomainresourceallocation_msg3);
+      }
     }
   }
 }
 
+void set_dl_DataToUL_ACK(NR_PUCCH_Config_t *pucch_Config, int min_feedback_time) {
+
+  pucch_Config->dl_DataToUL_ACK = calloc(1,sizeof(*pucch_Config->dl_DataToUL_ACK));
+  long *delay[8];
+  for (int i=0;i<8;i++) {
+    delay[i] = calloc(1,sizeof(*delay[i]));
+    *delay[i] = i+min_feedback_time;
+    ASN_SEQUENCE_ADD(&pucch_Config->dl_DataToUL_ACK->list,delay[i]);
+  }
+}
+
+// PUCCH resource set 0 for configuration with O_uci <= 2 bits and/or a positive or negative SR (section 9.2.1 of 38.213)
+void config_pucch_resset0(NR_PUCCH_Config_t *pucch_Config, int uid, int curr_bwp, NR_UE_NR_Capability_t *uecap) {
+
+  NR_PUCCH_ResourceSet_t *pucchresset = calloc(1,sizeof(*pucchresset));
+  pucchresset->pucch_ResourceSetId = 0;
+  NR_PUCCH_ResourceId_t *pucchid=calloc(1,sizeof(*pucchid));
+  *pucchid=0;
+  ASN_SEQUENCE_ADD(&pucchresset->resourceList.list,pucchid);
+  pucchresset->maxPayloadSize=NULL;
+
+  if(uecap) {
+    long *pucch_F0_2WithoutFH = uecap->phy_Parameters.phy_ParametersFRX_Diff->pucch_F0_2WithoutFH;
+    AssertFatal(pucch_F0_2WithoutFH == NULL,"UE does not support PUCCH F0 without frequency hopping. Current configuration is without FH\n");
+  }
+
+  NR_PUCCH_Resource_t *pucchres0=calloc(1,sizeof(*pucchres0));
+  pucchres0->pucch_ResourceId=*pucchid;
+  pucchres0->startingPRB= (8 + uid) % curr_bwp;
+  pucchres0->intraSlotFrequencyHopping=NULL;
+  pucchres0->secondHopPRB=NULL;
+  pucchres0->format.present= NR_PUCCH_Resource__format_PR_format0;
+  pucchres0->format.choice.format0=calloc(1,sizeof(*pucchres0->format.choice.format0));
+  pucchres0->format.choice.format0->initialCyclicShift=0;
+  pucchres0->format.choice.format0->nrofSymbols=1;
+  pucchres0->format.choice.format0->startingSymbolIndex=13;
+  ASN_SEQUENCE_ADD(&pucch_Config->resourceToAddModList->list,pucchres0);
+
+  ASN_SEQUENCE_ADD(&pucch_Config->resourceSetToAddModList->list,pucchresset);
+}
+
+
+// PUCCH resource set 1 for configuration with O_uci > 2 bits (currently format2)
+void config_pucch_resset1(NR_PUCCH_Config_t *pucch_Config, NR_UE_NR_Capability_t *uecap) {
+
+  NR_PUCCH_ResourceSet_t *pucchresset=calloc(1,sizeof(*pucchresset));
+  pucchresset->pucch_ResourceSetId = 1;
+  NR_PUCCH_ResourceId_t *pucchressetid=calloc(1,sizeof(*pucchressetid));
+  *pucchressetid=2;
+  ASN_SEQUENCE_ADD(&pucchresset->resourceList.list,pucchressetid);
+  pucchresset->maxPayloadSize=NULL;
+
+  if(uecap) {
+    long *pucch_F0_2WithoutFH = uecap->phy_Parameters.phy_ParametersFRX_Diff->pucch_F0_2WithoutFH;
+    AssertFatal(pucch_F0_2WithoutFH == NULL,"UE does not support PUCCH F2 without frequency hopping. Current configuration is without FH\n");
+  }
+
+  NR_PUCCH_Resource_t *pucchres2=calloc(1,sizeof(*pucchres2));
+  pucchres2->pucch_ResourceId=*pucchressetid;
+  pucchres2->startingPRB=0;
+  pucchres2->intraSlotFrequencyHopping=NULL;
+  pucchres2->secondHopPRB=NULL;
+  pucchres2->format.present= NR_PUCCH_Resource__format_PR_format2;
+  pucchres2->format.choice.format2=calloc(1,sizeof(*pucchres2->format.choice.format2));
+  pucchres2->format.choice.format2->nrofPRBs=8;
+  pucchres2->format.choice.format2->nrofSymbols=1;
+  pucchres2->format.choice.format2->startingSymbolIndex=13;
+  ASN_SEQUENCE_ADD(&pucch_Config->resourceToAddModList->list,pucchres2);
+
+  ASN_SEQUENCE_ADD(&pucch_Config->resourceSetToAddModList->list,pucchresset);
+
+  pucch_Config->format2=calloc(1,sizeof(*pucch_Config->format2));
+  pucch_Config->format2->present=NR_SetupRelease_PUCCH_FormatConfig_PR_setup;
+  NR_PUCCH_FormatConfig_t *pucchfmt2 = calloc(1,sizeof(*pucchfmt2));
+  pucch_Config->format2->choice.setup = pucchfmt2;
+  pucchfmt2->interslotFrequencyHopping=NULL;
+  pucchfmt2->additionalDMRS=NULL;
+  pucchfmt2->maxCodeRate=calloc(1,sizeof(*pucchfmt2->maxCodeRate));
+  *pucchfmt2->maxCodeRate=NR_PUCCH_MaxCodeRate_zeroDot35;
+  pucchfmt2->nrofSlots=NULL;
+  pucchfmt2->pi2BPSK=NULL;
+
+  // to check UE capabilities for that in principle
+  pucchfmt2->simultaneousHARQ_ACK_CSI=calloc(1,sizeof(*pucchfmt2->simultaneousHARQ_ACK_CSI));
+  *pucchfmt2->simultaneousHARQ_ACK_CSI=NR_PUCCH_FormatConfig__simultaneousHARQ_ACK_CSI_true;
+
+}
+
+void set_pucch_power_config(NR_PUCCH_Config_t *pucch_Config, int do_csirs) {
+
+  pucch_Config->pucch_PowerControl = calloc(1,sizeof(*pucch_Config->pucch_PowerControl));
+  NR_P0_PUCCH_t *p00 = calloc(1,sizeof(*p00));
+  p00->p0_PUCCH_Id = 1;
+  p00->p0_PUCCH_Value = 0;
+  pucch_Config->pucch_PowerControl->p0_Set = calloc(1,sizeof(*pucch_Config->pucch_PowerControl->p0_Set));
+  ASN_SEQUENCE_ADD(&pucch_Config->pucch_PowerControl->p0_Set->list,p00);
+
+  pucch_Config->pucch_PowerControl->pathlossReferenceRSs = calloc(1,sizeof(*pucch_Config->pucch_PowerControl->pathlossReferenceRSs));
+  struct NR_PUCCH_PathlossReferenceRS *PL_ref_RS = calloc(1,sizeof(*PL_ref_RS));
+  PL_ref_RS->pucch_PathlossReferenceRS_Id = 0;
+  if(do_csirs) {
+    PL_ref_RS->referenceSignal.present = NR_PUCCH_PathlossReferenceRS__referenceSignal_PR_csi_RS_Index;
+    PL_ref_RS->referenceSignal.choice.csi_RS_Index = 0;
+  }
+  else {
+    PL_ref_RS->referenceSignal.present = NR_PUCCH_PathlossReferenceRS__referenceSignal_PR_ssb_Index;
+    PL_ref_RS->referenceSignal.choice.ssb_Index = 0;
+  }
+  ASN_SEQUENCE_ADD(&pucch_Config->pucch_PowerControl->pathlossReferenceRSs->list,PL_ref_RS);
+
+  pucch_Config->pucch_PowerControl->deltaF_PUCCH_f0 = calloc(1,sizeof(*pucch_Config->pucch_PowerControl->deltaF_PUCCH_f0));
+  *pucch_Config->pucch_PowerControl->deltaF_PUCCH_f0 = 0;
+  pucch_Config->pucch_PowerControl->deltaF_PUCCH_f2 = calloc(1,sizeof(*pucch_Config->pucch_PowerControl->deltaF_PUCCH_f2));
+  *pucch_Config->pucch_PowerControl->deltaF_PUCCH_f2 = 0;
+
+  pucch_Config->spatialRelationInfoToAddModList = calloc(1,sizeof(*pucch_Config->spatialRelationInfoToAddModList));
+  pucch_Config->spatialRelationInfoToReleaseList=NULL;
+  NR_PUCCH_SpatialRelationInfo_t *pucchspatial = calloc(1,sizeof(*pucchspatial));
+  pucchspatial->pucch_SpatialRelationInfoId = 1;
+  pucchspatial->servingCellId = NULL;
+  if(do_csirs) {
+    pucchspatial->referenceSignal.present = NR_PUCCH_SpatialRelationInfo__referenceSignal_PR_csi_RS_Index;
+    pucchspatial->referenceSignal.choice.csi_RS_Index = 0;
+  }
+  else {
+    pucchspatial->referenceSignal.present = NR_PUCCH_SpatialRelationInfo__referenceSignal_PR_ssb_Index;
+    pucchspatial->referenceSignal.choice.ssb_Index = 0;
+  }
 
-void set_dl_mcs_table(int scs, NR_UE_NR_Capability_t *cap,
+  pucchspatial->pucch_PathlossReferenceRS_Id = PL_ref_RS->pucch_PathlossReferenceRS_Id;
+  pucchspatial->p0_PUCCH_Id = p00->p0_PUCCH_Id;
+  pucchspatial->closedLoopIndex = NR_PUCCH_SpatialRelationInfo__closedLoopIndex_i0;
+  ASN_SEQUENCE_ADD(&pucch_Config->spatialRelationInfoToAddModList->list,pucchspatial);
+}
+
+void set_SR_periodandoffset(NR_SchedulingRequestResourceConfig_t *schedulingRequestResourceConfig,
+                            NR_ServingCellConfigCommon_t *scc) {
+
+  const NR_TDD_UL_DL_Pattern_t *tdd = scc->tdd_UL_DL_ConfigurationCommon ? &scc->tdd_UL_DL_ConfigurationCommon->pattern1 : NULL;
+  int sr_slot = 1; // in FDD SR in slot 1
+  if(tdd)
+    sr_slot = tdd->nrofDownlinkSlots; // SR in the first uplink slot
+
+  schedulingRequestResourceConfig->periodicityAndOffset = calloc(1,sizeof(*schedulingRequestResourceConfig->periodicityAndOffset));
+
+  if(sr_slot<10){
+    schedulingRequestResourceConfig->periodicityAndOffset->present = NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl10;
+    schedulingRequestResourceConfig->periodicityAndOffset->choice.sl10 = sr_slot;
+    return;
+  }
+  if(sr_slot<20){
+    schedulingRequestResourceConfig->periodicityAndOffset->present = NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl20;
+    schedulingRequestResourceConfig->periodicityAndOffset->choice.sl20 = sr_slot;
+    return;
+  }
+  if(sr_slot<40){
+    schedulingRequestResourceConfig->periodicityAndOffset->present = NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl40;
+    schedulingRequestResourceConfig->periodicityAndOffset->choice.sl40 = sr_slot;
+    return;
+  }
+  if(sr_slot<80){
+    schedulingRequestResourceConfig->periodicityAndOffset->present = NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl80;
+    schedulingRequestResourceConfig->periodicityAndOffset->choice.sl80 = sr_slot;
+    return;
+  }
+  if(sr_slot<160){
+    schedulingRequestResourceConfig->periodicityAndOffset->present = NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl160;
+    schedulingRequestResourceConfig->periodicityAndOffset->choice.sl160 = sr_slot;
+    return;
+  }
+  if(sr_slot<320){
+    schedulingRequestResourceConfig->periodicityAndOffset->present = NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl320;
+    schedulingRequestResourceConfig->periodicityAndOffset->choice.sl320 = sr_slot;
+    return;
+  }
+  schedulingRequestResourceConfig->periodicityAndOffset->present = NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl640;
+  schedulingRequestResourceConfig->periodicityAndOffset->choice.sl640 = sr_slot;
+}
+
+void scheduling_request_config(NR_ServingCellConfigCommon_t *scc,
+                               NR_PUCCH_Config_t *pucch_Config) {
+
+  // format with <=2 bits in pucch resource set 0
+  NR_PUCCH_ResourceSet_t *pucchresset = pucch_Config->resourceSetToAddModList->list.array[0];
+  // assigning the 1st pucch resource in the set to scheduling request
+  NR_PUCCH_ResourceId_t *pucchressetid = pucchresset->resourceList.list.array[0];
+
+  pucch_Config->schedulingRequestResourceToAddModList = calloc(1,sizeof(*pucch_Config->schedulingRequestResourceToAddModList));
+  NR_SchedulingRequestResourceConfig_t *schedulingRequestResourceConfig = calloc(1,sizeof(*schedulingRequestResourceConfig));
+  schedulingRequestResourceConfig->schedulingRequestResourceId = 1;
+  schedulingRequestResourceConfig->schedulingRequestID = 0;
+
+  set_SR_periodandoffset(schedulingRequestResourceConfig, scc);
+
+  schedulingRequestResourceConfig->resource = calloc(1,sizeof(*schedulingRequestResourceConfig->resource));
+  *schedulingRequestResourceConfig->resource = *pucchressetid;
+  ASN_SEQUENCE_ADD(&pucch_Config->schedulingRequestResourceToAddModList->list,schedulingRequestResourceConfig);
+}
+
+void set_dl_mcs_table(int scs,
+                      NR_UE_NR_Capability_t *cap,
                       NR_SpCellConfig_t *SpCellConfig,
                       NR_BWP_DownlinkDedicated_t *bwp_Dedicated,
                       NR_ServingCellConfigCommon_t *scc) {
@@ -327,7 +802,7 @@ void set_dl_mcs_table(int scs, NR_UE_NR_Capability_t *cap,
   }
   AssertFatal(bw_rb>0,"Could not find scs-SpecificCarrierList element for scs %d",scs);
   int bw = get_supported_band_index(scs, band, bw_rb);
-  AssertFatal(bw>0,"Supported band corresponding to %d RBs not found\n", bw_rb);
+  AssertFatal(bw>=0,"Supported band corresponding to %d RBs not found\n", bw_rb);
 
   bool supported = false;
   if (band>256) {
@@ -346,7 +821,7 @@ void set_dl_mcs_table(int scs, NR_UE_NR_Capability_t *cap,
     if(bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table == NULL)
       bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table = calloc(1, sizeof(*bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table));
     *bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table = NR_PDSCH_Config__mcs_Table_qam256;
-// set table 2 in correct entry in SpCellConfig->spCellConfigDedicated->csi_MeasConfig->csi_ReportConfigToAddModList->list 
+    // set table 2 in correct entry in SpCellConfig->spCellConfigDedicated->csi_MeasConfig->csi_ReportConfigToAddModList->list
     AssertFatal(SpCellConfig!=NULL,"SpCellConfig shouldn't be null\n");
     AssertFatal(SpCellConfig->spCellConfigDedicated!=NULL,"SpCellConfigDedicated shouldn't be null\n");
     if (SpCellConfig->spCellConfigDedicated->csi_MeasConfig &&
@@ -362,5 +837,3 @@ void set_dl_mcs_table(int scs, NR_UE_NR_Capability_t *cap,
     bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table = NULL;
 }
 
-
-
diff --git a/openair2/RRC/NR/nr_rrc_config.h b/openair2/RRC/NR/nr_rrc_config.h
index 63df31d1a7995da859c675d18b93ee7efa122980..b1367a0c8a9a4240d0bb7536f6fc79a766f12e6d 100644
--- a/openair2/RRC/NR/nr_rrc_config.h
+++ b/openair2/RRC/NR/nr_rrc_config.h
@@ -111,15 +111,35 @@ typedef struct physicalcellgroup_s{
   long        RNTI_Value[MAX_NUM_CCs];
 }physicalcellgroup_t;
 
-void nr_rrc_config_dl_tda(NR_ServingCellConfigCommon_t *scc);
+uint64_t get_ssb_bitmap(NR_ServingCellConfigCommon_t *scc);
+void rrc_coreset_config(NR_ControlResourceSet_t *coreset,
+                        int bwp_id,
+                        int curr_bwp,
+                        uint64_t ssb_bitmap);
+void nr_rrc_config_dl_tda(NR_ServingCellConfigCommon_t *scc,
+                          NR_PDSCH_TimeDomainResourceAllocationList_t	*pdsch_TimeDomainAllocationList,
+                          int curr_bwp);
 void nr_rrc_config_ul_tda(NR_ServingCellConfigCommon_t *scc, int min_fb_delay);
+void config_pucch_resset0(NR_PUCCH_Config_t *pucch_Config, int uid, int curr_bwp, NR_UE_NR_Capability_t *uecap);
+void config_pucch_resset1(NR_PUCCH_Config_t *pucch_Config, NR_UE_NR_Capability_t *uecap);
+void set_dl_DataToUL_ACK(NR_PUCCH_Config_t *pucch_Config, int min_feedback_time);
+void set_pucch_power_config(NR_PUCCH_Config_t *pucch_Config, int do_csirs);
+void scheduling_request_config(NR_ServingCellConfigCommon_t *scc,
+                               NR_PUCCH_Config_t *pucch_Config);
 void config_csirs(NR_ServingCellConfigCommon_t *servingcellconfigcommon,
                   NR_CSI_MeasConfig_t *csi_MeasConfig,
                   int uid,
                   int num_dl_antenna_ports,
                   int curr_bwp,
                   int do_csirs);
-void set_dl_mcs_table(int scs, NR_UE_NR_Capability_t *cap,
+void config_csiim(int do_csirs, int dl_antenna_ports, int curr_bwp,
+                  NR_CSI_MeasConfig_t *csi_MeasConfig);
+void config_srs(NR_SetupRelease_SRS_Config_t *setup_release_srs_Config,
+                const NR_ServingCellConfigCommon_t *servingcellconfigcommon,
+                const int uid,
+                const int do_srs);
+void set_dl_mcs_table(int scs,
+                      NR_UE_NR_Capability_t *cap,
                       NR_SpCellConfig_t *SpCellConfig,
                       NR_BWP_DownlinkDedicated_t *bwp_Dedicated,
                       NR_ServingCellConfigCommon_t *scc);
@@ -129,5 +149,4 @@ void prepare_sim_uecap(NR_UE_NR_Capability_t *cap,
                        int rbsize,
                        int mcs_table);
 
-
 #endif
diff --git a/openair2/RRC/NR/nr_rrc_defs.h b/openair2/RRC/NR/nr_rrc_defs.h
index f59abb1bb488054ec8accd75909b920ee916040f..b6a92db7a8d24fccb2139c00ddf4da23eaaebc37 100644
--- a/openair2/RRC/NR/nr_rrc_defs.h
+++ b/openair2/RRC/NR/nr_rrc_defs.h
@@ -132,7 +132,7 @@ typedef enum UE_STATE_NR_e {
 #define MAX_MEAS_ID                                   7
 
 #define PAYLOAD_SIZE_MAX                              1024
-#define RRC_BUF_SIZE                                  512
+#define RRC_BUF_SIZE                                  1024
 #define UNDEF_SECURITY_MODE                           0xff
 #define NO_SECURITY_MODE                              0x20
 
@@ -173,7 +173,7 @@ typedef struct UE_RRC_INFO_NR_s {
 } __attribute__ ((__packed__)) NR_UE_RRC_INFO;
 
 typedef struct UE_S_TMSI_NR_s {
-  boolean_t                                           presence;
+  bool                                                presence;
   uint16_t                                            amf_set_id;
   uint8_t                                             amf_pointer;
   uint32_t                                            fiveg_tmsi;
@@ -217,7 +217,7 @@ typedef struct HANDOVER_INFO_NR_s {
 typedef struct {
   char                                                Payload[NR_RRC_BUFFER_SIZE_MAX];
   char                                                Header[NR_RRC_HEADER_SIZE_MAX];
-  int                                                 payload_size;
+  uint16_t                                            payload_size;
 } NR_RRC_BUFFER;
 
 #define NR_RRC_BUFFER_SIZE                            sizeof(RRC_BUFFER_NR)
@@ -290,10 +290,10 @@ typedef struct gNB_RRC_UE_s {
   NR_DRB_ToReleaseList_t            *DRB_Release_configList2[RRC_TRANSACTION_IDENTIFIER_NUMBER];
   uint8_t                            DRB_active[8];
 
-  NR_SRB_INFO                           SI;
-  NR_SRB_INFO                           Srb0;
-  NR_SRB_INFO_TABLE_ENTRY               Srb1;
-  NR_SRB_INFO_TABLE_ENTRY               Srb2;
+  NR_SRB_INFO                       SI;
+  NR_SRB_INFO                       Srb0;
+  NR_SRB_INFO_TABLE_ENTRY           Srb1;
+  NR_SRB_INFO_TABLE_ENTRY           Srb2;
   NR_MeasConfig_t                   *measConfig;
   HANDOVER_INFO                     *handover_info;
   NR_MeasResults_t                  *measResults;
@@ -435,7 +435,7 @@ typedef struct {
   uint8_t                                   sizeof_MIB;
 
   uint8_t                                   *SIB1;
-  uint8_t                                   sizeof_SIB1;
+  uint16_t                                  sizeof_SIB1;
 
   uint8_t                                   *SIB23;
   uint8_t                                   sizeof_SIB23;
@@ -447,13 +447,15 @@ typedef struct {
 
   NR_BCCH_BCH_Message_t                     mib;
   NR_BCCH_BCH_Message_t                    *mib_DU;
-  NR_BCCH_DL_SCH_Message_t                 *siblock1_DU;
+  NR_SIB1_t                                *siblock1_DU;
+  //NR_BCCH_DL_SCH_Message_t                 *siblock1_DU;
   NR_SIB1_t                                *sib1;
   NR_SIB2_t                                *sib2;
   NR_SIB3_t                                *sib3;
   NR_BCCH_DL_SCH_Message_t                  systemInformation; // SIB23
   NR_BCCH_DL_SCH_Message_t                  *siblock1;
   NR_ServingCellConfigCommon_t              *servingcellconfigcommon;
+  NR_ServingCellConfig_t                    *servingcellconfig;
   NR_PDCCH_ConfigSIB1_t                     *pdcch_ConfigSIB1;
   NR_CellGroupConfig_t                      *secondaryCellGroup[MAX_NR_RRC_UE_CONTEXTS];
   NR_SRB_INFO                               SI;
diff --git a/openair2/RRC/NR/nr_rrc_proto.h b/openair2/RRC/NR/nr_rrc_proto.h
index c8fddbecfb9373cfd4c80b7af226f6470aac5cc1..dc6e14215ff24f44665270fa010cca04b885dfee 100644
--- a/openair2/RRC/NR/nr_rrc_proto.h
+++ b/openair2/RRC/NR/nr_rrc_proto.h
@@ -47,13 +47,13 @@ void rrc_config_nr_buffer(NR_SRB_INFO* Srb_info,
                           uint8_t Lchan_type,
                           uint8_t Role);
 
-int    mac_rrc_nr_data_req(const module_id_t Mod_idP,
-                           const int         CC_id,
-                           const frame_t     frameP,
-                           const rb_id_t     Srb_id,
-                           const rnti_t      rnti,
-                           const uint8_t     Nb_tb,
-                           uint8_t *const    buffer_pP );
+uint16_t mac_rrc_nr_data_req(const module_id_t Mod_idP,
+                             const int         CC_id,
+                             const frame_t     frameP,
+                             const rb_id_t     Srb_id,
+                             const rnti_t      rnti,
+                             const uint8_t     Nb_tb,
+                             uint8_t *const    buffer_pP);
 
 void rrc_gNB_process_SgNBAdditionRequest( 
      const protocol_ctxt_t  *const ctxt_pP,
@@ -120,7 +120,7 @@ rrc_gNB_generate_SecurityModeCommand(
   rrc_gNB_ue_context_t          *const ue_context_pP
 );
 
-uint8_t
+				uint8_t
 rrc_gNB_get_next_transaction_identifier(
     module_id_t gnb_mod_idP
 );
@@ -167,18 +167,28 @@ int
 nr_rrc_mac_remove_ue(module_id_t mod_idP,
                   rnti_t rntiP);
 
-int8_t nr_mac_rrc_data_ind(
-    const module_id_t     module_idP,
-    const int             CC_id,
-    const frame_t         frameP,
-    const sub_frame_t     sub_frameP,
-    const int             UE_id,
-    const rnti_t          rntiP,
-    const rb_id_t         srb_idP,
-    const uint8_t        *sduP,
-    const sdu_size_t      sdu_lenP,
-    const boolean_t   brOption
-);
+int8_t nr_mac_rrc_bwp_switch_req(const module_id_t     module_idP,
+                                 const frame_t         frameP,
+                                 const sub_frame_t     sub_frameP,
+                                 const rnti_t          rntiP,
+                                 const int             dl_bwp_id,
+                                 const int             ul_bwp_id);
+
+int8_t nr_mac_rrc_data_ind(const module_id_t     module_idP,
+                           const int             CC_id,
+                           const frame_t         frameP,
+                           const sub_frame_t     sub_frameP,
+                           const int             UE_id,
+                           const rnti_t          rntiP,
+                           const rb_id_t         srb_idP,
+                           const uint8_t        *sduP,
+                           const sdu_size_t      sdu_lenP,
+                           const bool            brOption);
+
+int nr_rrc_reconfiguration_req(rrc_gNB_ue_context_t         *const ue_context_pP,
+                               protocol_ctxt_t              *const ctxt_pP,
+                               const int                    dl_bwp_id,
+                               const int                    ul_bwp_id);
 
 int nr_rrc_gNB_decode_ccch(protocol_ctxt_t    *const ctxt_pP,
                            const uint8_t      *buffer,
@@ -197,7 +207,8 @@ rrc_gNB_generate_dedicatedRRCReconfiguration_release(
 void 
 rrc_gNB_generate_dedicatedRRCReconfiguration(
     const protocol_ctxt_t     *const ctxt_pP,
-    rrc_gNB_ue_context_t      *ue_context_pP);
+    rrc_gNB_ue_context_t      *ue_context_pP,
+    NR_CellGroupConfig_t      *cell_groupConfig_from_DU);
 
 rlc_op_status_t nr_rrc_rlc_config_asn1_req (const protocol_ctxt_t   * const ctxt_pP,
     const NR_SRB_ToAddModList_t   * const srb2add_listP,
@@ -206,16 +217,15 @@ rlc_op_status_t nr_rrc_rlc_config_asn1_req (const protocol_ctxt_t   * const ctxt
     const LTE_PMCH_InfoList_r9_t * const pmch_InfoList_r9_pP,
     struct NR_CellGroupConfig__rlc_BearerToAddModList *rlc_bearer2add_list);
 
-boolean_t nr_rrc_pdcp_config_asn1_req(
-  const protocol_ctxt_t *const  ctxt_pP,
-  NR_SRB_ToAddModList_t  *const srb2add_list,
-  NR_DRB_ToAddModList_t  *const drb2add_list,
-  NR_DRB_ToReleaseList_t *const drb2release_list,
-  const uint8_t                   security_modeP,
-  uint8_t                  *const kRRCenc,
-  uint8_t                  *const kRRCint,
-  uint8_t                  *const kUPenc,
-  uint8_t                  *const kUPint
-  ,LTE_PMCH_InfoList_r9_t  *pmch_InfoList_r9
-  ,rb_id_t                 *const defaultDRB,
-  struct NR_CellGroupConfig__rlc_BearerToAddModList *rlc_bearer2add_list);
+bool nr_rrc_pdcp_config_asn1_req(const protocol_ctxt_t *const  ctxt_pP,
+                                 NR_SRB_ToAddModList_t  *const srb2add_list,
+                                 NR_DRB_ToAddModList_t  *const drb2add_list,
+                                 NR_DRB_ToReleaseList_t *const drb2release_list,
+                                 const uint8_t                   security_modeP,
+                                 uint8_t                  *const kRRCenc,
+                                 uint8_t                  *const kRRCint,
+                                 uint8_t                  *const kUPenc,
+                                 uint8_t                  *const kUPint,
+                                 LTE_PMCH_InfoList_r9_t   *pmch_InfoList_r9,
+                                 rb_id_t                  *const defaultDRB,
+                                 struct NR_CellGroupConfig__rlc_BearerToAddModList *rlc_bearer2add_list);
diff --git a/openair2/RRC/NR/rrc_gNB.c b/openair2/RRC/NR/rrc_gNB.c
index a0706509a79e876006d08ae31289d21f7d0a932b..8c6c583289a2448a95c49e98ab18de8028cde3fc 100755
--- a/openair2/RRC/NR/rrc_gNB.c
+++ b/openair2/RRC/NR/rrc_gNB.c
@@ -99,6 +99,7 @@
 #include <openair2/X2AP/x2ap_eNB.h>
 #include <openair3/ocp-gtpu/gtp_itf.h>
 #include <openair2/RRC/NR/nr_rrc_proto.h>
+#include "LAYER2/nr_rlc/nr_rlc_oai_api.h"
 
 #include "BIT_STRING.h"
 #include "assertions.h"
@@ -115,16 +116,16 @@ uint8_t first_rrcreconfiguration = 0;
 ///---------------------------------------------------------------------------------------------------------------///
 ///---------------------------------------------------------------------------------------------------------------///
 
-boolean_t DURecvCb( protocol_ctxt_t  *ctxt_pP,
-                    const srb_flag_t     srb_flagP,
-                    const rb_id_t        rb_idP,
-                    const mui_t          muiP,
-                    const confirm_t      confirmP,
-                    const sdu_size_t     sdu_buffer_sizeP,
-                    unsigned char *const sdu_buffer_pP,
-                    const pdcp_transmission_mode_t modeP,
-                    const uint32_t *sourceL2Id,
-                    const uint32_t *destinationL2Id) {
+bool DURecvCb(protocol_ctxt_t  *ctxt_pP,
+              const srb_flag_t     srb_flagP,
+              const rb_id_t        rb_idP,
+              const mui_t          muiP,
+              const confirm_t      confirmP,
+              const sdu_size_t     sdu_buffer_sizeP,
+              unsigned char *const sdu_buffer_pP,
+              const pdcp_transmission_mode_t modeP,
+              const uint32_t *sourceL2Id,
+              const uint32_t *destinationL2Id) {
   // The buffer comes from the stack in gtp-u thread, we have a make a separate buffer to enqueue in a inter-thread message queue
   mem_block_t *sdu=get_free_mem_block(sdu_buffer_sizeP, __func__);
   memcpy(sdu->data,  sdu_buffer_pP,  sdu_buffer_sizeP);
@@ -164,9 +165,8 @@ static void init_NR_SI(gNB_RRC_INST *rrc, gNB_RrcConfigurationReq *configuration
 
   LOG_I(NR_RRC,"Done init_NR_SI\n");
 
-  if (NODE_IS_MONOLITHIC(rrc->node_type)){
+  if (NODE_IS_MONOLITHIC(rrc->node_type) || NODE_IS_DU(rrc->node_type)){
     rrc_mac_config_req_gNB(rrc->module_id,
-                           rrc->configuration.ssb_SubcarrierOffset,
                            rrc->configuration.pdsch_AntennaPorts,
                            rrc->configuration.pusch_AntennaPorts,
                            rrc->configuration.sib1_tda,
@@ -197,7 +197,7 @@ static void init_NR_SI(gNB_RRC_INST *rrc, gNB_RrcConfigurationReq *configuration
 }
 
 char openair_rrc_gNB_configuration(const module_id_t gnb_mod_idP, gNB_RrcConfigurationReq *configuration) {
-  protocol_ctxt_t      ctxt;
+  protocol_ctxt_t      ctxt = { 0 };
   gNB_RRC_INST         *rrc=RC.nrrrc[gnb_mod_idP];
   PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, gnb_mod_idP, GNB_FLAG_YES, NOT_A_RNTI, 0, 0,gnb_mod_idP);
   LOG_I(NR_RRC,
@@ -218,6 +218,7 @@ char openair_rrc_gNB_configuration(const module_id_t gnb_mod_idP, gNB_RrcConfigu
   rrc->ngap_id2_ngap_ids    = hashtable_create (NUMBER_OF_UE_MAX * 2, NULL, NULL);
   rrc->configuration = *configuration;
   rrc->carrier.servingcellconfigcommon = configuration->scc;
+  rrc->carrier.servingcellconfig = configuration->scd;
   nr_rrc_config_ul_tda(configuration->scc,configuration->minRXTXTIME);
    /// System Information INIT
   pthread_mutex_init(&rrc->cell_info_mutex,NULL);
@@ -275,7 +276,6 @@ void apply_macrlc_config(gNB_RRC_INST *rrc,
 
   NR_CellGroupConfig_t *cgc = get_softmodem_params()->sa ? ue_context_pP->ue_context.masterCellGroup : NULL;
   rrc_mac_config_req_gNB(rrc->module_id,
-                         rrc->configuration.ssb_SubcarrierOffset,
                          rrc->configuration.pdsch_AntennaPorts,
                          rrc->configuration.pusch_AntennaPorts,
                          rrc->configuration.sib1_tda,
@@ -335,12 +335,16 @@ rrc_gNB_generate_RRCSetup(
   //   T_INT(ctxt_pP->rnti));
   gNB_RRC_UE_t *ue_p = &ue_context_pP->ue_context;
   gNB_RRC_INST *rrc = RC.nrrrc[ctxt_pP->module_id];
-  ue_p->Srb0.Tx_buffer.payload_size = do_RRCSetup(ue_context_pP,
-                                                  (uint8_t *) ue_p->Srb0.Tx_buffer.Payload,
-                                                  rrc_gNB_get_next_transaction_identifier(ctxt_pP->module_id),
-                                                  masterCellGroup_from_DU,
-                                                  scc,
-                                                  &rrc->configuration);
+  NR_ServingCellConfig_t *servingcellconfigdedicated = rrc->configuration.scd;
+  int16_t ret = do_RRCSetup(ue_context_pP,
+                            (uint8_t *) ue_p->Srb0.Tx_buffer.Payload,
+                            rrc_gNB_get_next_transaction_identifier(ctxt_pP->module_id),
+                            masterCellGroup_from_DU,
+                            scc,servingcellconfigdedicated,&rrc->configuration);
+
+  AssertFatal(ret>0,"Error generating RRCSetup for RRCSetupRequest\n");
+
+  ue_p->Srb0.Tx_buffer.payload_size = ret;
 
   LOG_DUMPMSG(NR_RRC, DEBUG_RRC,
               (char *)(ue_p->Srb0.Tx_buffer.Payload),
@@ -442,16 +446,20 @@ rrc_gNB_generate_RRCSetup_for_RRCReestablishmentRequest(
   rrc_gNB_ue_context_t         *ue_context_pP   = NULL;
   gNB_RRC_INST                 *rrc_instance_p = RC.nrrrc[ctxt_pP->module_id];
   NR_ServingCellConfigCommon_t *scc=rrc_instance_p->carrier.servingcellconfigcommon;
+  NR_ServingCellConfig_t       *servingcellconfigdedicated = rrc_instance_p->configuration.scd;
 
   ue_context_pP = rrc_gNB_get_next_free_ue_context(ctxt_pP, rrc_instance_p, 0);
 
   gNB_RRC_UE_t *ue_p = &ue_context_pP->ue_context;
-  ue_p->Srb0.Tx_buffer.payload_size = do_RRCSetup(ue_context_pP,
-                                                  (uint8_t *) ue_p->Srb0.Tx_buffer.Payload,
-                                                  rrc_gNB_get_next_transaction_identifier(ctxt_pP->module_id),
-                                                  NULL,
-                                                  scc,
-                                                  &rrc_instance_p->configuration);
+  int16_t ret = do_RRCSetup(ue_context_pP,
+                            (uint8_t *) ue_p->Srb0.Tx_buffer.Payload,
+                            rrc_gNB_get_next_transaction_identifier(ctxt_pP->module_id),
+                            NULL,
+                            scc,servingcellconfigdedicated,&rrc_instance_p->configuration);
+
+  AssertFatal(ret>0,"Error generating RRCSetup for RRCReestablishmentRequest\n");
+
+  ue_p->Srb0.Tx_buffer.payload_size = ret;
 
   LOG_DUMPMSG(NR_RRC, DEBUG_RRC,
               (char *)(ue_p->Srb0.Tx_buffer.Payload),
@@ -463,7 +471,6 @@ rrc_gNB_generate_RRCSetup_for_RRCReestablishmentRequest(
           PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP));
 
   rrc_mac_config_req_gNB(rrc_instance_p->module_id,
-                         rrc_instance_p->configuration.ssb_SubcarrierOffset,
                          rrc_instance_p->configuration.pdsch_AntennaPorts,
                          rrc_instance_p->configuration.pusch_AntennaPorts,
                          rrc_instance_p->configuration.sib1_tda,
@@ -799,10 +806,29 @@ rrc_gNB_generate_defaultRRCReconfiguration(
   }
 
   if (NODE_IS_DU(rrc->node_type) || NODE_IS_MONOLITHIC(rrc->node_type)) {
+    gNB_RRC_UE_t *ue_p = &ue_context_pP->ue_context;
+    rrc_mac_config_req_gNB(rrc->module_id,
+                           rrc->configuration.pdsch_AntennaPorts,
+                           rrc->configuration.pusch_AntennaPorts,
+                           rrc->configuration.sib1_tda,
+                           rrc->configuration.minRXTXTIME,
+                           NULL,
+                           NULL,
+                           NULL,
+                           0,
+                           ue_p->rnti,
+                           ue_p->masterCellGroup);
+
+    uint32_t delay_ms = ue_context_pP->ue_context.masterCellGroup &&
+                        ue_context_pP->ue_context.masterCellGroup->spCellConfig &&
+                        ue_context_pP->ue_context.masterCellGroup->spCellConfig->spCellConfigDedicated &&
+                        ue_context_pP->ue_context.masterCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList ?
+                        NR_RRC_RECONFIGURATION_DELAY_MS + NR_RRC_BWP_SWITCHING_DELAY_MS : NR_RRC_RECONFIGURATION_DELAY_MS;
+
     nr_mac_enable_ue_rrc_processing_timer(ctxt_pP->module_id,
                                           ue_context_pP->ue_context.rnti,
                                           *rrc->carrier.servingcellconfigcommon->ssbSubcarrierSpacing,
-                                          NR_RRC_RECONFIGURATION_DELAY_MS);
+                                          delay_ms);
   }
 }
 
@@ -810,7 +836,8 @@ rrc_gNB_generate_defaultRRCReconfiguration(
 void
 rrc_gNB_generate_dedicatedRRCReconfiguration(
     const protocol_ctxt_t     *const ctxt_pP,
-    rrc_gNB_ue_context_t      *ue_context_pP
+    rrc_gNB_ue_context_t      *ue_context_pP,
+    NR_CellGroupConfig_t      *cell_groupConfig_from_DU
 )
 //-----------------------------------------------------------------------------
 {
@@ -830,7 +857,10 @@ rrc_gNB_generate_dedicatedRRCReconfiguration(
   int                            qos_flow_index = 0;
   int                            pdu_sessions_done = 0;
   int i;
-  NR_CellGroupConfig_t *cellGroupConfig;
+  uint8_t drb_id_to_setup_start = 1;
+  uint8_t nb_drb_to_setup = 0;
+  long drb_priority[1] = {13}; // For now, we assume only one drb per pdu sessions with a default preiority (will be dynamique in future)
+  NR_CellGroupConfig_t *cellGroupConfig = NULL;
 
   uint8_t xid = rrc_gNB_get_next_transaction_identifier(ctxt_pP->module_id);
 
@@ -872,6 +902,8 @@ rrc_gNB_generate_dedicatedRRCReconfiguration(
 
     DRB_config = CALLOC(1, sizeof(*DRB_config));
     DRB_config->drb_Identity = i+1;
+    if (drb_id_to_setup_start == 1) drb_id_to_setup_start = DRB_config->drb_Identity;
+    nb_drb_to_setup++;
     DRB_config->cnAssociation = CALLOC(1, sizeof(*DRB_config->cnAssociation));
     DRB_config->cnAssociation->present = NR_DRB_ToAddMod__cnAssociation_PR_sdap_Config;
     // sdap_Config
@@ -885,7 +917,7 @@ rrc_gNB_generate_dedicatedRRCReconfiguration(
       sdap_config->sdap_HeaderDL = NR_SDAP_Config__sdap_HeaderDL_absent;
       sdap_config->sdap_HeaderUL = NR_SDAP_Config__sdap_HeaderUL_absent;
     }
-    sdap_config->defaultDRB = TRUE;
+    sdap_config->defaultDRB = true;
     sdap_config->mappedQoS_FlowsToAdd = calloc(1, sizeof(struct NR_SDAP_Config__mappedQoS_FlowsToAdd));
     memset(sdap_config->mappedQoS_FlowsToAdd, 0, sizeof(struct NR_SDAP_Config__mappedQoS_FlowsToAdd));
 
@@ -984,9 +1016,17 @@ rrc_gNB_generate_dedicatedRRCReconfiguration(
   }
 
   memset(buffer, 0, sizeof(buffer));
-  cellGroupConfig = calloc(1, sizeof(NR_CellGroupConfig_t));
-  fill_mastercellGroupConfig(cellGroupConfig, ue_context_pP->ue_context.masterCellGroup,
-                             rrc->um_on_default_drb);
+  if(cell_groupConfig_from_DU == NULL){
+    cellGroupConfig = calloc(1, sizeof(NR_CellGroupConfig_t));
+    // FIXME: fill_mastercellGroupConfig() won't fill the right priorities or
+    // bearer IDs for the DRBs
+    fill_mastercellGroupConfig(cellGroupConfig, ue_context_pP->ue_context.masterCellGroup, rrc->um_on_default_drb, (drb_id_to_setup_start < 2) ? 1 : 0, drb_id_to_setup_start, nb_drb_to_setup, drb_priority);
+  }
+  else{
+    LOG_I(NR_RRC, "Master cell group originating from the DU \n");
+    cellGroupConfig = cell_groupConfig_from_DU;
+  }
+
   size = do_RRCReconfiguration(ctxt_pP, buffer, sizeof(buffer),
                                 xid,
                                 *SRB_configList2,
@@ -1041,10 +1081,28 @@ rrc_gNB_generate_dedicatedRRCReconfiguration(
 #endif
 
   if (NODE_IS_DU(rrc->node_type) || NODE_IS_MONOLITHIC(rrc->node_type)) {
+    rrc_mac_config_req_gNB(rrc->module_id,
+                           rrc->configuration.pdsch_AntennaPorts,
+                           rrc->configuration.pusch_AntennaPorts,
+                           rrc->configuration.sib1_tda,
+                           rrc->configuration.minRXTXTIME,
+                           NULL,
+                           NULL,
+                           NULL,
+                           0,
+                           ue_context_pP->ue_context.rnti,
+                           ue_context_pP->ue_context.masterCellGroup);
+
+    uint32_t delay_ms = ue_context_pP->ue_context.masterCellGroup &&
+                        ue_context_pP->ue_context.masterCellGroup->spCellConfig &&
+                        ue_context_pP->ue_context.masterCellGroup->spCellConfig->spCellConfigDedicated &&
+                        ue_context_pP->ue_context.masterCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList ?
+                        NR_RRC_RECONFIGURATION_DELAY_MS + NR_RRC_BWP_SWITCHING_DELAY_MS : NR_RRC_RECONFIGURATION_DELAY_MS;
+
     nr_mac_enable_ue_rrc_processing_timer(ctxt_pP->module_id,
                                           ue_context_pP->ue_context.rnti,
                                           *rrc->carrier.servingcellconfigcommon->ssbSubcarrierSpacing,
-                                          NR_RRC_RECONFIGURATION_DELAY_MS);
+                                          delay_ms);
   }
 }
 
@@ -1221,10 +1279,16 @@ rrc_gNB_modify_dedicatedRRCReconfiguration(
 #endif
 
   if (NODE_IS_DU(RC.nrrrc[ctxt_pP->module_id]->node_type) || NODE_IS_MONOLITHIC(RC.nrrrc[ctxt_pP->module_id]->node_type)) {
+    uint32_t delay_ms = ue_context_pP->ue_context.masterCellGroup &&
+                        ue_context_pP->ue_context.masterCellGroup->spCellConfig &&
+                        ue_context_pP->ue_context.masterCellGroup->spCellConfig->spCellConfigDedicated &&
+                        ue_context_pP->ue_context.masterCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList ?
+                        NR_RRC_RECONFIGURATION_DELAY_MS + NR_RRC_BWP_SWITCHING_DELAY_MS : NR_RRC_RECONFIGURATION_DELAY_MS;
+
     nr_mac_enable_ue_rrc_processing_timer(ctxt_pP->module_id,
                                           ue_context_pP->ue_context.rnti,
                                           *RC.nrrrc[ctxt_pP->module_id]->carrier.servingcellconfigcommon->ssbSubcarrierSpacing,
-                                          NR_RRC_RECONFIGURATION_DELAY_MS);
+                                          delay_ms);
   }
 }
 
@@ -1291,8 +1355,8 @@ rrc_gNB_generate_dedicatedRRCReconfiguration_release(
                                NULL);
 
   ue_context_pP->ue_context.pdu_session_release_command_flag = 1;
-  LOG_DUMPMSG(NR_RRC,DEBUG_RRC,(char *)buffer,size,
-              "[MSG] RRC Reconfiguration\n");
+
+  LOG_DUMPMSG(NR_RRC,DEBUG_RRC,(char *)buffer,size, "[MSG] RRC Reconfiguration\n");
 
   /* Free all NAS PDUs */
   if (nas_length > 0) {
@@ -1328,10 +1392,16 @@ rrc_gNB_generate_dedicatedRRCReconfiguration_release(
 #endif
 
   if (NODE_IS_DU(RC.nrrrc[ctxt_pP->module_id]->node_type) || NODE_IS_MONOLITHIC(RC.nrrrc[ctxt_pP->module_id]->node_type)) {
+    uint32_t delay_ms = ue_context_pP->ue_context.masterCellGroup &&
+                        ue_context_pP->ue_context.masterCellGroup->spCellConfig &&
+                        ue_context_pP->ue_context.masterCellGroup->spCellConfig->spCellConfigDedicated &&
+                        ue_context_pP->ue_context.masterCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList ?
+                        NR_RRC_RECONFIGURATION_DELAY_MS + NR_RRC_BWP_SWITCHING_DELAY_MS : NR_RRC_RECONFIGURATION_DELAY_MS;
+
     nr_mac_enable_ue_rrc_processing_timer(ctxt_pP->module_id,
                                           ue_context_pP->ue_context.rnti,
                                           *RC.nrrrc[ctxt_pP->module_id]->carrier.servingcellconfigcommon->ssbSubcarrierSpacing,
-                                          NR_RRC_RECONFIGURATION_DELAY_MS);
+                                          delay_ms);
   }
 }
 
@@ -1356,7 +1426,6 @@ rrc_gNB_process_RRCReconfigurationComplete(
   NR_DRB_ToReleaseList_t             *DRB_Release_configList2 = ue_context_pP->ue_context.DRB_Release_configList2[xid];
   NR_DRB_Identity_t                  *drb_id_p      = NULL;
   //  uint8_t                             nr_DRB2LCHAN[8];
-  gNB_RRC_INST *rrc = RC.nrrrc[ctxt_pP->module_id];
 
   ue_context_pP->ue_context.ue_reestablishment_timer = 0;
 
@@ -1395,20 +1464,7 @@ rrc_gNB_process_RRCReconfigurationComplete(
                               NULL,
                               get_softmodem_params()->sa ? ue_context_pP->ue_context.masterCellGroup->rlc_BearerToAddModList : NULL);
   /* Refresh SRBs/DRBs */
-
   if (!NODE_IS_CU(RC.nrrrc[ctxt_pP->module_id]->node_type)) {
-    rrc_mac_config_req_gNB(rrc->module_id,
-                           rrc->configuration.ssb_SubcarrierOffset,
-                           rrc->configuration.pdsch_AntennaPorts,
-                           rrc->configuration.pusch_AntennaPorts,
-                           rrc->configuration.sib1_tda,
-                           rrc->configuration.minRXTXTIME,
-                           NULL,
-                           NULL,
-                           NULL,
-                           0,
-                           ue_context_pP->ue_context.rnti,
-                           ue_context_pP->ue_context.masterCellGroup);
     LOG_D(NR_RRC,"Configuring RLC DRBs/SRBs for UE %x\n",ue_context_pP->ue_context.rnti);
     nr_rrc_rlc_config_asn1_req(ctxt_pP,
                                SRB_configList, // NULL,
@@ -1417,49 +1473,6 @@ rrc_gNB_process_RRCReconfigurationComplete(
                                NULL,
                                get_softmodem_params()->sa ? ue_context_pP->ue_context.masterCellGroup->rlc_BearerToAddModList : NULL);
   }
-  else if(SRB_configList!=NULL || DRB_configList!=NULL){
-    MessageDef *message_p;
-    message_p = itti_alloc_new_message (TASK_RRC_GNB, 0, F1AP_UE_CONTEXT_SETUP_REQ);
-    f1ap_ue_context_setup_t *req=&F1AP_UE_CONTEXT_SETUP_REQ (message_p);
-    req->gNB_CU_ue_id     = 0;
-    req->gNB_DU_ue_id = 0;
-    req->rnti = ue_context_pP->ue_context.rnti;
-    req->mcc              = rrc->configuration.mcc[0];
-    req->mnc              = rrc->configuration.mnc[0];
-    req->mnc_digit_length = rrc->configuration.mnc_digit_length[0];
-    req->nr_cellid        = rrc->nr_cellid;
-    if(SRB_configList!=NULL){
-      req->srbs_to_be_setup = malloc(SRB_configList->list.count*sizeof(f1ap_srb_to_be_setup_t));
-      req->srbs_to_be_setup_length = SRB_configList->list.count;
-      f1ap_srb_to_be_setup_t *SRBs=req->srbs_to_be_setup;
-      for (int i = 0; i < SRB_configList->list.count; i++){
-        if(SRB_configList->list.array[i]->srb_Identity > 1){
-          SRBs[i].srb_id = SRB_configList->list.array[i]->srb_Identity;
-          SRBs[i].lcid = SRB_configList->list.array[i]->srb_Identity;
-        }
-      }
-    }
-    if(DRB_configList!=NULL){
-      gtpv1u_gnb_create_tunnel_req_t  create_tunnel_req;
-      memset(&create_tunnel_req, 0, sizeof(gtpv1u_gnb_create_tunnel_req_t));
-      req->drbs_to_be_setup = malloc(DRB_configList->list.count*sizeof(f1ap_drb_to_be_setup_t));
-      req->drbs_to_be_setup_length = DRB_configList->list.count;
-      f1ap_drb_to_be_setup_t *DRBs=req->drbs_to_be_setup;
-      LOG_I(RRC, "Length of DRB list:%d, %d \n", DRB_configList->list.count, req->drbs_to_be_setup_length);
-      for (int i = 0; i < DRB_configList->list.count; i++){
-        DRBs[i].drb_id = DRB_configList->list.array[i]->drb_Identity;
-        DRBs[i].rlc_mode = RLC_MODE_AM;
-        DRBs[i].up_ul_tnl[0].tl_address = inet_addr(rrc->eth_params_s.my_addr);
-        DRBs[i].up_ul_tnl[0].port=rrc->eth_params_s.my_portd;
-        DRBs[i].up_ul_tnl_length = 1;
-        DRBs[i].up_dl_tnl[0].tl_address = inet_addr(rrc->eth_params_s.remote_addr);
-        DRBs[i].up_dl_tnl[0].port=rrc->eth_params_s.remote_portd;
-        DRBs[i].up_dl_tnl_length = 1;
-      }
-      LOG_I(RRC, "Send F1AP_UE_CONTEXT_SETUP_REQ with ITTI\n");
-    }
-    itti_send_msg_to_task (TASK_CU_F1, ctxt_pP->module_id, message_p);
-  }
 #endif
 
   /* Set the SRB active in UE context */
@@ -1610,7 +1623,7 @@ rrc_gNB_generate_RRCReestablishment(
           ue_context->Srb0.Tx_buffer.payload_size);
 #if(0)
     /* TODO : It may be needed if gNB goes into full stack working. */
-    UE_id = find_nr_UE_id(module_id, rnti);
+    UE = find_nr_UE(module_id, rnti);
     if (UE_id != -1) {
       /* Activate reject timer, if RRCComplete not received after 10 frames, reject UE */
       RC.nrmac[module_id]->UE_info.UE_sched_ctrl[UE_id].ue_reestablishment_reject_timer = 1;
@@ -1754,15 +1767,16 @@ rrc_gNB_process_RRCConnectionReestablishmentComplete(
       }
     }
 
-    gtpv1u_gnb_create_tunnel_req_t  create_tunnel_req;
+    gtpv1u_gnb_create_tunnel_req_t  create_tunnel_req={0};
     /* Save e RAB information for later */
-    memset(&create_tunnel_req, 0, sizeof(create_tunnel_req));
 
     for ( j = 0, i = 0; i < NB_RB_MAX; i++) {
       if (ue_context_pP->ue_context.pduSession[i].status == PDU_SESSION_STATUS_ESTABLISHED || ue_context_pP->ue_context.pduSession[i].status == PDU_SESSION_STATUS_DONE) {
         create_tunnel_req.pdusession_id[j]   = ue_context_pP->ue_context.pduSession[i].param.pdusession_id;
         create_tunnel_req.incoming_rb_id[j]  = i+1;
         create_tunnel_req.outgoing_teid[j]  = ue_context_pP->ue_context.pduSession[i].param.gtp_teid;
+        // to be developped, use the first QFI only
+        create_tunnel_req.outgoing_qfi[j]  = ue_context_pP->ue_context.pduSession[i].param.qos[0].qfi;
         memcpy(create_tunnel_req.dst_addr[j].buffer,
                ue_context_pP->ue_context.pduSession[i].param.upf_addr.buffer,
                 sizeof(uint8_t)*20);
@@ -1813,7 +1827,7 @@ rrc_gNB_process_RRCConnectionReestablishmentComplete(
   ue_context_pP->ue_context.rnti               = ctxt_pP->rnti;
 
   if (AMF_MODE_ENABLED) {
-    uint8_t send_security_mode_command = FALSE;
+    uint8_t send_security_mode_command = false;
     nr_rrc_pdcp_config_security(
       ctxt_pP,
       ue_context_pP,
@@ -1848,8 +1862,8 @@ rrc_gNB_process_RRCConnectionReestablishmentComplete(
                                 NULL,
                                 NULL,
                                 NULL);
-  LOG_DUMPMSG(NR_RRC,DEBUG_RRC,(char *)buffer,size,
-              "[MSG] RRC Reconfiguration\n");
+
+  LOG_DUMPMSG(NR_RRC,DEBUG_RRC,(char *)buffer,size, "[MSG] RRC Reconfiguration\n");
 
   /* Free all NAS PDUs */
   for (i = 0; i < ue_context_pP->ue_context.nb_of_pdusessions; i++) {
@@ -1893,14 +1907,92 @@ rrc_gNB_process_RRCConnectionReestablishmentComplete(
   }
 
   if (NODE_IS_DU(RC.nrrrc[ctxt_pP->module_id]->node_type) || NODE_IS_MONOLITHIC(RC.nrrrc[ctxt_pP->module_id]->node_type)) {
+    uint32_t delay_ms = ue_context_pP->ue_context.masterCellGroup &&
+                        ue_context_pP->ue_context.masterCellGroup->spCellConfig &&
+                        ue_context_pP->ue_context.masterCellGroup->spCellConfig->spCellConfigDedicated &&
+                        ue_context_pP->ue_context.masterCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList ?
+                        NR_RRC_RECONFIGURATION_DELAY_MS + NR_RRC_BWP_SWITCHING_DELAY_MS : NR_RRC_RECONFIGURATION_DELAY_MS;
+
     nr_mac_enable_ue_rrc_processing_timer(ctxt_pP->module_id,
                                           ue_context_pP->ue_context.rnti,
                                           *RC.nrrrc[ctxt_pP->module_id]->carrier.servingcellconfigcommon->ssbSubcarrierSpacing,
-                                          NR_RRC_RECONFIGURATION_DELAY_MS);
+                                          delay_ms);
   }
 }
 //-----------------------------------------------------------------------------
 
+int nr_rrc_reconfiguration_req(rrc_gNB_ue_context_t         *const ue_context_pP,
+                               protocol_ctxt_t              *const ctxt_pP,
+                               const int                    dl_bwp_id,
+                               const int                    ul_bwp_id) {
+
+  uint8_t buffer[RRC_BUF_SIZE];
+  memset(buffer, 0, sizeof(buffer));
+  uint8_t xid = rrc_gNB_get_next_transaction_identifier(ctxt_pP->module_id);
+
+  NR_CellGroupConfig_t *masterCellGroup = ue_context_pP->ue_context.masterCellGroup;
+  if (dl_bwp_id >= 0) {
+    *masterCellGroup->spCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id = dl_bwp_id;
+    *masterCellGroup->spCellConfig->spCellConfigDedicated->defaultDownlinkBWP_Id = dl_bwp_id;
+  }
+  if (ul_bwp_id >= 0) {
+    *masterCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->firstActiveUplinkBWP_Id = ul_bwp_id;
+  }
+
+  uint16_t  size = do_RRCReconfiguration(ctxt_pP,
+                                         buffer,
+                                         sizeof(buffer),
+                                         xid,
+                                         NULL,
+                                         NULL,
+                                         NULL,
+                                         NULL,
+                                         NULL,
+                                         NULL,
+                                         NULL,
+                                         ue_context_pP,
+                                         NULL,
+                                         NULL,
+                                         NULL,
+                                         masterCellGroup);
+
+  gNB_RrcConfigurationReq *configuration = &RC.nrrrc[ctxt_pP->module_id]->configuration;
+  rrc_mac_config_req_gNB(ctxt_pP->module_id,
+                         configuration->pdsch_AntennaPorts,
+                         configuration->pusch_AntennaPorts,
+                         configuration->sib1_tda,
+                         configuration->minRXTXTIME,
+                         NULL,
+                         NULL,
+                         NULL,
+                         0,
+                         ue_context_pP->ue_context.rnti,
+                         masterCellGroup);
+
+  nr_rrc_data_req(ctxt_pP,
+                  DCCH,
+                  rrc_gNB_mui++,
+                  SDU_CONFIRM_NO,
+                  size,
+                  buffer,
+                  PDCP_TRANSMISSION_MODE_CONTROL);
+
+  if (NODE_IS_DU(RC.nrrrc[ctxt_pP->module_id]->node_type) || NODE_IS_MONOLITHIC(RC.nrrrc[ctxt_pP->module_id]->node_type)) {
+    uint32_t delay_ms = ue_context_pP->ue_context.masterCellGroup &&
+                        ue_context_pP->ue_context.masterCellGroup->spCellConfig &&
+                        ue_context_pP->ue_context.masterCellGroup->spCellConfig->spCellConfigDedicated &&
+                        ue_context_pP->ue_context.masterCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList ?
+                        NR_RRC_RECONFIGURATION_DELAY_MS + NR_RRC_BWP_SWITCHING_DELAY_MS : NR_RRC_RECONFIGURATION_DELAY_MS;
+
+    nr_mac_enable_ue_rrc_processing_timer(ctxt_pP->module_id,
+                                          ue_context_pP->ue_context.rnti,
+                                          *RC.nrrrc[ctxt_pP->module_id]->carrier.servingcellconfigcommon->ssbSubcarrierSpacing,
+                                          delay_ms);
+  }
+
+  return 0;
+}
+
 /*------------------------------------------------------------------------------*/
 int nr_rrc_gNB_decode_ccch(protocol_ctxt_t    *const ctxt_pP,
                            const uint8_t      *buffer,
@@ -2022,7 +2114,7 @@ int nr_rrc_gNB_decode_ccch(protocol_ctxt_t    *const ctxt_pP,
               }
 
               if (ue_context_p != NULL) {
-                ue_context_p->ue_context.Initialue_identity_5g_s_TMSI.presence = TRUE;
+                ue_context_p->ue_context.Initialue_identity_5g_s_TMSI.presence = true;
                 ue_context_p->ue_context.ng_5G_S_TMSI_Part1 = s_tmsi_part1;
               }
             }
@@ -2499,7 +2591,7 @@ rrc_gNB_decode_dcch(
                   fiveg_s_TMSI, fiveg_s_TMSI >> 38, fiveg_s_TMSI >> 38,
                   (fiveg_s_TMSI >> 32) & 0x3F, (fiveg_s_TMSI >> 32) & 0x3F,
                   (uint32_t)fiveg_s_TMSI);
-              if (ue_context_p->ue_context.Initialue_identity_5g_s_TMSI.presence == TRUE) {
+              if (ue_context_p->ue_context.Initialue_identity_5g_s_TMSI.presence == true) {
                   ue_context_p->ue_context.Initialue_identity_5g_s_TMSI.amf_set_id = fiveg_s_TMSI >> 38;
                   ue_context_p->ue_context.Initialue_identity_5g_s_TMSI.amf_pointer = (fiveg_s_TMSI >> 32) & 0x3F;
                   ue_context_p->ue_context.Initialue_identity_5g_s_TMSI.fiveg_tmsi = (uint32_t)fiveg_s_TMSI;
@@ -2683,11 +2775,74 @@ rrc_gNB_decode_dcch(
                                     ul_dcch_msg);
       }
 
-      if (ue_context_p->ue_context.established_pdu_sessions_flag == 1) {
-        rrc_gNB_generate_dedicatedRRCReconfiguration(ctxt_pP, ue_context_p);
-      } else {
-        rrc_gNB_generate_defaultRRCReconfiguration(ctxt_pP, ue_context_p);
+      if(!NODE_IS_CU(RC.nrrrc[ctxt_pP->module_id]->node_type)){
+        if (ue_context_p->ue_context.established_pdu_sessions_flag == 1) {
+          rrc_gNB_generate_dedicatedRRCReconfiguration(ctxt_pP, ue_context_p, NULL);
+        } else {
+          rrc_gNB_generate_defaultRRCReconfiguration(ctxt_pP, ue_context_p);
+        }
       }
+      else{
+        /*Generate a UE context setup request message towards the DU to provide the UE
+         *capability info and get the updates on master cell group config from the DU*/
+        MessageDef *message_p;
+        message_p = itti_alloc_new_message (TASK_RRC_GNB, 0, F1AP_UE_CONTEXT_SETUP_REQ);
+        f1ap_ue_context_setup_t *req=&F1AP_UE_CONTEXT_SETUP_REQ (message_p);
+        //UE_IDs will be extracted from F1AP layer
+        req->gNB_CU_ue_id     = 0;
+        req->gNB_DU_ue_id = 0;
+        req->rnti             = ue_context_p->ue_context.rnti;
+        req->mcc              = RC.nrrrc[ctxt_pP->module_id]->configuration.mcc[0];
+        req->mnc              = RC.nrrrc[ctxt_pP->module_id]->configuration.mnc[0];
+        req->mnc_digit_length = RC.nrrrc[ctxt_pP->module_id]->configuration.mnc_digit_length[0];
+        req->nr_cellid        = RC.nrrrc[ctxt_pP->module_id]->nr_cellid;
+
+        if (ue_context_p->ue_context.established_pdu_sessions_flag == 1) {
+          /*Instruction towards the DU for SRB2 configuration*/
+          req->srbs_to_be_setup = malloc(1*sizeof(f1ap_srb_to_be_setup_t));
+          req->srbs_to_be_setup_length = 1;
+          f1ap_srb_to_be_setup_t *SRBs=req->srbs_to_be_setup;
+          SRBs[0].srb_id = 2;
+          SRBs[0].lcid = 2;
+
+          /*Instruction towards the DU for DRB configuration and tunnel creation*/
+          req->drbs_to_be_setup = malloc(1*sizeof(f1ap_drb_to_be_setup_t));
+          req->drbs_to_be_setup_length = 1;
+          f1ap_drb_to_be_setup_t *DRBs=req->drbs_to_be_setup;
+          LOG_I(RRC, "Length of DRB list:%d \n", req->drbs_to_be_setup_length);
+          DRBs[0].drb_id = 1;
+          DRBs[0].rlc_mode = RLC_MODE_AM;
+          DRBs[0].up_ul_tnl[0].tl_address = inet_addr(RC.nrrrc[ctxt_pP->module_id]->eth_params_s.my_addr);
+          DRBs[0].up_ul_tnl[0].port=RC.nrrrc[ctxt_pP->module_id]->eth_params_s.my_portd;
+          DRBs[0].up_ul_tnl_length = 1;
+          DRBs[0].up_dl_tnl[0].tl_address = inet_addr(RC.nrrrc[ctxt_pP->module_id]->eth_params_s.remote_addr);
+          DRBs[0].up_dl_tnl[0].port=RC.nrrrc[ctxt_pP->module_id]->eth_params_s.remote_portd;
+          DRBs[0].up_dl_tnl_length = 1;
+        }
+        if( ul_dcch_msg->message.choice.c1->choice.ueCapabilityInformation->criticalExtensions.present ==
+                NR_UECapabilityInformation__criticalExtensions_PR_ueCapabilityInformation ) {
+          struct NR_UE_CapabilityRAT_ContainerList  *ue_CapabilityRAT_ContainerList =
+              ul_dcch_msg->message.choice.c1->choice.ueCapabilityInformation->criticalExtensions.choice.ueCapabilityInformation->ue_CapabilityRAT_ContainerList;
+          if(ue_CapabilityRAT_ContainerList!=NULL){
+            LOG_I(NR_RRC, "ue_CapabilityRAT_ContainerList is present \n");
+            req->cu_to_du_rrc_information = calloc(1,sizeof(cu_to_du_rrc_information_t));
+            req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList = calloc(1,4096);
+            asn_enc_rval_t enc_rval = uper_encode_to_buffer(&asn_DEF_NR_UE_CapabilityRAT_ContainerList,
+              NULL,
+              ue_CapabilityRAT_ContainerList,
+              req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList,
+              4096);
+            AssertFatal (enc_rval.encoded > 0, "ASN1 ue_CapabilityRAT_ContainerList encoding failed (%s, %jd)!\n",
+                             enc_rval.failed_type->name, enc_rval.encoded);
+            req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList_length = (enc_rval.encoded+7)>>3;
+          }
+          else{
+            LOG_I(NR_RRC, "ue_CapabilityRAT_ContainerList is not present \n");
+          }
+        }
+        itti_send_msg_to_task (TASK_CU_F1, ctxt_pP->module_id, message_p);
+      }
+
 
       break;
 
@@ -2800,11 +2955,8 @@ void rrc_gNB_process_f1_setup_req(f1ap_setup_req_t *f1_setup_req) {
         memset(mib->message.choice.mib,0,sizeof(struct NR_MIB));
         memcpy(mib->message.choice.mib, mib_DU->message.choice.mib, sizeof(struct NR_MIB));
 
-        rrc->carrier.SIB1 = malloc(f1_setup_req->sib1_length[i]);
-        rrc->carrier.sizeof_SIB1 = f1_setup_req->sib1_length[i];
-        memcpy((void *)rrc->carrier.SIB1,f1_setup_req->sib1[i],f1_setup_req->sib1_length[i]);
         dec_rval = uper_decode_complete(NULL,
-                                        &asn_DEF_NR_BCCH_DL_SCH_Message,
+                                        &asn_DEF_NR_SIB1, //&asn_DEF_NR_BCCH_DL_SCH_Message,
                                         (void **)&rrc->carrier.siblock1_DU,
                                         f1_setup_req->sib1[i],
                                         f1_setup_req->sib1_length[i]);
@@ -2814,12 +2966,12 @@ void rrc_gNB_process_f1_setup_req(f1ap_setup_req_t *f1_setup_req) {
                     dec_rval.consumed );
 
         // Parse message and extract SystemInformationBlockType1 field
-        NR_BCCH_DL_SCH_Message_t *bcch_message = rrc->carrier.siblock1_DU;
-        AssertFatal(bcch_message->message.present == NR_BCCH_DL_SCH_MessageType_PR_c1,
-                    "bcch_message->message.present != NR_BCCH_DL_SCH_MessageType_PR_c1\n");
-        AssertFatal(bcch_message->message.choice.c1->present == NR_BCCH_DL_SCH_MessageType__c1_PR_systemInformationBlockType1,
-                    "bcch_message->message.choice.c1->present != NR_BCCH_DL_SCH_MessageType__c1_PR_systemInformationBlockType1\n");
-        rrc->carrier.sib1 = bcch_message->message.choice.c1->choice.systemInformationBlockType1;
+        rrc->carrier.sib1 = rrc->carrier.siblock1_DU;
+        if ( LOG_DEBUGFLAG(DEBUG_ASN1)){
+          LOG_I(NR_RRC, "Printing received SIB1 container inside F1 setup request message:\n");
+          xer_fprint(stdout, &asn_DEF_NR_SIB1,(void *)rrc->carrier.sib1);
+        }
+
         rrc->carrier.physCellId = f1_setup_req->cell[i].nr_pci;
 
 	F1AP_GNB_CU_CONFIGURATION_UPDATE (msg_p2).gNB_CU_name                                = rrc->node_name;
@@ -2877,11 +3029,13 @@ void rrc_gNB_process_dc_overall_timeout(const module_id_t gnb_mod_idP, x2ap_ENDC
 
 static int  rrc_process_DU_DL(MessageDef *msg_p, const char *msg_name, instance_t instance) {
   NRDuDlReq_t * req=&NRDuDlReq(msg_p);
-  protocol_ctxt_t ctxt;
-  ctxt.rnti      = req->rnti;
-  ctxt.module_id = instance;
-  ctxt.instance  = instance;
-  ctxt.enb_flag  = 1;
+  protocol_ctxt_t ctxt = {
+    .rnti = req->rnti,
+    .module_id = instance,
+    .instance  = instance,
+    .enb_flag  = 1,
+    .eNB_index = instance
+  };
   gNB_RRC_INST *rrc = RC.nrrrc[ctxt.module_id];
   struct rrc_gNB_ue_context_s *ue_context_p =
     rrc_gNB_get_ue_context(rrc, ctxt.rnti);
@@ -3082,7 +3236,6 @@ static int  rrc_process_DU_DL(MessageDef *msg_p, const char *msg_name, instance_
   
   LOG_I(F1AP, "Received DL RRC Transfer on srb_id %ld\n", req->srb_id);
   //   rlc_op_status_t    rlc_status;
-  //   boolean_t          ret             = TRUE;
   
   //LOG_I(F1AP, "PRRCContainer size %lu:", ie->value.choice.RRCContainer.size);
   //for (int i = 0; i < ie->value.choice.RRCContainer.size; i++)
@@ -3107,23 +3260,23 @@ static int  rrc_process_DU_DL(MessageDef *msg_p, const char *msg_name, instance_
   //   switch (rlc_status) {
   //     case RLC_OP_STATUS_OK:
   //       //LOG_I(F1AP, "Data sending request over RLC succeeded!\n");
-  //       ret=TRUE;
+  //       ret=true;
   //       break;
   //     case RLC_OP_STATUS_BAD_PARAMETER:
   //       LOG_W(F1AP, "Data sending request over RLC failed with 'Bad Parameter' reason!\n");
-  //       ret= FALSE;
+  //       ret= false;
   //       break;
   //     case RLC_OP_STATUS_INTERNAL_ERROR:
   //       LOG_W(F1AP, "Data sending request over RLC failed with 'Internal Error' reason!\n");
-  //       ret= FALSE;
+  //       ret= false;
   //       break;
   //     case RLC_OP_STATUS_OUT_OF_RESSOURCES:
   //       LOG_W(F1AP, "Data sending request over RLC failed with 'Out of Resources' reason!\n");
-  //       ret= FALSE;
+  //       ret= false;
   //       break;
   //     default:
   //       LOG_W(F1AP, "RLC returned an unknown status code after PDCP placed the order to send some data (Status Code:%d)\n", rlc_status);
-  //       ret= FALSE;
+  //       ret= false;
   //       break;
   //   } // switch case
   //   return ret;
@@ -3133,11 +3286,13 @@ return 0;
 static void rrc_DU_process_ue_context_setup_request(MessageDef *msg_p, const char *msg_name, instance_t instance){
 
   f1ap_ue_context_setup_t * req=&F1AP_UE_CONTEXT_SETUP_REQ(msg_p);
-  protocol_ctxt_t ctxt;
-  ctxt.rnti      = req->rnti;
-  ctxt.module_id = instance;
-  ctxt.instance  = instance;
-  ctxt.enb_flag  = 1;
+  protocol_ctxt_t ctxt = {
+    .rnti = req->rnti,
+    .module_id = instance,
+    .instance  = instance,
+    .enb_flag  = 1,
+    .eNB_index = instance
+  };
   gNB_RRC_INST *rrc = RC.nrrrc[ctxt.module_id];
   gNB_MAC_INST *mac = RC.nrmac[ctxt.module_id];
   struct rrc_gNB_ue_context_s *ue_context_p =
@@ -3147,10 +3302,97 @@ static void rrc_DU_process_ue_context_setup_request(MessageDef *msg_p, const cha
   f1ap_ue_context_setup_t * resp=&F1AP_UE_CONTEXT_SETUP_RESP(message_p);
   uint32_t incoming_teid = 0;
 
+  if(req->cu_to_du_rrc_information!=NULL){
+    if(req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList!=NULL){
+      LOG_I(NR_RRC, "Length of ue_CapabilityRAT_ContainerList is: %d \n", (int) req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList_length);
+      struct NR_UE_CapabilityRAT_ContainerList  *ue_CapabilityRAT_ContainerList = NULL;
+      asn_dec_rval_t dec_rval = uper_decode_complete( NULL,
+          &asn_DEF_NR_UE_CapabilityRAT_ContainerList,
+          (void **)&ue_CapabilityRAT_ContainerList,
+          (uint8_t *)req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList,
+          (int) req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList_length);
+
+      if ((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)) {
+        AssertFatal(1==0,"UE Capability RAT ContainerList decode error\n");
+        // free the memory
+        SEQUENCE_free( &asn_DEF_NR_UE_CapabilityRAT_ContainerList, ue_CapabilityRAT_ContainerList, 1 );
+        return;
+      }
+      //To fill ue_context.UE_Capability_MRDC, ue_context.UE_Capability_nr ...
+      int NR_index = -1;
+      for(int i = 0;i < ue_CapabilityRAT_ContainerList->list.count; i++){
+        if(ue_CapabilityRAT_ContainerList->list.array[i]->rat_Type ==
+          NR_RAT_Type_nr){
+          LOG_I(NR_RRC, "DU received NR_RAT_Type_nr UE capabilities Info through the UE Context Setup Request from the CU \n");
+          if(ue_context_p->ue_context.UE_Capability_nr){
+            ASN_STRUCT_FREE(asn_DEF_NR_UE_NR_Capability,ue_context_p->ue_context.UE_Capability_nr);
+            ue_context_p->ue_context.UE_Capability_nr = 0;
+          }
+
+          dec_rval = uper_decode(NULL,
+                                  &asn_DEF_NR_UE_NR_Capability,
+                                  (void**)&ue_context_p->ue_context.UE_Capability_nr,
+                                  ue_CapabilityRAT_ContainerList->list.array[i]->ue_CapabilityRAT_Container.buf,
+                                  ue_CapabilityRAT_ContainerList->list.array[i]->ue_CapabilityRAT_Container.size,
+                                  0,0);
+          if(LOG_DEBUGFLAG(DEBUG_ASN1)){
+            xer_fprint(stdout,&asn_DEF_NR_UE_NR_Capability,ue_context_p->ue_context.UE_Capability_nr);
+          }
+
+          if((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)){
+            LOG_E(NR_RRC, PROTOCOL_NR_RRC_CTXT_UE_FMT" Failed to decode nr UE capabilities (%zu bytes)\n",
+            PROTOCOL_NR_RRC_CTXT_UE_ARGS(&ctxt),dec_rval.consumed);
+            ASN_STRUCT_FREE(asn_DEF_NR_UE_NR_Capability,ue_context_p->ue_context.UE_Capability_nr);
+            ue_context_p->ue_context.UE_Capability_nr = 0;
+          }
+
+          ue_context_p->ue_context.UE_Capability_size =
+          ue_CapabilityRAT_ContainerList->list.array[i]->ue_CapabilityRAT_Container.size;
+          if(NR_index != -1){
+            LOG_E(NR_RRC,"fatal: more than 1 eutra capability\n");
+            exit(1);
+          }
+          NR_index = i;
+        }
+
+        if(ue_CapabilityRAT_ContainerList->list.array[i]->rat_Type ==
+        NR_RAT_Type_eutra_nr){
+          LOG_I(NR_RRC, "DU received NR_RAT_Type_eutra_nr UE capabilities Info through the UE Context Setup Request from the CU \n");
+          if(ue_context_p->ue_context.UE_Capability_MRDC){
+            ASN_STRUCT_FREE(asn_DEF_NR_UE_MRDC_Capability,ue_context_p->ue_context.UE_Capability_MRDC);
+            ue_context_p->ue_context.UE_Capability_MRDC = 0;
+          }
+          dec_rval = uper_decode(NULL,
+              &asn_DEF_NR_UE_MRDC_Capability,
+              (void**)&ue_context_p->ue_context.UE_Capability_MRDC,
+              ue_CapabilityRAT_ContainerList->list.array[i]->ue_CapabilityRAT_Container.buf,
+              ue_CapabilityRAT_ContainerList->list.array[i]->ue_CapabilityRAT_Container.size,
+              0,0);
+          if(LOG_DEBUGFLAG(DEBUG_ASN1)){
+            xer_fprint(stdout,&asn_DEF_NR_UE_MRDC_Capability,ue_context_p->ue_context.UE_Capability_MRDC);
+          }
+
+          if((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)){
+            LOG_E(NR_RRC,PROTOCOL_NR_RRC_CTXT_FMT" Failed to decode nr UE capabilities (%zu bytes)\n",
+              PROTOCOL_NR_RRC_CTXT_UE_ARGS(&ctxt),dec_rval.consumed);
+            ASN_STRUCT_FREE(asn_DEF_NR_UE_MRDC_Capability,ue_context_p->ue_context.UE_Capability_MRDC);
+            ue_context_p->ue_context.UE_Capability_MRDC = 0;
+          }
+          ue_context_p->ue_context.UE_MRDC_Capability_size =
+          ue_CapabilityRAT_ContainerList->list.array[i]->ue_CapabilityRAT_Container.size;
+        }
+
+        if(ue_CapabilityRAT_ContainerList->list.array[i]->rat_Type ==
+        NR_RAT_Type_eutra){
+          //TODO
+        }
+      }
+    }
+  }
 
-  NR_CellGroupConfig_t *cellGroupConfig;
-  cellGroupConfig = calloc(1, sizeof(NR_CellGroupConfig_t));
-  fill_mastercellGroupConfig(cellGroupConfig, ue_context_p->ue_context.masterCellGroup,rrc->um_on_default_drb);
+  uint8_t drb_id_to_setup_start = 0;
+  uint8_t nb_drb_to_setup = 0;
+  long drb_priority[1] = {13}; // For now, we assume only one drb per pdu sessions with a default preiority (will be dynamique in future)
 
   /* Configure SRB2 */
   NR_SRB_ToAddMod_t            *SRB2_config          = NULL;
@@ -3179,6 +3421,7 @@ static void rrc_DU_process_ue_context_setup_request(MessageDef *msg_p, const cha
       ue_context_p->ue_context.DRB_configList = CALLOC(1, sizeof(*ue_context_p->ue_context.DRB_configList));
     }
     DRB_configList = ue_context_p->ue_context.DRB_configList;
+    nb_drb_to_setup = req->drbs_to_be_setup_length;
     for (int i=0; i<req->drbs_to_be_setup_length; i++){
       DRB_config = CALLOC(1, sizeof(*DRB_config));
       DRB_config->drb_Identity = req->drbs_to_be_setup[i].drb_id;
@@ -3188,18 +3431,39 @@ static void rrc_DU_process_ue_context_setup_request(MessageDef *msg_p, const cha
       memcpy(addr.buffer, &drb_p.up_ul_tnl[0].tl_address, sizeof(drb_p.up_ul_tnl[0].tl_address));
       addr.length=sizeof(drb_p.up_ul_tnl[0].tl_address)*8;
       extern instance_t DUuniqInstance;
-      incoming_teid=newGtpuCreateTunnel(DUuniqInstance,
-          req->rnti,
-          drb_p.drb_id,
-          drb_p.drb_id,
-          drb_p.up_ul_tnl[0].teid,
-          addr,
-          drb_p.up_ul_tnl[0].port,
-          DURecvCb);
+      if (!drb_id_to_setup_start) drb_id_to_setup_start = drb_p.drb_id;
+      incoming_teid = newGtpuCreateTunnel(DUuniqInstance,
+                                          req->rnti,
+                                          drb_p.drb_id,
+                                          drb_p.drb_id,
+                                          drb_p.up_ul_tnl[0].teid,
+                                          -1, // no qfi
+                                          addr,
+                                          drb_p.up_ul_tnl[0].port,
+                                          DURecvCb,
+                                          NULL);
     }
   }
 
+  NR_CellGroupConfig_t *cellGroupConfig = calloc(1, sizeof(NR_CellGroupConfig_t));
+  if (req->srbs_to_be_setup_length > 0 || req->drbs_to_be_setup_length>0)
+    // FIXME: fill_mastercellGroupConfig() won't fill the right priorities or
+    // bearer IDs for the DRBs
+    fill_mastercellGroupConfig(cellGroupConfig, ue_context_p->ue_context.masterCellGroup, rrc->um_on_default_drb, SRB2_config ? 1 : 0, drb_id_to_setup_start, nb_drb_to_setup, drb_priority);
+
   apply_macrlc_config(rrc, ue_context_p, &ctxt);
+  
+  if(req->rrc_container_length > 0){
+    mem_block_t *pdcp_pdu_p = get_free_mem_block(req->rrc_container_length, __func__);
+    memcpy(&pdcp_pdu_p->data[0], req->rrc_container, req->rrc_container_length);
+    du_rlc_data_req(&ctxt, 1, 0x00, 1, 1, 0, req->rrc_container_length, pdcp_pdu_p);
+    LOG_I(F1AP, "Printing RRC Container of UE context setup request: \n");
+    for (int j=0; j<req->rrc_container_length; j++){
+      printf("%02x ", pdcp_pdu_p->data[j]);
+    }
+    printf("\n");
+  }
+
   /* Fill the UE context setup response ITTI message to send to F1AP */
   resp->gNB_CU_ue_id = req->gNB_CU_ue_id;
   resp->rnti = ctxt.rnti;
@@ -3234,25 +3498,188 @@ static void rrc_DU_process_ue_context_setup_request(MessageDef *msg_p, const cha
   else{
     LOG_W(NR_RRC, "No SRB added upon reception of F1 UE Context setup request at the DU\n");
   }
-  resp->du_to_cu_rrc_information = calloc(1,1024*sizeof(uint8_t));
+  /* fixme:
+   * Here we should be encoding the updates on cellgroupconfig based on the content of UE capabilities
+   */
+  resp->du_to_cu_rrc_information = calloc(1, sizeof(du_to_cu_rrc_information_t));
+  resp->du_to_cu_rrc_information->cellGroupConfig = calloc(1,1024);
   asn_enc_rval_t enc_rval = uper_encode_to_buffer(&asn_DEF_NR_CellGroupConfig,
                                 NULL,
-                                (void *)cellGroupConfig,
-                                resp->du_to_cu_rrc_information,
+                                ue_context_p->ue_context.masterCellGroup, //(void *)cellGroupConfig,
+                                resp->du_to_cu_rrc_information->cellGroupConfig,
                                 1024);
-  resp->du_to_cu_rrc_information_length = (enc_rval.encoded+7)>>3;
+  if (enc_rval.encoded == -1) {
+        LOG_E(F1AP,"Could not encode ue_context.masterCellGroup, failed element %s\n",enc_rval.failed_type->name);
+        exit(-1);
+  }
+  resp->du_to_cu_rrc_information->cellGroupConfig_length = (enc_rval.encoded+7)>>3;
   free(cellGroupConfig);
   itti_send_msg_to_task (TASK_DU_F1, ctxt.module_id, message_p);
 }
 
+static void rrc_DU_process_ue_context_modification_request(MessageDef *msg_p, const char *msg_name, instance_t instance){
+
+  f1ap_ue_context_setup_t * req=&F1AP_UE_CONTEXT_MODIFICATION_REQ(msg_p);
+  protocol_ctxt_t ctxt = {
+    .rnti = req->rnti,
+    .module_id = instance,
+    .instance  = instance,
+    .enb_flag  = 1,
+    .eNB_index = instance
+  };
+  gNB_RRC_INST *rrc = RC.nrrrc[ctxt.module_id];
+  gNB_MAC_INST *mac = RC.nrmac[ctxt.module_id];
+  struct rrc_gNB_ue_context_s *ue_context_p =
+      rrc_gNB_get_ue_context(rrc, ctxt.rnti);
+  MessageDef *message_p;
+  message_p = itti_alloc_new_message (TASK_RRC_GNB, 0, F1AP_UE_CONTEXT_MODIFICATION_RESP);
+  f1ap_ue_context_setup_t * resp=&F1AP_UE_CONTEXT_MODIFICATION_RESP(message_p);
+  uint32_t incoming_teid = 0;
+  NR_CellGroupConfig_t *cellGroupConfig = NULL;
+
+  /* Configure SRB2 */
+  NR_SRB_ToAddMod_t            *SRB2_config          = NULL;
+  NR_SRB_ToAddModList_t        *SRB_configList       = NULL;
+  uint8_t SRBs_before_new_addition = 0;
+
+  if(req->srbs_to_be_setup_length>0){
+    if(ue_context_p->ue_context.SRB_configList == NULL){
+      LOG_W(NR_RRC, "The SRB list of the UE context is empty before the addition of new SRB at the DU \n");
+      ue_context_p->ue_context.SRB_configList = CALLOC(1, sizeof(*ue_context_p->ue_context.SRB_configList));
+    }
+    SRB_configList = ue_context_p->ue_context.SRB_configList;
+    SRBs_before_new_addition = SRB_configList->list.count;
+    for (int i=0; i<req->srbs_to_be_setup_length; i++){
+      SRB2_config = CALLOC(1, sizeof(*SRB2_config));
+      SRB2_config->srb_Identity = req->srbs_to_be_setup[i].srb_id;
+      ASN_SEQUENCE_ADD(&SRB_configList->list, SRB2_config);
+    }
+  }
+
+  /* Configure DRB */
+  NR_DRB_ToAddMod_t            *DRB_config          = NULL;
+  NR_DRB_ToAddModList_t        *DRB_configList      = NULL;
+  if(req->drbs_to_be_setup_length>0){
+    if(ue_context_p->ue_context.DRB_configList == NULL){
+      ue_context_p->ue_context.DRB_configList = CALLOC(1, sizeof(*ue_context_p->ue_context.DRB_configList));
+    }
+    DRB_configList = ue_context_p->ue_context.DRB_configList;
+    for (int i=0; i<req->drbs_to_be_setup_length; i++){
+      DRB_config = CALLOC(1, sizeof(*DRB_config));
+      DRB_config->drb_Identity = req->drbs_to_be_setup[i].drb_id;
+      ASN_SEQUENCE_ADD(&DRB_configList->list, DRB_config);
+      f1ap_drb_to_be_setup_t drb_p = req->drbs_to_be_setup[i];
+      transport_layer_addr_t addr;
+      memcpy(addr.buffer, &drb_p.up_ul_tnl[0].tl_address, sizeof(drb_p.up_ul_tnl[0].tl_address));
+      addr.length=sizeof(drb_p.up_ul_tnl[0].tl_address)*8;
+      extern instance_t DUuniqInstance;
+      incoming_teid = newGtpuCreateTunnel(DUuniqInstance,
+                                          req->rnti,
+                                          drb_p.drb_id,
+                                          drb_p.drb_id,
+                                          drb_p.up_ul_tnl[0].teid,
+                                          -1, // no qfi
+                                          addr,
+                                          drb_p.up_ul_tnl[0].port,
+                                          DURecvCb,
+                                          NULL);
+    }
+  }
+
+  if(req->srbs_to_be_setup_length>0 || req->drbs_to_be_setup_length>0){
+    cellGroupConfig = calloc(1, sizeof(NR_CellGroupConfig_t));
+    uint8_t drb_id_to_setup_start = 1;
+    long drb_priority[1] = {13}; // For now, we assume only one drb per pdu sessions with a default preiority (will be dynamique in future)
+    fill_mastercellGroupConfig(cellGroupConfig,
+                               ue_context_p->ue_context.masterCellGroup,
+                               rrc->um_on_default_drb,
+                               drb_id_to_setup_start < 2 ? 1 : 0,
+                               drb_id_to_setup_start,
+                               req->drbs_to_be_setup_length,
+                               drb_priority);
+     apply_macrlc_config(rrc, ue_context_p, &ctxt);
+  }
+  if(req->ReconfigComplOutcome == RRCreconf_failure){
+    LOG_W(NR_RRC, "CU reporting RRC Reconfiguration failure \n");
+  }
+  else if(req->ReconfigComplOutcome == RRCreconf_success){
+    LOG_I(NR_RRC, "CU reporting RRC Reconfiguration success \n");
+    if(ue_context_p->ue_context.DRB_configList!=NULL){
+      LOG_I(NR_RRC, "Send first DDD buffer status reporting towards the CU through an ITTI message to gtp-u \n");
+      uint8_t drb_id = ue_context_p->ue_context.DRB_configList->list.array[0]->drb_Identity;
+      rnti_t rnti   = ue_context_p->ue_context.rnti;
+      int rlc_tx_buffer_space = nr_rlc_get_available_tx_space(rnti, drb_id);
+      LOG_I(NR_RRC, "Reported in DDD drb_id:%d, rnti:%d\n", drb_id, rnti);
+      MessageDef *msg = itti_alloc_new_message_sized(TASK_RRC_GNB, 0, GTPV1U_DU_BUFFER_REPORT_REQ,
+                                     sizeof(gtpv1u_gnb_tunnel_data_req_t));
+      gtpv1u_DU_buffer_report_req_t *req=&GTPV1U_DU_BUFFER_REPORT_REQ(msg);
+      req->pdusession_id = drb_id;
+      req->rnti = rnti;
+      req->buffer_availability = rlc_tx_buffer_space; //10000000; //Hardcoding to be removed and read the actual RLC buffer availability instead
+      extern instance_t DUuniqInstance;
+      itti_send_msg_to_task(TASK_GTPV1_U, DUuniqInstance, msg);
+
+    }
+  }
+
+  /* Fill the UE context setup response ITTI message to send to F1AP */
+  resp->gNB_CU_ue_id = req->gNB_CU_ue_id;
+  resp->rnti = ctxt.rnti;
+  if(DRB_configList){
+    if(DRB_configList->list.count > 0){
+      resp->drbs_to_be_setup = calloc(1,DRB_configList->list.count*sizeof(f1ap_drb_to_be_setup_t));
+      resp->drbs_to_be_setup_length = DRB_configList->list.count;
+      for (int i=0; i<DRB_configList->list.count; i++){
+        resp->drbs_to_be_setup[i].drb_id = DRB_configList->list.array[i]->drb_Identity;
+        resp->drbs_to_be_setup[i].rlc_mode = RLC_MODE_AM;
+        resp->drbs_to_be_setup[i].up_dl_tnl[0].teid = incoming_teid;
+        resp->drbs_to_be_setup[i].up_dl_tnl[0].tl_address = inet_addr(mac->eth_params_n.my_addr);
+        resp->drbs_to_be_setup[i].up_dl_tnl_length = 1;
+      }
+    }
+    else{
+      LOG_W(NR_RRC, "No DRB added upon reception of F1 UE context modification request with a DRB to setup list\n");
+    }
+  }
+  if(SRB_configList){
+    if(SRB_configList->list.count >0 && SRBs_before_new_addition < SRB_configList->list.count){
+      resp->srbs_to_be_setup = calloc(1,req->srbs_to_be_setup_length*sizeof(f1ap_srb_to_be_setup_t));
+      resp->srbs_to_be_setup_length = req->srbs_to_be_setup_length;
+      for (int i=SRBs_before_new_addition; i<SRB_configList->list.count; i++){
+        resp->srbs_to_be_setup[i-SRBs_before_new_addition].srb_id = SRB_configList->list.array[i]->srb_Identity;
+      }
+    }
+    else{
+      LOG_W(NR_RRC, "No SRB added upon reception of F1 UE Context modification request at the DU\n");
+    }
+  }
+  else{
+    LOG_W(NR_RRC, "No SRB added upon reception of F1 UE Context modification request at the DU\n");
+  }
+
+  //if(cellGroupConfig != NULL) {
+    resp->du_to_cu_rrc_information = calloc(1,sizeof(du_to_cu_rrc_information_t));
+    resp->du_to_cu_rrc_information->cellGroupConfig = calloc(1,1024);
+    asn_enc_rval_t enc_rval = uper_encode_to_buffer(&asn_DEF_NR_CellGroupConfig,
+                                NULL,
+                                ue_context_p->ue_context.masterCellGroup, //(void *)cellGroupConfig,
+                                resp->du_to_cu_rrc_information->cellGroupConfig,
+                                1024);
+    resp->du_to_cu_rrc_information->cellGroupConfig_length = (enc_rval.encoded+7)>>3;
+  //}
+  itti_send_msg_to_task (TASK_DU_F1, ctxt.module_id, message_p);
+}
+
 static void rrc_CU_process_ue_context_setup_response(MessageDef *msg_p, const char *msg_name, instance_t instance){
 
   f1ap_ue_context_setup_t * resp=&F1AP_UE_CONTEXT_SETUP_RESP(msg_p);
-  protocol_ctxt_t ctxt;
-  ctxt.rnti      = resp->rnti;
-  ctxt.module_id = instance;
-  ctxt.instance  = instance;
-  ctxt.enb_flag  = 1;
+  protocol_ctxt_t ctxt = {
+    .rnti = resp->rnti,
+    .module_id = instance,
+    .instance  = instance,
+    .enb_flag  = 1,
+    .eNB_index = instance
+  };
   gNB_RRC_INST *rrc = RC.nrrrc[ctxt.module_id];
   struct rrc_gNB_ue_context_s *ue_context_p = rrc_gNB_get_ue_context(rrc, ctxt.rnti);
   NR_CellGroupConfig_t *cellGroupConfig = NULL;
@@ -3260,8 +3687,8 @@ static void rrc_CU_process_ue_context_setup_response(MessageDef *msg_p, const ch
   asn_dec_rval_t dec_rval = uper_decode_complete( NULL,
     &asn_DEF_NR_CellGroupConfig,
     (void **)&cellGroupConfig,
-    (uint8_t *)resp->du_to_cu_rrc_information,
-    (int) resp->du_to_cu_rrc_information_length);
+    (uint8_t *)resp->du_to_cu_rrc_information->cellGroupConfig,
+    (int) resp->du_to_cu_rrc_information->cellGroupConfig_length);
 
   if ((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)) {
     AssertFatal(1==0,"Cell group config decode error\n");
@@ -3276,20 +3703,90 @@ static void rrc_CU_process_ue_context_setup_response(MessageDef *msg_p, const ch
   }
   if(cellGroupConfig->rlc_BearerToAddModList!=NULL){
     if(ue_context_p->ue_context.masterCellGroup->rlc_BearerToAddModList != NULL){
-      LOG_I(NR_RRC, "rlc_BearerToAddModList not empty before filling it \n");
-      free(ue_context_p->ue_context.masterCellGroup->rlc_BearerToAddModList);
+      int ue_ctxt_rlc_Bearers = ue_context_p->ue_context.masterCellGroup->rlc_BearerToAddModList->list.count;
+      for(int i=ue_ctxt_rlc_Bearers; i<ue_ctxt_rlc_Bearers + cellGroupConfig->rlc_BearerToAddModList->list.count; i++){
+        ASN_SEQUENCE_ADD(&ue_context_p->ue_context.masterCellGroup->rlc_BearerToAddModList->list,
+          cellGroupConfig->rlc_BearerToAddModList->list.array[i-ue_ctxt_rlc_Bearers]);
+      }
     }
-    ue_context_p->ue_context.masterCellGroup->rlc_BearerToAddModList = calloc(1, sizeof(*cellGroupConfig->rlc_BearerToAddModList));
-    memcpy(ue_context_p->ue_context.masterCellGroup->rlc_BearerToAddModList, cellGroupConfig->rlc_BearerToAddModList,
+    else{
+      LOG_W(NR_RRC, "Empty rlc_BearerToAddModList at ue_context of the CU before filling the updates from UE context setup response \n");
+      ue_context_p->ue_context.masterCellGroup->rlc_BearerToAddModList = calloc(1, sizeof(*cellGroupConfig->rlc_BearerToAddModList));
+      memcpy(ue_context_p->ue_context.masterCellGroup->rlc_BearerToAddModList, cellGroupConfig->rlc_BearerToAddModList,
         sizeof(*cellGroupConfig->rlc_BearerToAddModList));
+    }
   }
   xer_fprint(stdout,&asn_DEF_NR_CellGroupConfig, ue_context_p->ue_context.masterCellGroup);
 
+  if (ue_context_p->ue_context.established_pdu_sessions_flag == 1) {
+    rrc_gNB_generate_dedicatedRRCReconfiguration(&ctxt, ue_context_p, cellGroupConfig);
+  } else {
+    rrc_gNB_generate_defaultRRCReconfiguration(&ctxt, ue_context_p);
+  }
+
   free(cellGroupConfig->rlc_BearerToAddModList);
   free(cellGroupConfig);
 
 }
 
+static void rrc_CU_process_ue_context_modification_response(MessageDef *msg_p, const char *msg_name, instance_t instance){
+
+  f1ap_ue_context_setup_t * resp=&F1AP_UE_CONTEXT_SETUP_RESP(msg_p);
+  protocol_ctxt_t ctxt = {
+    .rnti = resp->rnti,
+    .module_id = instance,
+    .instance  = instance,
+    .enb_flag  = 1,
+    .eNB_index = instance
+  };
+  gNB_RRC_INST *rrc = RC.nrrrc[ctxt.module_id];
+  struct rrc_gNB_ue_context_s *ue_context_p = rrc_gNB_get_ue_context(rrc, ctxt.rnti);
+  NR_CellGroupConfig_t *cellGroupConfig = NULL;
+
+  if(resp->du_to_cu_rrc_information->cellGroupConfig!=NULL){
+    asn_dec_rval_t dec_rval = uper_decode_complete( NULL,
+      &asn_DEF_NR_CellGroupConfig,
+      (void **)&cellGroupConfig,
+      (uint8_t *)resp->du_to_cu_rrc_information->cellGroupConfig,
+      (int) resp->du_to_cu_rrc_information->cellGroupConfig_length);
+
+    if((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)) {
+      AssertFatal(1==0,"Cell group config decode error\n");
+      // free the memory
+      SEQUENCE_free( &asn_DEF_NR_CellGroupConfig, cellGroupConfig, 1 );
+      return;
+    }
+    //xer_fprint(stdout,&asn_DEF_NR_CellGroupConfig, cellGroupConfig);
+
+    if(ue_context_p->ue_context.masterCellGroup == NULL){
+      ue_context_p->ue_context.masterCellGroup = calloc(1, sizeof(NR_CellGroupConfig_t));
+    }
+
+    if(cellGroupConfig->rlc_BearerToAddModList!=NULL){
+      if(ue_context_p->ue_context.masterCellGroup->rlc_BearerToAddModList != NULL){
+        int ue_ctxt_rlc_Bearers = ue_context_p->ue_context.masterCellGroup->rlc_BearerToAddModList->list.count;
+        for(int i=ue_ctxt_rlc_Bearers; i<ue_ctxt_rlc_Bearers + cellGroupConfig->rlc_BearerToAddModList->list.count; i++){
+          ASN_SEQUENCE_ADD(&ue_context_p->ue_context.masterCellGroup->rlc_BearerToAddModList->list,
+              cellGroupConfig->rlc_BearerToAddModList->list.array[i-ue_ctxt_rlc_Bearers]);
+        }
+      }
+      else{
+        LOG_W(NR_RRC, "Empty rlc_BearerToAddModList at ue_context of the CU before filling the updates from UE context setup response \n");
+        ue_context_p->ue_context.masterCellGroup->rlc_BearerToAddModList = calloc(1, sizeof(*cellGroupConfig->rlc_BearerToAddModList));
+        memcpy(ue_context_p->ue_context.masterCellGroup->rlc_BearerToAddModList, cellGroupConfig->rlc_BearerToAddModList,
+          sizeof(*cellGroupConfig->rlc_BearerToAddModList));
+      }
+    }
+    LOG_I(NR_RRC, "Updated master cell group configuration stored at the UE context of the CU:\n");
+    xer_fprint(stdout,&asn_DEF_NR_CellGroupConfig, ue_context_p->ue_context.masterCellGroup);
+
+    rrc_gNB_generate_dedicatedRRCReconfiguration(&ctxt, ue_context_p, cellGroupConfig);
+
+    free(cellGroupConfig->rlc_BearerToAddModList);
+    free(cellGroupConfig);
+  }
+}
+
 unsigned int mask_flip(unsigned int x) {
   return((((x>>8) + (x<<8))&0xffff)>>6);
 }
@@ -3451,9 +3948,10 @@ void nr_rrc_subframe_process(protocol_ctxt_t *const ctxt_pP, const int CC_id) {
   FILE *fd=NULL;//fopen("nrRRCstats.log","w");
   RB_FOREACH(ue_context_p, rrc_nr_ue_tree_s, &(RC.nrrrc[ctxt_pP->module_id]->rrc_ue_head)) {
     ctxt_pP->rnti = ue_context_p->ue_id_rnti;
+    gNB_MAC_INST *nrmac=RC.nrmac[ctxt_pP->module_id]; //WHAT A BEAUTIFULL RACE CONDITION !!!
 
     if (fd) {
-      if (ue_context_p->ue_context.Initialue_identity_5g_s_TMSI.presence == TRUE) {
+      if (ue_context_p->ue_context.Initialue_identity_5g_s_TMSI.presence == true) {
         fprintf(fd,"NR RRC UE rnti %x: S-TMSI %x failure timer %d/8\n",
                 ue_context_p->ue_id_rnti,
                 ue_context_p->ue_context.Initialue_identity_5g_s_TMSI.fiveg_tmsi,
@@ -3490,15 +3988,27 @@ void nr_rrc_subframe_process(protocol_ctxt_t *const ctxt_pP, const int CC_id) {
 
         // Remove here the MAC and RRC context when RRC is not connected or gNB is not connected to CN5G
         if(ue_context_p->ue_context.StatusRrc < NR_RRC_CONNECTED || ue_context_p->ue_context.gNB_ue_ngap_id == 0) {
-          mac_remove_nr_ue(ctxt_pP->module_id, ctxt_pP->rnti);
-          rrc_rlc_remove_ue(ctxt_pP);
-          pdcp_remove_UE(ctxt_pP);
-
-          /* remove RRC UE Context */
-          ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[ctxt_pP->module_id], ctxt_pP->rnti);
-          if (ue_context_p) {
-            rrc_gNB_remove_ue_context(ctxt_pP, RC.nrrrc[ctxt_pP->module_id], ue_context_p);
-            LOG_I(NR_RRC, "remove UE %x \n", ctxt_pP->rnti);
+          if(!NODE_IS_CU(RC.nrrrc[ctxt_pP->instance]->node_type)){
+            mac_remove_nr_ue(nrmac, ctxt_pP->rnti);
+            rrc_rlc_remove_ue(ctxt_pP);
+            pdcp_remove_UE(ctxt_pP);
+
+            /* remove RRC UE Context */
+            ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[ctxt_pP->module_id], ctxt_pP->rnti);
+            if (ue_context_p) {
+              rrc_gNB_remove_ue_context(ctxt_pP, RC.nrrrc[ctxt_pP->module_id], ue_context_p);
+              LOG_I(NR_RRC, "remove UE %x \n", ctxt_pP->rnti);
+            }
+          }
+          // In case of CU trigger UE context release command towards the DU
+          else{
+            MessageDef *message_p;
+            message_p = itti_alloc_new_message (TASK_RRC_GNB, 0, F1AP_UE_CONTEXT_RELEASE_CMD);
+            f1ap_ue_context_release_cmd_t *rel_cmd=&F1AP_UE_CONTEXT_RELEASE_CMD (message_p);
+            rel_cmd->rnti = ctxt_pP->rnti;
+            rel_cmd->cause = F1AP_CAUSE_RADIO_NETWORK;
+            rel_cmd->cause_value = 10; // 10 = F1AP_CauseRadioNetwork_normal_release
+            itti_send_msg_to_task(TASK_CU_F1, ctxt_pP->module_id, message_p);
           }
         }
 
@@ -3514,7 +4024,7 @@ void nr_rrc_subframe_process(protocol_ctxt_t *const ctxt_pP, const int CC_id) {
               ue_context_p->ue_context.rnti);
         ue_context_p->ue_context.ue_release_timer_rrc = 0;
 
-        mac_remove_nr_ue(ctxt_pP->module_id, ctxt_pP->rnti);
+        mac_remove_nr_ue(nrmac, ctxt_pP->rnti);
         rrc_rlc_remove_ue(ctxt_pP);
         pdcp_remove_UE(ctxt_pP);
         newGtpuDeleteAllTunnels(ctxt_pP->instance, ctxt_pP->rnti);
@@ -3533,7 +4043,6 @@ void nr_rrc_subframe_process(protocol_ctxt_t *const ctxt_pP, const int CC_id) {
 
   if (fd) fclose(fd);
 
-
   /* send a tick to x2ap */
   if (is_x2ap_enabled()){
     msg = itti_alloc_new_message(TASK_RRC_ENB, 0, X2AP_SUBFRAME_PROCESS);
@@ -3685,17 +4194,30 @@ void *rrc_gnb_task(void *args_p) {
         rrc_gNB_process_f1_setup_req(&F1AP_SETUP_REQ(msg_p));
         break;
 	
-    case NR_DU_RRC_DL_INDICATION:
-      rrc_process_DU_DL(msg_p, msg_name_p, instance);
-      break;
+      case NR_DU_RRC_DL_INDICATION:
+        rrc_process_DU_DL(msg_p, msg_name_p, instance);
+        break;
       
-    case F1AP_UE_CONTEXT_SETUP_REQ:
-      rrc_DU_process_ue_context_setup_request(msg_p, msg_name_p, instance);
-      break;
+      case F1AP_UE_CONTEXT_SETUP_REQ:
+        rrc_DU_process_ue_context_setup_request(msg_p, msg_name_p, instance);
+        break;
 
-    case F1AP_UE_CONTEXT_SETUP_RESP:
-      rrc_CU_process_ue_context_setup_response(msg_p, msg_name_p, instance);
-      break;
+      case F1AP_UE_CONTEXT_SETUP_RESP:
+        rrc_CU_process_ue_context_setup_response(msg_p, msg_name_p, instance);
+        break;
+
+      case F1AP_UE_CONTEXT_MODIFICATION_RESP:
+        rrc_CU_process_ue_context_modification_response(msg_p, msg_name_p, instance);
+        break;
+
+      case F1AP_UE_CONTEXT_MODIFICATION_REQ:
+        rrc_DU_process_ue_context_modification_request(msg_p, msg_name_p, instance);
+        break;
+
+      case F1AP_UE_CONTEXT_RELEASE_CMD:
+        LOG_W(NR_RRC, "Received F1AP_UE_CONTEXT_RELEASE_CMD for processing at the RRC layer of the DU. Processing function "
+            "implementation is pending\n");
+        break;
 
       /* Messages from X2AP */
       case X2AP_ENDC_SGNB_ADDITION_REQ:
@@ -3966,5 +4488,6 @@ void nr_rrc_trigger(protocol_ctxt_t *ctxt, int CC_id, int frame, int subframe)
   message_p = itti_alloc_new_message(TASK_RRC_GNB, 0, RRC_SUBFRAME_PROCESS);
   RRC_SUBFRAME_PROCESS(message_p).ctxt  = *ctxt;
   RRC_SUBFRAME_PROCESS(message_p).CC_id = CC_id;
+  LOG_D(NR_RRC, "Time in RRC: %u/ %u \n", frame, subframe);
   itti_send_msg_to_task(TASK_RRC_GNB, ctxt->module_id, message_p);
 }
diff --git a/openair2/RRC/NR/rrc_gNB_NGAP.c b/openair2/RRC/NR/rrc_gNB_NGAP.c
index c73c3d9649df3bdd81b2eda5e497db748662adb7..8e1975ea1195f8e7b603a6278fb8ff573e8d09d8 100644
--- a/openair2/RRC/NR/rrc_gNB_NGAP.c
+++ b/openair2/RRC/NR/rrc_gNB_NGAP.c
@@ -307,7 +307,6 @@ nr_rrc_pdcp_config_security(
   //uint8_t                            *k_kdf  = NULL;
   static int                          print_keys= 1;
 
-
   /* Derive the keys from kgnb */
   if (SRB_configList != NULL) {
     nr_derive_key_up_enc(ue_context_pP->ue_context.ciphering_algorithm,
@@ -475,7 +474,6 @@ rrc_gNB_process_NGAP_INITIAL_CONTEXT_SETUP_REQ(
     rrc_gNB_ue_context_t            *ue_context_p = NULL;
     protocol_ctxt_t                 ctxt={0};
     uint8_t                         pdu_sessions_done = 0;
-    gtpv1u_gnb_create_tunnel_req_t  create_tunnel_req;
     gtpv1u_gnb_create_tunnel_resp_t create_tunnel_resp;
     uint8_t                         inde_list[NR_NB_RB_MAX - 3]= {0};
     int                             ret = 0;
@@ -504,7 +502,7 @@ rrc_gNB_process_NGAP_INITIAL_CONTEXT_SETUP_REQ(
 
       uint8_t nb_pdusessions_tosetup = NGAP_INITIAL_CONTEXT_SETUP_REQ (msg_p).nb_of_pdusessions;
       if (nb_pdusessions_tosetup != 0) {
-        memset(&create_tunnel_req, 0, sizeof(gtpv1u_gnb_create_tunnel_req_t));
+        gtpv1u_gnb_create_tunnel_req_t  create_tunnel_req={0};
         for (int i = 0; i < NR_NB_RB_MAX - 3; i++) {
           if(ue_context_p->ue_context.pduSession[i].status >= PDU_SESSION_STATUS_DONE)
             continue;
@@ -513,6 +511,8 @@ rrc_gNB_process_NGAP_INITIAL_CONTEXT_SETUP_REQ(
           create_tunnel_req.pdusession_id[pdu_sessions_done]   = NGAP_INITIAL_CONTEXT_SETUP_REQ (msg_p).pdusession_param[pdu_sessions_done].pdusession_id;
           create_tunnel_req.incoming_rb_id[pdu_sessions_done]  = i+1;
           create_tunnel_req.outgoing_teid[pdu_sessions_done]    = NGAP_INITIAL_CONTEXT_SETUP_REQ (msg_p).pdusession_param[pdu_sessions_done].gtp_teid;
+          // To be developped: hardcoded first flow 
+          create_tunnel_req.outgoing_qfi[pdu_sessions_done]    = NGAP_INITIAL_CONTEXT_SETUP_REQ (msg_p).pdusession_param[pdu_sessions_done].qos[0].qfi;
           create_tunnel_req.dst_addr[pdu_sessions_done].length = NGAP_INITIAL_CONTEXT_SETUP_REQ (msg_p).pdusession_param[pdu_sessions_done].upf_addr.length;
           memcpy(create_tunnel_req.dst_addr[pdu_sessions_done].buffer,
                   NGAP_INITIAL_CONTEXT_SETUP_REQ (msg_p).pdusession_param[pdu_sessions_done].upf_addr.buffer,
@@ -709,7 +709,7 @@ rrc_gNB_process_security(
   rrc_gNB_ue_context_t *const ue_context_pP,
   ngap_security_capabilities_t *security_capabilities_pP
 ) {
-  boolean_t                                             changed = FALSE;
+  bool                                                  changed = false;
   NR_CipheringAlgorithm_t                               cipheringAlgorithm;
   e_NR_IntegrityProtAlgorithm                           integrityProtAlgorithm;
   /* Save security parameters */
@@ -727,14 +727,14 @@ rrc_gNB_process_security(
 
   if (ue_context_pP->ue_context.ciphering_algorithm != cipheringAlgorithm) {
     ue_context_pP->ue_context.ciphering_algorithm = cipheringAlgorithm;
-    changed = TRUE;
+    changed = true;
   }
 
   integrityProtAlgorithm = rrc_gNB_select_integrity(ctxt_pP, ue_context_pP->ue_context.security_capabilities.nRintegrity_algorithms);
 
   if (ue_context_pP->ue_context.integrity_algorithm != integrityProtAlgorithm) {
     ue_context_pP->ue_context.integrity_algorithm = integrityProtAlgorithm;
-    changed = TRUE;
+    changed = true;
   }
 
   LOG_I (NR_RRC, "[gNB %d][UE %x] Selected security algorithms (%p): %lx, %x, %s\n",
@@ -905,7 +905,7 @@ rrc_gNB_send_NGAP_PDUSESSION_SETUP_RESP(
   for (pdusession = 0; pdusession < ue_context_pP->ue_context.setup_pdu_sessions; pdusession++) {
     // if (xid == ue_context_pP->ue_context.pdusession[pdusession].xid) {
       if (ue_context_pP->ue_context.pduSession[pdusession].status == PDU_SESSION_STATUS_DONE) {
-        pdusession_setup_t * tmp=&NGAP_PDUSESSION_SETUP_RESP(msg_p).pdusessions[pdusession];
+        pdusession_setup_t * tmp=&NGAP_PDUSESSION_SETUP_RESP(msg_p).pdusessions[pdu_sessions_done];
         tmp->pdusession_id = ue_context_pP->ue_context.pduSession[pdusession].param.pdusession_id;
         // tmp->pdusession_id = 1;
         tmp->nb_of_qos_flow = ue_context_pP->ue_context.pduSession[pdusession].param.nb_qos;
@@ -1004,6 +1004,7 @@ rrc_gNB_process_NGAP_PDUSESSION_SETUP_REQ(
       create_tunnel_req.pdusession_id[pdu_sessions_done] = NGAP_PDUSESSION_SETUP_REQ(msg_p).pdusession_setup_params[pdu_sessions_done].pdusession_id;
       create_tunnel_req.incoming_rb_id[pdu_sessions_done]= i+1;
       create_tunnel_req.outgoing_teid[pdu_sessions_done]  = NGAP_PDUSESSION_SETUP_REQ(msg_p).pdusession_setup_params[pdu_sessions_done].gtp_teid;
+      create_tunnel_req.outgoing_qfi[pdu_sessions_done]  = NGAP_PDUSESSION_SETUP_REQ(msg_p).pdusession_setup_params[pdu_sessions_done].qos[0].qfi;
       memcpy(create_tunnel_req.dst_addr[pdu_sessions_done].buffer,
               NGAP_PDUSESSION_SETUP_REQ(msg_p).pdusession_setup_params[pdu_sessions_done].upf_addr.buffer,
               sizeof(uint8_t)*20);
@@ -1050,7 +1051,46 @@ rrc_gNB_process_NGAP_PDUSESSION_SETUP_REQ(
     // TEST 
     // ue_context_p->ue_context.pdusession[0].status = PDU_SESSION_STATUS_DONE;
     // rrc_gNB_send_NGAP_PDUSESSION_SETUP_RESP(&ctxt, ue_context_p, 0);
-    rrc_gNB_generate_dedicatedRRCReconfiguration(&ctxt, ue_context_p);
+    if(!NODE_IS_CU(RC.nrrrc[ctxt.module_id]->node_type)){
+      rrc_gNB_generate_dedicatedRRCReconfiguration(&ctxt, ue_context_p, NULL);
+    }
+    else{
+      /*Generate a UE context modification request message towards the DU to instruct the DU
+       *for SRB2 and DRB configuration and get the updates on master cell group config from the DU*/
+      MessageDef *message_p;
+      message_p = itti_alloc_new_message (TASK_RRC_GNB, 0, F1AP_UE_CONTEXT_MODIFICATION_REQ);
+      f1ap_ue_context_setup_t *req=&F1AP_UE_CONTEXT_MODIFICATION_REQ (message_p);
+      req->rnti             = ue_context_p->ue_context.rnti;
+      req->mcc              = RC.nrrrc[ctxt.module_id]->configuration.mcc[0];
+      req->mnc              = RC.nrrrc[ctxt.module_id]->configuration.mnc[0];
+      req->mnc_digit_length = RC.nrrrc[ctxt.module_id]->configuration.mnc_digit_length[0];
+      req->nr_cellid        = RC.nrrrc[ctxt.module_id]->nr_cellid;
+
+      /*Instruction towards the DU for SRB2 configuration*/
+      req->srbs_to_be_setup = malloc(1*sizeof(f1ap_srb_to_be_setup_t));
+      req->srbs_to_be_setup_length = 1;
+      f1ap_srb_to_be_setup_t *SRBs=req->srbs_to_be_setup;
+      SRBs[0].srb_id = 2;
+      SRBs[0].lcid = 2;
+
+      /*Instruction towards the DU for DRB configuration and tunnel creation*/
+      gtpv1u_gnb_create_tunnel_req_t  create_tunnel_req;
+      memset(&create_tunnel_req, 0, sizeof(gtpv1u_gnb_create_tunnel_req_t));
+      req->drbs_to_be_setup = malloc(1*sizeof(f1ap_drb_to_be_setup_t));
+      req->drbs_to_be_setup_length = 1;
+      f1ap_drb_to_be_setup_t *DRBs=req->drbs_to_be_setup;
+      LOG_D(RRC, "Length of DRB list:%d \n", req->drbs_to_be_setup_length);
+      DRBs[0].drb_id = 1;
+      DRBs[0].rlc_mode = RLC_MODE_AM;
+      DRBs[0].up_ul_tnl[0].tl_address = inet_addr(RC.nrrrc[ctxt.module_id]->eth_params_s.my_addr);
+      DRBs[0].up_ul_tnl[0].port=RC.nrrrc[ctxt.module_id]->eth_params_s.my_portd;
+      DRBs[0].up_ul_tnl_length = 1;
+      DRBs[0].up_dl_tnl[0].tl_address = inet_addr(RC.nrrrc[ctxt.module_id]->eth_params_s.remote_addr);
+      DRBs[0].up_dl_tnl[0].port=RC.nrrrc[ctxt.module_id]->eth_params_s.remote_portd;
+      DRBs[0].up_dl_tnl_length = 1;
+
+      itti_send_msg_to_task (TASK_CU_F1, ctxt.module_id, message_p);
+    }
     return(0);
   }
 }
@@ -1088,17 +1128,17 @@ rrc_gNB_process_NGAP_PDUSESSION_MODIFY_REQ(
     ue_context_p->ue_context.gNB_ue_ngap_id = gNB_ue_ngap_id;
     {
       int j;
-      boolean_t is_treated[NGAP_MAX_PDUSESSION] = {FALSE};
+      bool is_treated[NGAP_MAX_PDUSESSION] = {false};
       uint8_t nb_of_failed_pdusessions = 0;
 
       for (i = 0; i < nb_pdusessions_tomodify; i++) {
-        if (is_treated[i] == TRUE) {
+        if (is_treated[i] == true) {
           continue;
         }
         
         //Check if same PDU session ID to handle multiple pdu sessions
         for (j = i+1; j < nb_pdusessions_tomodify; j++) {
-          if (is_treated[j] == FALSE &&
+          if (is_treated[j] == false &&
               NGAP_PDUSESSION_MODIFY_REQ(msg_p).pdusession_modify_params[j].pdusession_id == 
                 NGAP_PDUSESSION_MODIFY_REQ(msg_p).pdusession_modify_params[i].pdusession_id) {
             // handle multiple pdu session id
@@ -1109,12 +1149,12 @@ rrc_gNB_process_NGAP_PDUSESSION_MODIFY_REQ(
             ue_context_p->ue_context.modify_pdusession[j].cause               = NGAP_CAUSE_RADIO_NETWORK;
             ue_context_p->ue_context.modify_pdusession[j].cause_value         = NGAP_CauseRadioNetwork_multiple_PDU_session_ID_instances;
             nb_of_failed_pdusessions++;
-            is_treated[i] = TRUE;
-            is_treated[j] = TRUE;
+            is_treated[i] = true;
+            is_treated[j] = true;
           }
         }
         // handle multiple pdu session id case
-        if (is_treated[i] == TRUE) {
+        if (is_treated[i] == true) {
           LOG_D(NR_RRC, "handle multiple pdu session id \n");
           ue_context_p->ue_context.modify_pdusession[i].status              = PDU_SESSION_STATUS_NEW;
           ue_context_p->ue_context.modify_pdusession[i].param.pdusession_id = 
@@ -1157,13 +1197,13 @@ rrc_gNB_process_NGAP_PDUSESSION_MODIFY_REQ(
             ue_context_p->ue_context.modify_pdusession[i].param.gtp_teid = 
               ue_context_p->ue_context.pduSession[j].param.gtp_teid;
             
-            is_treated[i] = TRUE;
+            is_treated[i] = true;
             break;
           }
         }
 
         // handle Unknown pdu session ID
-        if (is_treated[i] == FALSE) {
+        if (is_treated[i] == false) {
           LOG_D(NR_RRC, "handle Unknown pdu session ID \n");
           ue_context_p->ue_context.modify_pdusession[i].status              = PDU_SESSION_STATUS_NEW;
           ue_context_p->ue_context.modify_pdusession[i].param.pdusession_id = 
@@ -1171,7 +1211,7 @@ rrc_gNB_process_NGAP_PDUSESSION_MODIFY_REQ(
           ue_context_p->ue_context.modify_pdusession[i].cause               = NGAP_CAUSE_RADIO_NETWORK;
           ue_context_p->ue_context.modify_pdusession[i].cause_value         = NGAP_CauseRadioNetwork_unknown_PDU_session_ID;
           nb_of_failed_pdusessions++;
-          is_treated[i] = TRUE;
+          is_treated[i] = true;
         }
       }
 
diff --git a/openair2/RRC/NR/rrc_gNB_nsa.c b/openair2/RRC/NR/rrc_gNB_nsa.c
index b482637dfd4072aec7ba836400311af6bc09778c..b3eada8136ad9b1c11b918c689777bca26b28dbc 100644
--- a/openair2/RRC/NR/rrc_gNB_nsa.c
+++ b/openair2/RRC/NR/rrc_gNB_nsa.c
@@ -106,6 +106,9 @@ void rrc_parse_ue_capabilities(gNB_RRC_INST *rrc, NR_UE_CapabilityRAT_ContainerL
   }
   LOG_A(NR_RRC, "Successfully decoded UE NR capabilities (NR and MRDC)\n");
 
+  ue_context_p->ue_context.spCellConfig = calloc(1, sizeof(struct NR_SpCellConfig));
+  ue_context_p->ue_context.spCellConfig->spCellConfigDedicated = rrc->carrier.servingcellconfig;
+  LOG_I(NR_RRC,"Adding new NSA user (%p)\n",ue_context_p);
   rrc_add_nsa_user(rrc,ue_context_p, m);
 }
 
@@ -241,6 +244,7 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc,struct rrc_gNB_ue_context_s *ue_context_
                           cipher_algo,
                           NR_SecurityConfig__keyToUse_secondary);
   }
+
   NR_ServingCellConfig_t *scc = ue_context_p->ue_context.spCellConfig ?
       ue_context_p->ue_context.spCellConfig->spCellConfigDedicated : NULL;
   fill_default_reconfig(carrier->servingcellconfigcommon,
@@ -250,6 +254,7 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc,struct rrc_gNB_ue_context_s *ue_context_
                         ue_context_p->ue_context.UE_Capability_nr,
                         configuration,
                         ue_context_p->local_uid);
+
   ue_context_p->ue_id_rnti = ue_context_p->ue_context.secondaryCellGroup->spCellConfig->reconfigurationWithSync->newUE_Identity;
   NR_CG_Config_t *CG_Config = calloc(1,sizeof(*CG_Config));
   memset((void *)CG_Config,0,sizeof(*CG_Config));
@@ -344,7 +349,6 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc,struct rrc_gNB_ue_context_s *ue_context_
   // configure MAC and RLC
   if (NODE_IS_DU(rrc->node_type)) {
     rrc_mac_config_req_gNB(rrc->module_id,
-                           rrc->configuration.ssb_SubcarrierOffset,
                            rrc->configuration.pdsch_AntennaPorts,
                            rrc->configuration.pusch_AntennaPorts,
                            rrc->configuration.sib1_tda,
@@ -357,7 +361,6 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc,struct rrc_gNB_ue_context_s *ue_context_
                            ue_context_p->ue_context.secondaryCellGroup);
   } else {
     rrc_mac_config_req_gNB(rrc->module_id,
-                           rrc->configuration.ssb_SubcarrierOffset,
                            rrc->configuration.pdsch_AntennaPorts,
                            rrc->configuration.pusch_AntennaPorts,
                            rrc->configuration.sib1_tda,
@@ -421,7 +424,8 @@ void rrc_remove_nsa_user(gNB_RRC_INST *rrc, int rnti) {
 
   rrc_rlc_remove_ue(&ctxt);
 
-  mac_remove_nr_ue(rrc->module_id, rnti);
+  // WHAT A RACE CONDITION
+  mac_remove_nr_ue(RC.nrmac[rrc->module_id], rnti);
   gtpv1u_enb_delete_tunnel_req_t tmp={0};
   tmp.rnti=rnti;
   tmp.from_gnb=1;
diff --git a/openair2/RRC/NR/rrc_gNB_reconfig.c b/openair2/RRC/NR/rrc_gNB_reconfig.c
index b56d622acdcc77d1123a6a6763a43e6fec473559..2ee3a26c4b0c6a56e9fa2788651171a998276dbf 100644
--- a/openair2/RRC/NR/rrc_gNB_reconfig.c
+++ b/openair2/RRC/NR/rrc_gNB_reconfig.c
@@ -47,8 +47,463 @@
 #include "LAYER2/nr_rlc/nr_rlc_oai_api.h"
 #include "nr_rrc_config.h"
 
-#define false 0
-#define true 1
+void fix_servingcellconfigdedicated(NR_ServingCellConfig_t *scd) {
+
+  int b = 0;
+  while (b < scd->downlinkBWP_ToAddModList->list.count) {
+    if (scd->downlinkBWP_ToAddModList->list.array[b]->bwp_Common->genericParameters.locationAndBandwidth == 0) {
+      asn_sequence_del(&scd->downlinkBWP_ToAddModList->list, b, 1);
+    } else {
+      b++;
+    }
+  }
+
+  if(scd->downlinkBWP_ToAddModList->list.count == 0) {
+    free(scd->downlinkBWP_ToAddModList);
+    scd->downlinkBWP_ToAddModList = NULL;
+  }
+
+  b = 0;
+  while (b < scd->uplinkConfig->uplinkBWP_ToAddModList->list.count) {
+    if (scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[b]->bwp_Common->genericParameters.locationAndBandwidth ==
+        0) {
+      asn_sequence_del(&scd->uplinkConfig->uplinkBWP_ToAddModList->list, b, 1);
+    } else {
+      b++;
+    }
+  }
+
+  if(scd->uplinkConfig->uplinkBWP_ToAddModList->list.count == 0) {
+    free(scd->uplinkConfig->uplinkBWP_ToAddModList);
+    scd->uplinkConfig->uplinkBWP_ToAddModList = NULL;
+  }
+
+}
+
+void fill_default_nsa_downlinkBWP(NR_BWP_Downlink_t *bwp,
+                                  long bwp_loop,
+                                  NR_CellGroupConfig_t *secondaryCellGroup,
+                                  NR_ServingCellConfig_t *servingcellconfigdedicated,
+                                  NR_ServingCellConfigCommon_t *servingcellconfigcommon,
+                                  const gNB_RrcConfigurationReq *configuration,
+                                  NR_UE_NR_Capability_t *uecap,
+                                  int dl_antenna_ports,
+                                  uint64_t bitmap) {
+
+  /// BWP common configuration
+
+  bwp->bwp_Common = calloc(1,sizeof(*bwp->bwp_Common));
+
+  if(servingcellconfigdedicated->downlinkBWP_ToAddModList &&
+      bwp_loop < servingcellconfigdedicated->downlinkBWP_ToAddModList->list.count) {
+    bwp->bwp_Id = servingcellconfigdedicated->downlinkBWP_ToAddModList->list.array[bwp_loop]->bwp_Id;
+    bwp->bwp_Common->genericParameters.locationAndBandwidth = servingcellconfigdedicated->downlinkBWP_ToAddModList->list.array[bwp_loop]->bwp_Common->genericParameters.locationAndBandwidth;
+    bwp->bwp_Common->genericParameters.subcarrierSpacing = servingcellconfigdedicated->downlinkBWP_ToAddModList->list.array[bwp_loop]->bwp_Common->genericParameters.subcarrierSpacing;
+    bwp->bwp_Common->genericParameters.cyclicPrefix = servingcellconfigdedicated->downlinkBWP_ToAddModList->list.array[bwp_loop]->bwp_Common->genericParameters.cyclicPrefix;
+  } else {
+    bwp->bwp_Id=bwp_loop+1;
+    bwp->bwp_Common->genericParameters.locationAndBandwidth = PRBalloc_to_locationandbandwidth(servingcellconfigcommon->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth,0);
+    bwp->bwp_Common->genericParameters.subcarrierSpacing = servingcellconfigcommon->downlinkConfigCommon->initialDownlinkBWP->genericParameters.subcarrierSpacing;
+    bwp->bwp_Common->genericParameters.cyclicPrefix = servingcellconfigcommon->downlinkConfigCommon->initialDownlinkBWP->genericParameters.cyclicPrefix;
+  }
+
+  bwp->bwp_Common->pdcch_ConfigCommon=calloc(1,sizeof(*bwp->bwp_Common->pdcch_ConfigCommon));
+  bwp->bwp_Common->pdcch_ConfigCommon->present = NR_SetupRelease_PDCCH_ConfigCommon_PR_setup;
+  bwp->bwp_Common->pdcch_ConfigCommon->choice.setup = calloc(1,sizeof(*bwp->bwp_Common->pdcch_ConfigCommon->choice.setup));
+  bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->controlResourceSetZero=NULL;
+  bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonControlResourceSet=calloc(1,sizeof(*bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonControlResourceSet));
+
+  int curr_bwp = NRRIV2BW(bwp->bwp_Common->genericParameters.locationAndBandwidth,275);
+
+  NR_ControlResourceSet_t *coreset = calloc(1,sizeof(*coreset));
+  rrc_coreset_config(coreset, bwp->bwp_Id, curr_bwp, bitmap);
+  bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonControlResourceSet = coreset;
+
+  bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->searchSpaceZero=NULL;
+  bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList=NULL;
+  bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList=calloc(1,sizeof(*bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList));
+
+  NR_SearchSpace_t *ss=calloc(1,sizeof(*ss));
+  ss->searchSpaceId = (bwp->bwp_Id<<1)-1; // To uniquely identify each SearchSpace lets derive it from the BWPId
+  ss->controlResourceSetId=calloc(1,sizeof(*ss->controlResourceSetId));
+  *ss->controlResourceSetId=coreset->controlResourceSetId;
+  ss->monitoringSlotPeriodicityAndOffset = calloc(1,sizeof(*ss->monitoringSlotPeriodicityAndOffset));
+  ss->monitoringSlotPeriodicityAndOffset->present = NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
+  ss->duration=NULL;
+  ss->monitoringSymbolsWithinSlot = calloc(1,sizeof(*ss->monitoringSymbolsWithinSlot));
+  ss->monitoringSymbolsWithinSlot->buf = calloc(1,2);
+  // should be '1100 0000 0000 00'B (LSB first!), first two symols in slot, adjust if needed
+  ss->monitoringSymbolsWithinSlot->buf[1] = 0;
+  ss->monitoringSymbolsWithinSlot->buf[0] = (1<<7) | (1<<6);
+  ss->monitoringSymbolsWithinSlot->size = 2;
+  ss->monitoringSymbolsWithinSlot->bits_unused = 2;
+  ss->nrofCandidates = calloc(1,sizeof(*ss->nrofCandidates));
+  ss->nrofCandidates->aggregationLevel1 = NR_SearchSpace__nrofCandidates__aggregationLevel1_n0;
+  ss->nrofCandidates->aggregationLevel2 = NR_SearchSpace__nrofCandidates__aggregationLevel2_n0;
+  ss->nrofCandidates->aggregationLevel4 = NR_SearchSpace__nrofCandidates__aggregationLevel4_n1;
+  ss->nrofCandidates->aggregationLevel8 = NR_SearchSpace__nrofCandidates__aggregationLevel8_n0;
+  ss->nrofCandidates->aggregationLevel16 = NR_SearchSpace__nrofCandidates__aggregationLevel16_n0;
+  ss->searchSpaceType = calloc(1,sizeof(*ss->searchSpaceType));
+  ss->searchSpaceType->present = NR_SearchSpace__searchSpaceType_PR_common;
+  ss->searchSpaceType->choice.common=calloc(1,sizeof(*ss->searchSpaceType->choice.common));
+  ss->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0 = calloc(1,sizeof(*ss->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0));
+  ASN_SEQUENCE_ADD(&bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList->list,ss);
+
+  bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->searchSpaceSIB1=NULL;
+  bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->searchSpaceOtherSystemInformation=NULL;
+  bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->pagingSearchSpace=NULL;
+  bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->ra_SearchSpace=calloc(1,sizeof(*bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->ra_SearchSpace));
+  *bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->ra_SearchSpace=ss->searchSpaceId;
+  bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->ext1=NULL;
+
+  bwp->bwp_Common->pdsch_ConfigCommon=calloc(1,sizeof(*bwp->bwp_Common->pdsch_ConfigCommon));
+  bwp->bwp_Common->pdsch_ConfigCommon->present = NR_SetupRelease_PDSCH_ConfigCommon_PR_setup;
+  bwp->bwp_Common->pdsch_ConfigCommon->choice.setup = calloc(1,sizeof(*bwp->bwp_Common->pdsch_ConfigCommon->choice.setup));
+  bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList = calloc(1,sizeof(*bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList));
+
+  // Prepare PDSCH-TimeDomainResourceAllocation list
+  nr_rrc_config_dl_tda(servingcellconfigcommon,
+                       bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList,
+                       curr_bwp);
+
+  /// BWP dedicated configuration
+
+  if (!bwp->bwp_Dedicated) {
+    bwp->bwp_Dedicated=calloc(1,sizeof(*bwp->bwp_Dedicated));
+  }
+  bwp->bwp_Dedicated->pdcch_Config=calloc(1,sizeof(*bwp->bwp_Dedicated->pdcch_Config));
+  bwp->bwp_Dedicated->pdcch_Config->present = NR_SetupRelease_PDCCH_Config_PR_setup;
+  bwp->bwp_Dedicated->pdcch_Config->choice.setup = calloc(1,sizeof(*bwp->bwp_Dedicated->pdcch_Config->choice.setup));
+  bwp->bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList = calloc(1,sizeof(*bwp->bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList));
+
+  ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList->list, coreset);
+
+  bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList = calloc(1,sizeof(*bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList));
+
+  NR_SearchSpace_t *ss2 = calloc(1,sizeof(*ss2));
+  ss2->searchSpaceId=(bwp->bwp_Id<<1); // To uniquely identify each SearchSpace lets derive it from the BWPId
+  ss2->controlResourceSetId=calloc(1,sizeof(*ss2->controlResourceSetId));
+  *ss2->controlResourceSetId=coreset->controlResourceSetId;
+  ss2->monitoringSlotPeriodicityAndOffset=calloc(1,sizeof(*ss2->monitoringSlotPeriodicityAndOffset));
+  ss2->monitoringSlotPeriodicityAndOffset->present = NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
+  ss2->monitoringSlotPeriodicityAndOffset->choice.sl1=(NULL_t)0;
+  ss2->duration=NULL;
+  ss2->monitoringSymbolsWithinSlot = calloc(1,sizeof(*ss2->monitoringSymbolsWithinSlot));
+  ss2->monitoringSymbolsWithinSlot->buf = calloc(1,2);
+  ss2->monitoringSymbolsWithinSlot->size = 2;
+  ss2->monitoringSymbolsWithinSlot->bits_unused = 2;
+  ss2->monitoringSymbolsWithinSlot->buf[0]=0xc0;
+  ss2->monitoringSymbolsWithinSlot->buf[1]=0x0;
+  ss2->nrofCandidates=calloc(1,sizeof(*ss2->nrofCandidates));
+  ss2->nrofCandidates->aggregationLevel1 = NR_SearchSpace__nrofCandidates__aggregationLevel1_n0;
+  ss2->nrofCandidates->aggregationLevel2 = NR_SearchSpace__nrofCandidates__aggregationLevel2_n0;
+  if (curr_bwp < 48) {
+    ss2->nrofCandidates->aggregationLevel4 = NR_SearchSpace__nrofCandidates__aggregationLevel4_n1;
+    ss2->nrofCandidates->aggregationLevel8 = NR_SearchSpace__nrofCandidates__aggregationLevel8_n0;
+  } else if (curr_bwp < 96) {
+    ss2->nrofCandidates->aggregationLevel4 = NR_SearchSpace__nrofCandidates__aggregationLevel4_n2;
+    ss2->nrofCandidates->aggregationLevel8 = NR_SearchSpace__nrofCandidates__aggregationLevel8_n1;
+  } else {
+    ss2->nrofCandidates->aggregationLevel4 = NR_SearchSpace__nrofCandidates__aggregationLevel4_n4;
+    ss2->nrofCandidates->aggregationLevel8 = NR_SearchSpace__nrofCandidates__aggregationLevel8_n2;
+  }
+  ss2->nrofCandidates->aggregationLevel16 = NR_SearchSpace__nrofCandidates__aggregationLevel16_n0;
+  ss2->searchSpaceType=calloc(1,sizeof(*ss2->searchSpaceType));
+  ss2->searchSpaceType->present = NR_SearchSpace__searchSpaceType_PR_ue_Specific;
+  ss2->searchSpaceType->choice.ue_Specific = calloc(1,sizeof(*ss2->searchSpaceType->choice.ue_Specific));
+  ss2->searchSpaceType->choice.ue_Specific->dci_Formats=NR_SearchSpace__searchSpaceType__ue_Specific__dci_Formats_formats0_1_And_1_1;
+  ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList->list, ss2);
+
+  bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToReleaseList = NULL;
+
+  if (!bwp->bwp_Dedicated->pdsch_Config) {
+    bwp->bwp_Dedicated->pdsch_Config = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config));
+    bwp->bwp_Dedicated->pdsch_Config->present = NR_SetupRelease_PDSCH_Config_PR_setup;
+    bwp->bwp_Dedicated->pdsch_Config->choice.setup = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup));
+    bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA));
+    bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->present= NR_SetupRelease_DMRS_DownlinkConfig_PR_setup;
+    bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup));
+  }
+  bwp->bwp_Dedicated->pdsch_Config->choice.setup->dataScramblingIdentityPDSCH = NULL;
+
+  if ((get_softmodem_params()->do_ra || get_softmodem_params()->phy_test) && dl_antenna_ports > 1) // for MIMO, we use DMRS Config Type 2 but only with OAI UE
+    bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type=calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type));
+  else
+    bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type=NULL;
+  bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->maxLength=NULL;
+  bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->scramblingID0=NULL;
+  bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->scramblingID1=NULL;
+  if (!bwp->bwp_Dedicated->pdsch_Config) {
+    bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS=NULL;
+  }
+  bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition));
+  *bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition = NR_DMRS_DownlinkConfig__dmrs_AdditionalPosition_pos1;
+
+  bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList=calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList));
+
+  int n_ssb = 0;
+  NR_TCI_State_t *tcid[64];
+  for (int i=0;i<64;i++) {
+    if ((bitmap>>(63-i))&0x01){
+      tcid[i]=calloc(1,sizeof(*tcid[i]));
+      tcid[i]->tci_StateId=n_ssb;
+      tcid[i]->qcl_Type1.cell=NULL;
+      tcid[i]->qcl_Type1.bwp_Id=calloc(1,sizeof(*tcid[i]->qcl_Type1.bwp_Id));
+      *tcid[i]->qcl_Type1.bwp_Id=1;
+      tcid[i]->qcl_Type1.referenceSignal.present = NR_QCL_Info__referenceSignal_PR_ssb;
+      tcid[i]->qcl_Type1.referenceSignal.choice.ssb = i;
+      tcid[i]->qcl_Type1.qcl_Type=NR_QCL_Info__qcl_Type_typeC;
+      ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList->list,tcid[i]);
+      n_ssb++;
+    }
+  }
+
+  bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToReleaseList=NULL;
+  bwp->bwp_Dedicated->pdsch_Config->choice.setup->vrb_ToPRB_Interleaver=NULL;
+  bwp->bwp_Dedicated->pdsch_Config->choice.setup->resourceAllocation=NR_PDSCH_Config__resourceAllocation_resourceAllocationType1;
+  bwp->bwp_Dedicated->pdsch_Config->choice.setup->pdsch_TimeDomainAllocationList=NULL;
+  bwp->bwp_Dedicated->pdsch_Config->choice.setup->pdsch_AggregationFactor=NULL;
+  bwp->bwp_Dedicated->pdsch_Config->choice.setup->rateMatchPatternToAddModList=NULL;
+  bwp->bwp_Dedicated->pdsch_Config->choice.setup->rateMatchPatternToReleaseList=NULL;
+  bwp->bwp_Dedicated->pdsch_Config->choice.setup->rateMatchPatternGroup1=NULL;
+  bwp->bwp_Dedicated->pdsch_Config->choice.setup->rateMatchPatternGroup2=NULL;
+  bwp->bwp_Dedicated->pdsch_Config->choice.setup->rbg_Size=NR_PDSCH_Config__rbg_Size_config1;
+  set_dl_mcs_table(bwp->bwp_Common->genericParameters.subcarrierSpacing,
+                   configuration->force_256qam_off ? NULL : uecap,
+                   secondaryCellGroup->spCellConfig,
+                   bwp->bwp_Dedicated,
+                   servingcellconfigcommon);
+  bwp->bwp_Dedicated->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI));
+  *bwp->bwp_Dedicated->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI = NR_PDSCH_Config__maxNrofCodeWordsScheduledByDCI_n1;
+  bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.present = NR_PDSCH_Config__prb_BundlingType_PR_staticBundling;
+  bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling));
+  bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling->bundleSize =
+      calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling->bundleSize));
+  *bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling->bundleSize = NR_PDSCH_Config__prb_BundlingType__staticBundling__bundleSize_wideband;
+  bwp->bwp_Dedicated->pdsch_Config->choice.setup->zp_CSI_RS_ResourceToAddModList=NULL;
+  bwp->bwp_Dedicated->pdsch_Config->choice.setup->zp_CSI_RS_ResourceToReleaseList=NULL;
+  bwp->bwp_Dedicated->pdsch_Config->choice.setup->aperiodic_ZP_CSI_RS_ResourceSetsToAddModList=NULL;
+  bwp->bwp_Dedicated->pdsch_Config->choice.setup->aperiodic_ZP_CSI_RS_ResourceSetsToReleaseList=NULL;
+  bwp->bwp_Dedicated->pdsch_Config->choice.setup->sp_ZP_CSI_RS_ResourceSetsToAddModList=NULL;
+  bwp->bwp_Dedicated->pdsch_Config->choice.setup->sp_ZP_CSI_RS_ResourceSetsToReleaseList=NULL;
+  bwp->bwp_Dedicated->pdsch_Config->choice.setup->p_ZP_CSI_RS_ResourceSet=NULL;
+  bwp->bwp_Dedicated->sps_Config = NULL;
+  bwp->bwp_Dedicated->radioLinkMonitoringConfig = NULL;
+
+#if 0
+ bwp->bwp_Dedicated->radioLinkMonitoringConfig = calloc(1,sizeof(*bwp->bwp_Dedicated->radioLinkMonitoringConfig));
+ bwp->bwp_Dedicated->radioLinkMonitoringConfig->present = NR_SetupRelease_RadioLinkMonitoringConfig_PR_setup;
+ bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup = calloc(1,sizeof(*bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup));
+ bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup->failureDetectionResourcesToAddModList=NULL;
+ bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup->failureDetectionResourcesToReleaseList=NULL;
+ bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup->beamFailureInstanceMaxCount = calloc(1,sizeof(*bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup->beamFailureInstanceMaxCount));
+ *bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup->beamFailureInstanceMaxCount = NR_RadioLinkMonitoringConfig__beamFailureInstanceMaxCount_n3;
+ bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup->beamFailureDetectionTimer = calloc(1,sizeof(*bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup->beamFailureDetectionTimer));
+ *bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup->beamFailureDetectionTimer = NR_RadioLinkMonitoringConfig__beamFailureDetectionTimer_pbfd2;
+#endif
+
+}
+
+void fill_default_nsa_uplinkBWP(NR_BWP_Uplink_t *ubwp,
+                                long bwp_loop,
+                                NR_ServingCellConfig_t *servingcellconfigdedicated,
+                                NR_ServingCellConfigCommon_t *servingcellconfigcommon,
+                                const gNB_RrcConfigurationReq *configuration,
+                                int uid) {
+
+  /// BWP common configuration
+
+  ubwp->bwp_Common = calloc(1,sizeof(*ubwp->bwp_Common));
+
+  if(servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList &&
+     bwp_loop < servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.count) {
+    ubwp->bwp_Id = servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[bwp_loop]->bwp_Id;
+    ubwp->bwp_Common->genericParameters.locationAndBandwidth = servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[bwp_loop]->bwp_Common->genericParameters.locationAndBandwidth;
+    ubwp->bwp_Common->genericParameters.subcarrierSpacing = servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[bwp_loop]->bwp_Common->genericParameters.subcarrierSpacing;
+    ubwp->bwp_Common->genericParameters.cyclicPrefix = servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[bwp_loop]->bwp_Common->genericParameters.cyclicPrefix;
+  } else {
+    ubwp->bwp_Id=bwp_loop+1;
+    ubwp->bwp_Common->genericParameters.locationAndBandwidth = PRBalloc_to_locationandbandwidth(servingcellconfigcommon->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth,0);
+    ubwp->bwp_Common->genericParameters.subcarrierSpacing = servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->genericParameters.subcarrierSpacing;
+    ubwp->bwp_Common->genericParameters.cyclicPrefix = servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->genericParameters.cyclicPrefix;
+  }
+
+  ubwp->bwp_Common->rach_ConfigCommon  = servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon;
+  ubwp->bwp_Common->pusch_ConfigCommon = servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon;
+  ubwp->bwp_Common->pucch_ConfigCommon = servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->pucch_ConfigCommon;
+
+  /// BWP dedicated configuration
+
+  if (!ubwp->bwp_Dedicated)
+    ubwp->bwp_Dedicated = calloc(1,sizeof(*ubwp->bwp_Dedicated));
+
+  int curr_bwp = NRRIV2BW(ubwp->bwp_Common->genericParameters.locationAndBandwidth,275);
+
+  ubwp->bwp_Dedicated->pucch_Config = calloc(1,sizeof(*ubwp->bwp_Dedicated->pucch_Config));
+  ubwp->bwp_Dedicated->pucch_Config->present = NR_SetupRelease_PUCCH_Config_PR_setup;
+  NR_PUCCH_Config_t *pucch_Config = calloc(1,sizeof(*pucch_Config));
+  ubwp->bwp_Dedicated->pucch_Config->choice.setup=pucch_Config;
+
+  pucch_Config->resourceSetToAddModList = calloc(1,sizeof(*pucch_Config->resourceSetToAddModList));
+  pucch_Config->resourceSetToReleaseList = NULL;
+  pucch_Config->resourceToAddModList = calloc(1,sizeof(*pucch_Config->resourceToAddModList));
+  pucch_Config->resourceToReleaseList = NULL;
+  config_pucch_resset0(pucch_Config, uid, curr_bwp, NULL);
+  config_pucch_resset1(pucch_Config, NULL);
+  set_pucch_power_config(pucch_Config, configuration->do_CSIRS);
+
+  scheduling_request_config(servingcellconfigcommon, pucch_Config);
+  set_dl_DataToUL_ACK(pucch_Config, configuration->minRXTXTIME);
+
+  ubwp->bwp_Dedicated->pusch_Config = calloc(1,sizeof(*ubwp->bwp_Dedicated->pusch_Config));
+  ubwp->bwp_Dedicated->pusch_Config->present = NR_SetupRelease_PUSCH_Config_PR_setup;
+  NR_PUSCH_Config_t *pusch_Config = NULL;
+  if(servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList &&
+     bwp_loop < servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.count) {
+    pusch_Config = servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[bwp_loop]->bwp_Dedicated->pusch_Config->choice.setup;
+  } else {
+    pusch_Config = calloc(1,sizeof(*pusch_Config));
+  }
+  ubwp->bwp_Dedicated->pusch_Config->choice.setup = pusch_Config;
+  pusch_Config->txConfig=calloc(1,sizeof(*pusch_Config->txConfig));
+  *pusch_Config->txConfig= NR_PUSCH_Config__txConfig_codebook;
+  pusch_Config->dmrs_UplinkForPUSCH_MappingTypeA = NULL;
+  if (!pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB) {
+    pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB = calloc(1,sizeof(*pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB));
+    pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->present = NR_SetupRelease_DMRS_UplinkConfig_PR_setup;
+    pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup = calloc(1,sizeof(*pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup));
+  }
+  NR_DMRS_UplinkConfig_t *NR_DMRS_UplinkConfig = pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup;
+  NR_DMRS_UplinkConfig->dmrs_Type = NULL;
+  NR_DMRS_UplinkConfig->dmrs_AdditionalPosition = calloc(1,sizeof(*NR_DMRS_UplinkConfig->dmrs_AdditionalPosition));
+  *NR_DMRS_UplinkConfig->dmrs_AdditionalPosition = NR_DMRS_UplinkConfig__dmrs_AdditionalPosition_pos0;
+  if (!servingcellconfigdedicated) {
+    NR_DMRS_UplinkConfig->phaseTrackingRS=NULL;
+  }
+  NR_DMRS_UplinkConfig->maxLength=NULL;
+  NR_DMRS_UplinkConfig->transformPrecodingDisabled = calloc(1,sizeof(*NR_DMRS_UplinkConfig->transformPrecodingDisabled));
+  NR_DMRS_UplinkConfig->transformPrecodingDisabled->scramblingID0 = NULL;
+  NR_DMRS_UplinkConfig->transformPrecodingDisabled->scramblingID1 = NULL;
+  NR_DMRS_UplinkConfig->transformPrecodingEnabled = NULL;
+  pusch_Config->pusch_PowerControl = calloc(1,sizeof(*pusch_Config->pusch_PowerControl));
+  pusch_Config->pusch_PowerControl->tpc_Accumulation = NULL;
+  pusch_Config->pusch_PowerControl->msg3_Alpha = calloc(1,sizeof(*pusch_Config->pusch_PowerControl->msg3_Alpha));
+  *pusch_Config->pusch_PowerControl->msg3_Alpha = NR_Alpha_alpha1;
+  pusch_Config->pusch_PowerControl->p0_NominalWithoutGrant = NULL;
+  pusch_Config->pusch_PowerControl->p0_AlphaSets = calloc(1,sizeof(*pusch_Config->pusch_PowerControl->p0_AlphaSets));
+  NR_P0_PUSCH_AlphaSet_t *aset = calloc(1,sizeof(*aset));
+  aset->p0_PUSCH_AlphaSetId=0;
+  aset->p0=calloc(1,sizeof(*aset->p0));
+  *aset->p0 = 0;
+  aset->alpha=calloc(1,sizeof(*aset->alpha));
+  *aset->alpha=NR_Alpha_alpha1;
+  ASN_SEQUENCE_ADD(&pusch_Config->pusch_PowerControl->p0_AlphaSets->list,aset);
+  pusch_Config->pusch_PowerControl->pathlossReferenceRSToAddModList = NULL;
+  pusch_Config->pusch_PowerControl->pathlossReferenceRSToReleaseList = NULL;
+  pusch_Config->pusch_PowerControl->twoPUSCH_PC_AdjustmentStates = NULL;
+  pusch_Config->pusch_PowerControl->deltaMCS = NULL;
+  pusch_Config->pusch_PowerControl->sri_PUSCH_MappingToAddModList = NULL;
+  pusch_Config->pusch_PowerControl->sri_PUSCH_MappingToReleaseList = NULL;
+  pusch_Config->frequencyHopping=NULL;
+  pusch_Config->frequencyHoppingOffsetLists=NULL;
+  pusch_Config->resourceAllocation = NR_PUSCH_Config__resourceAllocation_resourceAllocationType1;
+  pusch_Config->pusch_TimeDomainAllocationList = NULL;
+  pusch_Config->pusch_AggregationFactor=NULL;
+  pusch_Config->mcs_Table=NULL;
+  pusch_Config->transformPrecoder= NULL;
+  pusch_Config->mcs_TableTransformPrecoder=NULL;
+  /* if msg3_transformprecoding is set in conf file - pusch config should not disable it */
+  if (servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg3_transformPrecoder == NULL) {
+    pusch_Config->transformPrecoder=calloc(1,sizeof(*pusch_Config->transformPrecoder));
+    *pusch_Config->transformPrecoder = NR_PUSCH_Config__transformPrecoder_disabled;
+  }
+  pusch_Config->codebookSubset=calloc(1,sizeof(*pusch_Config->codebookSubset));
+  *pusch_Config->codebookSubset = NR_PUSCH_Config__codebookSubset_nonCoherent;
+  pusch_Config->maxRank=calloc(1,sizeof(*pusch_Config->maxRank));
+  *pusch_Config->maxRank= 1;
+  pusch_Config->rbg_Size=NULL;
+  pusch_Config->uci_OnPUSCH=NULL;
+  pusch_Config->tp_pi2BPSK=NULL;
+
+  ubwp->bwp_Dedicated->srs_Config = calloc(1,sizeof(*ubwp->bwp_Dedicated->srs_Config));
+  ubwp->bwp_Dedicated->srs_Config->present = NR_SetupRelease_SRS_Config_PR_setup;
+  NR_SRS_Config_t *srs_Config = calloc(1,sizeof(*srs_Config));
+  ubwp->bwp_Dedicated->srs_Config->choice.setup = srs_Config;
+  srs_Config->srs_ResourceSetToReleaseList=NULL;
+  srs_Config->srs_ResourceSetToAddModList=calloc(1,sizeof(*srs_Config->srs_ResourceSetToAddModList));
+  NR_SRS_ResourceSet_t *srs_resset0=calloc(1,sizeof(*srs_resset0));
+  srs_resset0->srs_ResourceSetId = 0;
+  srs_resset0->srs_ResourceIdList=calloc(1,sizeof(*srs_resset0->srs_ResourceIdList));
+  NR_SRS_ResourceId_t *srs_resset0_id=calloc(1,sizeof(*srs_resset0_id));
+  *srs_resset0_id=0;
+  ASN_SEQUENCE_ADD(&srs_resset0->srs_ResourceIdList->list,srs_resset0_id);
+  srs_Config->srs_ResourceToReleaseList=NULL;
+
+  if(configuration->do_SRS) {
+    srs_resset0->resourceType.present =  NR_SRS_ResourceSet__resourceType_PR_periodic;
+    srs_resset0->resourceType.choice.periodic = calloc(1,sizeof(*srs_resset0->resourceType.choice.periodic));
+    srs_resset0->resourceType.choice.periodic->associatedCSI_RS = NULL;
+  } else {
+    srs_resset0->resourceType.present =  NR_SRS_ResourceSet__resourceType_PR_aperiodic;
+    srs_resset0->resourceType.choice.aperiodic = calloc(1,sizeof(*srs_resset0->resourceType.choice.aperiodic));
+    srs_resset0->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger=1;
+    srs_resset0->resourceType.choice.aperiodic->csi_RS=NULL;
+    srs_resset0->resourceType.choice.aperiodic->slotOffset= calloc(1,sizeof(*srs_resset0->resourceType.choice.aperiodic->slotOffset));
+    *srs_resset0->resourceType.choice.aperiodic->slotOffset=2;
+    srs_resset0->resourceType.choice.aperiodic->ext1=NULL;
+  }
+
+  srs_resset0->usage=NR_SRS_ResourceSet__usage_codebook;
+  srs_resset0->alpha = calloc(1,sizeof(*srs_resset0->alpha));
+  *srs_resset0->alpha = NR_Alpha_alpha1;
+  srs_resset0->p0=calloc(1,sizeof(*srs_resset0->p0));
+  *srs_resset0->p0=-80;
+  srs_resset0->pathlossReferenceRS=NULL;
+  srs_resset0->srs_PowerControlAdjustmentStates=NULL;
+  ASN_SEQUENCE_ADD(&srs_Config->srs_ResourceSetToAddModList->list,srs_resset0);
+  srs_Config->srs_ResourceToReleaseList=NULL;
+  srs_Config->srs_ResourceToAddModList=calloc(1,sizeof(*srs_Config->srs_ResourceToAddModList));
+  NR_SRS_Resource_t *srs_res0=calloc(1,sizeof(*srs_res0));
+  srs_res0->srs_ResourceId=0;
+  srs_res0->nrofSRS_Ports=NR_SRS_Resource__nrofSRS_Ports_port1;
+  srs_res0->ptrs_PortIndex=NULL;
+  srs_res0->transmissionComb.present=NR_SRS_Resource__transmissionComb_PR_n2;
+  srs_res0->transmissionComb.choice.n2=calloc(1,sizeof(*srs_res0->transmissionComb.choice.n2));
+  srs_res0->transmissionComb.choice.n2->combOffset_n2=0;
+  srs_res0->transmissionComb.choice.n2->cyclicShift_n2=0;
+  srs_res0->resourceMapping.startPosition = 2 + uid%2;
+  srs_res0->resourceMapping.nrofSymbols=NR_SRS_Resource__resourceMapping__nrofSymbols_n1;
+  srs_res0->resourceMapping.repetitionFactor=NR_SRS_Resource__resourceMapping__repetitionFactor_n1;
+  srs_res0->freqDomainPosition=0;
+  srs_res0->freqDomainShift=0;
+  srs_res0->freqHopping.b_SRS=0;
+  srs_res0->freqHopping.b_hop=0;
+  srs_res0->freqHopping.c_SRS = rrc_get_max_nr_csrs(
+      NRRIV2BW(servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, 275),
+      srs_res0->freqHopping.b_SRS);
+  srs_res0->groupOrSequenceHopping=NR_SRS_Resource__groupOrSequenceHopping_neither;
+
+  if(configuration->do_SRS) {
+    srs_res0->resourceType.present= NR_SRS_Resource__resourceType_PR_periodic;
+    srs_res0->resourceType.choice.periodic=calloc(1,sizeof(*srs_res0->resourceType.choice.periodic));
+    srs_res0->resourceType.choice.periodic->periodicityAndOffset_p.present = NR_SRS_PeriodicityAndOffset_PR_sl160;
+    srs_res0->resourceType.choice.periodic->periodicityAndOffset_p.choice.sl160 = 17 + (uid>1)*10; // 17/17/.../147/157 are mixed slots
+  } else {
+    srs_res0->resourceType.present= NR_SRS_Resource__resourceType_PR_aperiodic;
+    srs_res0->resourceType.choice.aperiodic=calloc(1,sizeof(*srs_res0->resourceType.choice.aperiodic));
+  }
+
+  srs_res0->sequenceId=40;
+  srs_res0->spatialRelationInfo=calloc(1,sizeof(*srs_res0->spatialRelationInfo));
+  srs_res0->spatialRelationInfo->servingCellId=NULL;
+  srs_res0->spatialRelationInfo->referenceSignal.present=NR_SRS_SpatialRelationInfo__referenceSignal_PR_csi_RS_Index;
+  srs_res0->spatialRelationInfo->referenceSignal.choice.csi_RS_Index=0;
+  ASN_SEQUENCE_ADD(&srs_Config->srs_ResourceToAddModList->list,srs_res0);
+
+  ubwp->bwp_Dedicated->configuredGrantConfig = NULL;
+  ubwp->bwp_Dedicated->beamFailureRecoveryConfig = NULL;
+
+}
 
 void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellconfigcommon,
                                      NR_ServingCellConfig_t *servingcellconfigdedicated,
@@ -57,8 +512,8 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
                                      int scg_id,
                                      int servCellIndex,
                                      const gNB_RrcConfigurationReq *configuration,
-                                     int uid)
-{
+                                     int uid) {
+
   const rrc_pdsch_AntennaPorts_t* pdschap = &configuration->pdsch_AntennaPorts;
   const int dl_antenna_ports = pdschap->N1 * pdschap->N2 * pdschap->XP;
   const int do_csirs = configuration->do_CSIRS;
@@ -74,22 +529,8 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
   // where the startPosition = 2 or 3 and sl160 = 17, 17, 27 ... 157 only give us 30 different allocations.
   AssertFatal(uid>=0 && uid<30, "gNB cannot allocate the SRS resources\n");
 
-  uint64_t bitmap=0;
-  switch (servingcellconfigcommon->ssb_PositionsInBurst->present) {
-    case 1 :
-      bitmap = ((uint64_t) servingcellconfigcommon->ssb_PositionsInBurst->choice.shortBitmap.buf[0])<<56;
-      break;
-    case 2 :
-      bitmap = ((uint64_t) servingcellconfigcommon->ssb_PositionsInBurst->choice.mediumBitmap.buf[0])<<56;
-      break;
-    case 3 :
-      for (int i=0; i<8; i++) {
-        bitmap |= (((uint64_t) servingcellconfigcommon->ssb_PositionsInBurst->choice.longBitmap.buf[i])<<((7-i)*8));
-      }
-      break;
-    default:
-      AssertFatal(1==0,"SSB bitmap size value %d undefined (allowed values 1,2,3) \n", servingcellconfigcommon->ssb_PositionsInBurst->present);
-  }
+  uint64_t bitmap = get_ssb_bitmap(servingcellconfigcommon);
+  fix_servingcellconfigdedicated(servingcellconfigdedicated);
 
   memset(secondaryCellGroup,0,sizeof(NR_CellGroupConfig_t));
   secondaryCellGroup->cellGroupId = scg_id;
@@ -102,40 +543,33 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
   secondaryCellGroup->rlc_BearerToAddModList = calloc(1,sizeof(*secondaryCellGroup->rlc_BearerToAddModList));
   ASN_SEQUENCE_ADD(&secondaryCellGroup->rlc_BearerToAddModList->list, RLC_BearerConfig);
 
-  secondaryCellGroup->mac_CellGroupConfig=calloc(1,sizeof(*secondaryCellGroup->mac_CellGroupConfig));
-  secondaryCellGroup->mac_CellGroupConfig->drx_Config = NULL;
-  secondaryCellGroup->mac_CellGroupConfig->schedulingRequestConfig = calloc(1,sizeof(*secondaryCellGroup->mac_CellGroupConfig->schedulingRequestConfig));
-  secondaryCellGroup->mac_CellGroupConfig->schedulingRequestConfig->schedulingRequestToAddModList = calloc(1,sizeof(*secondaryCellGroup->mac_CellGroupConfig->schedulingRequestConfig->schedulingRequestToAddModList));
-  NR_SchedulingRequestToAddMod_t *SchedulingRequestConf = calloc(1,sizeof(*SchedulingRequestConf));
-  SchedulingRequestConf->schedulingRequestId = 0;  //Could be changed
-  SchedulingRequestConf->sr_ProhibitTimer = calloc(1,sizeof(*SchedulingRequestConf->sr_ProhibitTimer));
-  *SchedulingRequestConf->sr_ProhibitTimer = NR_SchedulingRequestToAddMod__sr_ProhibitTimer_ms16;
-  SchedulingRequestConf->sr_TransMax = NR_SchedulingRequestToAddMod__sr_TransMax_n32;
-  ASN_SEQUENCE_ADD(&secondaryCellGroup->mac_CellGroupConfig->schedulingRequestConfig->schedulingRequestToAddModList->list,SchedulingRequestConf);
-  secondaryCellGroup->mac_CellGroupConfig->schedulingRequestConfig->schedulingRequestToReleaseList = NULL;
-
-  secondaryCellGroup->mac_CellGroupConfig->bsr_Config=calloc(1,sizeof(*secondaryCellGroup->mac_CellGroupConfig->bsr_Config));
-  secondaryCellGroup->mac_CellGroupConfig->bsr_Config->periodicBSR_Timer = NR_BSR_Config__periodicBSR_Timer_sf10;
-  secondaryCellGroup->mac_CellGroupConfig->bsr_Config->retxBSR_Timer     = NR_BSR_Config__retxBSR_Timer_sf160;
-  secondaryCellGroup->mac_CellGroupConfig->tag_Config=calloc(1,sizeof(*secondaryCellGroup->mac_CellGroupConfig->tag_Config));
-  secondaryCellGroup->mac_CellGroupConfig->tag_Config->tag_ToReleaseList = NULL;
-  secondaryCellGroup->mac_CellGroupConfig->tag_Config->tag_ToAddModList  = calloc(1,sizeof(*secondaryCellGroup->mac_CellGroupConfig->tag_Config->tag_ToAddModList));
+  NR_MAC_CellGroupConfig_t *mac_CellGroupConfig = secondaryCellGroup->mac_CellGroupConfig;
+
+  mac_CellGroupConfig=calloc(1,sizeof(*mac_CellGroupConfig));
+  mac_CellGroupConfig->drx_Config = NULL;
+
+  mac_CellGroupConfig->bsr_Config=calloc(1,sizeof(*mac_CellGroupConfig->bsr_Config));
+  mac_CellGroupConfig->bsr_Config->periodicBSR_Timer = NR_BSR_Config__periodicBSR_Timer_sf10;
+  mac_CellGroupConfig->bsr_Config->retxBSR_Timer     = NR_BSR_Config__retxBSR_Timer_sf160;
+  mac_CellGroupConfig->tag_Config=calloc(1,sizeof(*mac_CellGroupConfig->tag_Config));
+  mac_CellGroupConfig->tag_Config->tag_ToReleaseList = NULL;
+  mac_CellGroupConfig->tag_Config->tag_ToAddModList  = calloc(1,sizeof(*mac_CellGroupConfig->tag_Config->tag_ToAddModList));
   struct NR_TAG *tag=calloc(1,sizeof(*tag));
   tag->tag_Id             = 0;
   tag->timeAlignmentTimer = NR_TimeAlignmentTimer_infinity;
-  ASN_SEQUENCE_ADD(&secondaryCellGroup->mac_CellGroupConfig->tag_Config->tag_ToAddModList->list,tag);
-  secondaryCellGroup->mac_CellGroupConfig->phr_Config  = calloc(1,sizeof(*secondaryCellGroup->mac_CellGroupConfig->phr_Config));
-  secondaryCellGroup->mac_CellGroupConfig->phr_Config->present = NR_SetupRelease_PHR_Config_PR_setup;
-  secondaryCellGroup->mac_CellGroupConfig->phr_Config->choice.setup  = calloc(1,sizeof(*secondaryCellGroup->mac_CellGroupConfig->phr_Config->choice.setup));
-  secondaryCellGroup->mac_CellGroupConfig->phr_Config->choice.setup->phr_PeriodicTimer = NR_PHR_Config__phr_PeriodicTimer_sf20;
-  secondaryCellGroup->mac_CellGroupConfig->phr_Config->choice.setup->phr_ProhibitTimer = NR_PHR_Config__phr_ProhibitTimer_sf0;
-  secondaryCellGroup->mac_CellGroupConfig->phr_Config->choice.setup->phr_Tx_PowerFactorChange = NR_PHR_Config__phr_Tx_PowerFactorChange_dB3;
-  secondaryCellGroup->mac_CellGroupConfig->phr_Config->choice.setup->multiplePHR=false;
-  secondaryCellGroup->mac_CellGroupConfig->phr_Config->choice.setup->dummy=false;
-  secondaryCellGroup->mac_CellGroupConfig->phr_Config->choice.setup->phr_Type2OtherCell = false;
-  secondaryCellGroup->mac_CellGroupConfig->phr_Config->choice.setup->phr_ModeOtherCG = NR_PHR_Config__phr_ModeOtherCG_real;
-  secondaryCellGroup->mac_CellGroupConfig->skipUplinkTxDynamic=false;
-  secondaryCellGroup->mac_CellGroupConfig->ext1 = NULL;
+  ASN_SEQUENCE_ADD(&mac_CellGroupConfig->tag_Config->tag_ToAddModList->list,tag);
+  mac_CellGroupConfig->phr_Config  = calloc(1,sizeof(*mac_CellGroupConfig->phr_Config));
+  mac_CellGroupConfig->phr_Config->present = NR_SetupRelease_PHR_Config_PR_setup;
+  mac_CellGroupConfig->phr_Config->choice.setup  = calloc(1,sizeof(*mac_CellGroupConfig->phr_Config->choice.setup));
+  mac_CellGroupConfig->phr_Config->choice.setup->phr_PeriodicTimer = NR_PHR_Config__phr_PeriodicTimer_sf20;
+  mac_CellGroupConfig->phr_Config->choice.setup->phr_ProhibitTimer = NR_PHR_Config__phr_ProhibitTimer_sf0;
+  mac_CellGroupConfig->phr_Config->choice.setup->phr_Tx_PowerFactorChange = NR_PHR_Config__phr_Tx_PowerFactorChange_dB3;
+  mac_CellGroupConfig->phr_Config->choice.setup->multiplePHR=false;
+  mac_CellGroupConfig->phr_Config->choice.setup->dummy=false;
+  mac_CellGroupConfig->phr_Config->choice.setup->phr_Type2OtherCell = false;
+  mac_CellGroupConfig->phr_Config->choice.setup->phr_ModeOtherCG = NR_PHR_Config__phr_ModeOtherCG_real;
+  mac_CellGroupConfig->skipUplinkTxDynamic=false;
+  mac_CellGroupConfig->ext1 = NULL;
   secondaryCellGroup->physicalCellGroupConfig = calloc(1,sizeof(*secondaryCellGroup->physicalCellGroupConfig));
   secondaryCellGroup->physicalCellGroupConfig->harq_ACK_SpatialBundlingPUCCH=NULL;
   secondaryCellGroup->physicalCellGroupConfig->harq_ACK_SpatialBundlingPUSCH=NULL;
@@ -198,12 +632,12 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
   secondaryCellGroup->spCellConfig->rlf_TimersAndConstants->choice.setup->ext1 = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->rlf_TimersAndConstants->choice.setup->ext1));
   secondaryCellGroup->spCellConfig->rlf_TimersAndConstants->choice.setup->ext1->t311 = NR_RLF_TimersAndConstants__ext1__t311_ms30000;
   secondaryCellGroup->spCellConfig->rlmInSyncOutOfSyncThreshold                   = NULL;
-  if (servingcellconfigdedicated) {
-    secondaryCellGroup->spCellConfig->spCellConfigDedicated = servingcellconfigdedicated;
-  } else {
-    secondaryCellGroup->spCellConfig->spCellConfigDedicated = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated));
-  }
+
+  secondaryCellGroup->spCellConfig->spCellConfigDedicated = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated));
   secondaryCellGroup->spCellConfig->spCellConfigDedicated->tdd_UL_DL_ConfigurationDedicated = NULL;
+
+  /// initialDownlinkBWP
+
   secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP));
   secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdcch_Config=NULL;
   secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config=calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config));
@@ -225,7 +659,6 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
  secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition));
  *secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition = NR_DMRS_DownlinkConfig__dmrs_AdditionalPosition_pos1;
 
-
  secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->tci_StatesToAddModList=calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->tci_StatesToAddModList));
 
  int n_ssb = 0;
@@ -245,7 +678,6 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
    }
  }
 
-
 #if 0
 
  NR_TCI_State_t*tci0=calloc(1,sizeof(*tci0));
@@ -371,406 +803,129 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
  *secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->radioLinkMonitoringConfig->choice.setup->beamFailureDetectionTimer = NR_RadioLinkMonitoringConfig__beamFailureDetectionTimer_pbfd2;
 #endif
 
- secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToReleaseList= NULL;
- 
- NR_BWP_Downlink_t *bwp = NULL;
- if (servingcellconfigdedicated) {
-   bwp=servingcellconfigdedicated->downlinkBWP_ToAddModList->list.array[0];
- } else {
-   secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList));
-
-   bwp=calloc(1,sizeof(*bwp));
- }
- bwp->bwp_Id=1;
- bwp->bwp_Common=calloc(1,sizeof(*bwp->bwp_Common));
- // copy common BWP size from initial BWP except for bandwdith
- memcpy((void*)&bwp->bwp_Common->genericParameters,
-	&servingcellconfigcommon->downlinkConfigCommon->initialDownlinkBWP->genericParameters,
-	sizeof(bwp->bwp_Common->genericParameters));
- bwp->bwp_Common->genericParameters.locationAndBandwidth=PRBalloc_to_locationandbandwidth(servingcellconfigcommon->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth,0);
-
- 
- bwp->bwp_Common->pdcch_ConfigCommon=calloc(1,sizeof(*bwp->bwp_Common->pdcch_ConfigCommon));
- bwp->bwp_Common->pdcch_ConfigCommon->present = NR_SetupRelease_PDCCH_ConfigCommon_PR_setup;
- bwp->bwp_Common->pdcch_ConfigCommon->choice.setup = calloc(1,sizeof(*bwp->bwp_Common->pdcch_ConfigCommon->choice.setup));
- bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->controlResourceSetZero=NULL;
- bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonControlResourceSet=calloc(1,sizeof(*bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonControlResourceSet));
-
- int curr_bwp = NRRIV2BW(bwp->bwp_Common->genericParameters.locationAndBandwidth,275);
-
- NR_ControlResourceSet_t *coreset = calloc(1,sizeof(*coreset));
- coreset->controlResourceSetId=1;
- // frequency domain resources depends on BWP size
- // options are 24, 48 or 96
- coreset->frequencyDomainResources.buf = calloc(1,6);
- if (curr_bwp < 48)
-   coreset->frequencyDomainResources.buf[0] = 0xf0;
- else
-   coreset->frequencyDomainResources.buf[0] = 0xff;
- if (curr_bwp < 96)
-   coreset->frequencyDomainResources.buf[1] = 0;
- else
-   coreset->frequencyDomainResources.buf[1] = 0xff;
- coreset->frequencyDomainResources.buf[2] = 0;
- coreset->frequencyDomainResources.buf[3] = 0;
- coreset->frequencyDomainResources.buf[4] = 0;
- coreset->frequencyDomainResources.buf[5] = 0;
- coreset->frequencyDomainResources.size = 6;
- coreset->frequencyDomainResources.bits_unused = 3;
- coreset->duration=1;
- coreset->cce_REG_MappingType.present = NR_ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved;
- coreset->precoderGranularity = NR_ControlResourceSet__precoderGranularity_sameAsREG_bundle;
-
- coreset->tci_StatesPDCCH_ToAddList=calloc(1,sizeof(*coreset->tci_StatesPDCCH_ToAddList));
- NR_TCI_StateId_t *tci[64];
- for (int i=0;i<64;i++) {
-   if ((bitmap>>(63-i))&0x01){
-     tci[i]=calloc(1,sizeof(*tci[i]));
-     *tci[i] = i;
-     ASN_SEQUENCE_ADD(&coreset->tci_StatesPDCCH_ToAddList->list,tci[i]);
-   }
- }
- coreset->tci_StatesPDCCH_ToReleaseList = NULL;
- coreset->tci_PresentInDCI = NULL;
- coreset->pdcch_DMRS_ScramblingID = NULL;
-
- bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonControlResourceSet = coreset;
-
- bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->searchSpaceZero=NULL;
- bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList=NULL;
- bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList=calloc(1,sizeof(*bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList));
-
- NR_SearchSpace_t *ss=calloc(1,sizeof(*ss));
- ss->searchSpaceId = 1;
- ss->controlResourceSetId=calloc(1,sizeof(*ss->controlResourceSetId));
- *ss->controlResourceSetId=1;
- ss->monitoringSlotPeriodicityAndOffset = calloc(1,sizeof(*ss->monitoringSlotPeriodicityAndOffset));
- ss->monitoringSlotPeriodicityAndOffset->present = NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
- ss->duration=NULL; 
- ss->monitoringSymbolsWithinSlot = calloc(1,sizeof(*ss->monitoringSymbolsWithinSlot));
- ss->monitoringSymbolsWithinSlot->buf = calloc(1,2);
- // should be '1100 0000 0000 00'B (LSB first!), first two symols in slot, adjust if needed
- ss->monitoringSymbolsWithinSlot->buf[1] = 0;
- ss->monitoringSymbolsWithinSlot->buf[0] = (1<<7) | (1<<6);
- ss->monitoringSymbolsWithinSlot->size = 2;
- ss->monitoringSymbolsWithinSlot->bits_unused = 2;
- ss->nrofCandidates = calloc(1,sizeof(*ss->nrofCandidates));
- ss->nrofCandidates->aggregationLevel1 = NR_SearchSpace__nrofCandidates__aggregationLevel1_n0;
- ss->nrofCandidates->aggregationLevel2 = NR_SearchSpace__nrofCandidates__aggregationLevel2_n0;
- ss->nrofCandidates->aggregationLevel4 = NR_SearchSpace__nrofCandidates__aggregationLevel4_n1;
- ss->nrofCandidates->aggregationLevel8 = NR_SearchSpace__nrofCandidates__aggregationLevel8_n0;
- ss->nrofCandidates->aggregationLevel16 = NR_SearchSpace__nrofCandidates__aggregationLevel16_n0;
- ss->searchSpaceType = calloc(1,sizeof(*ss->searchSpaceType));
- ss->searchSpaceType->present = NR_SearchSpace__searchSpaceType_PR_common;
- ss->searchSpaceType->choice.common=calloc(1,sizeof(*ss->searchSpaceType->choice.common));
- ss->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0 = calloc(1,sizeof(*ss->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0));
-
- ASN_SEQUENCE_ADD(&bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList->list,ss);
-
- bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->searchSpaceSIB1=NULL;
- if(get_softmodem_params()->sa) {
-   bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->searchSpaceSIB1=calloc(1,sizeof(*bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->searchSpaceSIB1));
-   *bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->searchSpaceSIB1=0;
- }
- bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->searchSpaceOtherSystemInformation=NULL;
- bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->pagingSearchSpace=NULL;
- bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->ra_SearchSpace=calloc(1,sizeof(*bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->ra_SearchSpace));
- *bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->ra_SearchSpace=1;
- bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->ext1=NULL;
-
- bwp->bwp_Common->pdsch_ConfigCommon=calloc(1,sizeof(*bwp->bwp_Common->pdsch_ConfigCommon));
- bwp->bwp_Common->pdsch_ConfigCommon->present = NR_SetupRelease_PDSCH_ConfigCommon_PR_setup;
- bwp->bwp_Common->pdsch_ConfigCommon->choice.setup = calloc(1,sizeof(*bwp->bwp_Common->pdsch_ConfigCommon->choice.setup));
- bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList = calloc(1,sizeof(*bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList));
-
- // copy PDSCH TimeDomainResourceAllocation from InitialBWP
- 
- NR_PDSCH_TimeDomainResourceAllocation_t *pdschi;
- for (int i=0;i<servingcellconfigcommon->downlinkConfigCommon->initialDownlinkBWP->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list.count;i++) {
-   pdschi= calloc(1,sizeof(*pdschi));
-   if(servingcellconfigcommon->downlinkConfigCommon->initialDownlinkBWP->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list.array[i]->k0){
-     pdschi->k0 = calloc(1,sizeof(*pdschi->k0));
-     *pdschi->k0 = *servingcellconfigcommon->downlinkConfigCommon->initialDownlinkBWP->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list.array[i]->k0;
-   }
-   pdschi->mappingType = servingcellconfigcommon->downlinkConfigCommon->initialDownlinkBWP->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list.array[i]->mappingType;
-   pdschi->startSymbolAndLength = servingcellconfigcommon->downlinkConfigCommon->initialDownlinkBWP->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list.array[i]->startSymbolAndLength;
-   ASN_SEQUENCE_ADD(&bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list,pdschi);
- }
-
- if (!servingcellconfigdedicated) {
-   bwp->bwp_Dedicated=calloc(1,sizeof(*bwp->bwp_Dedicated));
- }
- bwp->bwp_Dedicated->pdcch_Config=calloc(1,sizeof(*bwp->bwp_Dedicated->pdcch_Config));
- bwp->bwp_Dedicated->pdcch_Config->present = NR_SetupRelease_PDCCH_Config_PR_setup;
- bwp->bwp_Dedicated->pdcch_Config->choice.setup = calloc(1,sizeof(*bwp->bwp_Dedicated->pdcch_Config->choice.setup));
- bwp->bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList = calloc(1,sizeof(*bwp->bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList));
-
- ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList->list,
-		  coreset);
-
- bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList = calloc(1,sizeof(*bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList));
-
- NR_SearchSpace_t *ss2 = calloc(1,sizeof(*ss2));
-
- ss2->searchSpaceId=2;
- ss2->controlResourceSetId=calloc(1,sizeof(*ss2->controlResourceSetId));
- *ss2->controlResourceSetId=1;
- ss2->monitoringSlotPeriodicityAndOffset=calloc(1,sizeof(*ss2->monitoringSlotPeriodicityAndOffset));
- ss2->monitoringSlotPeriodicityAndOffset->present = NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
- ss2->monitoringSlotPeriodicityAndOffset->choice.sl1=(NULL_t)0;
- ss2->duration=NULL;
- ss2->monitoringSymbolsWithinSlot = calloc(1,sizeof(*ss2->monitoringSymbolsWithinSlot));
- ss2->monitoringSymbolsWithinSlot->buf = calloc(1,2);
- ss2->monitoringSymbolsWithinSlot->size = 2;
- ss2->monitoringSymbolsWithinSlot->bits_unused = 2;
- ss2->monitoringSymbolsWithinSlot->buf[0]=0xc0;
- ss2->monitoringSymbolsWithinSlot->buf[1]=0x0;
- ss2->nrofCandidates=calloc(1,sizeof(*ss2->nrofCandidates));
- ss2->nrofCandidates->aggregationLevel1 = NR_SearchSpace__nrofCandidates__aggregationLevel1_n0;
- ss2->nrofCandidates->aggregationLevel2 = NR_SearchSpace__nrofCandidates__aggregationLevel2_n0;
- if (curr_bwp < 48)
-   ss2->nrofCandidates->aggregationLevel4 = NR_SearchSpace__nrofCandidates__aggregationLevel4_n1;
- else if (curr_bwp < 96)
-   ss2->nrofCandidates->aggregationLevel4 = NR_SearchSpace__nrofCandidates__aggregationLevel4_n2;
- else
-   ss2->nrofCandidates->aggregationLevel4 = NR_SearchSpace__nrofCandidates__aggregationLevel4_n4;
- ss2->nrofCandidates->aggregationLevel8 = NR_SearchSpace__nrofCandidates__aggregationLevel8_n0;
- ss2->nrofCandidates->aggregationLevel16 = NR_SearchSpace__nrofCandidates__aggregationLevel16_n0;
- ss2->searchSpaceType=calloc(1,sizeof(*ss2->searchSpaceType));
- ss2->searchSpaceType->present = NR_SearchSpace__searchSpaceType_PR_ue_Specific;
- ss2->searchSpaceType->choice.ue_Specific = calloc(1,sizeof(*ss2->searchSpaceType->choice.ue_Specific));
- ss2->searchSpaceType->choice.ue_Specific->dci_Formats=NR_SearchSpace__searchSpaceType__ue_Specific__dci_Formats_formats0_1_And_1_1;
-
- ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList->list,
-		  ss2);
-
-
- bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToReleaseList = NULL;
-
- if (!servingcellconfigdedicated) {
-  bwp->bwp_Dedicated->pdsch_Config = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config));
-
-  bwp->bwp_Dedicated->pdsch_Config->present = NR_SetupRelease_PDSCH_Config_PR_setup;
-  bwp->bwp_Dedicated->pdsch_Config->choice.setup = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup));
-  bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA));
-  bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->present= NR_SetupRelease_DMRS_DownlinkConfig_PR_setup;
-
-  bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup));
- }
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->dataScramblingIdentityPDSCH = NULL;
-
- if ((get_softmodem_params()->do_ra ||
-     get_softmodem_params()->phy_test) &&
-     dl_antenna_ports > 1) // for MIMO, we use DMRS Config Type 2 but only with OAI UE
-   bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type=calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type));
- else
-   bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type=NULL;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->maxLength=NULL;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->scramblingID0=NULL;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->scramblingID1=NULL;
- if (!servingcellconfigdedicated) {
-   bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS=NULL;
- }
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition));
- *bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition = NR_DMRS_DownlinkConfig__dmrs_AdditionalPosition_pos1;
+  /// initialUplinkBWP
 
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList=calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList));
-
- n_ssb = 0;
- NR_TCI_State_t *tcid[64];
- for (int i=0;i<64;i++) {
-   if ((bitmap>>(63-i))&0x01){
-     tcid[i]=calloc(1,sizeof(*tcid[i]));
-     tcid[i]->tci_StateId=n_ssb;
-     tcid[i]->qcl_Type1.cell=NULL;
-     tcid[i]->qcl_Type1.bwp_Id=calloc(1,sizeof(*tcid[i]->qcl_Type1.bwp_Id));
-     *tcid[i]->qcl_Type1.bwp_Id=1;
-     tcid[i]->qcl_Type1.referenceSignal.present = NR_QCL_Info__referenceSignal_PR_ssb;
-     tcid[i]->qcl_Type1.referenceSignal.choice.ssb = i;
-     tcid[i]->qcl_Type1.qcl_Type=NR_QCL_Info__qcl_Type_typeC;
-     ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList->list,tcid[i]);
-     n_ssb++;
-   }
- }
-
-
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToReleaseList=NULL;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->vrb_ToPRB_Interleaver=NULL;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->resourceAllocation=NR_PDSCH_Config__resourceAllocation_resourceAllocationType1;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->pdsch_TimeDomainAllocationList=NULL;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->pdsch_AggregationFactor=NULL;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->rateMatchPatternToAddModList=NULL;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->rateMatchPatternToReleaseList=NULL;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->rateMatchPatternGroup1=NULL;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->rateMatchPatternGroup2=NULL;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->rbg_Size=NR_PDSCH_Config__rbg_Size_config1;
- set_dl_mcs_table(bwp->bwp_Common->genericParameters.subcarrierSpacing,
-                  configuration->force_256qam_off ? NULL : uecap,
-                  secondaryCellGroup->spCellConfig,bwp->bwp_Dedicated,
-                  servingcellconfigcommon);
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI));
- *bwp->bwp_Dedicated->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI = NR_PDSCH_Config__maxNrofCodeWordsScheduledByDCI_n1;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.present = NR_PDSCH_Config__prb_BundlingType_PR_staticBundling;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling));
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling->bundleSize =
-   calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling->bundleSize));
- *bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling->bundleSize = NR_PDSCH_Config__prb_BundlingType__staticBundling__bundleSize_wideband;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->zp_CSI_RS_ResourceToAddModList=NULL;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->zp_CSI_RS_ResourceToReleaseList=NULL;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->aperiodic_ZP_CSI_RS_ResourceSetsToAddModList=NULL;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->aperiodic_ZP_CSI_RS_ResourceSetsToReleaseList=NULL;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->sp_ZP_CSI_RS_ResourceSetsToAddModList=NULL;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->sp_ZP_CSI_RS_ResourceSetsToReleaseList=NULL;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->p_ZP_CSI_RS_ResourceSet=NULL;
- bwp->bwp_Dedicated->sps_Config = NULL; //calloc(1,sizeof(struct NR_SetupRelease_SPS_Config));
-
- bwp->bwp_Dedicated->radioLinkMonitoringConfig = NULL;
-#if 0
- bwp->bwp_Dedicated->radioLinkMonitoringConfig = calloc(1,sizeof(*bwp->bwp_Dedicated->radioLinkMonitoringConfig));
- bwp->bwp_Dedicated->radioLinkMonitoringConfig->present = NR_SetupRelease_RadioLinkMonitoringConfig_PR_setup;
+  if (!secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig) {
+    secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig=calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig));
+  }
 
- bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup = calloc(1,sizeof(*bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup));
- bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup->failureDetectionResourcesToAddModList=NULL;
- bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup->failureDetectionResourcesToReleaseList=NULL;
- bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup->beamFailureInstanceMaxCount = calloc(1,sizeof(*bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup->beamFailureInstanceMaxCount));
- *bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup->beamFailureInstanceMaxCount = NR_RadioLinkMonitoringConfig__beamFailureInstanceMaxCount_n3;
- bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup->beamFailureDetectionTimer = calloc(1,sizeof(*bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup->beamFailureDetectionTimer));
- *bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup->beamFailureDetectionTimer = NR_RadioLinkMonitoringConfig__beamFailureDetectionTimer_pbfd2;
-#endif
- 
- if (!servingcellconfigdedicated) {
-   ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list,bwp);
- }
- secondaryCellGroup->spCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id=calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id));
- 
- *secondaryCellGroup->spCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id=1;
- secondaryCellGroup->spCellConfig->spCellConfigDedicated->bwp_InactivityTimer = NULL;
- secondaryCellGroup->spCellConfig->spCellConfigDedicated->defaultDownlinkBWP_Id = NULL;
- secondaryCellGroup->spCellConfig->spCellConfigDedicated->defaultDownlinkBWP_Id = calloc(1, sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->defaultDownlinkBWP_Id));
- *secondaryCellGroup->spCellConfig->spCellConfigDedicated->defaultDownlinkBWP_Id = 1;
-
- if (!servingcellconfigdedicated) {
-   secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig=calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig));
- }
+  NR_BWP_UplinkDedicated_t *initialUplinkBWP = calloc(1,sizeof(*initialUplinkBWP));
+  secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP = initialUplinkBWP;
+  initialUplinkBWP->pucch_Config = NULL;
+  initialUplinkBWP->pusch_Config = calloc(1,sizeof(*initialUplinkBWP->pusch_Config));
+  initialUplinkBWP->pusch_Config->present = NR_SetupRelease_PUSCH_Config_PR_setup;
 
- NR_BWP_UplinkDedicated_t *initialUplinkBWP = calloc(1,sizeof(*initialUplinkBWP));
- secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP = initialUplinkBWP;
- initialUplinkBWP->pucch_Config = NULL;
- initialUplinkBWP->pusch_Config = calloc(1,sizeof(*initialUplinkBWP->pusch_Config));
- initialUplinkBWP->pusch_Config->present = NR_SetupRelease_PUSCH_Config_PR_setup;
- NR_PUSCH_Config_t *pusch_Config = NULL;
- if (servingcellconfigdedicated) {
-   pusch_Config = servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup;
- } else {
-   pusch_Config = calloc(1,sizeof(*pusch_Config));
- }
- initialUplinkBWP->pusch_Config->choice.setup = pusch_Config;
- pusch_Config->txConfig=calloc(1,sizeof(*pusch_Config->txConfig));
- *pusch_Config->txConfig= NR_PUSCH_Config__txConfig_codebook;
- pusch_Config->dmrs_UplinkForPUSCH_MappingTypeA = NULL;
- if (!servingcellconfigdedicated) {
-  pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB = calloc(1,sizeof(*pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB));
-  pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->present = NR_SetupRelease_DMRS_UplinkConfig_PR_setup;
-  pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup = calloc(1,sizeof(*pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup));
- }
- NR_DMRS_UplinkConfig_t *NR_DMRS_UplinkConfig = pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup;
- NR_DMRS_UplinkConfig->dmrs_Type = NULL;
- NR_DMRS_UplinkConfig->dmrs_AdditionalPosition = calloc(1,sizeof(*NR_DMRS_UplinkConfig->dmrs_AdditionalPosition));
- *NR_DMRS_UplinkConfig->dmrs_AdditionalPosition = NR_DMRS_UplinkConfig__dmrs_AdditionalPosition_pos0;
- if (!servingcellconfigdedicated) {
-   NR_DMRS_UplinkConfig->phaseTrackingRS=NULL;
- }
- NR_DMRS_UplinkConfig->maxLength=NULL;
- NR_DMRS_UplinkConfig->transformPrecodingDisabled = calloc(1,sizeof(*NR_DMRS_UplinkConfig->transformPrecodingDisabled));
- NR_DMRS_UplinkConfig->transformPrecodingDisabled->scramblingID0 = NULL;
- NR_DMRS_UplinkConfig->transformPrecodingDisabled->scramblingID1 = NULL;
- NR_DMRS_UplinkConfig->transformPrecodingEnabled = NULL;
- pusch_Config->pusch_PowerControl = calloc(1,sizeof(*pusch_Config->pusch_PowerControl));
- pusch_Config->pusch_PowerControl->tpc_Accumulation = NULL;
- pusch_Config->pusch_PowerControl->msg3_Alpha = calloc(1,sizeof(*pusch_Config->pusch_PowerControl->msg3_Alpha));
- *pusch_Config->pusch_PowerControl->msg3_Alpha = NR_Alpha_alpha1;
- pusch_Config->pusch_PowerControl->p0_NominalWithoutGrant = NULL;
- pusch_Config->pusch_PowerControl->p0_AlphaSets = calloc(1,sizeof(*pusch_Config->pusch_PowerControl->p0_AlphaSets));
- NR_P0_PUSCH_AlphaSet_t *aset = calloc(1,sizeof(*aset));
- aset->p0_PUSCH_AlphaSetId=0;
- aset->p0=calloc(1,sizeof(*aset->p0));
- *aset->p0 = 0;
- aset->alpha=calloc(1,sizeof(*aset->alpha));
- *aset->alpha=NR_Alpha_alpha1;
- ASN_SEQUENCE_ADD(&pusch_Config->pusch_PowerControl->p0_AlphaSets->list,aset);
- pusch_Config->pusch_PowerControl->pathlossReferenceRSToAddModList = NULL;
- pusch_Config->pusch_PowerControl->pathlossReferenceRSToReleaseList = NULL;
- pusch_Config->pusch_PowerControl->twoPUSCH_PC_AdjustmentStates = NULL;
- pusch_Config->pusch_PowerControl->deltaMCS = NULL;
- pusch_Config->pusch_PowerControl->sri_PUSCH_MappingToAddModList = NULL;
- pusch_Config->pusch_PowerControl->sri_PUSCH_MappingToReleaseList = NULL;
- pusch_Config->frequencyHopping=NULL;
- pusch_Config->frequencyHoppingOffsetLists=NULL;
- pusch_Config->resourceAllocation = NR_PUSCH_Config__resourceAllocation_resourceAllocationType1;
- pusch_Config->pusch_TimeDomainAllocationList = NULL;
- pusch_Config->pusch_AggregationFactor=NULL;
- pusch_Config->mcs_Table=NULL;
- pusch_Config->transformPrecoder= NULL;
- pusch_Config->mcs_TableTransformPrecoder=NULL;
- /* if msg3_transformprecoding is set in conf file - pusch config should not disable it */
- if (servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg3_transformPrecoder == NULL) {
+  NR_PUSCH_Config_t *pusch_Config = NULL;
+  if (servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList) {
+    pusch_Config = servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup;
+  } else {
+    pusch_Config = calloc(1,sizeof(*pusch_Config));
+  }
+  initialUplinkBWP->pusch_Config->choice.setup = pusch_Config;
+  pusch_Config->txConfig=calloc(1,sizeof(*pusch_Config->txConfig));
+  *pusch_Config->txConfig= NR_PUSCH_Config__txConfig_codebook;
+  pusch_Config->dmrs_UplinkForPUSCH_MappingTypeA = NULL;
+  if (!pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB) {
+    pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB = calloc(1,sizeof(*pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB));
+    pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->present = NR_SetupRelease_DMRS_UplinkConfig_PR_setup;
+    pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup = calloc(1,sizeof(*pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup));
+  }
+  NR_DMRS_UplinkConfig_t *NR_DMRS_UplinkConfig = pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup;
+  NR_DMRS_UplinkConfig->dmrs_Type = NULL;
+  NR_DMRS_UplinkConfig->dmrs_AdditionalPosition = calloc(1,sizeof(*NR_DMRS_UplinkConfig->dmrs_AdditionalPosition));
+  *NR_DMRS_UplinkConfig->dmrs_AdditionalPosition = NR_DMRS_UplinkConfig__dmrs_AdditionalPosition_pos0;
+  if (!servingcellconfigdedicated) {
+    NR_DMRS_UplinkConfig->phaseTrackingRS=NULL;
+  }
+  NR_DMRS_UplinkConfig->maxLength=NULL;
+  NR_DMRS_UplinkConfig->transformPrecodingDisabled = calloc(1,sizeof(*NR_DMRS_UplinkConfig->transformPrecodingDisabled));
+  NR_DMRS_UplinkConfig->transformPrecodingDisabled->scramblingID0 = NULL;
+  NR_DMRS_UplinkConfig->transformPrecodingDisabled->scramblingID1 = NULL;
+  NR_DMRS_UplinkConfig->transformPrecodingEnabled = NULL;
+  pusch_Config->pusch_PowerControl = calloc(1,sizeof(*pusch_Config->pusch_PowerControl));
+  pusch_Config->pusch_PowerControl->tpc_Accumulation = NULL;
+  pusch_Config->pusch_PowerControl->msg3_Alpha = calloc(1,sizeof(*pusch_Config->pusch_PowerControl->msg3_Alpha));
+  *pusch_Config->pusch_PowerControl->msg3_Alpha = NR_Alpha_alpha1;
+  pusch_Config->pusch_PowerControl->p0_NominalWithoutGrant = NULL;
+  pusch_Config->pusch_PowerControl->p0_AlphaSets = calloc(1,sizeof(*pusch_Config->pusch_PowerControl->p0_AlphaSets));
+  NR_P0_PUSCH_AlphaSet_t *aset = calloc(1,sizeof(*aset));
+  aset->p0_PUSCH_AlphaSetId=0;
+  aset->p0=calloc(1,sizeof(*aset->p0));
+  *aset->p0 = 0;
+  aset->alpha=calloc(1,sizeof(*aset->alpha));
+  *aset->alpha=NR_Alpha_alpha1;
+  ASN_SEQUENCE_ADD(&pusch_Config->pusch_PowerControl->p0_AlphaSets->list,aset);
+  pusch_Config->pusch_PowerControl->pathlossReferenceRSToAddModList = NULL;
+  pusch_Config->pusch_PowerControl->pathlossReferenceRSToReleaseList = NULL;
+  pusch_Config->pusch_PowerControl->twoPUSCH_PC_AdjustmentStates = NULL;
+  pusch_Config->pusch_PowerControl->deltaMCS = NULL;
+  pusch_Config->pusch_PowerControl->sri_PUSCH_MappingToAddModList = NULL;
+  pusch_Config->pusch_PowerControl->sri_PUSCH_MappingToReleaseList = NULL;
+  pusch_Config->frequencyHopping=NULL;
+  pusch_Config->frequencyHoppingOffsetLists=NULL;
+  pusch_Config->resourceAllocation = NR_PUSCH_Config__resourceAllocation_resourceAllocationType1;
+  pusch_Config->pusch_TimeDomainAllocationList = NULL;
+  pusch_Config->pusch_AggregationFactor=NULL;
+  pusch_Config->mcs_Table=NULL;
+  pusch_Config->transformPrecoder= NULL;
+  pusch_Config->mcs_TableTransformPrecoder=NULL;
+  /* if msg3_transformprecoding is set in conf file - pusch config should not disable it */
+  if (servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg3_transformPrecoder == NULL) {
     pusch_Config->transformPrecoder=calloc(1,sizeof(*pusch_Config->transformPrecoder));
     *pusch_Config->transformPrecoder = NR_PUSCH_Config__transformPrecoder_disabled;
- }
- pusch_Config->codebookSubset=calloc(1,sizeof(*pusch_Config->codebookSubset));
- *pusch_Config->codebookSubset = NR_PUSCH_Config__codebookSubset_nonCoherent;
- pusch_Config->maxRank=calloc(1,sizeof(*pusch_Config->maxRank));
- *pusch_Config->maxRank= 1;
- pusch_Config->rbg_Size=NULL;
- pusch_Config->uci_OnPUSCH=NULL;
- pusch_Config->tp_pi2BPSK=NULL;
+  }
+  pusch_Config->codebookSubset=calloc(1,sizeof(*pusch_Config->codebookSubset));
+  *pusch_Config->codebookSubset = NR_PUSCH_Config__codebookSubset_nonCoherent;
+  pusch_Config->maxRank=calloc(1,sizeof(*pusch_Config->maxRank));
+  *pusch_Config->maxRank= configuration->pusch_AntennaPorts;
+  pusch_Config->rbg_Size=NULL;
+  pusch_Config->uci_OnPUSCH=NULL;
+  pusch_Config->tp_pi2BPSK=NULL;
 
- /*------------------------------TRANSFORM PRECODING- -----------------------------------------------------------------------*/
+  /*------------------------------TRANSFORM PRECODING- -----------------------------------------------------------------------*/
 
- uint8_t transform_precoding = NR_PUSCH_Config__transformPrecoder_disabled;
+  uint8_t transformPrecoder = NR_PUSCH_Config__transformPrecoder_disabled;
 
- // TBD: configure this from .conf file, Dedicated params cannot yet be configured in .conf file.
- // Enable this to test transform precoding enabled from dedicated config.
- /*if (pusch_Config->transformPrecoder == NULL)
-    pusch_Config->transformPrecoder=calloc(1,sizeof(*pusch_Config->transformPrecoder));
+  // TBD: configure this from .conf file, Dedicated params cannot yet be configured in .conf file.
+  // Enable this to test transform precoding enabled from dedicated config.
+  /*if (pusch_Config->transformPrecoder == NULL)
+     pusch_Config->transformPrecoder=calloc(1,sizeof(*pusch_Config->transformPrecoder));
 
- *pusch_Config->transformPrecoder = NR_PUSCH_Config__transformPrecoder_enabled;  */
+  *pusch_Config->transformPrecoder = NR_PUSCH_Config__transformPrecoder_enabled;  */
   // END -------
 
- if (pusch_Config->transformPrecoder == NULL) {
-  if (servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg3_transformPrecoder != NULL)
-    transform_precoding = NR_PUSCH_Config__transformPrecoder_enabled;
- }
- else
-    transform_precoding = *pusch_Config->transformPrecoder;
+  if (pusch_Config->transformPrecoder == NULL) {
+    if (servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg3_transformPrecoder != NULL)
+      transformPrecoder = NR_PUSCH_Config__transformPrecoder_enabled;
+  }
+  else
+    transformPrecoder = *pusch_Config->transformPrecoder;
 
 
- if (transform_precoding == NR_PUSCH_Config__transformPrecoder_enabled ) {
+  if (transformPrecoder == NR_PUSCH_Config__transformPrecoder_enabled ) {
     /* Enable DMRS uplink config for transform precoding enabled */
     NR_DMRS_UplinkConfig->transformPrecodingEnabled = calloc(1,sizeof(*NR_DMRS_UplinkConfig->transformPrecodingEnabled));
     NR_DMRS_UplinkConfig->transformPrecodingEnabled->nPUSCH_Identity = NULL;
     NR_DMRS_UplinkConfig->transformPrecodingEnabled->sequenceGroupHopping = NULL;
     NR_DMRS_UplinkConfig->transformPrecodingEnabled->sequenceHopping = NULL;
     NR_DMRS_UplinkConfig->transformPrecodingEnabled->ext1 = NULL;
-
     LOG_I(RRC,"TRANSFORM PRECODING ENABLED......\n");
-
   }
- /*----------------------------------------------------------------------------------------------------------------------------*/ 
-
- initialUplinkBWP->srs_Config = calloc(1,sizeof(*initialUplinkBWP->srs_Config));
- initialUplinkBWP->srs_Config->present = NR_SetupRelease_SRS_Config_PR_setup;
- NR_SRS_Config_t *srs_Config = calloc(1,sizeof(*srs_Config));
- initialUplinkBWP->srs_Config->choice.setup=srs_Config;
- srs_Config->srs_ResourceSetToReleaseList=NULL;
- srs_Config->srs_ResourceSetToAddModList=calloc(1,sizeof(*srs_Config->srs_ResourceSetToAddModList));
- NR_SRS_ResourceSet_t *srs_resset0=calloc(1,sizeof(*srs_resset0));
- srs_resset0->srs_ResourceSetId = 0;
- srs_resset0->srs_ResourceIdList=calloc(1,sizeof(*srs_resset0->srs_ResourceIdList));
- NR_SRS_ResourceId_t *srs_resset0_id=calloc(1,sizeof(*srs_resset0_id));
- *srs_resset0_id=0;
- ASN_SEQUENCE_ADD(&srs_resset0->srs_ResourceIdList->list,srs_resset0_id);
- srs_Config->srs_ResourceToReleaseList=NULL;
+
+  initialUplinkBWP->srs_Config = calloc(1,sizeof(*initialUplinkBWP->srs_Config));
+  initialUplinkBWP->srs_Config->present = NR_SetupRelease_SRS_Config_PR_setup;
+
+  NR_SRS_Config_t *srs_Config = calloc(1,sizeof(*srs_Config));
+  initialUplinkBWP->srs_Config->choice.setup=srs_Config;
+  srs_Config->srs_ResourceSetToReleaseList=NULL;
+  srs_Config->srs_ResourceSetToAddModList=calloc(1,sizeof(*srs_Config->srs_ResourceSetToAddModList));
+  NR_SRS_ResourceSet_t *srs_resset0=calloc(1,sizeof(*srs_resset0));
+  srs_resset0->srs_ResourceSetId = 0;
+  srs_resset0->srs_ResourceIdList=calloc(1,sizeof(*srs_resset0->srs_ResourceIdList));
+  NR_SRS_ResourceId_t *srs_resset0_id=calloc(1,sizeof(*srs_resset0_id));
+  *srs_resset0_id=0;
+  ASN_SEQUENCE_ADD(&srs_resset0->srs_ResourceIdList->list,srs_resset0_id);
+  srs_Config->srs_ResourceToReleaseList=NULL;
 
   if (configuration->do_SRS) {
     srs_resset0->resourceType.present =  NR_SRS_ResourceSet__resourceType_PR_periodic;
@@ -786,35 +941,35 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
     srs_resset0->resourceType.choice.aperiodic->ext1=NULL;
   }
 
- srs_resset0->usage=NR_SRS_ResourceSet__usage_codebook;
- srs_resset0->alpha = calloc(1,sizeof(*srs_resset0->alpha));
- *srs_resset0->alpha = NR_Alpha_alpha1;
- srs_resset0->p0=calloc(1,sizeof(*srs_resset0->p0));
- *srs_resset0->p0=-80;
- srs_resset0->pathlossReferenceRS=NULL;
- srs_resset0->srs_PowerControlAdjustmentStates=NULL;
- ASN_SEQUENCE_ADD(&srs_Config->srs_ResourceSetToAddModList->list,srs_resset0);
- srs_Config->srs_ResourceToReleaseList=NULL;
- srs_Config->srs_ResourceToAddModList=calloc(1,sizeof(*srs_Config->srs_ResourceToAddModList));
- NR_SRS_Resource_t *srs_res0=calloc(1,sizeof(*srs_res0));
- srs_res0->srs_ResourceId=0;
- srs_res0->nrofSRS_Ports=NR_SRS_Resource__nrofSRS_Ports_port1;
- srs_res0->ptrs_PortIndex=NULL;
- srs_res0->transmissionComb.present=NR_SRS_Resource__transmissionComb_PR_n2; 
- srs_res0->transmissionComb.choice.n2=calloc(1,sizeof(*srs_res0->transmissionComb.choice.n2));
- srs_res0->transmissionComb.choice.n2->combOffset_n2=0;
- srs_res0->transmissionComb.choice.n2->cyclicShift_n2=0;
- srs_res0->resourceMapping.startPosition = 2 + uid%2;
- srs_res0->resourceMapping.nrofSymbols=NR_SRS_Resource__resourceMapping__nrofSymbols_n1;
- srs_res0->resourceMapping.repetitionFactor=NR_SRS_Resource__resourceMapping__repetitionFactor_n1;
- srs_res0->freqDomainPosition=0;
- srs_res0->freqDomainShift=0;
- srs_res0->freqHopping.b_SRS=0;
- srs_res0->freqHopping.b_hop=0;
- srs_res0->freqHopping.c_SRS = rrc_get_max_nr_csrs(
-     NRRIV2BW(servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, 275),
-     srs_res0->freqHopping.b_SRS);
- srs_res0->groupOrSequenceHopping=NR_SRS_Resource__groupOrSequenceHopping_neither;
+  srs_resset0->usage=NR_SRS_ResourceSet__usage_codebook;
+  srs_resset0->alpha = calloc(1,sizeof(*srs_resset0->alpha));
+  *srs_resset0->alpha = NR_Alpha_alpha1;
+  srs_resset0->p0=calloc(1,sizeof(*srs_resset0->p0));
+  *srs_resset0->p0=-80;
+  srs_resset0->pathlossReferenceRS=NULL;
+  srs_resset0->srs_PowerControlAdjustmentStates=NULL;
+  ASN_SEQUENCE_ADD(&srs_Config->srs_ResourceSetToAddModList->list,srs_resset0);
+  srs_Config->srs_ResourceToReleaseList=NULL;
+  srs_Config->srs_ResourceToAddModList=calloc(1,sizeof(*srs_Config->srs_ResourceToAddModList));
+  NR_SRS_Resource_t *srs_res0=calloc(1,sizeof(*srs_res0));
+  srs_res0->srs_ResourceId=0;
+  srs_res0->nrofSRS_Ports=NR_SRS_Resource__nrofSRS_Ports_port1;
+  srs_res0->ptrs_PortIndex=NULL;
+  srs_res0->transmissionComb.present=NR_SRS_Resource__transmissionComb_PR_n2;
+  srs_res0->transmissionComb.choice.n2=calloc(1,sizeof(*srs_res0->transmissionComb.choice.n2));
+  srs_res0->transmissionComb.choice.n2->combOffset_n2=0;
+  srs_res0->transmissionComb.choice.n2->cyclicShift_n2=0;
+  srs_res0->resourceMapping.startPosition = 2 + uid%2;
+  srs_res0->resourceMapping.nrofSymbols=NR_SRS_Resource__resourceMapping__nrofSymbols_n1;
+  srs_res0->resourceMapping.repetitionFactor=NR_SRS_Resource__resourceMapping__repetitionFactor_n1;
+  srs_res0->freqDomainPosition=0;
+  srs_res0->freqDomainShift=0;
+  srs_res0->freqHopping.b_SRS=0;
+  srs_res0->freqHopping.b_hop=0;
+  srs_res0->freqHopping.c_SRS = rrc_get_max_nr_csrs(
+      NRRIV2BW(servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, 275),
+      srs_res0->freqHopping.b_SRS);
+  srs_res0->groupOrSequenceHopping=NR_SRS_Resource__groupOrSequenceHopping_neither;
 
   if (configuration->do_SRS) {
     srs_res0->resourceType.present= NR_SRS_Resource__resourceType_PR_periodic;
@@ -826,174 +981,60 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
     srs_res0->resourceType.choice.aperiodic=calloc(1,sizeof(*srs_res0->resourceType.choice.aperiodic));
   }
 
- srs_res0->sequenceId=40;
- srs_res0->spatialRelationInfo=calloc(1,sizeof(*srs_res0->spatialRelationInfo));
- srs_res0->spatialRelationInfo->servingCellId=NULL;
- srs_res0->spatialRelationInfo->referenceSignal.present=NR_SRS_SpatialRelationInfo__referenceSignal_PR_csi_RS_Index;
- srs_res0->spatialRelationInfo->referenceSignal.choice.csi_RS_Index=0;
- ASN_SEQUENCE_ADD(&srs_Config->srs_ResourceToAddModList->list,srs_res0);
-
- secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToReleaseList = NULL;
- NR_BWP_Uplink_t *ubwp = NULL;
- if (servingcellconfigdedicated) {
-   ubwp = servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[0];
- } else {
-   secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList));
-   ubwp = calloc(1,sizeof(*ubwp));
- }
- ubwp->bwp_Id=1;
- ubwp->bwp_Common = calloc(1,sizeof(*ubwp->bwp_Common));
- // copy bwp_Common from Initial UL BWP except for bandwidth
- memcpy((void*)&ubwp->bwp_Common->genericParameters,
-	(void*)&servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->genericParameters,
-	sizeof(servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->genericParameters));
- ubwp->bwp_Common->genericParameters.locationAndBandwidth=PRBalloc_to_locationandbandwidth(servingcellconfigcommon->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth,0);
-
- ubwp->bwp_Common->rach_ConfigCommon  = servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon;
- ubwp->bwp_Common->pusch_ConfigCommon = servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon;
- ubwp->bwp_Common->pucch_ConfigCommon = servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->pucch_ConfigCommon;
- 
- if (!servingcellconfigdedicated) {
-   ubwp->bwp_Dedicated = calloc(1,sizeof(*ubwp->bwp_Dedicated));
- }
- ubwp->bwp_Dedicated->pucch_Config = calloc(1,sizeof(*ubwp->bwp_Dedicated->pucch_Config));
- ubwp->bwp_Dedicated->pucch_Config->present = NR_SetupRelease_PUCCH_Config_PR_setup;
- NR_PUCCH_Config_t *pucch_Config = calloc(1,sizeof(*pucch_Config));
- ubwp->bwp_Dedicated->pucch_Config->choice.setup=pucch_Config;
- pucch_Config->resourceSetToAddModList = calloc(1,sizeof(*pucch_Config->resourceSetToAddModList));
- pucch_Config->resourceSetToReleaseList = NULL;
- NR_PUCCH_ResourceSet_t *pucchresset0=calloc(1,sizeof(*pucchresset0));
- NR_PUCCH_ResourceSet_t *pucchresset1=calloc(1,sizeof(*pucchresset1));
- pucchresset0->pucch_ResourceSetId = 0;
- NR_PUCCH_ResourceId_t *pucchresset0id0=calloc(1,sizeof(*pucchresset0id0));
- *pucchresset0id0=1;
- ASN_SEQUENCE_ADD(&pucchresset0->resourceList.list,pucchresset0id0);
- pucchresset0->maxPayloadSize=NULL;
-
- ASN_SEQUENCE_ADD(&pucch_Config->resourceSetToAddModList->list,pucchresset0);
-
- pucchresset1->pucch_ResourceSetId = 1;
- NR_PUCCH_ResourceId_t *pucchresset1id0=calloc(1,sizeof(*pucchresset1id0));
- *pucchresset1id0=2;
- ASN_SEQUENCE_ADD(&pucchresset1->resourceList.list,pucchresset1id0);
- pucchresset1->maxPayloadSize=NULL;
- ASN_SEQUENCE_ADD(&pucch_Config->resourceSetToAddModList->list,pucchresset1);
-
- pucch_Config->resourceToAddModList = calloc(1,sizeof(*pucch_Config->resourceToAddModList));
- pucch_Config->resourceToReleaseList = NULL;
- NR_PUCCH_Resource_t *pucchres0=calloc(1,sizeof(*pucchres0));
- NR_PUCCH_Resource_t *pucchres2=calloc(1,sizeof(*pucchres2));
-
- pucchres0->pucch_ResourceId=1;
- pucchres0->startingPRB= (8 + uid) % curr_bwp;
- pucchres0->intraSlotFrequencyHopping=NULL;
- pucchres0->secondHopPRB=NULL;
- pucchres0->format.present= NR_PUCCH_Resource__format_PR_format0;
- pucchres0->format.choice.format0=calloc(1,sizeof(*pucchres0->format.choice.format0));
- pucchres0->format.choice.format0->initialCyclicShift=0;
- pucchres0->format.choice.format0->nrofSymbols=1;
- pucchres0->format.choice.format0->startingSymbolIndex=13;
- ASN_SEQUENCE_ADD(&pucch_Config->resourceToAddModList->list,pucchres0);
-
- pucchres2->pucch_ResourceId=2;
- pucchres2->startingPRB=0;
- pucchres2->intraSlotFrequencyHopping=NULL;
- pucchres2->secondHopPRB=NULL;
- pucchres2->format.present= NR_PUCCH_Resource__format_PR_format2;
- pucchres2->format.choice.format2=calloc(1,sizeof(*pucchres2->format.choice.format2));
- pucchres2->format.choice.format2->nrofPRBs=8;
- pucchres2->format.choice.format2->nrofSymbols=1;
- pucchres2->format.choice.format2->startingSymbolIndex=13;
- ASN_SEQUENCE_ADD(&pucch_Config->resourceToAddModList->list,pucchres2);
-
- pucch_Config->format2=calloc(1,sizeof(*pucch_Config->format2));
- pucch_Config->format2->present=NR_SetupRelease_PUCCH_FormatConfig_PR_setup;
- NR_PUCCH_FormatConfig_t *pucchfmt2 = calloc(1,sizeof(*pucchfmt2));
- pucch_Config->format2->choice.setup = pucchfmt2;
- pucchfmt2->interslotFrequencyHopping=NULL;
- pucchfmt2->additionalDMRS=NULL;
- pucchfmt2->maxCodeRate=calloc(1,sizeof(*pucchfmt2->maxCodeRate));
- *pucchfmt2->maxCodeRate=NR_PUCCH_MaxCodeRate_zeroDot35;
- pucchfmt2->nrofSlots=NULL;
- pucchfmt2->pi2BPSK=NULL;
- pucchfmt2->simultaneousHARQ_ACK_CSI=calloc(1,sizeof(*pucchfmt2->simultaneousHARQ_ACK_CSI));
- *pucchfmt2->simultaneousHARQ_ACK_CSI=NR_PUCCH_FormatConfig__simultaneousHARQ_ACK_CSI_true;
-
- // for scheduling requestresource
- pucch_Config->schedulingRequestResourceToAddModList = calloc(1,sizeof(*pucch_Config->schedulingRequestResourceToAddModList));
- NR_SchedulingRequestResourceConfig_t *schedulingRequestResourceConfig = calloc(1,sizeof(*schedulingRequestResourceConfig));
- schedulingRequestResourceConfig->schedulingRequestResourceId = 1;
- schedulingRequestResourceConfig->schedulingRequestID = 0;
- schedulingRequestResourceConfig->periodicityAndOffset = calloc(1,sizeof(*schedulingRequestResourceConfig->periodicityAndOffset));
- schedulingRequestResourceConfig->periodicityAndOffset->present = NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl10;
- schedulingRequestResourceConfig->periodicityAndOffset->choice.sl10 = 7;
- schedulingRequestResourceConfig->resource = calloc(1,sizeof(*schedulingRequestResourceConfig->resource));
- *schedulingRequestResourceConfig->resource = 1;
- ASN_SEQUENCE_ADD(&pucch_Config->schedulingRequestResourceToAddModList->list,schedulingRequestResourceConfig);
-
- pucch_Config->schedulingRequestResourceToReleaseList=NULL;
- pucch_Config->multi_CSI_PUCCH_ResourceList=NULL;
- pucch_Config->dl_DataToUL_ACK = calloc(1,sizeof(*pucch_Config->dl_DataToUL_ACK));
- long *delay[8];
- for (int i=0;i<8;i++) {
-   delay[i] = calloc(1,sizeof(*delay[i]));
-   *delay[i] = i + configuration->minRXTXTIME;
-   ASN_SEQUENCE_ADD(&pucch_Config->dl_DataToUL_ACK->list,delay[i]);
- }
- pucch_Config->spatialRelationInfoToAddModList = calloc(1,sizeof(*pucch_Config->spatialRelationInfoToAddModList));
- NR_PUCCH_SpatialRelationInfo_t *pucchspatial = calloc(1,sizeof(*pucchspatial));
- pucchspatial->pucch_SpatialRelationInfoId = 1;
- pucchspatial->servingCellId = NULL;
- if(do_csirs) {
-   pucchspatial->referenceSignal.present = NR_PUCCH_SpatialRelationInfo__referenceSignal_PR_csi_RS_Index;
-   pucchspatial->referenceSignal.choice.csi_RS_Index = 0;
- }
- else {
-   pucchspatial->referenceSignal.present = NR_PUCCH_SpatialRelationInfo__referenceSignal_PR_ssb_Index;
-   pucchspatial->referenceSignal.choice.ssb_Index = 0;
- }
- pucchspatial->pucch_PathlossReferenceRS_Id = 0;
- pucchspatial->p0_PUCCH_Id = 1;
- pucchspatial->closedLoopIndex = NR_PUCCH_SpatialRelationInfo__closedLoopIndex_i0;
- ASN_SEQUENCE_ADD(&pucch_Config->spatialRelationInfoToAddModList->list,pucchspatial);
- pucch_Config->spatialRelationInfoToReleaseList=NULL;
- pucch_Config->pucch_PowerControl=calloc(1,sizeof(*pucch_Config->pucch_PowerControl));
- pucch_Config->pucch_PowerControl->deltaF_PUCCH_f0 = calloc(1,sizeof(*pucch_Config->pucch_PowerControl->deltaF_PUCCH_f0));
- *pucch_Config->pucch_PowerControl->deltaF_PUCCH_f0 = 0;
- pucch_Config->pucch_PowerControl->deltaF_PUCCH_f1 = calloc(1,sizeof(*pucch_Config->pucch_PowerControl->deltaF_PUCCH_f1));
- *pucch_Config->pucch_PowerControl->deltaF_PUCCH_f1 = 0;
- pucch_Config->pucch_PowerControl->deltaF_PUCCH_f2 = calloc(1,sizeof(*pucch_Config->pucch_PowerControl->deltaF_PUCCH_f2));
- *pucch_Config->pucch_PowerControl->deltaF_PUCCH_f2 = 0;
- pucch_Config->pucch_PowerControl->deltaF_PUCCH_f3 = calloc(1,sizeof(*pucch_Config->pucch_PowerControl->deltaF_PUCCH_f3));
- *pucch_Config->pucch_PowerControl->deltaF_PUCCH_f3 = 0;
- pucch_Config->pucch_PowerControl->deltaF_PUCCH_f4 = calloc(1,sizeof(*pucch_Config->pucch_PowerControl->deltaF_PUCCH_f4));
- *pucch_Config->pucch_PowerControl->deltaF_PUCCH_f4 = 0;
- pucch_Config->pucch_PowerControl->p0_Set = calloc(1,sizeof(*pucch_Config->pucch_PowerControl->p0_Set));
- NR_P0_PUCCH_t *p00 = calloc(1,sizeof(*p00));
- p00->p0_PUCCH_Id=1;
- p00->p0_PUCCH_Value = 0;
- ASN_SEQUENCE_ADD(&pucch_Config->pucch_PowerControl->p0_Set->list,p00);
- pucch_Config->pucch_PowerControl->pathlossReferenceRSs = NULL;
-
- if (!servingcellconfigdedicated) {
-   // copy pusch_Config from dedicated initialBWP
-   ubwp->bwp_Dedicated->pusch_Config = calloc(1,sizeof(*ubwp->bwp_Dedicated->pusch_Config));
-   ubwp->bwp_Dedicated->pusch_Config->present = NR_SetupRelease_PUSCH_Config_PR_setup;
-   ubwp->bwp_Dedicated->pusch_Config->choice.setup = pusch_Config;
- }
- ubwp->bwp_Dedicated->configuredGrantConfig = NULL;
- ubwp->bwp_Dedicated->srs_Config = calloc(1,sizeof(*ubwp->bwp_Dedicated->srs_Config));
- ubwp->bwp_Dedicated->srs_Config->present = NR_SetupRelease_SRS_Config_PR_setup;
- ubwp->bwp_Dedicated->srs_Config->choice.setup = srs_Config;
+  srs_res0->sequenceId=40;
+  srs_res0->spatialRelationInfo=calloc(1,sizeof(*srs_res0->spatialRelationInfo));
+  srs_res0->spatialRelationInfo->servingCellId=NULL;
+  srs_res0->spatialRelationInfo->referenceSignal.present=NR_SRS_SpatialRelationInfo__referenceSignal_PR_csi_RS_Index;
+  srs_res0->spatialRelationInfo->referenceSignal.choice.csi_RS_Index=0;
+  ASN_SEQUENCE_ADD(&srs_Config->srs_ResourceToAddModList->list,srs_res0);
 
- ubwp->bwp_Dedicated->beamFailureRecoveryConfig = NULL;
+  /// Dedicated BWPs
 
- if (!servingcellconfigdedicated) {
-   ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list,ubwp);
- }
+  // Downlink BWPs
+  int n_dl_bwp = 1;
+  if (servingcellconfigdedicated && servingcellconfigdedicated->downlinkBWP_ToAddModList) {
+    n_dl_bwp = servingcellconfigdedicated->downlinkBWP_ToAddModList->list.count;
+  }
+  if(n_dl_bwp>0) {
+    secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList));
+    for (int bwp_loop = 0; bwp_loop < n_dl_bwp; bwp_loop++) {
+      NR_BWP_Downlink_t *bwp = calloc(1,sizeof(*bwp));
+      fill_default_nsa_downlinkBWP(bwp, bwp_loop, secondaryCellGroup, servingcellconfigdedicated, servingcellconfigcommon, configuration, uecap, dl_antenna_ports, bitmap);
+      ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list,bwp);
+    }
+    secondaryCellGroup->spCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id));
+    *secondaryCellGroup->spCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id = servingcellconfigdedicated->firstActiveDownlinkBWP_Id ? *servingcellconfigdedicated->firstActiveDownlinkBWP_Id : 1;
+    secondaryCellGroup->spCellConfig->spCellConfigDedicated->defaultDownlinkBWP_Id = calloc(1, sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->defaultDownlinkBWP_Id));
+    *secondaryCellGroup->spCellConfig->spCellConfigDedicated->defaultDownlinkBWP_Id = servingcellconfigdedicated->defaultDownlinkBWP_Id ? *servingcellconfigdedicated->defaultDownlinkBWP_Id : 1;
+  }
 
- secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->firstActiveUplinkBWP_Id = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->firstActiveUplinkBWP_Id));
- *secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->firstActiveUplinkBWP_Id = 1;
+  // Uplink BWPs
+  int n_ul_bwp = 1;
+  if (servingcellconfigdedicated && servingcellconfigdedicated->uplinkConfig && servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList) {
+    n_ul_bwp = servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.count;
+  }
+  if(n_ul_bwp>0) {
+    secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList));
+    for (int bwp_loop = 0; bwp_loop < n_ul_bwp; bwp_loop++) {
+      NR_BWP_Uplink_t *ubwp = calloc(1,sizeof(*ubwp));
+      fill_default_nsa_uplinkBWP(ubwp, bwp_loop, servingcellconfigdedicated, servingcellconfigcommon, configuration, uid);
+      ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list,ubwp);
+    }
+    secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->firstActiveUplinkBWP_Id = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->firstActiveUplinkBWP_Id));
+    *secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->firstActiveUplinkBWP_Id = servingcellconfigdedicated->uplinkConfig->firstActiveUplinkBWP_Id ? *servingcellconfigdedicated->uplinkConfig->firstActiveUplinkBWP_Id : 1;
+  }
+
+  secondaryCellGroup->spCellConfig->spCellConfigDedicated->bwp_InactivityTimer = NULL;
+  secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToReleaseList= NULL;
+  secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToReleaseList = NULL;
+
+  mac_CellGroupConfig->schedulingRequestConfig = calloc(1, sizeof(*mac_CellGroupConfig->schedulingRequestConfig));
+  mac_CellGroupConfig->schedulingRequestConfig->schedulingRequestToAddModList = CALLOC(1,sizeof(*mac_CellGroupConfig->schedulingRequestConfig->schedulingRequestToAddModList));
+  struct NR_SchedulingRequestToAddMod *schedulingrequestlist = CALLOC(1,sizeof(*schedulingrequestlist));
+  schedulingrequestlist->schedulingRequestId  = 0;
+  schedulingrequestlist->sr_ProhibitTimer = NULL;
+  schedulingrequestlist->sr_TransMax      = NR_SchedulingRequestToAddMod__sr_TransMax_n64;
+  ASN_SEQUENCE_ADD(&(mac_CellGroupConfig->schedulingRequestConfig->schedulingRequestToAddModList->list),schedulingrequestlist);
 
  secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->pusch_ServingCellConfig = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->pusch_ServingCellConfig));
  NR_PUSCH_ServingCellConfig_t *pusch_scc = calloc(1,sizeof(*pusch_scc));
@@ -1008,9 +1049,7 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
  pusch_scc->ext1->processingType2Enabled = NULL;
 
  secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->carrierSwitching = NULL;
-
  secondaryCellGroup->spCellConfig->spCellConfigDedicated->supplementaryUplink=NULL;
-
  secondaryCellGroup->spCellConfig->spCellConfigDedicated->pdcch_ServingCellConfig=NULL;
 
  secondaryCellGroup->spCellConfig->spCellConfigDedicated->pdsch_ServingCellConfig=calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->pdsch_ServingCellConfig));
@@ -1034,39 +1073,9 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
  NR_CSI_MeasConfig_t *csi_MeasConfig = calloc(1,sizeof(*csi_MeasConfig));
  secondaryCellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup = csi_MeasConfig;
 
- if (do_csirs && dl_antenna_ports > 1) {
-   csi_MeasConfig->csi_IM_ResourceToAddModList = calloc(1,sizeof(*csi_MeasConfig->csi_IM_ResourceToAddModList));
-   NR_CSI_IM_Resource_t *imres0 = calloc(1,sizeof(*imres0));
-   imres0->csi_IM_ResourceId = 0;
-   imres0->csi_IM_ResourceElementPattern = calloc(1,sizeof(*imres0->csi_IM_ResourceElementPattern));
-   imres0->csi_IM_ResourceElementPattern->present = NR_CSI_IM_Resource__csi_IM_ResourceElementPattern_PR_pattern1;
-   imres0->csi_IM_ResourceElementPattern->choice.pattern1 = calloc(1,sizeof(*imres0->csi_IM_ResourceElementPattern->choice.pattern1));
-   imres0->csi_IM_ResourceElementPattern->choice.pattern1->subcarrierLocation_p1 = NR_CSI_IM_Resource__csi_IM_ResourceElementPattern__pattern1__subcarrierLocation_p1_s4;
-   imres0->csi_IM_ResourceElementPattern->choice.pattern1->symbolLocation_p1 = 6;
-   imres0->freqBand = calloc(1,sizeof(*imres0->freqBand));
-   imres0->freqBand->startingRB = 0;
-   imres0->freqBand->nrofRBs = ((curr_bwp>>2)+(curr_bwp%4>0))<<2;
-   imres0->periodicityAndOffset = calloc(1,sizeof(*imres0->periodicityAndOffset));
-   imres0->periodicityAndOffset->present = NR_CSI_ResourcePeriodicityAndOffset_PR_slots320;
-   imres0->periodicityAndOffset->choice.slots320 = 0;
-   ASN_SEQUENCE_ADD(&csi_MeasConfig->csi_IM_ResourceToAddModList->list,imres0);
-   csi_MeasConfig->csi_IM_ResourceSetToAddModList = calloc(1,sizeof(*csi_MeasConfig->csi_IM_ResourceSetToAddModList));
-   NR_CSI_IM_ResourceSet_t *imset0 = calloc(1,sizeof(*imset0));
-   imset0->csi_IM_ResourceSetId = 0;
-   NR_CSI_IM_ResourceId_t *res0 = calloc(1,sizeof(*res0));
-   *res0 = 0;
-   ASN_SEQUENCE_ADD(&imset0->csi_IM_Resources,res0);
-   ASN_SEQUENCE_ADD(&csi_MeasConfig->csi_IM_ResourceSetToAddModList->list,imset0);
- }
- else {
-   csi_MeasConfig->csi_IM_ResourceToAddModList = NULL;
-   csi_MeasConfig->csi_IM_ResourceSetToAddModList = NULL;
- }
-
- csi_MeasConfig->csi_IM_ResourceToReleaseList = NULL;
- csi_MeasConfig->csi_IM_ResourceSetToReleaseList = NULL;
-
+  int curr_bwp = NRRIV2BW(PRBalloc_to_locationandbandwidth(servingcellconfigcommon->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth,0),275);
  config_csirs(servingcellconfigcommon, csi_MeasConfig, uid, dl_antenna_ports, curr_bwp, do_csirs);
+ config_csiim(do_csirs, dl_antenna_ports, curr_bwp, csi_MeasConfig);
 
  csi_MeasConfig->csi_SSB_ResourceSetToAddModList = calloc(1,sizeof(*csi_MeasConfig->csi_SSB_ResourceSetToAddModList));
  csi_MeasConfig->csi_SSB_ResourceSetToReleaseList = NULL;
@@ -1268,10 +1277,7 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
    ASN_SEQUENCE_ADD(&csirep2->reportConfigType.choice.periodic->pucch_CSI_ResourceList.list,pucchcsires1);
    csirep2->reportQuantity.present = NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP;
    csirep2->reportQuantity.choice.ssb_Index_RSRP=(NULL_t)0;
-   csirep2->reportFreqConfiguration = calloc(1,sizeof(*csirep2->reportFreqConfiguration));
-   csirep2->reportFreqConfiguration->cqi_FormatIndicator=NR_CSI_ReportConfig__reportFreqConfiguration__cqi_FormatIndicator_widebandCQI;
-   csirep2->reportFreqConfiguration->pmi_FormatIndicator=NR_CSI_ReportConfig__reportFreqConfiguration__pmi_FormatIndicator_widebandPMI;
-   csirep2->reportFreqConfiguration->csi_ReportingBand=NULL;
+   csirep2->reportFreqConfiguration = NULL;
    csirep2->timeRestrictionForChannelMeasurements= NR_CSI_ReportConfig__timeRestrictionForChannelMeasurements_configured;
    csirep2->timeRestrictionForInterferenceMeasurements=NR_CSI_ReportConfig__timeRestrictionForInterferenceMeasurements_configured;
    csirep2->codebookConfig= NULL;
@@ -1295,8 +1301,12 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
  secondaryCellGroup->spCellConfig->spCellConfigDedicated->pathlossReferenceLinking=NULL;
  secondaryCellGroup->spCellConfig->spCellConfigDedicated->servingCellMO=NULL;
 
-}
+  *servingcellconfigdedicated = *secondaryCellGroup->spCellConfig->spCellConfigDedicated;
 
+  if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
+    xer_fprint(stdout, &asn_DEF_NR_SpCellConfig, (void *)secondaryCellGroup->spCellConfig);
+  }
+}
 
 void fill_default_reconfig(NR_ServingCellConfigCommon_t *servingcellconfigcommon,
                            NR_ServingCellConfig_t *servingcellconfigdedicated,
diff --git a/openair2/RRC/NR_UE/L2_interface_ue.c b/openair2/RRC/NR_UE/L2_interface_ue.c
index 6f0c7fc27fa2c868ec456b0a4aa539fdd79ba774..b4508e2627d767194a3b58a4b708e7488e60ffa7 100644
--- a/openair2/RRC/NR_UE/L2_interface_ue.c
+++ b/openair2/RRC/NR_UE/L2_interface_ue.c
@@ -181,6 +181,6 @@ rrc_data_req_nr_ue(
       TASK_PDCP_UE,
       ctxt_pP->instance,
       message_p);
-    return TRUE; // TODO should be changed to a CNF message later, currently RRC lite does not used the returned value anyway.
+    return true; // TODO should be changed to a CNF message later, currently RRC lite does not used the returned value anyway.
 
 }
diff --git a/openair2/RRC/NR_UE/rrc_UE.c b/openair2/RRC/NR_UE/rrc_UE.c
index 7dca9b277407da75ab4e2dad5f7616cc9306158c..53817af48e2f172365b2c968b68d18abf546d782 100644
--- a/openair2/RRC/NR_UE/rrc_UE.c
+++ b/openair2/RRC/NR_UE/rrc_UE.c
@@ -1320,11 +1320,11 @@ nr_rrc_ue_process_masterCellGroup(
     //TODO (perform SCell addition/modification as specified in 5.3.5.5.9)
   }
 
-  if( cellGroupConfig->ext2->bh_RLC_ChannelToReleaseList_r16 != NULL){
+  if(cellGroupConfig->ext2 != NULL && cellGroupConfig->ext2->bh_RLC_ChannelToReleaseList_r16 != NULL){
     //TODO (perform the BH RLC channel addition/modification as specified in 5.3.5.5.11)
   }
 
-  if( cellGroupConfig->ext2->bh_RLC_ChannelToAddModList_r16 != NULL){
+  if(cellGroupConfig->ext2 != NULL && cellGroupConfig->ext2->bh_RLC_ChannelToAddModList_r16 != NULL){
     //TODO (perform the BH RLC channel addition/modification as specified in 5.3.5.5.11)
   }
 }
@@ -1340,13 +1340,6 @@ static void rrc_ue_generate_RRCSetupComplete(
   uint8_t size;
   const char *nas_msg;
   int   nas_msg_length;
-  NR_UE_MAC_INST_t *mac = get_mac_inst(0);
-
-  if (mac->cg &&
-      mac->cg->spCellConfig &&
-      mac->cg->spCellConfig->spCellConfigDedicated &&
-      mac->cg->spCellConfig->spCellConfigDedicated->csi_MeasConfig)
-    AssertFatal(1==0,"2 > csi_MeasConfig is not null\n");
 
  if (AMF_MODE_ENABLED) {
 #if defined(ITTI_SIM)
@@ -1462,8 +1455,8 @@ int8_t nr_rrc_ue_decode_ccch( const protocol_ctxt_t *const ctxt_pP, const NR_SRB
 	 nr_rrc_ue_process_RadioBearerConfig(ctxt_pP,
 					     gNB_index,
 					     &dl_ccch_msg->message.choice.c1->choice.rrcSetup->criticalExtensions.choice.rrcSetup->radioBearerConfig);
-	 nr_rrc_set_state (ctxt_pP->module_id, RRC_STATE_CONNECTED);
-	 nr_rrc_set_sub_state (ctxt_pP->module_id, RRC_SUB_STATE_CONNECTED);
+	 nr_rrc_set_state (ctxt_pP->module_id, RRC_STATE_CONNECTED_NR);
+	 nr_rrc_set_sub_state (ctxt_pP->module_id, RRC_SUB_STATE_CONNECTED_NR);
 	 NR_UE_rrc_inst[ctxt_pP->module_id].Info[gNB_index].rnti = ctxt_pP->rnti;
 	 rrc_ue_generate_RRCSetupComplete(
 					  ctxt_pP,
@@ -2021,7 +2014,7 @@ nr_rrc_ue_establish_srb2(
    int i, cnt;
 
    if( radioBearerConfig->srb3_ToRelease != NULL){
-     if( *radioBearerConfig->srb3_ToRelease == TRUE){
+     if( *radioBearerConfig->srb3_ToRelease == true){
        //TODO (release the PDCP entity and the srb-Identity of the SRB3.)
      }
    }
diff --git a/openair2/SDAP/nr_sdap/nr_sdap.c b/openair2/SDAP/nr_sdap/nr_sdap.c
index 74ef93aff743fa9929e9c0d3aa2227dc5c45ec5b..dd7a76920d30c43887db01d964f6f9d7861710e2 100644
--- a/openair2/SDAP/nr_sdap/nr_sdap.c
+++ b/openair2/SDAP/nr_sdap/nr_sdap.c
@@ -21,19 +21,19 @@
 
 #include "nr_sdap.h"
 
-boolean_t sdap_data_req(protocol_ctxt_t *ctxt_p,
-                        const srb_flag_t srb_flag,
-                        const rb_id_t rb_id,
-                        const mui_t mui,
-                        const confirm_t confirm,
-                        const sdu_size_t sdu_buffer_size,
-                        unsigned char *const sdu_buffer,
-                        const pdcp_transmission_mode_t pt_mode,
-                        const uint32_t *sourceL2Id,
-                        const uint32_t *destinationL2Id,
-                        const uint8_t qfi,
-                        const boolean_t rqi,
-                        const int pdusession_id) {
+bool sdap_data_req(protocol_ctxt_t *ctxt_p,
+                   const srb_flag_t srb_flag,
+                   const rb_id_t rb_id,
+                   const mui_t mui,
+                   const confirm_t confirm,
+                   const sdu_size_t sdu_buffer_size,
+                   unsigned char *const sdu_buffer,
+                   const pdcp_transmission_mode_t pt_mode,
+                   const uint32_t *sourceL2Id,
+                   const uint32_t *destinationL2Id,
+                   const uint8_t qfi,
+                   const bool rqi,
+                   const int pdusession_id) {
   nr_sdap_entity_t *sdap_entity;
   sdap_entity = nr_sdap_get_entity(ctxt_p->rnti, pdusession_id);
 
@@ -42,19 +42,19 @@ boolean_t sdap_data_req(protocol_ctxt_t *ctxt_p,
     return 0;
   }
 
-  boolean_t ret = sdap_entity->tx_entity(sdap_entity,
-                                         ctxt_p,
-                                         srb_flag,
-                                         rb_id,
-                                         mui,
-                                         confirm,
-                                         sdu_buffer_size,
-                                         sdu_buffer,
-                                         pt_mode,
-                                         sourceL2Id,
-                                         destinationL2Id,
-                                         qfi,
-                                         rqi);
+  bool ret = sdap_entity->tx_entity(sdap_entity,
+                                    ctxt_p,
+                                    srb_flag,
+                                    rb_id,
+                                    mui,
+                                    confirm,
+                                    sdu_buffer_size,
+                                    sdu_buffer,
+                                    pt_mode,
+                                    sourceL2Id,
+                                    destinationL2Id,
+                                    qfi,
+                                    rqi);
   return ret;
 }
 
diff --git a/openair2/SDAP/nr_sdap/nr_sdap.h b/openair2/SDAP/nr_sdap/nr_sdap.h
index cd702cfd7f39d2b6698842b3fa1b643458ba0710..5959ca15589783dd84c51e21257875101d04ce36 100644
--- a/openair2/SDAP/nr_sdap/nr_sdap.h
+++ b/openair2/SDAP/nr_sdap/nr_sdap.h
@@ -32,20 +32,19 @@
  * Downlink - gNB
  * Uplink   - nrUE
  */
-boolean_t sdap_data_req(protocol_ctxt_t *ctxt_p,
-                        const srb_flag_t srb_flag,
-                        const rb_id_t rb_id,
-                        const mui_t mui,
-                        const confirm_t confirm,
-                        const sdu_size_t sdu_buffer_size,
-                        unsigned char *const sdu_buffer,
-                        const pdcp_transmission_mode_t pt_mode,
-                        const uint32_t *sourceL2Id,
-                        const uint32_t *destinationL2Id,
-                        const uint8_t qfi,
-                        const boolean_t rqi,
-                        const int pdusession_id
-                       );
+bool sdap_data_req(protocol_ctxt_t *ctxt_p,
+                   const srb_flag_t srb_flag,
+                   const rb_id_t rb_id,
+                   const mui_t mui,
+                   const confirm_t confirm,
+                   const sdu_size_t sdu_buffer_size,
+                   unsigned char *const sdu_buffer,
+                   const pdcp_transmission_mode_t pt_mode,
+                   const uint32_t *sourceL2Id,
+                   const uint32_t *destinationL2Id,
+                   const uint8_t qfi,
+                   const bool rqi,
+                   const int pdusession_id);
 
 /*
  * TS 37.324 4.4 Functions
diff --git a/openair2/SDAP/nr_sdap/nr_sdap_entity.c b/openair2/SDAP/nr_sdap/nr_sdap_entity.c
index c5d1c1d6fe1dd1d630c464dd9e7fb2f79a491301..5e3627296c56b62a15e3a33bdd390cb746913168 100644
--- a/openair2/SDAP/nr_sdap/nr_sdap_entity.c
+++ b/openair2/SDAP/nr_sdap/nr_sdap_entity.c
@@ -46,23 +46,22 @@ void nr_pdcp_submit_sdap_ctrl_pdu(int rnti, rb_id_t sdap_ctrl_pdu_drb, nr_sdap_u
   return;
 }
 
-static boolean_t nr_sdap_tx_entity(nr_sdap_entity_t *entity,
-                                   protocol_ctxt_t *ctxt_p,
-                                   const srb_flag_t srb_flag,
-                                   const rb_id_t rb_id,
-                                   const mui_t mui,
-                                   const confirm_t confirm,
-                                   const sdu_size_t sdu_buffer_size,
-                                   unsigned char *const sdu_buffer,
-                                   const pdcp_transmission_mode_t pt_mode,
-                                   const uint32_t *sourceL2Id,
-                                   const uint32_t *destinationL2Id,
-                                   const uint8_t qfi,
-                                   const boolean_t rqi
-                                  ) {
+static bool nr_sdap_tx_entity(nr_sdap_entity_t *entity,
+                              protocol_ctxt_t *ctxt_p,
+                              const srb_flag_t srb_flag,
+                              const rb_id_t rb_id,
+                              const mui_t mui,
+                              const confirm_t confirm,
+                              const sdu_size_t sdu_buffer_size,
+                              unsigned char *const sdu_buffer,
+                              const pdcp_transmission_mode_t pt_mode,
+                              const uint32_t *sourceL2Id,
+                              const uint32_t *destinationL2Id,
+                              const uint8_t qfi,
+                              const bool rqi) {
   /* The offset of the SDAP header, it might be 0 if the has_sdap is not true in the pdcp entity. */
   int offset=0;
-  boolean_t ret=false;
+  bool ret = false;
   /*Hardcode DRB ID given from upper layer (ue/enb_tun_read_thread rb_id), it will change if we have SDAP*/
   rb_id_t sdap_drb_id = rb_id;
   int pdcp_ent_has_sdap = 0;
@@ -297,7 +296,7 @@ static void nr_sdap_rx_entity(nr_sdap_entity_t *entity,
   }
 }
 
-void nr_sdap_qfi2drb_map_update(nr_sdap_entity_t *entity, uint8_t qfi, rb_id_t drb, boolean_t hasSdap){
+void nr_sdap_qfi2drb_map_update(nr_sdap_entity_t *entity, uint8_t qfi, rb_id_t drb, bool hasSdap) {
   if(qfi < SDAP_MAX_QFI &&
      qfi > SDAP_MAP_RULE_EMPTY &&
      drb > 0 &&
@@ -390,7 +389,7 @@ void nr_sdap_ue_qfi2drb_config(nr_sdap_entity_t *existing_sdap_entity,
 nr_sdap_entity_t *new_nr_sdap_entity(int has_sdap,
                                      uint16_t rnti,
                                      int pdusession_id,
-                                     boolean_t is_defaultDRB,
+                                     bool is_defaultDRB,
                                      uint8_t drb_identity,
                                      NR_QFI_t *mapped_qfi_2_add,
                                      uint8_t mappedQFIs2AddCount)
@@ -450,7 +449,7 @@ nr_sdap_entity_t *nr_sdap_get_entity(uint16_t rnti, int pdusession_id) {
   if(sdap_entity == NULL)
     return NULL;
 
-  while(sdap_entity->rnti != rnti && sdap_entity->next_entity != NULL) {
+  while(( sdap_entity->rnti != rnti || sdap_entity->pdusession_id != pdusession_id ) && sdap_entity->next_entity != NULL) {
     sdap_entity = sdap_entity->next_entity;
   }
 
@@ -460,6 +459,7 @@ nr_sdap_entity_t *nr_sdap_get_entity(uint16_t rnti, int pdusession_id) {
   return NULL;
 }
 
+
 void delete_nr_sdap_entity(uint16_t rnti) {
   nr_sdap_entity_t *entityPtr, *entityPrev = NULL;
   entityPtr = sdap_info.sdap_entity_llist;
diff --git a/openair2/SDAP/nr_sdap/nr_sdap_entity.h b/openair2/SDAP/nr_sdap/nr_sdap_entity.h
index b46e5bf4e3462bef98b65b5e2e799b14dc7b6319..635289d4d48cfc4f7d41564f87c8668236bc19a6 100644
--- a/openair2/SDAP/nr_sdap/nr_sdap_entity.h
+++ b/openair2/SDAP/nr_sdap/nr_sdap_entity.h
@@ -64,7 +64,7 @@ typedef struct nr_sdap_ul_hdr_s {
 
 typedef struct qfi2drb_s {
   rb_id_t drb_id;
-  boolean_t hasSdap;
+  bool    hasSdap;
 } qfi2drb_t;
 
 void nr_pdcp_submit_sdap_ctrl_pdu(int rnti, rb_id_t sdap_ctrl_pdu_drb, nr_sdap_ul_hdr_t ctrl_pdu);
@@ -75,7 +75,7 @@ typedef struct nr_sdap_entity_s {
   int pdusession_id;
   qfi2drb_t qfi2drb_table[SDAP_MAX_QFI];
 
-  void (*qfi2drb_map_update)(struct nr_sdap_entity_s *entity, uint8_t qfi, rb_id_t drb, boolean_t hasSdap);
+  void (*qfi2drb_map_update)(struct nr_sdap_entity_s *entity, uint8_t qfi, rb_id_t drb, bool hasSdap);
   void (*qfi2drb_map_delete)(struct nr_sdap_entity_s *entity, uint8_t qfi);
   rb_id_t (*qfi2drb_map)(struct nr_sdap_entity_s *entity, uint8_t qfi, rb_id_t upper_layer_rb_id);
 
@@ -84,20 +84,19 @@ typedef struct nr_sdap_entity_s {
   void (*sdap_submit_ctrl_pdu)(int rnti, rb_id_t sdap_ctrl_pdu_drb, nr_sdap_ul_hdr_t ctrl_pdu);
 
 
-  boolean_t (*tx_entity)(struct nr_sdap_entity_s *entity,
-                         protocol_ctxt_t *ctxt_p,
-                         const srb_flag_t srb_flag,
-                         const rb_id_t rb_id,
-                         const mui_t mui,
-                         const confirm_t confirm,
-                         const sdu_size_t sdu_buffer_size,
-                         unsigned char *const sdu_buffer,
-                         const pdcp_transmission_mode_t pt_mode,
-                         const uint32_t *sourceL2Id,
-                         const uint32_t *destinationL2Id,
-                         const uint8_t qfi,
-                         const boolean_t rqi
-                         );
+  bool (*tx_entity)(struct nr_sdap_entity_s *entity,
+                    protocol_ctxt_t *ctxt_p,
+                    const srb_flag_t srb_flag,
+                    const rb_id_t rb_id,
+                    const mui_t mui,
+                    const confirm_t confirm,
+                    const sdu_size_t sdu_buffer_size,
+                    unsigned char *const sdu_buffer,
+                    const pdcp_transmission_mode_t pt_mode,
+                    const uint32_t *sourceL2Id,
+                    const uint32_t *destinationL2Id,
+                    const uint8_t qfi,
+                    const bool rqi);
 
   void (*rx_entity)(struct nr_sdap_entity_s *entity,
                     rb_id_t pdcp_entity,
@@ -114,7 +113,7 @@ typedef struct nr_sdap_entity_s {
 } nr_sdap_entity_t;
 
 /* QFI to DRB Mapping Related Function */
-void nr_sdap_qfi2drb_map_update(nr_sdap_entity_t *entity, uint8_t qfi, rb_id_t drb, boolean_t hasSdap);
+void nr_sdap_qfi2drb_map_update(nr_sdap_entity_t *entity, uint8_t qfi, rb_id_t drb, bool hasSdap);
 
 /* QFI to DRB Mapping Related Function */
 void nr_sdap_qfi2drb_map_del(nr_sdap_entity_t *entity, uint8_t qfi);
@@ -168,7 +167,7 @@ void nr_sdap_ue_qfi2drb_config(nr_sdap_entity_t *existing_sdap_entity,
 nr_sdap_entity_t *new_nr_sdap_entity(int has_sdap,
                                      uint16_t rnti,
                                      int pdusession_id,
-                                     boolean_t is_defaultDRB,
+                                     bool is_defaultDRB,
                                      uint8_t default_DRB,
                                      NR_QFI_t *mapped_qfi_2_add,
                                      uint8_t mappedQFIs2AddCount);
diff --git a/openair2/UTIL/OMG/defs.h b/openair2/UTIL/OMG/defs.h
index 06c9bf6e73fe1a5adc3c2f6022157969ccfd43ce..1102a69cc56a7ee85c825bb2a73de6291d87e7e6 100644
--- a/openair2/UTIL/OMG/defs.h
+++ b/openair2/UTIL/OMG/defs.h
@@ -29,12 +29,6 @@
 
 #include <stdlib.h>
 
-// TYPEDEFS
-
-#define true 1
-#define false 0
-
-//typedef char bool;
 #include <stdbool.h>
 #include "omg_constants.h"
 
diff --git a/openair2/UTIL/OPT/opt.h b/openair2/UTIL/OPT/opt.h
index ae6a3eb2a65fb4e8dac6eabaa69942381afbc445..d08790a05847387c2b807eb67da9b407cd05b036 100644
--- a/openair2/UTIL/OPT/opt.h
+++ b/openair2/UTIL/OPT/opt.h
@@ -109,11 +109,14 @@ typedef enum radio_type_e {
 
 extern int opt_enabled;
 #define trace_pdu(x...) if (opt_enabled) trace_pdu_implementation(0, x)
-#define trace_NRpdu(x...) if (opt_enabled) trace_pdu_implementation(1, x)
+#define trace_NRpdu(x...) if (opt_enabled) nr_trace_pdu_implementation(1, x)
 
 void trace_pdu_implementation(int nr, int direction, uint8_t *pdu_buffer, unsigned int pdu_buffer_size,
                               int ueid, int rntiType, int rnti, uint16_t sysFrame, uint8_t subframe,
                               int oob_event, int oob_event_value);
+void nr_trace_pdu_implementation(int nr, int direction, uint8_t *pdu_buffer, unsigned int pdu_buffer_size,
+				 int rntiType, int rnti, uint16_t sysFrame, uint8_t subframe,
+				 int oob_event, int oob_event_value);
 
 int init_opt(void);
 
diff --git a/openair2/UTIL/OPT/probe.c b/openair2/UTIL/OPT/probe.c
index 8731eb294a5a64ab9a4b57ffb7fd8e1d5fde5594..9359c48e95a93a6b7363c0b2ea773a1974ca3f99 100644
--- a/openair2/UTIL/OPT/probe.c
+++ b/openair2/UTIL/OPT/probe.c
@@ -476,6 +476,14 @@ static void SendFrameNR(guint8 radioType, guint8 direction, guint8 rntiType,
 extern RAN_CONTEXT_t RC;
 #include <openair1/PHY/phy_extern_ue.h>
 /* Remote serveraddress (where Wireshark is running) */
+void nr_trace_pdu_implementation(int nr, int direction, uint8_t *pdu_buffer, unsigned int pdu_buffer_size,
+				 int rntiType, int rnti, uint16_t sysFrameNumber, uint8_t subFrameNumber, int oob_event,
+				 int oob_event_value) {
+  trace_pdu_implementation(nr, direction, pdu_buffer, pdu_buffer_size,
+			   rnti, rntiType, rnti, sysFrameNumber, subFrameNumber, oob_event,
+			   oob_event_value);
+}
+
 void trace_pdu_implementation(int nr, int direction, uint8_t *pdu_buffer, unsigned int pdu_buffer_size,
                               int ueid, int rntiType, int rnti, uint16_t sysFrameNumber, uint8_t subFrameNumber, int oob_event,
                               int oob_event_value) {
diff --git a/openair2/X2AP/x2ap_common.h b/openair2/X2AP/x2ap_common.h
index a2f903a73725f812b44314e02408ad40ceed145f..7dd88ffa21a2f496a3ebf2f7ca5790d6e3aa65b8 100644
--- a/openair2/X2AP/x2ap_common.h
+++ b/openair2/X2AP/x2ap_common.h
@@ -52,11 +52,6 @@
 # define X2AP_PORT 36422
 #endif
 
-#ifndef TRUE
-#define TRUE 1
-#define FALSE 0
-#endif
-
 extern int asn1_xer_print;
 
 #if defined(ENB_MODE)
diff --git a/openair3/M3AP/m3ap_common.h b/openair3/M3AP/m3ap_common.h
index 7f68510314fa31b18148a222e7769cdd17990c49..c5f55bc70a293e16cc7360c6f55e2d2549598b6d 100644
--- a/openair3/M3AP/m3ap_common.h
+++ b/openair3/M3AP/m3ap_common.h
@@ -52,11 +52,6 @@
 # define M3AP_PORT 36444
 #endif
 
-#ifndef TRUE
-#define TRUE 1
-#define FALSE 0
-#endif
-
 extern int asn1_xer_print;
 
 #if defined(ENB_MODE)
diff --git a/openair3/NAS/COMMON/UTIL/nas_timer.c b/openair3/NAS/COMMON/UTIL/nas_timer.c
index 8448d9a78cce62155edfc34ab35c266b5bfe6d48..b67a3bc232f8d8402c891e327658ab2a41b8a346 100644
--- a/openair3/NAS/COMMON/UTIL/nas_timer.c
+++ b/openair3/NAS/COMMON/UTIL/nas_timer.c
@@ -121,7 +121,7 @@ static nas_timer_database_t _nas_timer_db = {
 static void _nas_timer_db_init(void);
 
 static int _nas_timer_db_get_id(void);
-static int _nas_timer_db_is_active(int id);
+static bool _nas_timer_db_is_active(int id);
 static nas_timer_entry_t *_nas_timer_db_create_entry(long sec,
     nas_timer_callback_t cb, void *args);
 static void _nas_timer_db_delete_entry(int id);
@@ -130,7 +130,7 @@ static void _nas_timer_db_insert_entry(int id, nas_timer_entry_t *te);
 static int _nas_timer_db_insert(timer_queue_t *entry);
 
 static nas_timer_entry_t *_nas_timer_db_remove_entry(int id);
-static int _nas_timer_db_remove(timer_queue_t *entry);
+static bool _nas_timer_db_remove(timer_queue_t *entry);
 
 /*
  * -----------------------------------------------------------------------------
@@ -408,12 +408,12 @@ static int _nas_timer_db_get_id(void)
  **      Others:    _nas_timer_db                              **
  **                                                                        **
  ** Outputs:     None                                                      **
- **      Return:    TRUE if the timer entry is active; FALSE   **
+ **      Return:    true if the timer entry is active; false   **
  **             if it is not an active timer entry.        **
  **      Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
-static int _nas_timer_db_is_active(int id)
+static bool _nas_timer_db_is_active(int id)
 {
   return ( (id != NAS_TIMER_INACTIVE_ID) &&
            (_nas_timer_db.tq[id].id != NAS_TIMER_INACTIVE_ID) );
@@ -562,11 +562,11 @@ static int _nas_timer_db_insert(timer_queue_t *entry)
   } else {
     /* The new entry is the first entry of the list */
     _nas_timer_db.head = entry;
-    return TRUE;
+    return true;
   }
 
   /* The new entry is NOT the first entry of the list */
-  return FALSE;
+  return false;
 }
 
 /****************************************************************************
@@ -588,7 +588,7 @@ static int _nas_timer_db_insert(timer_queue_t *entry)
  ***************************************************************************/
 static nas_timer_entry_t *_nas_timer_db_remove_entry(int id)
 {
-  int restart;
+  bool restart;
 
   /* The identifier of the timer is valid within the timer queue */
   assert(_nas_timer_db.tq[id].id == id);
@@ -622,7 +622,7 @@ static nas_timer_entry_t *_nas_timer_db_remove_entry(int id)
   return (_nas_timer_db.tq[id].entry);
 }
 
-static int _nas_timer_db_remove(timer_queue_t *entry)
+static bool _nas_timer_db_remove(timer_queue_t *entry)
 {
   /* Update the pointer from the previous entry */
   /* prev ---> entry ---> next */
@@ -644,12 +644,12 @@ static int _nas_timer_db_remove(timer_queue_t *entry)
 
     if (_nas_timer_db.head != NULL) {
       /* Other timers are scheduled to expire */
-      return TRUE;
+      return true;
     }
   }
 
   /* The entry was NOT the first entry of the list */
-  return FALSE;
+  return false;
 }
 
 /*
diff --git a/openair3/NAS/COMMON/UTIL/socket.c b/openair3/NAS/COMMON/UTIL/socket.c
index 53a6ec8823d063bb5ec1d7d87154015af2981bd6..20c071203df0ab92a54c8707683c13d12a98aa5a 100644
--- a/openair3/NAS/COMMON/UTIL/socket.c
+++ b/openair3/NAS/COMMON/UTIL/socket.c
@@ -397,7 +397,7 @@ static int _socket_set_option(int sfd)
    * and it will simply open another socket on the same port and
    * continue listening.
    */
-  optval = TRUE;
+  optval = true;
 
   if (setsockopt (sfd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) < 0) {
     return RETURNerror;
@@ -405,12 +405,12 @@ static int _socket_set_option(int sfd)
 
   /* IPV6_V6ONLY socket option
    * -------------------------
-   * When option is set to TRUE, the socket is restricted to sending and
+   * When option is set to true, the socket is restricted to sending and
    * receiving IPv6 packets only.
-   * When option is set to FALSE, the socket can be used to send and receive
+   * When option is set to false, the socket can be used to send and receive
    * packets to and from an IPv6 address or an IPv4-mapped IPv6 address.
    */
-  optval = FALSE;
+  optval = false;
 
   if (setsockopt (sfd, IPPROTO_IPV6, IPV6_V6ONLY, &optval, sizeof(optval)) < 0) {
     return RETURNerror;
diff --git a/openair3/NAS/COMMON/UTIL/stty.c b/openair3/NAS/COMMON/UTIL/stty.c
index eceb0b06b139294326ef911f81de8e1aec8b68c0..fe87a63e44045ff6f50876fab2ae1c12f0c6bac2 100644
--- a/openair3/NAS/COMMON/UTIL/stty.c
+++ b/openair3/NAS/COMMON/UTIL/stty.c
@@ -192,7 +192,7 @@ static sttyset_t stty_params[] = {
   { NULL, 0,  0,    0 }
 };
 
-static int _stty_set_this(struct termios *term, const sttyset_t *p, int turnon);
+static int _stty_set_this(struct termios *term, const sttyset_t *p, bool turnon);
 
 /****************************************************************************/
 /******************  E X P O R T E D    F U N C T I O N S  ******************/
@@ -207,7 +207,7 @@ static int _stty_set_this(struct termios *term, const sttyset_t *p, int turnon);
  **                                                                        **
  ** Inputs:  p:   The TTY parameters                         **
  **    turnon:  Indicate whether the parameter should be   **
- **                             turned on (TRUE) or turned off (FALSE)     **
+ **                             turned on (true) or turned off (false)     **
  **    Others:  None                                       **
  **                                                                        **
  ** Outputs:   term:    The termios structure to fill              **
@@ -223,7 +223,7 @@ int stty_set(int fd, const char *params)
   register char *s;
   struct termios term;
   register int i;
-  int mode;
+  bool mode;
 
   /* Get current tty attributes */
   if ( tcgetattr(fd, &term) < 0 ) {
@@ -234,10 +234,10 @@ int stty_set(int fd, const char *params)
   p = strtok(s," \t\n");
 
   while (p && (rc != RETURNerror)) {
-    mode = 1;
+    mode = true;
 
     if ( *p == '-' ) {
-      mode = 0;
+      mode = false;
       p++;
     }
 
@@ -275,7 +275,7 @@ int stty_set(int fd, const char *params)
  **                                                                        **
  ** Inputs:  p:   The TTY parameters                         **
  **    turnon:  Indicate whether the parameter should be   **
- **                             turned on (TRUE) or turned off (FALSE)     **
+ **                             turned on (true) or turned off (false)     **
  **    Others:  None                                       **
  **                                                                        **
  ** Outputs:   term:    The termios structure to fill              **
@@ -283,7 +283,7 @@ int stty_set(int fd, const char *params)
  **    Others:  None                                       **
  **                                                                        **
  ***************************************************************************/
-static int _stty_set_this(struct termios *term, const sttyset_t *p, int turnon)
+static int _stty_set_this(struct termios *term, const sttyset_t *p, bool turnon)
 {
   int rc = RETURNok;
 
diff --git a/openair3/NAS/NR_UE/nr_nas_msg_sim.h b/openair3/NAS/NR_UE/nr_nas_msg_sim.h
index 9655f87130f472f13a18ce1ce182bf9a6eef3b3b..abdc5b2e757642f9d8d98ff71826502c0fd53fbb 100644
--- a/openair3/NAS/NR_UE/nr_nas_msg_sim.h
+++ b/openair3/NAS/NR_UE/nr_nas_msg_sim.h
@@ -80,7 +80,6 @@ typedef struct {
   uint8_t kgnb[32];
 } ue_sa_security_key_t;
 
-
 typedef enum fgs_protocol_discriminator_e {
   /* Protocol discriminator identifier for 5GS Mobility Management */
   FGS_MOBILITY_MANAGEMENT_MESSAGE =   0x7E,
diff --git a/openair3/NAS/TEST/AS_SIMULATOR/as_simulator.c b/openair3/NAS/TEST/AS_SIMULATOR/as_simulator.c
index bbc37d18a3caaa3380a32c081f6afa3a0a10bd6a..387c3de3a8c07d7c8ee2d3019c5d044308b38346 100644
--- a/openair3/NAS/TEST/AS_SIMULATOR/as_simulator.c
+++ b/openair3/NAS/TEST/AS_SIMULATOR/as_simulator.c
@@ -120,12 +120,12 @@ static socket_id_t * _as_simulator_mme_sid = NULL;
 /*
  * UE NAS process connection manager's running indicator
  */
-static int _as_simulator_ue_is_running = FALSE;
+static bool _as_simulator_ue_is_running = false;
 
 /*
  * MME NAS process connection manager's running indicator
  */
-static int _as_simulator_mme_is_running = FALSE;
+static bool _as_simulator_mme_is_running = false;
 
 static int _set_signal_handler(int signal, void (handler)(int));
 static void _signal_handler(int signal_number);
@@ -307,8 +307,8 @@ static void _signal_handler(int signal_number)
 {
   printf("\nWARNING\t: %s - Signal %d received\n", __FUNCTION__,
          signal_number);
-  _as_simulator_ue_is_running = FALSE;
-  _as_simulator_mme_is_running = FALSE;
+  _as_simulator_ue_is_running = false;
+  _as_simulator_mme_is_running = false;
 }
 
 /*
@@ -321,7 +321,7 @@ static void* _as_simulator_ue_mngr(void* args)
   int msg_id;
   as_message_t msg;
 
-  _as_simulator_ue_is_running = TRUE;
+  _as_simulator_ue_is_running = true;
 
   printf("INFO\t: %s - UE connection manager started\n", __FUNCTION__);
 
@@ -388,7 +388,7 @@ static void* _as_simulator_ue_mngr(void* args)
   }
 
   /* Close the connection to the network sublayer */
-  _as_simulator_ue_is_running = FALSE;
+  _as_simulator_ue_is_running = false;
   printf("ERROR\t: The UE connection manager exited\n");
   return (NULL);
 }
@@ -403,7 +403,7 @@ static void* _as_simulator_mme_mngr(void* args)
   int msg_id;
   as_message_t msg;
 
-  _as_simulator_mme_is_running = TRUE;
+  _as_simulator_mme_is_running = true;
 
   printf("INFO\t: %s - MME connection manager started\n", __FUNCTION__);
 
@@ -469,7 +469,7 @@ static void* _as_simulator_mme_mngr(void* args)
   }
 
   /* Close the connection to the network sublayer */
-  _as_simulator_mme_is_running = FALSE;
+  _as_simulator_mme_is_running = false;
   printf("ERROR\t: %s - The MME connection manager exited\n", __FUNCTION__);
   return (NULL);
 }
diff --git a/openair3/NAS/TEST/NETWORK/network_simulator.c b/openair3/NAS/TEST/NETWORK/network_simulator.c
index 461f701f95181d08a1c8cd2cb4a6a6de7dc33f8e..492a709463f348f0ad72b2308dbe3539dfc02fe6 100644
--- a/openair3/NAS/TEST/NETWORK/network_simulator.c
+++ b/openair3/NAS/TEST/NETWORK/network_simulator.c
@@ -208,7 +208,7 @@ static const OctetString* _network_simulator_pdn[NETWORK_IP_MAX][2] = {
 static int _set_signal_handler(int signal, void (handler)(int));
 static void _signal_handler(int signal_number);
 static int _process_message(int msgID, const as_message_t* req);
-static int _assign_pdn_address(int ue_pdn_type, int is_initial, int* pdn_type, OctetString* pdn);
+static int _assign_pdn_address(int ue_pdn_type, bool is_initial, int* pdn_type, OctetString* pdn);
 
 /* Functions used to process messages received from the Access Stratum */
 static int _process_cell_info_req(const cell_info_req_t* req, cell_info_cnf_t* rsp);
@@ -283,7 +283,7 @@ int main (int argc, const char* argv[])
   /*
    * Network simulator main loop
    */
-  while (TRUE) {
+  while (true) {
     as_message_t msg;
 
     /* Receive message from the NAS */
@@ -1072,11 +1072,11 @@ static int _process_pdn_connectivity_request(const pdn_connectivity_request_msg*
     /* Assign PDN address */
     if (apn.length > 0) {
       request->accesspointname.accesspointnamevalue = apn;
-      esm_cause = _assign_pdn_address(requested_pdn_type, FALSE, &pdn_type,
+      esm_cause = _assign_pdn_address(requested_pdn_type, false, &pdn_type,
                                       &request->pdnaddress.pdnaddressinformation);
     } else {
       request->accesspointname.accesspointnamevalue = EURECOM_APN;
-      esm_cause = _assign_pdn_address(requested_pdn_type, TRUE, &pdn_type,
+      esm_cause = _assign_pdn_address(requested_pdn_type, true, &pdn_type,
                                       &request->pdnaddress.pdnaddressinformation);
     }
 
diff --git a/openair3/NAS/TEST/USER/user_simulator.c b/openair3/NAS/TEST/USER/user_simulator.c
index 1c429c3b8508c1b766d0c27a0d1289d3d2edb8a7..3050c166927f932fe7ac37b27a175786cd884174 100644
--- a/openair3/NAS/TEST/USER/user_simulator.c
+++ b/openair3/NAS/TEST/USER/user_simulator.c
@@ -192,7 +192,7 @@ int main (int argc, const char* argv[])
   /*
    * User simulator main loop
    */
-  while (TRUE) {
+  while (true) {
     char c;
     int len;
 
@@ -293,7 +293,7 @@ static void _signal_handler(int signal_number)
  */
 static void* _receive_thread(void* arg)
 {
-  while (TRUE) {
+  while (true) {
     /* Receive AT response from the NAS sublayer */
     int rbytes = USER_RECV(_user_simulator_recv_buffer,
                            USER_SIMULATOR_BUFFER_SIZE);
diff --git a/openair3/NAS/UE/API/USER/at_command.c b/openair3/NAS/UE/API/USER/at_command.c
index ab85b2d2fa6fe994ffe6956e79d431c9e00a4e5c..a6591c6748227301cb9b7a3c5555d1889d084e1f 100644
--- a/openair3/NAS/UE/API/USER/at_command.c
+++ b/openair3/NAS/UE/API/USER/at_command.c
@@ -354,7 +354,7 @@ static int ParseString(char * at_str, at_command_t* at_command)
   char* terminal_character_index = NULL;
   int num_of_chars_to_compare = -1;
   int handler_index;
-  int handler_found = FALSE;
+  bool handler_found = false;
   int check_for_carriage_return_index = 0;
 
   /*
@@ -415,7 +415,7 @@ static int ParseString(char * at_str, at_command_t* at_command)
     if (strncasecmp(at_str, _at_command_handler[handler_index].command,
                     num_of_chars_to_compare) != 0) continue;
 
-    handler_found = TRUE;
+    handler_found = true;
     break;
   }
 
@@ -681,7 +681,7 @@ static unsigned int NumberOfParameters(const unsigned char* str)
  **      Others:  None                                       **
  **                                                                        **
  ** Outputs:   None                                                      **
- **      Return:  TRUE, FALSE                                **
+ **      Return:  true, false                                **
  **      Others:  None                                       **
  **                                                                        **
  ***************************************************************************/
@@ -689,11 +689,11 @@ static unsigned int IsNumeric(const char* str, size_t len)
 {
   while (len-- > 0) {
     if (!isdigit(str[len])) {
-      return FALSE;
+      return false;
     }
   }
 
-  return TRUE;
+  return true;
 }
 
 /****************************************************************************/
@@ -719,7 +719,7 @@ static int parse_e1(const char* string, int position, at_command_t* at_command)
 static int parse_q0(const char* string, int position, at_command_t* at_command)
 {
   /* Result code suppression Q0 */
-  at_error_code_suppression_q1 = FALSE;
+  at_error_code_suppression_q1 = false;
   at_command->id = 0;
   at_command->mask = AT_COMMAND_NO_PARAM;
   return at_command->id;
@@ -728,7 +728,7 @@ static int parse_q0(const char* string, int position, at_command_t* at_command)
 static int parse_q1(const char* string, int position, at_command_t* at_command)
 {
   /* Result code suppression Q1 */
-  at_error_code_suppression_q1 = TRUE;
+  at_error_code_suppression_q1 = true;
   at_command->id = 0;
   at_command->mask = AT_COMMAND_NO_PARAM;
   return at_command->id;
@@ -738,7 +738,7 @@ static int parse_v0(const char* string, int position, at_command_t* at_command)
 {
   /* Response format V0 (numeric result code + limited header) */
   at_error_format = AT_ERROR_NUMERIC;
-  at_response_format_v1 = FALSE;
+  at_response_format_v1 = false;
   at_command->id = 0;
   at_command->mask = AT_COMMAND_NO_PARAM;
   return at_command->id;
@@ -748,7 +748,7 @@ static int parse_v1(const char* string, int position, at_command_t* at_command)
 {
   /* Response format V1 (verbose result code + full header) */
   at_error_format = AT_ERROR_VERBOSE;
-  at_response_format_v1 = TRUE;
+  at_response_format_v1 = true;
   at_command->id = 0;
   at_command->mask = AT_COMMAND_NO_PARAM;
   return at_command->id;
diff --git a/openair3/NAS/UE/API/USER/at_error.c b/openair3/NAS/UE/API/USER/at_error.c
index d004c897368bc4d467954c02ac125ea0ef856985..bad7127adc4de4cd10493c24b44edf2ad793eb5c 100644
--- a/openair3/NAS/UE/API/USER/at_error.c
+++ b/openair3/NAS/UE/API/USER/at_error.c
@@ -55,10 +55,10 @@ extern int at_response_format_v1;
 /*
  * Result code suppression indicator (set by ATQ0 and ATQ1)
  * -------------------------------------------------------
- *  FALSE - Result codes are transmitted to the user application
- *  TRUE  - Result codes are suppressed and not transmitted
+ *  false - Result codes are transmitted to the user application
+ *  true  - Result codes are suppressed and not transmitted
  */
-int at_error_code_suppression_q1 = FALSE;
+bool at_error_code_suppression_q1 = false;
 
 /*
  * Verbose mode indicator (set by ATV0, ATV1 and AT+CMEE)
diff --git a/openair3/NAS/UE/API/USER/at_response.c b/openair3/NAS/UE/API/USER/at_response.c
index 859db90d7e0d5393045771260e30b35f968e7484..eef0385750cffd5b181f432c84002f149ea45289 100644
--- a/openair3/NAS/UE/API/USER/at_response.c
+++ b/openair3/NAS/UE/API/USER/at_response.c
@@ -52,10 +52,10 @@ Description Defines structure of the AT command response returned after
 /*
  * Response format indicator (set by ATV0 and ATV1)
  * -----------------------------------------------
- *  TRUE  - <CR><LF><text><CR><LF>, <CR><LF><verbose code><CR><LF>
- *  FALSE - <text><CR><LF>, <numeric code><CR><LF>
+ *  true  - <CR><LF><text><CR><LF>, <CR><LF><verbose code><CR><LF>
+ *  false - <text><CR><LF>, <numeric code><CR><LF>
  */
-int at_response_format_v1 = TRUE;
+bool at_response_format_v1 = true;
 
 /****************************************************************************/
 /*******************  L O C A L    D E F I N I T I O N S  *******************/
diff --git a/openair3/NAS/UE/EMM/Attach.c b/openair3/NAS/UE/EMM/Attach.c
index 5e7a1f578b76c68803089cb52fd1cda893b7b6fa..52f7ebce4488d0d6b39455122aa3d7f2ef518961 100644
--- a/openair3/NAS/UE/EMM/Attach.c
+++ b/openair3/NAS/UE/EMM/Attach.c
@@ -146,7 +146,7 @@ int emm_proc_attach(nas_user_t *user, emm_proc_attach_type_t type)
 
   /* Update the emergency bearer service indicator */
   if (type == EMM_ATTACH_TYPE_EMERGENCY) {
-    user->emm_data->is_emergency = TRUE;
+    user->emm_data->is_emergency = true;
   }
 
   /* Setup initial NAS information message to transfer */
@@ -211,7 +211,7 @@ int emm_proc_attach(nas_user_t *user, emm_proc_attach_type_t type)
   }
 
   /* Setup EPS NAS security data */
-  emm_as_set_security_data(&emm_as->sctx, user->emm_data->security, FALSE, FALSE);
+  emm_as_set_security_data(&emm_as->sctx, user->emm_data->security, false, false);
   emm_as->ksi = EMM_AS_NO_KEY_AVAILABLE;
 
   if (user->emm_data->security) {
@@ -230,8 +230,8 @@ int emm_proc_attach(nas_user_t *user, emm_proc_attach_type_t type)
    * is requested to setup a default EPS bearer
    */
   esm_sap.primitive = ESM_PDN_CONNECTIVITY_REQ;
-  esm_sap.is_standalone = FALSE;
-  esm_sap.data.pdn_connect.is_defined = TRUE;
+  esm_sap.is_standalone = false;
+  esm_sap.data.pdn_connect.is_defined = true;
   esm_sap.data.pdn_connect.cid = 1;
   /* TODO: PDN type should be set according to the IP capability of the UE */
   esm_sap.data.pdn_connect.pdn_type = NET_PDN_TYPE_IPV4;
@@ -387,7 +387,7 @@ int emm_proc_attach_accept(nas_user_t *user, long t3412, long t3402, long t3423,
 
   if (n_eplmns > 0) {
     for (i = 0; (i < n_eplmns) && (i < EMM_DATA_EPLMN_MAX); i++) {
-      int is_forbidden = FALSE;
+      bool is_forbidden = false;
 
       if (!user->emm_data->is_emergency) {
         /* If the attach procedure is not for emergency bearer
@@ -395,7 +395,7 @@ int emm_proc_attach_accept(nas_user_t *user, long t3412, long t3402, long t3423,
          * code that is already in the list of forbidden PLMNs */
         for (j = 0; j < user->emm_data->fplmn.n_plmns; j++) {
           if (PLMNS_ARE_EQUAL(eplmn[i], user->emm_data->fplmn.plmn[j])) {
-            is_forbidden = TRUE;
+            is_forbidden = true;
             break;
           }
         }
@@ -418,7 +418,7 @@ int emm_proc_attach_accept(nas_user_t *user, long t3412, long t3402, long t3423,
    * Notify ESM that a default EPS bearer has to be activated
    */
   esm_sap.primitive = ESM_DEFAULT_EPS_BEARER_CONTEXT_ACTIVATE_REQ;
-  esm_sap.is_standalone = FALSE;
+  esm_sap.is_standalone = false;
   esm_sap.recv = esm_msg_pP;
   rc = esm_sap_send(user, &esm_sap);
 
@@ -445,7 +445,7 @@ int emm_proc_attach_accept(nas_user_t *user, long t3412, long t3402, long t3423,
     emm_sap.u.emm_as.u.data.ueid = user->ueid;
     /* Setup EPS NAS security data */
     emm_as_set_security_data(&emm_sap.u.emm_as.u.data.sctx,
-                             user->emm_data->security, FALSE, TRUE);
+                             user->emm_data->security, false, true);
     /* Get the activate default EPS bearer context accept message
      * to be transfered within the ESM container of the attach
      * complete message */
@@ -546,7 +546,7 @@ int emm_proc_attach_reject(nas_user_t *user, int emm_cause, const OctetString *e
   case EMM_CAUSE_EPS_NOT_ALLOWED:
   case EMM_CAUSE_BOTH_NOT_ALLOWED:
     /* Consider the USIM as invalid for EPS services */
-    user->emm_data->usim_is_valid = FALSE;
+    user->emm_data->usim_is_valid = false;
     /* Delete the list of equivalent PLMNs */
     user->emm_data->nvdata.eplmn.n_plmns = 0;
     break;
@@ -682,7 +682,7 @@ int emm_proc_attach_reject(nas_user_t *user, int emm_cause, const OctetString *e
   if (esm_msg_pP != NULL) {
     esm_sap_t esm_sap;
     esm_sap.primitive = ESM_PDN_CONNECTIVITY_REJ;
-    esm_sap.is_standalone = FALSE;
+    esm_sap.is_standalone = false;
     esm_sap.recv = esm_msg_pP;
     rc = esm_sap_send(user, &esm_sap);
   }
@@ -731,7 +731,7 @@ int emm_proc_attach_complete(void *args)
 
   /* Set the EPS update status to EU1 UPDATED */
   user->emm_data->status = EU1_UPDATED;
-  user->emm_data->is_attached = TRUE;
+  user->emm_data->is_attached = true;
 
   /*
    * Notify EMM that network attach complete message has been delivered
@@ -747,7 +747,7 @@ int emm_proc_attach_complete(void *args)
      * Complete message
      */
     esm_sap.primitive = ESM_DEFAULT_EPS_BEARER_CONTEXT_ACTIVATE_CNF;
-    esm_sap.is_standalone = FALSE;
+    esm_sap.is_standalone = false;
     rc = esm_sap_send(user, &esm_sap);
   }
 
@@ -766,7 +766,7 @@ int emm_proc_attach_complete(void *args)
  **      The  UE  shall restart the attach  procedure when timer   **
  **      T3411 expires.                                            **
  **                                                                        **
- ** Inputs:  is_initial:    TRUE if the NAS message that failed to be  **
+ ** Inputs:  is_initial:    true if the NAS message that failed to be  **
  **             transfered is an initial NAS message (ESM  **
  **             message embedded within an Attach Request  **
  **             message)                                   **
@@ -778,7 +778,7 @@ int emm_proc_attach_complete(void *args)
  **      Others:    T3410, T3411                               **
  **                                                                        **
  ***************************************************************************/
-int emm_proc_attach_failure(int is_initial, void *args)
+int emm_proc_attach_failure(bool is_initial, void *args)
 {
   LOG_FUNC_IN;
   int rc = RETURNok;
@@ -804,7 +804,7 @@ int emm_proc_attach_failure(int is_initial, void *args)
      * to be transmitted
      */
     esm_sap.primitive = ESM_PDN_CONNECTIVITY_REJ;
-    esm_sap.is_standalone = FALSE;
+    esm_sap.is_standalone = false;
     esm_sap.recv = NULL;
   } else {
     /*
@@ -813,7 +813,7 @@ int emm_proc_attach_failure(int is_initial, void *args)
      * has failed to be transmitted
      */
     esm_sap.primitive = ESM_DEFAULT_EPS_BEARER_CONTEXT_ACTIVATE_REJ;
-    esm_sap.is_standalone = FALSE;
+    esm_sap.is_standalone = false;
     esm_sap.recv = NULL;
   }
 
@@ -919,7 +919,7 @@ int emm_proc_attach_set_emergency(emm_data_t *emm_data)
   LOG_TRACE(WARNING, "EMM-PROC  - UE is now attached to the network for "
             "emergency bearer services only");
 
-  emm_data->is_emergency = TRUE;
+  emm_data->is_emergency = true;
 
   LOG_FUNC_RETURN(RETURNok);
 }
@@ -950,7 +950,7 @@ int emm_proc_attach_set_detach(void *nas_user)
             "EMM-PROC  - UE is now locally detached from the network");
 
   /* Reset the network attachment indicator */
-  user->emm_data->is_attached = FALSE;
+  user->emm_data->is_attached = false;
   /*
    * Notify that the UE is locally detached from the network
    */
diff --git a/openair3/NAS/UE/EMM/Authentication.c b/openair3/NAS/UE/EMM/Authentication.c
index a2762d08e838461323728a9f205fef783df9395f..a3b58f89f42bf5f5cd8aca173629ba623954058f 100644
--- a/openair3/NAS/UE/EMM/Authentication.c
+++ b/openair3/NAS/UE/EMM/Authentication.c
@@ -129,7 +129,7 @@ static int _authentication_kasme(const OctetString *autn,
  **      authentication challenge data and respond with an AUTHEN- **
  **      TICATION RESPONSE message to the network.                 **
  **                                                                        **
- ** Inputs:  native_ksi:    TRUE if the security context is of type    **
+ ** Inputs:  native_ksi:    true if the security context is of type    **
  **             native (for KSIASME)                       **
  **      ksi:       The NAS ket sey identifier                 **
  **      rand:      Authentication parameter RAND              **
@@ -179,14 +179,14 @@ int emm_proc_authentication_request(nas_user_t *user, int native_ksi, int ksi,
   OctetString res = {AUTH_RES_SIZE, authentication_data->res};
 
   if ((memcmp(authentication_data->rand, rand->value, AUTH_CK_SIZE) != 0) ||
-      (authentication_data->auth_process_started == FALSE)) {
+      (authentication_data->auth_process_started == false)) {
     /*
      * There is no valid stored RAND in the ME or the stored RAND is
      * different from the new received value in the AUTHENTICATION
      * REQUEST message OR if this is first time UE starting the
      * Authentication process
      */
-	authentication_data->auth_process_started = TRUE;
+	authentication_data->auth_process_started = true;
     OctetString auts;
     auts.length = 0;
     auts.value = (uint8_t *)malloc(AUTH_AUTS_SIZE);
@@ -308,7 +308,7 @@ int emm_proc_authentication_request(nas_user_t *user, int native_ksi, int ksi,
   emm_sap.u.emm_as.u.security.res = &res;
   /* Setup EPS NAS security data */
   emm_as_set_security_data(&emm_sap.u.emm_as.u.security.sctx,
-                           user->emm_data->security, FALSE, TRUE);
+                           user->emm_data->security, false, true);
   rc = emm_sap_send(user, &emm_sap);
 
   if (rc != RETURNerror) {
@@ -398,7 +398,7 @@ int emm_proc_authentication_reject(nas_user_t *user)
   }
 
   /* Consider the USIM invalid */
-  user->emm_data->usim_is_valid = FALSE;
+  user->emm_data->usim_is_valid = false;
 
   /* Stop timer T3410 */
   if (emm_timers->T3410.id != NAS_TIMER_INACTIVE_ID) {
@@ -652,7 +652,7 @@ static int _authentication_abnormal_cases_cde(nas_user_t *user, int emm_cause,
   emm_sap.u.emm_as.u.security.auts = auts;
   /* Setup EPS NAS security data */
   emm_as_set_security_data(&emm_sap.u.emm_as.u.security.sctx,
-                           user->emm_data->security, FALSE, TRUE);
+                           user->emm_data->security, false, true);
   rc = emm_sap_send(user, &emm_sap);
 
   if (rc != RETURNerror) {
diff --git a/openair3/NAS/UE/EMM/Detach.c b/openair3/NAS/UE/EMM/Detach.c
index b61bcdc14dc7e7ea1d04ff61896ca4db7137d01e..654486226e0cd00b615b5bf366e1b9bc96777aec 100644
--- a/openair3/NAS/UE/EMM/Detach.c
+++ b/openair3/NAS/UE/EMM/Detach.c
@@ -114,7 +114,7 @@ static int _emm_detach_abort(nas_user_t *user, emm_proc_detach_type_t type);
  **      Return:    RETURNok, RETURNerror                      **
  **                                                                        **
  ***************************************************************************/
-int emm_proc_detach(nas_user_t *user, emm_proc_detach_type_t type, int switch_off)
+int emm_proc_detach(nas_user_t *user, emm_proc_detach_type_t type, bool switch_off)
 {
   LOG_FUNC_IN;
 
@@ -154,7 +154,7 @@ int emm_proc_detach(nas_user_t *user, emm_proc_detach_type_t type, int switch_of
   emm_as->guti = user->emm_data->guti;
   emm_as->ueid = user->ueid;
   /* Setup EPS NAS security data */
-  emm_as_set_security_data(&emm_as->sctx, user->emm_data->security, FALSE, TRUE);
+  emm_as_set_security_data(&emm_as->sctx, user->emm_data->security, false, true);
 
   /*
    * Notify EMM-AS SAP that Detach Request message has to
@@ -280,7 +280,7 @@ int emm_proc_detach_accept(void* args)
  **      Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
-int emm_proc_detach_failure(int is_initial, void *args)
+int emm_proc_detach_failure(bool is_initial, void *args)
 {
   LOG_FUNC_IN;
 
@@ -405,8 +405,7 @@ void *emm_detach_t3421_handler(void *args)
     emm_as->guti = user->emm_data->guti;
     emm_as->ueid = user->ueid;
     /* Setup EPS NAS security data */
-    emm_as_set_security_data(&emm_as->sctx, user->emm_data->security,
-                             FALSE, TRUE);
+    emm_as_set_security_data(&emm_as->sctx, user->emm_data->security, false, true);
 
     /*
      * Notify EMM-AS SAP that Detach Request message has to
diff --git a/openair3/NAS/UE/EMM/EmmStatusHdl.c b/openair3/NAS/UE/EMM/EmmStatusHdl.c
index 367d0327f4f1c6d6984adf44651c416da839b262..9ac2fc794b91a7d9397b28ab29c0456aa8b1ac43 100644
--- a/openair3/NAS/UE/EMM/EmmStatusHdl.c
+++ b/openair3/NAS/UE/EMM/EmmStatusHdl.c
@@ -137,8 +137,7 @@ int emm_proc_status(nas_user_t *user, int emm_cause)
   emm_sap.u.emm_as.u.status.guti = user->emm_data->guti;
   sctx = user->emm_data->security;
   /* Setup EPS NAS security data */
-  emm_as_set_security_data(&emm_sap.u.emm_as.u.status.sctx, sctx,
-                           FALSE, TRUE);
+  emm_as_set_security_data(&emm_sap.u.emm_as.u.status.sctx, sctx, false, true);
 
   rc = emm_sap_send(user, &emm_sap);
 
diff --git a/openair3/NAS/UE/EMM/Identification.c b/openair3/NAS/UE/EMM/Identification.c
index 0364c6d22f2c79797a345aa2596c61e6b67ed1a2..d4fc85a931bcb6fab0cf7b39ee1f8560e4850554 100644
--- a/openair3/NAS/UE/EMM/Identification.c
+++ b/openair3/NAS/UE/EMM/Identification.c
@@ -199,8 +199,7 @@ int emm_proc_identification_request(nas_user_t *user, emm_proc_identity_type_t t
   emm_sap.u.emm_as.u.security.ueid = user->ueid;
   emm_sap.u.emm_as.u.security.msgType = EMM_AS_MSG_TYPE_IDENT;
   /* Setup EPS NAS security data */
-  emm_as_set_security_data(&emm_sap.u.emm_as.u.security.sctx,
-                           user->emm_data->security, FALSE, TRUE);
+  emm_as_set_security_data(&emm_sap.u.emm_as.u.security.sctx, user->emm_data->security, false, true);
   rc = emm_sap_send(user, &emm_sap);
 
   LOG_FUNC_RETURN (rc);
diff --git a/openair3/NAS/UE/EMM/IdleMode.c b/openair3/NAS/UE/EMM/IdleMode.c
index 362d5e5b4af56ec9c677d7844ce51da9c0d7e007..50a318355c534cd26fe69730d0b0d03e8c75fcdd 100644
--- a/openair3/NAS/UE/EMM/IdleMode.c
+++ b/openair3/NAS/UE/EMM/IdleMode.c
@@ -663,8 +663,8 @@ int emm_proc_plmn_selection(nas_user_t *user, int index)
  **      to camp on an acceptable cell, irrespective of its PLMN   **
  **      identity, so that only emergency calls can be made.       **
  **                                                                        **
- ** Inputs:  found:     TRUE if a suitable cell of the chosen      **
- **             PLMN has been found; FALSE otherwise.      **
+ ** Inputs:  found:     true if a suitable cell of the chosen      **
+ **             PLMN has been found; false otherwise.      **
  **      tac:       The code of the location/tracking area the **
  **             chosen PLMN belongs to                     **
  **      ci:        The identifier of the cell                 **
@@ -685,7 +685,7 @@ int emm_proc_plmn_selection_end(nas_user_t *user, int found, tac_t tac, ci_t ci,
   emm_plmn_list_t *emm_plmn_list = user->emm_plmn_list;
   user_api_id_t *user_api_id = user->user_api_id;
   int index = emm_plmn_list->index;
-  int select_next_plmn = FALSE;
+  bool select_next_plmn = false;
 
   LOG_TRACE(INFO, "EMM-IDLE  - %s cell found for PLMN %d in %s mode",
             (found)? "One" : "No", index,
@@ -694,7 +694,7 @@ int emm_proc_plmn_selection_end(nas_user_t *user, int found, tac_t tac, ci_t ci,
             "Automatic/manual");
 
   if (found) {
-    int is_forbidden = FALSE;
+    bool is_forbidden = false;
 
     /* Select the PLMN of which a suitable cell has been found */
     emm_data->splmn = *emm_plmn_list->plmn[index];
@@ -721,7 +721,7 @@ int emm_proc_plmn_selection_end(nas_user_t *user, int found, tac_t tac, ci_t ci,
       /* Check if the selected PLMN is in the forbidden list */
       for (i = 0; i < emm_data->fplmn.n_plmns; i++) {
         if (PLMNS_ARE_EQUAL(emm_data->splmn, emm_data->fplmn.plmn[i])) {
-          is_forbidden = TRUE;
+          is_forbidden = true;
           break;
         }
       }
@@ -730,7 +730,7 @@ int emm_proc_plmn_selection_end(nas_user_t *user, int found, tac_t tac, ci_t ci,
         for (i = 0; i < emm_data->fplmn_gprs.n_plmns; i++) {
           if (PLMNS_ARE_EQUAL(emm_data->splmn,
                               emm_data->fplmn_gprs.plmn[i])) {
-            is_forbidden = TRUE;
+            is_forbidden = true;
             break;
           }
         }
@@ -745,7 +745,7 @@ int emm_proc_plmn_selection_end(nas_user_t *user, int found, tac_t tac, ci_t ci,
       if (!is_forbidden) {
         for (i = 0; i < emm_data->ftai.n_tais; i++) {
           if (TAIS_ARE_EQUAL(tai, emm_data->ftai.tai[i])) {
-            is_forbidden = TRUE;
+            is_forbidden = true;
             break;
           }
         }
@@ -754,7 +754,7 @@ int emm_proc_plmn_selection_end(nas_user_t *user, int found, tac_t tac, ci_t ci,
       if (!is_forbidden) {
         for (i = 0; i < emm_data->ftai_roaming.n_tais; i++) {
           if (TAIS_ARE_EQUAL(tai, emm_data->ftai_roaming.tai[i])) {
-            is_forbidden = TRUE;
+            is_forbidden = true;
             break;
           }
         }
@@ -793,7 +793,7 @@ int emm_proc_plmn_selection_end(nas_user_t *user, int found, tac_t tac, ci_t ci,
      * Try to select the next PLMN in the ordered list of available PLMNs
      */
     index += 1;
-    select_next_plmn = TRUE;
+    select_next_plmn = true;
 
     /* Bypass the previously selected PLMN */
     if (index == emm_plmn_list->splmn) {
@@ -809,7 +809,7 @@ int emm_proc_plmn_selection_end(nas_user_t *user, int found, tac_t tac, ci_t ci,
      * registered or equivalent PLMNs is ongoing
      */
     index += 1;
-    select_next_plmn = TRUE;
+    select_next_plmn = true;
   }
 
   else if (emm_data->plmn_mode == EMM_DATA_PLMN_MANUAL) {
@@ -830,7 +830,7 @@ int emm_proc_plmn_selection_end(nas_user_t *user, int found, tac_t tac, ci_t ci,
      */
     emm_data->plmn_mode = EMM_DATA_PLMN_AUTO;
     index = emm_plmn_list->hplmn;
-    select_next_plmn = TRUE;
+    select_next_plmn = true;
   }
 
   /*
@@ -851,7 +851,7 @@ int emm_proc_plmn_selection_end(nas_user_t *user, int found, tac_t tac, ci_t ci,
     } else {
       /* No suitable cell of any PLMN within the ordered list
        * of available PLMNs has been found */
-      select_next_plmn = FALSE;
+      select_next_plmn = false;
       emm_sap.primitive = EMMREG_NO_CELL;
     }
   }
@@ -892,11 +892,11 @@ int emm_proc_plmn_selection_end(nas_user_t *user, int found, tac_t tac, ci_t ci,
       if (emm_plmn_list->splmn == emm_plmn_list->rplmn) {
         /* The selected PLMN is the registered PLMN */
         LOG_TRACE(INFO, "EMM-IDLE  - The selected PLMN is the registered PLMN");
-        emm_data->is_rplmn = TRUE;
+        emm_data->is_rplmn = true;
       } else if (emm_plmn_list->splmn < emm_plmn_list->hplmn) {
         /* The selected PLMN is in the list of equivalent PLMNs */
         LOG_TRACE(INFO, "EMM-IDLE  - The selected PLMN is in the list of equivalent PLMNs");
-        emm_data->is_eplmn = TRUE;
+        emm_data->is_eplmn = true;
       }
 
       /*
diff --git a/openair3/NAS/UE/EMM/LowerLayer.c b/openair3/NAS/UE/EMM/LowerLayer.c
index 01b07fc35606b7662c6f7d545fb6c681fd1bcb9e..538ba210991e0c8d13ef2f755474ccd4f25c60ac 100644
--- a/openair3/NAS/UE/EMM/LowerLayer.c
+++ b/openair3/NAS/UE/EMM/LowerLayer.c
@@ -208,7 +208,7 @@ int lowerlayer_data_ind(nas_user_t *user, const OctetString *data)
   LOG_FUNC_IN;
 
   esm_sap.primitive = ESM_UNITDATA_IND;
-  esm_sap.is_standalone = TRUE;
+  esm_sap.is_standalone = true;
   esm_sap.ueid = user->ueid;
 
   esm_sap.recv = data;
@@ -250,7 +250,7 @@ int lowerlayer_data_req(nas_user_t *user, const OctetString *data)
   emm_sap.u.emm_as.u.data.NASmsg.length = data->length;
   emm_sap.u.emm_as.u.data.NASmsg.value = data->value;
   /* Setup EPS NAS security data */
-  emm_as_set_security_data(&emm_sap.u.emm_as.u.data.sctx, sctx, FALSE, TRUE);
+  emm_as_set_security_data(&emm_sap.u.emm_as.u.data.sctx, sctx, false, true);
   rc = emm_sap_send(user, &emm_sap);
 
   LOG_FUNC_RETURN (rc);
@@ -336,7 +336,7 @@ int emm_proc_lowerlayer_success(lowerlayer_data_t *lowerlayer_data)
  ** Description: Handles EMM procedure to be executed upon receiving noti- **
  **      fication that data failed to be delivered to the network. **
  **                                                                        **
- ** Inputs:  is_initial:    TRUE if the NAS message that failed to be  **
+ ** Inputs:  is_initial:    true if the NAS message that failed to be  **
  **             transfered is an initial NAS message       **
  **      Others:    None                                       **
  **                                                                        **
@@ -345,7 +345,7 @@ int emm_proc_lowerlayer_success(lowerlayer_data_t *lowerlayer_data)
  **      Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
-int emm_proc_lowerlayer_failure(lowerlayer_data_t *lowerlayer_data, int is_initial)
+int emm_proc_lowerlayer_failure(lowerlayer_data_t *lowerlayer_data, bool is_initial)
 {
   LOG_FUNC_IN;
 
diff --git a/openair3/NAS/UE/EMM/LowerLayer.h b/openair3/NAS/UE/EMM/LowerLayer.h
index 0d8eefc7f3830170be3625e420df6526e39e1db2..ed60e379bc7f7be42df25efb92ad66505ef15400 100644
--- a/openair3/NAS/UE/EMM/LowerLayer.h
+++ b/openair3/NAS/UE/EMM/LowerLayer.h
@@ -72,7 +72,7 @@ int emm_proc_lowerlayer_initialize(lowerlayer_data_t *lowerlayer_data, lowerlaye
                                    lowerlayer_release_callback_t release,
                                    void *args);
 int emm_proc_lowerlayer_success(lowerlayer_data_t *lowerlayer_data);
-int emm_proc_lowerlayer_failure(lowerlayer_data_t *lowerlayer_data, int is_initial);
+int emm_proc_lowerlayer_failure(lowerlayer_data_t *lowerlayer_data, bool is_initial);
 int emm_proc_lowerlayer_release(lowerlayer_data_t *lowerlayer_data);
 
 
diff --git a/openair3/NAS/UE/EMM/LowerLayer_defs.h b/openair3/NAS/UE/EMM/LowerLayer_defs.h
index 6035d4ed12db9111ef0bd75e7f81a550c4e58018..1a0ae7d6564719fc1f61a95eb729b73c71759c23 100644
--- a/openair3/NAS/UE/EMM/LowerLayer_defs.h
+++ b/openair3/NAS/UE/EMM/LowerLayer_defs.h
@@ -11,7 +11,7 @@ typedef int (*lowerlayer_success_callback_t)(void *);
  * Type of EMM procedure callback function executed when data are not
  * delivered to the network because a lower layer failure occurred
  */
-typedef int (*lowerlayer_failure_callback_t)(int, void *);
+typedef int (*lowerlayer_failure_callback_t)(bool, void *);
 
 /*
  * Type of EMM procedure callback function executed when NAS signalling
diff --git a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredAttemptingToAttach.c b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredAttemptingToAttach.c
index f58cf4b9e0928a01ab2abfe425ebad06985fc0db..3fa47094c7b2e0199e59bcb814d4ec8669775236 100644
--- a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredAttemptingToAttach.c
+++ b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredAttemptingToAttach.c
@@ -120,7 +120,7 @@ int EmmDeregisteredAttemptingToAttach(nas_user_t *user, const emm_reg_t *evt)
     /*
      * Data failed to be delivered to the network
      */
-    rc = emm_proc_lowerlayer_failure(user->lowerlayer_data, FALSE);
+    rc = emm_proc_lowerlayer_failure(user->lowerlayer_data, false);
     break;
 
   default:
diff --git a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredLimitedService.c b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredLimitedService.c
index 4310f963cd41b87cffa509c059ef3f617e595df9..c0763009b850a20160799b308eea592b6fc24218 100644
--- a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredLimitedService.c
+++ b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredLimitedService.c
@@ -133,7 +133,7 @@ int EmmDeregisteredLimitedService(nas_user_t *user, const emm_reg_t *evt)
     /*
      * Initial NAS message failed to be delivered to the network
      */
-    rc = emm_proc_lowerlayer_failure(user->lowerlayer_data, TRUE);
+    rc = emm_proc_lowerlayer_failure(user->lowerlayer_data, true);
     break;
 
   case _EMMREG_LOWERLAYER_RELEASE:
diff --git a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredNormalService.c b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredNormalService.c
index f77c2921a319070eebc069f392ed13c27afcec26..0925cb4e0f2dfa8620efdc1d413bdc7ccb2e7267 100644
--- a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredNormalService.c
+++ b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredNormalService.c
@@ -141,7 +141,7 @@ int EmmDeregisteredNormalService(nas_user_t *user, const emm_reg_t *evt)
     /*
      * Initial NAS message failed to be delivered to the network
      */
-    rc = emm_proc_lowerlayer_failure(user->lowerlayer_data, TRUE);
+    rc = emm_proc_lowerlayer_failure(user->lowerlayer_data, true);
     break;
 
   case _EMMREG_LOWERLAYER_RELEASE:
diff --git a/openair3/NAS/UE/EMM/SAP/EmmRegistered.c b/openair3/NAS/UE/EMM/SAP/EmmRegistered.c
index fbd3e1ce63e18fe14bd96b42102553111c323ea6..2cd25f77d60d253e5287321e83d77dea2aa8b187 100644
--- a/openair3/NAS/UE/EMM/SAP/EmmRegistered.c
+++ b/openair3/NAS/UE/EMM/SAP/EmmRegistered.c
@@ -143,7 +143,7 @@ int EmmRegistered(nas_user_t *user, const emm_reg_t *evt)
     /*
      * Data transfer message failed to be delivered
      */
-    rc = emm_proc_lowerlayer_failure(user->lowerlayer_data, FALSE);
+    rc = emm_proc_lowerlayer_failure(user->lowerlayer_data, false);
     break;
 
   case _EMMREG_LOWERLAYER_RELEASE:
diff --git a/openair3/NAS/UE/EMM/SAP/EmmRegisteredInitiated.c b/openair3/NAS/UE/EMM/SAP/EmmRegisteredInitiated.c
index 36929fc4d7feb47b125b90d7ac92891812416327..a770e08bab2be3d82cff3f7714ccf6a22bacf7d6 100644
--- a/openair3/NAS/UE/EMM/SAP/EmmRegisteredInitiated.c
+++ b/openair3/NAS/UE/EMM/SAP/EmmRegisteredInitiated.c
@@ -240,7 +240,7 @@ int EmmRegisteredInitiated(nas_user_t *user, const emm_reg_t *evt)
      * any message transfered by EMM common procedures requested
      * by the network.
      */
-    rc = emm_proc_lowerlayer_failure(user->lowerlayer_data, FALSE);
+    rc = emm_proc_lowerlayer_failure(user->lowerlayer_data, false);
     break;
 
   case _EMMREG_LOWERLAYER_RELEASE:
diff --git a/openair3/NAS/UE/EMM/SAP/emm_as.c b/openair3/NAS/UE/EMM/SAP/emm_as.c
index ea4eefadeba8ffecb1097686de6e984d5f48889f..de6dee4a5e18e741a24a2a15e1b07b517a679649 100644
--- a/openair3/NAS/UE/EMM/SAP/emm_as.c
+++ b/openair3/NAS/UE/EMM/SAP/emm_as.c
@@ -679,7 +679,7 @@ static int _emm_as_cell_info_res(nas_user_t *user, const emm_as_cell_info_t *msg
 
   int AcT = NET_ACCESS_EUTRAN;
 
-  if (msg->found == TRUE) {
+  if (msg->found == true) {
     /* Get the first supported access technology */
     while (AcT != NET_ACCESS_UNAVAILABLE) {
       if (msg->rat & (1 << AcT)) {
@@ -1081,7 +1081,7 @@ static int _emm_as_data_req(const emm_data_t *emm_data, const emm_as_data_t *msg
   LOG_FUNC_IN;
   ul_info_transfer_req_t *as_msg = (ul_info_transfer_req_t *)ul_info_transfer_req_unaligned;
   int size = 0;
-  int is_encoded = FALSE;
+  bool is_encoded = false;
 
   LOG_TRACE(INFO, "EMMAS-SAP - Send AS data transfer request");
 
@@ -1114,7 +1114,7 @@ static int _emm_as_data_req(const emm_data_t *emm_data, const emm_as_data_t *msg
     default:
       /* Send other NAS messages as already encoded ESM messages */
       size = msg->NASmsg.length;
-      is_encoded = TRUE;
+      is_encoded = true;
       break;
     }
 
diff --git a/openair3/NAS/UE/EMM/SAP/emm_asDef.h b/openair3/NAS/UE/EMM/SAP/emm_asDef.h
index 7bd464ec04d377841818163f6636d724c7d626d4..4f6182a2c9c38d1867786d8c55986643918a2a11 100644
--- a/openair3/NAS/UE/EMM/SAP/emm_asDef.h
+++ b/openair3/NAS/UE/EMM/SAP/emm_asDef.h
@@ -150,7 +150,7 @@ typedef struct emm_as_establish_s {
   uint32_t ueid;      /* UE lower layer identifier         */
   emm_as_EPS_identity_t UEid; /* UE's EPS mobile identity      */
   emm_as_security_data_t sctx;/* EPS NAS security context      */
-  int switch_off;     /* TRUE if the UE is switched off    */
+  bool switch_off;     /* true if the UE is switched off    */
   uint8_t type;       /* Network attach/detach type        */
   uint8_t RRCcause;       /* Connection establishment cause    */
   uint8_t RRCtype;        /* Associated call type          */
@@ -194,7 +194,7 @@ typedef struct emm_as_data_s {
   uint32_t ueid;      /* UE lower layer identifier        */
   const GUTI_t *guti;     /* GUTI temporary mobile identity   */
   emm_as_security_data_t sctx;/* EPS NAS security context     */
-  int switch_off;     /* TRUE if the UE is switched off   */
+  bool switch_off;     /* true if the UE is switched off   */
   uint8_t type;       /* Network detach type          */
   uint8_t delivered;      /* Data message delivery indicator  */
 #define EMM_AS_NAS_DATA_ATTACH  0x01    /* Attach complete      */
diff --git a/openair3/NAS/UE/EMM/SAP/emm_esmDef.h b/openair3/NAS/UE/EMM/SAP/emm_esmDef.h
index aac37b46bfb6680df0dc907fd41a5eab0a150a58..6e7065f9139211b89fa3a900ece1f6178cfe2f14 100644
--- a/openair3/NAS/UE/EMM/SAP/emm_esmDef.h
+++ b/openair3/NAS/UE/EMM/SAP/emm_esmDef.h
@@ -71,9 +71,9 @@ typedef enum {
  * ---------------------------------------------
  */
 typedef struct {
-  int is_emergency;   /* Indicates whether the PDN connection is established
+  bool is_emergency;   /* Indicates whether the PDN connection is established
              * for emergency bearer services only       */
-  int is_attached;    /* Indicates whether the UE remains attached to the
+  bool is_attached;    /* Indicates whether the UE remains attached to the
              * network                  */
 } emm_esm_establish_t;
 
diff --git a/openair3/NAS/UE/EMM/SAP/emm_regDef.h b/openair3/NAS/UE/EMM/SAP/emm_regDef.h
index b66c0565ea6dfd0af0be73db21ae5c9c803bf82c..752f328375bc0d5764bf95472a60ad1192bdddd2 100644
--- a/openair3/NAS/UE/EMM/SAP/emm_regDef.h
+++ b/openair3/NAS/UE/EMM/SAP/emm_regDef.h
@@ -100,7 +100,7 @@ typedef struct {
  * -------------------------------------
  */
 typedef struct {
-  int is_emergency;   /* TRUE if the UE was attempting to register to
+  bool is_emergency;   /* true if the UE was attempting to register to
              * the network for emergency services only  */
 } emm_reg_attach_t;
 
@@ -109,7 +109,7 @@ typedef struct {
  * -------------------------------------
  */
 typedef struct {
-  int switch_off; /* TRUE if the UE is switched off       */
+  bool switch_off; /* true if the UE is switched off       */
   int type;       /* Network detach type              */
 } emm_reg_detach_t;
 
diff --git a/openair3/NAS/UE/EMM/SecurityModeControl.c b/openair3/NAS/UE/EMM/SecurityModeControl.c
index f9a02b1a7055a2e502d8fe758c16b101b474d31c..fd3332669b024581f5c659ccf79f543c9238874d 100644
--- a/openair3/NAS/UE/EMM/SecurityModeControl.c
+++ b/openair3/NAS/UE/EMM/SecurityModeControl.c
@@ -124,7 +124,7 @@ static void _security_release(emm_security_context_t *ctx);
  **      grity algorithm and ciphered with the selected NAS ciphe-         **
  **      ring algorithm.                                                   **
  **                                                                        **
- ** Inputs:  native_ksi:    TRUE if the security context is of type        **
+ ** Inputs:  native_ksi:    true if the security context is of type        **
  **             native (for KSIASME)                                       **
  **      ksi:       The NAS ket sey identifier                             **
  **      seea:      Selected EPS cyphering algorithm                       **
@@ -145,7 +145,7 @@ int emm_proc_security_mode_command(nas_user_t *user, int native_ksi, int ksi,
 
   int rc = RETURNerror;
   int emm_cause = EMM_CAUSE_SUCCESS;
-  int security_context_is_new = FALSE;
+  int security_context_is_new = false;
   security_data_t *security_data = user->security_data;
 
   LOG_TRACE(INFO, "EMM-PROC  - Security mode control requested (ksi=%d)",
@@ -263,7 +263,7 @@ int emm_proc_security_mode_command(nas_user_t *user, int native_ksi, int ksi,
           user->emm_data->security->ul_count.overflow = 0;
           user->emm_data->security->ul_count.seq_num = 0;
           /* Set new security context indicator */
-          security_context_is_new = TRUE;
+          security_context_is_new = true;
         }
       }
 
@@ -328,7 +328,7 @@ int emm_proc_security_mode_command(nas_user_t *user, int native_ksi, int ksi,
   emm_sap.u.emm_as.u.security.emm_cause = emm_cause;
   /* Setup EPS NAS security data */
   emm_as_set_security_data(&emm_sap.u.emm_as.u.security.sctx,
-                           user->emm_data->security, security_context_is_new, TRUE);
+                           user->emm_data->security, security_context_is_new, true);
   rc = emm_sap_send(user, &emm_sap);
 
   LOG_FUNC_RETURN (rc);
diff --git a/openair3/NAS/UE/EMM/emmData.h b/openair3/NAS/UE/EMM/emmData.h
index dfdfb34e77ecd90f9d36f2a6c382d56b4f636bbe..50219b788376782cc547146484fdb1623dfcf8ed 100644
--- a/openair3/NAS/UE/EMM/emmData.h
+++ b/openair3/NAS/UE/EMM/emmData.h
@@ -112,7 +112,7 @@ typedef struct {
 #define EMM_DETACH_COUNTER_MAX  5
   unsigned int count;      /* Counter used to limit the number of
                   * subsequently detach attempts    */
-  int switch_off;      /* UE switch-off indicator     */
+  bool switch_off;      /* UE switch-off indicator     */
   emm_proc_detach_type_t type; /* Type of the detach procedure
                   * currently in progress       */
 } emm_detach_data_t;
@@ -249,8 +249,8 @@ typedef struct emm_data_s {
 
   emm_eps_update_t    status;    /* The current EPS update status           */
   emm_ecm_state_t     ecm_status; /* The EPS Connection Management status   */
-  int                 is_attached;    /* Network attachment indicator       */
-  int                 is_emergency;   /* Emergency bearer services indicator*/
+  bool                is_attached;    /* Network attachment indicator       */
+  bool                is_emergency;   /* Emergency bearer services indicator*/
 
   /* Tracking Areas list the UE is registered to
    * Contains the list of TAIs that identify the tracking areas that
diff --git a/openair3/NAS/UE/EMM/emm_main.c b/openair3/NAS/UE/EMM/emm_main.c
index 329b59fae6746c312b3692b53393278952876369..74676c8b36baef3f685ba8a752a50080f7660daa 100644
--- a/openair3/NAS/UE/EMM/emm_main.c
+++ b/openair3/NAS/UE/EMM/emm_main.c
@@ -113,7 +113,7 @@ void _emm_attach_initialize(emm_attach_data_t *emm_attach_data) {
 
 void _emm_detach_initialize(emm_detach_data_t *emm_detach) {
   emm_detach->count = 0;
-  emm_detach->switch_off = FALSE;
+  emm_detach->switch_off = false;
   emm_detach->type = EMM_DETACH_TYPE_RESERVED;
 }
 
@@ -137,7 +137,7 @@ void emm_main_initialize(nas_user_t *user, emm_indication_callback_t cb, const c
   LOG_FUNC_IN;
   user->emm_data = calloc_or_fail(sizeof(emm_data_t));
   /* USIM validity indicator */
-  user->emm_data->usim_is_valid = FALSE;
+  user->emm_data->usim_is_valid = false;
   /* The IMEI read from the UE's non-volatile memory  */
   user->emm_data->imei = (imei_t *)malloc(sizeof(imei_t));
   user->emm_data->imei->length = _emm_main_get_imei(user->emm_data->imei, imei);
@@ -157,14 +157,14 @@ void emm_main_initialize(nas_user_t *user, emm_indication_callback_t cb, const c
   user->emm_data->plmn_rat = NET_ACCESS_UNAVAILABLE;
   /* Selected PLMN */
   memset(&user->emm_data->splmn, 0xFF, sizeof(plmn_t));
-  user->emm_data->is_rplmn = FALSE;
-  user->emm_data->is_eplmn = FALSE;
+  user->emm_data->is_rplmn = false;
+  user->emm_data->is_eplmn = false;
   /* Radio Access Technology of the serving cell */
   user->emm_data->rat = NET_ACCESS_UNAVAILABLE;
   /* Network registration status */
   user->emm_data->stat = NET_REG_STATE_OFF;
-  user->emm_data->is_attached = FALSE;
-  user->emm_data->is_emergency = FALSE;
+  user->emm_data->is_attached = false;
+  user->emm_data->is_emergency = false;
   /* Location/Tracking area code */
   user->emm_data->tac = 0;  // two byte in hexadecimal format
   /* Identifier of the serving cell */
@@ -201,7 +201,7 @@ void emm_main_initialize(nas_user_t *user, emm_indication_callback_t cb, const c
 
     /* The USIM application is present and valid */
     LOG_TRACE(INFO, "EMM-MAIN  - USIM application data successfully read");
-    user->emm_data->usim_is_valid = TRUE;
+    user->emm_data->usim_is_valid = true;
 
     /* print keys (for debugging) */
     {
@@ -844,12 +844,12 @@ AcT_t emm_main_get_plmn_rat(emm_data_t *emm_data)
  **      Others:    user->emm_data->                                 **
  **                                                                        **
  ** Outputs:     None                                                      **
- **      Return:    TRUE if the UE is currently attached to    **
- **             the network; FALSE otherwise.              **
+ **      Return:    true if the UE is currently attached to    **
+ **             the network; false otherwise.              **
  **      Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
-int emm_main_is_attached(emm_data_t *emm_data)
+bool emm_main_is_attached(emm_data_t *emm_data)
 {
   LOG_FUNC_IN;
   LOG_FUNC_RETURN (emm_data->is_attached);
@@ -866,13 +866,13 @@ int emm_main_is_attached(emm_data_t *emm_data)
  **      Others:    user->emm_data->                                 **
  **                                                                        **
  ** Outputs:     None                                                      **
- **      Return:    TRUE if the UE is currently attached or is **
+ **      Return:    true if the UE is currently attached or is **
  **             attempting to attach to the network for    **
- **             emergency bearer services; FALSE otherwise **
+ **             emergency bearer services; false otherwise **
  **      Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
-int emm_main_is_emergency(emm_data_t *emm_data)
+bool emm_main_is_emergency(emm_data_t *emm_data)
 {
   LOG_FUNC_IN;
   LOG_FUNC_RETURN (emm_data->is_attached && emm_data->is_emergency);
@@ -967,8 +967,8 @@ static int _emm_main_get_imei(imei_t *imei, const char *imei_str)
  **      Others:    None                                       **
  **                                                                        **
  ** Outputs:     None                                                      **
- **      Return:    TRUE if the first IMSI is found to match   **
- **             the second; FALSE otherwise.               **
+ **      Return:    true if the first IMSI is found to match   **
+ **             the second; false otherwise.               **
  **      Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
@@ -977,16 +977,16 @@ static int _emm_main_imsi_cmp(imsi_t *imsi1, imsi_t *imsi2)
   int i;
 
   if (imsi1->length != imsi2->length) {
-    return FALSE;
+    return false;
   }
 
   for (i = 0; i < imsi1->length; i++) {
     if (imsi1->u.value[i] != imsi2->u.value[i]) {
-      return FALSE;
+      return false;
     }
   }
 
-  return TRUE;
+  return true;
 }
 
 /****************************************************************************
diff --git a/openair3/NAS/UE/EMM/emm_main.h b/openair3/NAS/UE/EMM/emm_main.h
index d30f778e3b7f7d2114e5d23c81da0cb393babcb2..d081024548ae4e2a4d705dd5a13e782990e5fb92 100644
--- a/openair3/NAS/UE/EMM/emm_main.h
+++ b/openair3/NAS/UE/EMM/emm_main.h
@@ -94,8 +94,8 @@ AcT_t emm_main_get_plmn_rat(emm_data_t *emm_data);
 const char *emm_main_get_registered_plmn(emm_plmn_list_t *emm_plmn_list, emm_data_t *emm_data, network_plmn_t *plmn, int format);
 
 /* User's getter for network attachment */
-int emm_main_is_attached(emm_data_t *emm_data);
-int emm_main_is_emergency(emm_data_t *emm_data);
+bool emm_main_is_attached(emm_data_t *emm_data);
+bool emm_main_is_emergency(emm_data_t *emm_data);
 
 
 #endif /* __EMM_MAIN_H__*/
diff --git a/openair3/NAS/UE/EMM/emm_proc.h b/openair3/NAS/UE/EMM/emm_proc.h
index 7d4024d9d63fd7a8ca228fe038db6f74e7311249..b93bb33bf16b7ebb31ed99b1d8d9b59bf5557feb 100644
--- a/openair3/NAS/UE/EMM/emm_proc.h
+++ b/openair3/NAS/UE/EMM/emm_proc.h
@@ -89,7 +89,7 @@ int emm_proc_attach_accept(nas_user_t *user, long T3412, long T3402, long T3423,
                            const OctetString *esm_msg);
 int emm_proc_attach_reject(nas_user_t *user, int emm_cause, const OctetString *esm_msg);
 int emm_proc_attach_complete(void *args);
-int emm_proc_attach_failure(int is_initial, void *args);
+int emm_proc_attach_failure(bool is_initial, void *args);
 int emm_proc_attach_release(void *args);
 int emm_proc_attach_restart(nas_user_t *user);
 
@@ -103,10 +103,10 @@ int emm_proc_attach_set_detach(void *user);
  *              Detach procedure
  * --------------------------------------------------------------------------
  */
-int emm_proc_detach(nas_user_t *user, emm_proc_detach_type_t type, int switch_off);
+int emm_proc_detach(nas_user_t *user, emm_proc_detach_type_t type, bool switch_off);
 int emm_proc_detach_request(void *args);
 int emm_proc_detach_accept(void *args);
-int emm_proc_detach_failure(int is_initial, void *args);
+int emm_proc_detach_failure(bool is_initial, void *args);
 int emm_proc_detach_release(void *args);
 
 
diff --git a/openair3/NAS/UE/ESM/DedicatedEpsBearerContextActivation.c b/openair3/NAS/UE/ESM/DedicatedEpsBearerContextActivation.c
index 21c3da3f195138e6dacbd6cba39c29b56b3c1a3c..db95dd648f7b3418d1166fb37a40ae4cc40f2273 100644
--- a/openair3/NAS/UE/ESM/DedicatedEpsBearerContextActivation.c
+++ b/openair3/NAS/UE/ESM/DedicatedEpsBearerContextActivation.c
@@ -131,7 +131,7 @@ int esm_proc_dedicated_eps_bearer_context_request(nas_user_t *user, int ebi, int
   }
 
   /* Assign dedicated EPS bearer context */
-  int new_ebi = esm_ebr_assign(user->esm_ebr_data, ebi, pid+1, FALSE);
+  int new_ebi = esm_ebr_assign(user->esm_ebr_data, ebi, pid+1, false);
 
   if (new_ebi == ESM_EBI_UNASSIGNED) {
     /* 3GPP TS 24.301, section 6.4.2.5, abnormal cases a and b
@@ -141,7 +141,7 @@ int esm_proc_dedicated_eps_bearer_context_request(nas_user_t *user, int ebi, int
     int old_pid, old_bid;
     /* Locally deactivate the existing EPS bearer context and proceed
      * with the requested dedicated EPS bearer context activation */
-    rc = esm_proc_eps_bearer_context_deactivate(user, TRUE, ebi,
+    rc = esm_proc_eps_bearer_context_deactivate(user, true, ebi,
          &old_pid, &old_bid);
 
     if (rc != RETURNok) {
@@ -149,7 +149,7 @@ int esm_proc_dedicated_eps_bearer_context_request(nas_user_t *user, int ebi, int
       *esm_cause = ESM_CAUSE_PROTOCOL_ERROR;
     } else {
       /* Assign new dedicated EPS bearer context */
-      ebi = esm_ebr_assign(user->esm_ebr_data, ebi, pid+1, FALSE);
+      ebi = esm_ebr_assign(user->esm_ebr_data, ebi, pid+1, false);
     }
   }
 
@@ -165,7 +165,7 @@ int esm_proc_dedicated_eps_bearer_context_request(nas_user_t *user, int ebi, int
       *esm_cause = ESM_CAUSE_SYNTACTICAL_ERROR_IN_PACKET_FILTER;
     } else {
       /* Create new dedicated EPS bearer context */
-      default_ebi = esm_ebr_context_create(esm_data, user->ueid, pid, ebi, FALSE, qos, tft);
+      default_ebi = esm_ebr_context_create(esm_data, user->ueid, pid, ebi, false, qos, tft);
 
       if (default_ebi != ESM_EBI_UNASSIGNED) {
         /* Dedicated EPS bearer contextx successfully created */
@@ -197,7 +197,7 @@ int esm_proc_dedicated_eps_bearer_context_request(nas_user_t *user, int ebi, int
  ** Inputs:  is_standalone: Not used                                   **
  **      ebi:       EPS bearer identity                        **
  **      msg:       Encoded ESM message to be sent             **
- **      ue_triggered:  TRUE if the EPS bearer context procedure   **
+ **      ue_triggered:  true if the EPS bearer context procedure   **
  **             was triggered by the UE                    **
  **      Others:    None                                       **
  **                                                                        **
@@ -206,8 +206,8 @@ int esm_proc_dedicated_eps_bearer_context_request(nas_user_t *user, int ebi, int
  **      Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
-int esm_proc_dedicated_eps_bearer_context_accept(nas_user_t *user, int is_standalone, int ebi,
-    OctetString *msg, int ue_triggered)
+int esm_proc_dedicated_eps_bearer_context_accept(nas_user_t *user, bool is_standalone, int ebi,
+    OctetString *msg, bool ue_triggered)
 {
   LOG_FUNC_IN;
 
@@ -268,8 +268,8 @@ int esm_proc_dedicated_eps_bearer_context_accept(nas_user_t *user, int is_standa
  **      Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
-int esm_proc_dedicated_eps_bearer_context_reject(nas_user_t *user, int is_standalone, int ebi,
-    OctetString *msg, int ue_triggered)
+int esm_proc_dedicated_eps_bearer_context_reject(nas_user_t *user, bool is_standalone, int ebi,
+    OctetString *msg, bool ue_triggered)
 {
   LOG_FUNC_IN;
 
diff --git a/openair3/NAS/UE/ESM/DefaultEpsBearerContextActivation.c b/openair3/NAS/UE/ESM/DefaultEpsBearerContextActivation.c
index 7c528d75691bc7527513074ba2c03db974834a64..f61b1498226a312738b4239e06596bfce533be91 100644
--- a/openair3/NAS/UE/ESM/DefaultEpsBearerContextActivation.c
+++ b/openair3/NAS/UE/ESM/DefaultEpsBearerContextActivation.c
@@ -103,7 +103,7 @@ int esm_proc_default_eps_bearer_context_request(nas_user_t *user, int pid, int e
             "requested by the network (ebi=%d)", ebi);
 
   /* Assign default EPS bearer context */
-  int new_ebi = esm_ebr_assign(user->esm_ebr_data, ebi, pid+1, TRUE);
+  int new_ebi = esm_ebr_assign(user->esm_ebr_data, ebi, pid+1, true);
 
   if (new_ebi == ESM_EBI_UNASSIGNED) {
     /* 3GPP TS 24.301, section 6.4.1.5, abnormal cases a and b
@@ -113,7 +113,7 @@ int esm_proc_default_eps_bearer_context_request(nas_user_t *user, int pid, int e
     int old_pid, old_bid;
     /* Locally deactivate the existing EPS bearer context and proceed
      * with the requested default EPS bearer context activation */
-    rc = esm_proc_eps_bearer_context_deactivate(user, TRUE, ebi,
+    rc = esm_proc_eps_bearer_context_deactivate(user, true, ebi,
          &old_pid, &old_bid);
 
     if (rc != RETURNok) {
@@ -121,13 +121,13 @@ int esm_proc_default_eps_bearer_context_request(nas_user_t *user, int pid, int e
       *esm_cause = ESM_CAUSE_PROTOCOL_ERROR;
     } else {
       /* Assign new default EPS bearer context */
-      ebi = esm_ebr_assign(user->esm_ebr_data, ebi, pid+1, TRUE);
+      ebi = esm_ebr_assign(user->esm_ebr_data, ebi, pid+1, true);
     }
   }
 
   if (ebi != ESM_EBI_UNASSIGNED) {
     /* Create new default EPS bearer context */
-    ebi = esm_ebr_context_create(esm_data, user->ueid, pid, ebi, TRUE, qos, NULL);
+    ebi = esm_ebr_context_create(esm_data, user->ueid, pid, ebi, true, qos, NULL);
 
     if (ebi != ESM_EBI_UNASSIGNED) {
       /* Default EPS bearer contextx successfully created */
@@ -165,9 +165,9 @@ int esm_proc_default_eps_bearer_context_request(nas_user_t *user, int pid, int e
  **             te message                                 **
  **      ebi:       EPS bearer identity                        **
  **      msg:       Encoded ESM message to be sent             **
- **      ue_triggered:  TRUE if the EPS bearer context procedure   **
+ **      ue_triggered:  true if the EPS bearer context procedure   **
  **             was triggered by the UE (should be always  **
- **             TRUE)                                      **
+ **             true)                                      **
  **      Others:    None                                       **
  **                                                                        **
  ** Outputs:     None                                                      **
@@ -175,8 +175,8 @@ int esm_proc_default_eps_bearer_context_request(nas_user_t *user, int pid, int e
  **      Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
-int esm_proc_default_eps_bearer_context_accept(nas_user_t *user, int is_standalone, int ebi,
-    OctetString *msg, int ue_triggered)
+int esm_proc_default_eps_bearer_context_accept(nas_user_t *user, bool is_standalone, int ebi,
+    OctetString *msg, bool ue_triggered)
 {
   LOG_FUNC_IN;
 
@@ -245,8 +245,8 @@ int esm_proc_default_eps_bearer_context_accept(nas_user_t *user, int is_standalo
  **      Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
-int esm_proc_default_eps_bearer_context_reject(nas_user_t *user, int is_standalone, int ebi,
-    OctetString *msg, int ue_triggered)
+int esm_proc_default_eps_bearer_context_reject(nas_user_t *user, bool is_standalone, int ebi,
+    OctetString *msg, bool ue_triggered)
 {
   LOG_FUNC_IN;
 
@@ -344,7 +344,7 @@ int esm_proc_default_eps_bearer_context_failure(nas_user_t *user)
             "ESM-PROC  - Default EPS bearer context activation failure");
 
   /* Release the default EPS bearer context and enter state INACTIVE */
-  int rc = esm_proc_eps_bearer_context_deactivate(user, TRUE, ebi, &pid, &bid);
+  int rc = esm_proc_eps_bearer_context_deactivate(user, true, ebi, &pid, &bid);
 
   if (rc != RETURNerror) {
     /* Reset default EPS bearer context internal data */
diff --git a/openair3/NAS/UE/ESM/EpsBearerContextDeactivation.c b/openair3/NAS/UE/ESM/EpsBearerContextDeactivation.c
index 5adbae05c6fee7337d18522f57b6101f8969d891..742e70cd4a72f886a133db9975d9234472953adc 100644
--- a/openair3/NAS/UE/ESM/EpsBearerContextDeactivation.c
+++ b/openair3/NAS/UE/ESM/EpsBearerContextDeactivation.c
@@ -97,7 +97,7 @@ static int _eps_bearer_release(nas_user_t *user, int ebi, int *pid, int *bid);
  **      has an EPS bearer context with specified EPS bearer iden- **
  **      tity activated.                                           **
  **                                                                        **
- ** Inputs:  is local:  TRUE if the EPS bearer context has to be   **
+ ** Inputs:  is local:  true if the EPS bearer context has to be   **
  **             locally released without peer-to-peer si-  **
  **             gnalling between the UE and the MME        **
  **      ebi:       EPS bearer identity of the EPS bearer con- **
@@ -111,7 +111,7 @@ static int _eps_bearer_release(nas_user_t *user, int ebi, int *pid, int *bid);
  **      Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
-int esm_proc_eps_bearer_context_deactivate(nas_user_t *user, int is_local, int ebi,
+int esm_proc_eps_bearer_context_deactivate(nas_user_t *user, bool is_local, int ebi,
     int *pid, int *bid)
 {
   LOG_FUNC_IN;
@@ -213,7 +213,7 @@ int esm_proc_eps_bearer_context_deactivate_request(nas_user_t *user, int ebi, in
      * the PDN connection */
     if (*esm_cause == ESM_CAUSE_REACTIVATION_REQUESTED) {
       esm_sap_t esm_sap;
-      int active = FALSE;
+      bool active = false;
 
       /* 3GPP TS 24.301, section 6.4.4.3
        * The UE should re-initiate the UE requested PDN connectivity
@@ -242,8 +242,8 @@ int esm_proc_eps_bearer_context_deactivate_request(nas_user_t *user, int ebi, in
          * Notify ESM to re-initiate PDN connectivity procedure
          */
         esm_sap.primitive = ESM_PDN_CONNECTIVITY_REQ;
-        esm_sap.is_standalone = TRUE;
-        esm_sap.data.pdn_connect.is_defined = TRUE;
+        esm_sap.is_standalone = true;
+        esm_sap.data.pdn_connect.is_defined = true;
         esm_sap.data.pdn_connect.cid = pid + 1;
         rc = esm_sap_send(user, &esm_sap);
       }
@@ -265,10 +265,10 @@ int esm_proc_eps_bearer_context_deactivate_request(nas_user_t *user, int ebi, in
  **      DEACTIVATE EPS BEARER CONTEXT ACCEPT message and entering **
  **      the state BEARER CONTEXT INACTIVE.                        **
  **                                                                        **
- ** Inputs:  is_standalone: Should be always TRUE                      **
+ ** Inputs:  is_standalone: Should be always true                      **
  **      ebi:       EPS bearer identity                        **
  **      msg:       Encoded ESM message to be sent             **
- **      ue_triggered:  TRUE if the EPS bearer context procedure   **
+ **      ue_triggered:  true if the EPS bearer context procedure   **
  **             was triggered by the UE                    **
  **      Others:    None                                       **
  **                                                                        **
@@ -277,8 +277,8 @@ int esm_proc_eps_bearer_context_deactivate_request(nas_user_t *user, int ebi, in
  **      Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
-int esm_proc_eps_bearer_context_deactivate_accept(nas_user_t *user, int is_standalone, int ebi,
-    OctetString *msg, int ue_triggered)
+int esm_proc_eps_bearer_context_deactivate_accept(nas_user_t *user, bool is_standalone, int ebi,
+    OctetString *msg, bool ue_triggered)
 {
   LOG_FUNC_IN;
 
@@ -371,7 +371,7 @@ static int _eps_bearer_release(nas_user_t *user, int ebi, int *pid, int *bid)
     LOG_TRACE(WARNING, "ESM-PROC  - Failed to release EPS bearer context");
   } else {
     /* Set the EPS bearer context state to INACTIVE */
-    rc = esm_ebr_set_status(user_api_id, esm_ebr_data, ebi, ESM_EBR_INACTIVE, FALSE);
+    rc = esm_ebr_set_status(user_api_id, esm_ebr_data, ebi, ESM_EBR_INACTIVE, false);
 
     if (rc != RETURNok) {
       /* The EPS bearer context was already in INACTIVE state */
diff --git a/openair3/NAS/UE/ESM/EsmStatusHdl.c b/openair3/NAS/UE/ESM/EsmStatusHdl.c
index def498a89b91ccc7d50cc6b4f6aa3d5cf7f5cebd..88f6550251f4d6413d950ed0ed943bb9998bacee 100644
--- a/openair3/NAS/UE/ESM/EsmStatusHdl.c
+++ b/openair3/NAS/UE/ESM/EsmStatusHdl.c
@@ -149,7 +149,7 @@ int esm_proc_status_ind(
  **                                                                        **
  ** Description: Initiates ESM status procedure.                           **
  **                                                                        **
- ** Inputs:  is_standalone: Not used - Always TRUE                     **
+ ** Inputs:  is_standalone: Not used - Always true                     **
  **      ueid:      UE lower layer identifier                  **
  **      ebi:       Not used                                   **
  **      msg:       Encoded ESM status message to be sent      **
@@ -161,9 +161,9 @@ int esm_proc_status_ind(
  **      Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
-int esm_proc_status(nas_user_t *user, int is_standalone,
+int esm_proc_status(nas_user_t *user, bool is_standalone,
                     int ebi, OctetString *msg,
-                    int ue_triggered)
+                    bool ue_triggered)
 {
   LOG_FUNC_IN;
 
diff --git a/openair3/NAS/UE/ESM/PdnConnectivity.c b/openair3/NAS/UE/ESM/PdnConnectivity.c
index d17b5fde3c72341a94af41151acffbd4f2960c5e..a79320cccbd0d270d95bd96eba1a06d28d4eef3c 100644
--- a/openair3/NAS/UE/ESM/PdnConnectivity.c
+++ b/openair3/NAS/UE/ESM/PdnConnectivity.c
@@ -80,7 +80,7 @@ Description Defines the PDN connectivity ESM procedure executed by the
  * PDN connection handlers
  */
 static int _pdn_connectivity_create(esm_data_t *esm_data, int pid, const OctetString *apn,
-                                    esm_proc_pdn_type_t pdn_type, int is_emergency);
+                                    esm_proc_pdn_type_t pdn_type, bool is_emergency);
 static int _pdn_connectivity_update(esm_data_t *esm_data, int pid, const OctetString *apn,
                                     esm_proc_pdn_type_t pdn_type, const OctetString *pdn_addr, int esm_cause);
 static int _pdn_connectivity_delete(esm_data_t *esm_data, int pid);
@@ -121,7 +121,7 @@ static void *_pdn_connectivity_t3482_handler(void *);
  **             to be defined or undefined                 **
  **      pdn_type:  PDN connection type (IPv4, IPv6, IPv4v6)   **
  **      apn:       Access Point logical Name to be used       **
- **      is_emergency:  TRUE if the PDN connection has to be esta- **
+ **      is_emergency:  true if the PDN connection has to be esta- **
  **             blished for emergency bearer services      **
  **      Others:    None                                       **
  **                                                                        **
@@ -133,7 +133,7 @@ static void *_pdn_connectivity_t3482_handler(void *);
  ***************************************************************************/
 int esm_proc_pdn_connectivity(nas_user_t *user, int cid, int is_to_define,
                               esm_proc_pdn_type_t pdn_type,
-                              const OctetString *apn, int is_emergency,
+                              const OctetString *apn, bool is_emergency,
                               unsigned int *pti)
 {
     LOG_FUNC_IN;
@@ -270,7 +270,7 @@ int esm_proc_pdn_connectivity(nas_user_t *user, int cid, int is_to_define,
  **      pti:       Procedure transaction identity             **
  **      msg:       Encoded PDN connectivity request message   **
  **             to be sent                                 **
- **      sent_by_ue:    Not used - Always TRUE                     **
+ **      sent_by_ue:    Not used - Always true                     **
  **      Others:    None                                       **
  **                                                                        **
  ** Outputs:     None                                                      **
@@ -278,8 +278,8 @@ int esm_proc_pdn_connectivity(nas_user_t *user, int cid, int is_to_define,
  **      Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
-int esm_proc_pdn_connectivity_request(nas_user_t *user, int is_standalone, int pti,
-                                      OctetString *msg, int sent_by_ue)
+int esm_proc_pdn_connectivity_request(nas_user_t *user, bool is_standalone, int pti,
+                                      OctetString *msg, bool sent_by_ue)
 {
     LOG_FUNC_IN;
     esm_pt_data_t *esm_pt_data = user->esm_pt_data;
@@ -523,7 +523,7 @@ int esm_proc_pdn_connectivity_complete(nas_user_t *user)
  **      PDN connectivity procedure which is still pending in the  **
  **      PROCEDURE TRANSACTION INACTIVE or PENDING state.          **
  **                                                                        **
- ** Inputs:  is_pending:    TRUE if this PDN connectivity procedure    **
+ ** Inputs:  is_pending:    true if this PDN connectivity procedure    **
  **             transaction is in the PENDING state        **
  **      Others:    None                                       **
  **                                                                        **
@@ -679,7 +679,7 @@ static void *_pdn_connectivity_t3482_handler(void *args)
  ** Inputs:  pid:       Identifier of the PDN connection entry     **
  **      apn:       Access Point Name of the PDN connection    **
  **      pdn_type:  PDN type (IPv4, IPv6, IPv4v6)              **
- **      is_emergency:  TRUE if the PDN connection has to be esta- **
+ **      is_emergency:  true if the PDN connection has to be esta- **
  **             blished for emergency bearer services      **
  **                                                                        **
  ** Outputs:     None                                                      **
@@ -688,7 +688,7 @@ static void *_pdn_connectivity_t3482_handler(void *args)
  ***************************************************************************/
 static int _pdn_connectivity_create(esm_data_t *esm_data, int pid, const OctetString *apn,
                                     esm_proc_pdn_type_t pdn_type,
-                                    int is_emergency)
+                                    bool is_emergency)
 {
     esm_pdn_t *pdn = NULL;
 
@@ -720,7 +720,7 @@ static int _pdn_connectivity_create(esm_data_t *esm_data, int pid, const OctetSt
         /* Set the PDN connection identifier */
         esm_data->pdn[pid].pid = pid;
         /* Reset the PDN connection active indicator */
-        esm_data->pdn[pid].is_active = FALSE;
+        esm_data->pdn[pid].is_active = false;
         /* Setup the PDN connection data */
         esm_data->pdn[pid].data = pdn;
     }
@@ -744,7 +744,7 @@ static int _pdn_connectivity_create(esm_data_t *esm_data, int pid, const OctetSt
     }
 
     pdn->type = pdn_type;
-    pdn->addr_realloc = FALSE;
+    pdn->addr_realloc = false;
 
     return (RETURNok);
 }
@@ -825,7 +825,7 @@ static int _pdn_connectivity_update(esm_data_t *esm_data, int pid, const OctetSt
          * the other IP version using the UE requested PDN connectivity
          * procedure to the same APN with a single address PDN type
          * (IPv4 or IPv6) other than the one already activated */
-        pdn->addr_realloc = TRUE;
+        pdn->addr_realloc = true;
     } else if ( (esm_cause == ESM_CAUSE_PDN_TYPE_IPV4_ONLY_ALLOWED) ||
                 (esm_cause == ESM_CAUSE_PDN_TYPE_IPV6_ONLY_ALLOWED) ) {
         /* The UE requested IPv4 or IPv6 address and the network allows
@@ -833,9 +833,9 @@ static int _pdn_connectivity_update(esm_data_t *esm_data, int pid, const OctetSt
          * The UE shall not subsequently initiate another UE requested
          * PDN connectivity procedure to the same APN to obtain a PDN
          * type different from the one allowed by the network */
-        pdn->addr_realloc = FALSE;
+        pdn->addr_realloc = false;
     } else if (pdn_type != ESM_PDN_TYPE_IPV4V6) {
-        pdn->addr_realloc = TRUE;
+        pdn->addr_realloc = true;
     }
 
     return (RETURNok);
diff --git a/openair3/NAS/UE/ESM/PdnDisconnect.c b/openair3/NAS/UE/ESM/PdnDisconnect.c
index 6665126e40a007983969db1277173129929cd37d..cb7b3225bcfab82c0ea452c0d5a9dbd765c4789a 100644
--- a/openair3/NAS/UE/ESM/PdnDisconnect.c
+++ b/openair3/NAS/UE/ESM/PdnDisconnect.c
@@ -155,7 +155,7 @@ int esm_proc_pdn_disconnect(esm_data_t *esm_data, int cid, unsigned int *pti, un
  **      PDN DISCONNECT REQUEST message to the MME, starting timer **
  **      T3492 and entering state PROCEDURE TRANSACTION PENDING.   **
  **                                                                        **
- ** Inputs:  is_standalone: Should be always TRUE                      **
+ ** Inputs:  is_standalone: Should be always true                      **
  **      pti:       Procedure transaction identity             **
  **      msg:       Encoded PDN disconnect request message to  **
  **             be sent                                    **
@@ -167,8 +167,8 @@ int esm_proc_pdn_disconnect(esm_data_t *esm_data, int cid, unsigned int *pti, un
  **      Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
-int esm_proc_pdn_disconnect_request(nas_user_t *user, int is_standalone, int pti,
-                                    OctetString *msg, int sent_by_ue)
+int esm_proc_pdn_disconnect_request(nas_user_t *user, bool is_standalone, int pti,
+                                    OctetString *msg, bool sent_by_ue)
 {
   LOG_FUNC_IN;
 
@@ -326,7 +326,7 @@ int esm_proc_pdn_disconnect_reject(nas_user_t *user, int pti, int *esm_cause)
        */
       esm_sap_t esm_sap;
       esm_sap.primitive = ESM_EPS_BEARER_CONTEXT_DEACTIVATE_REQ;
-      esm_sap.is_standalone = TRUE;
+      esm_sap.is_standalone = true;
       esm_sap.recv = NULL;
       esm_sap.send.length = 0;
       esm_sap.data.eps_bearer_context_deactivate.ebi = ebi;
@@ -444,7 +444,7 @@ static void *_pdn_disconnect_t3492_handler(void *args)
          */
         esm_sap_t esm_sap;
         esm_sap.primitive = ESM_EPS_BEARER_CONTEXT_DEACTIVATE_REQ;
-        esm_sap.is_standalone = TRUE;
+        esm_sap.is_standalone = true;
         esm_sap.recv = NULL;
         esm_sap.send.length = 0;
         esm_sap.data.eps_bearer_context_deactivate.ebi = ebi;
diff --git a/openair3/NAS/UE/ESM/SAP/esm_sap.c b/openair3/NAS/UE/ESM/SAP/esm_sap.c
index e039f66a3a882c1b6304456e9698ae03f82d600e..f1663175d43cc3ba1cd9cd737b60302f0197a41e 100644
--- a/openair3/NAS/UE/ESM/SAP/esm_sap.c
+++ b/openair3/NAS/UE/ESM/SAP/esm_sap.c
@@ -63,9 +63,9 @@ Description Defines the ESM Service Access Points at which the EPS
 /*******************  L O C A L    D E F I N I T I O N S  *******************/
 /****************************************************************************/
 
-static int _esm_sap_recv(nas_user_t *user, int msg_type, int is_standalone,
+static int _esm_sap_recv(nas_user_t *user, int msg_type, bool is_standalone,
                          const OctetString *req, OctetString *rsp, esm_sap_error_t *err);
-static int _esm_sap_send(nas_user_t *user, int msg_type, int is_standalone, int pti, int ebi,
+static int _esm_sap_send(nas_user_t *user, int msg_type, bool is_standalone, int pti, int ebi,
                          const esm_sap_data_t *data, OctetString *rsp);
 
 
@@ -171,7 +171,7 @@ int esm_sap_send(nas_user_t *user, esm_sap_t *msg)
       }
 
       /* Define new PDN context */
-      rc = esm_proc_pdn_connectivity(user, pdn_connect->cid, TRUE,
+      rc = esm_proc_pdn_connectivity(user, pdn_connect->cid, true,
                                      pdn_connect->pdn_type, &apn,
                                      pdn_connect->is_emergency, NULL);
 
@@ -183,7 +183,7 @@ int esm_sap_send(nas_user_t *user, esm_sap_t *msg)
     if (pdn_connect->is_defined) {
       unsigned int pti;
       /* Assign new procedure transaction identity */
-      rc = esm_proc_pdn_connectivity(user, pdn_connect->cid, TRUE,
+      rc = esm_proc_pdn_connectivity(user, pdn_connect->cid, true,
                                      pdn_connect->pdn_type, NULL,
                                      pdn_connect->is_emergency, &pti);
 
@@ -205,7 +205,7 @@ int esm_sap_send(nas_user_t *user, esm_sap_t *msg)
 
       if ( msg->is_standalone && pdn_connect->is_defined ) {
         /* Undefine the specified PDN context */
-        rc = esm_proc_pdn_connectivity(user, pdn_connect->cid, FALSE,
+        rc = esm_proc_pdn_connectivity(user, pdn_connect->cid, false,
                                        pdn_connect->pdn_type, NULL,
                                        pdn_connect->is_emergency, NULL);
       } else if (msg->recv != NULL) {
@@ -214,7 +214,7 @@ int esm_sap_send(nas_user_t *user, esm_sap_t *msg)
                            msg->recv, &msg->send, &msg->err);
       } else {
         /* The PDN connectivity procedure locally failed */
-        rc = esm_proc_pdn_connectivity_failure(user, TRUE);
+        rc = esm_proc_pdn_connectivity_failure(user, true);
       }
     }
     break;
@@ -230,7 +230,7 @@ int esm_sap_send(nas_user_t *user, esm_sap_t *msg)
 
     if (rc != RETURNerror) {
       /* Send PDN disconnect request */
-      rc = _esm_sap_send(user, PDN_DISCONNECT_REQUEST, TRUE, pti, ebi,
+      rc = _esm_sap_send(user, PDN_DISCONNECT_REQUEST, true, pti, ebi,
                          &msg->data, &msg->send);
     }
   }
@@ -278,7 +278,7 @@ int esm_sap_send(nas_user_t *user, esm_sap_t *msg)
     rc = esm_proc_default_eps_bearer_context_failure(user);
 
     if (rc != RETURNerror) {
-      rc = esm_proc_pdn_connectivity_failure(user, FALSE);
+      rc = esm_proc_pdn_connectivity_failure(user, false);
     }
 
     break;
@@ -306,7 +306,7 @@ int esm_sap_send(nas_user_t *user, esm_sap_t *msg)
     /*
      * Locally deactivate EPS bearer context
      */
-    rc = esm_proc_eps_bearer_context_deactivate(user, TRUE,
+    rc = esm_proc_eps_bearer_context_deactivate(user, true,
          msg->data.eps_bearer_context_deactivate.ebi, &pid, &bid);
   }
   break;
@@ -359,7 +359,7 @@ int esm_sap_send(nas_user_t *user, esm_sap_t *msg)
  **      Return:    RETURNok, RETURNerror                      **
  **                                                                        **
  ***************************************************************************/
-static int _esm_sap_recv(nas_user_t *user, int msg_type, int is_standalone,
+static int _esm_sap_recv(nas_user_t *user, int msg_type, bool is_standalone,
                          const OctetString *req, OctetString *rsp,
                          esm_sap_error_t *err)
 {
@@ -422,7 +422,7 @@ static int _esm_sap_recv(nas_user_t *user, int msg_type, int is_standalone,
    * was triggered network-internally */
   int triggered_by_ue = (pti != PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED);
   /* Indicate whether the received message shall be ignored */
-  int is_discarded = FALSE;
+  bool is_discarded = false;
 
   if (esm_cause != ESM_CAUSE_SUCCESS) {
     LOG_TRACE(ERROR, "ESM-SAP   - Failed to decode expected ESM message "
@@ -455,7 +455,7 @@ static int _esm_sap_recv(nas_user_t *user, int msg_type, int is_standalone,
            * of already accepted activate default EPS bearer context
            * request message
            */
-          is_discarded = TRUE;
+          is_discarded = true;
         }
       } else {
         /* Return reject message */
@@ -493,7 +493,7 @@ static int _esm_sap_recv(nas_user_t *user, int msg_type, int is_standalone,
            * of already accepted activate dedicated EPS bearer context
            * request message
            */
-          is_discarded = TRUE;
+          is_discarded = true;
         }
       } else {
         /* Return reject message */
@@ -525,7 +525,7 @@ static int _esm_sap_recv(nas_user_t *user, int msg_type, int is_standalone,
          * received with PTI reserved value, or assigned value
          * that does not match any PTI in use
          */
-        is_discarded = TRUE;
+        is_discarded = true;
       } else if ( (esm_cause == ESM_CAUSE_SUCCESS) ||
                   (esm_cause == ESM_CAUSE_INVALID_EPS_BEARER_IDENTITY) ) {
         /* Return accept message */
@@ -541,7 +541,7 @@ static int _esm_sap_recv(nas_user_t *user, int msg_type, int is_standalone,
            * message with the EPS bearer identity set to the received
            * EPS bearer identity
            */
-          is_discarded = TRUE;
+          is_discarded = true;
         }
       }
 
@@ -565,7 +565,7 @@ static int _esm_sap_recv(nas_user_t *user, int msg_type, int is_standalone,
          * Ignore PDN connectivity reject message received with
          * reserved or unassigned EPS bearer identity value
          */
-        is_discarded = TRUE;
+        is_discarded = true;
       }
 
       break;
@@ -588,7 +588,7 @@ static int _esm_sap_recv(nas_user_t *user, int msg_type, int is_standalone,
          * Ignore PDN disconnect reject message received with
          * reserved or unassigned EPS bearer identity value
          */
-        is_discarded = TRUE;
+        is_discarded = true;
       }
 
       break;
@@ -629,7 +629,7 @@ static int _esm_sap_recv(nas_user_t *user, int msg_type, int is_standalone,
        * onto the network */
       esm_procedure = esm_proc_status;
       /* Discard received ESM message */
-      is_discarded = TRUE;
+      is_discarded = true;
     }
   } else {
     /* ESM message processing succeed */
@@ -687,7 +687,7 @@ static int _esm_sap_recv(nas_user_t *user, int msg_type, int is_standalone,
  **      Return:    RETURNok, RETURNerror                      **
  **                                                                        **
  ***************************************************************************/
-static int _esm_sap_send(nas_user_t *user, int msg_type, int is_standalone,
+static int _esm_sap_send(nas_user_t *user, int msg_type, bool is_standalone,
                          int pti, int ebi, const esm_sap_data_t *data,
                          OctetString *rsp)
 {
@@ -697,7 +697,7 @@ static int _esm_sap_send(nas_user_t *user, int msg_type, int is_standalone,
   int rc = RETURNok;
 
   /* Indicate whether the message is sent by the UE or the MME */
-  int sent_by_ue = TRUE;
+  bool sent_by_ue = true;
 
   ESM_msg esm_msg;
   memset(&esm_msg, 0 , sizeof(ESM_msg));
diff --git a/openair3/NAS/UE/ESM/SAP/esm_sapDef.h b/openair3/NAS/UE/ESM/SAP/esm_sapDef.h
index 4ff7c7e9ddccd0b5b776e356e86e8d4c90ba2b5d..2d3227ba75fbe379d46e5eea5aa177c9cd3eb84a 100644
--- a/openair3/NAS/UE/ESM/SAP/esm_sapDef.h
+++ b/openair3/NAS/UE/ESM/SAP/esm_sapDef.h
@@ -109,11 +109,11 @@ typedef struct esm_activate_eps_default_bearer_context_s {
  */
 typedef struct esm_pdn_connectivity_s {
   int cid;        /* PDN connection local identifier      */
-  int is_defined; /* Indicates whether a PDN context has been defined
+  bool is_defined; /* Indicates whether a PDN context has been defined
              * for the specified APN            */
   int pdn_type;   /* PDN address type (IPv4, IPv6, IPv4v6)    */
   const char *apn;    /* PDN's Access Point Name          */
-  int is_emergency;   /* Indicates whether the PDN context has been
+  bool is_emergency;   /* Indicates whether the PDN context has been
              * defined to establish connection for emergency
              * bearer services              */
 } esm_pdn_connectivity_t;
@@ -149,7 +149,7 @@ typedef union {
 
 typedef struct esm_sap_s {
   esm_primitive_t primitive;  /* ESM-SAP primitive to process     */
-  int is_standalone;      /* Indicates whether the ESM message handled
+  bool is_standalone;      /* Indicates whether the ESM message handled
                  * within this primitive has to be sent/received
                  * standalone or together within an EMM related
                  * message              */
diff --git a/openair3/NAS/UE/ESM/SAP/esm_send.c b/openair3/NAS/UE/ESM/SAP/esm_send.c
index 020d9d89e3c9c0188be205e4d6a30c9ad481f005..e710d745ad57c7d594c9c5b2903a91a3155efee5 100644
--- a/openair3/NAS/UE/ESM/SAP/esm_send.c
+++ b/openair3/NAS/UE/ESM/SAP/esm_send.c
@@ -132,7 +132,7 @@ int esm_send_status(int pti, int ebi, esm_status_msg *msg, int esm_cause)
  **      Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
-int esm_send_pdn_connectivity_request(int pti, int is_emergency, int pdn_type,
+int esm_send_pdn_connectivity_request(int pti, bool is_emergency, int pdn_type,
                                       const char *apn,
                                       pdn_connectivity_request_msg *msg)
 {
diff --git a/openair3/NAS/UE/ESM/SAP/esm_send.h b/openair3/NAS/UE/ESM/SAP/esm_send.h
index f97454027ae05dde8f7ec725949c0db26a3999a0..b9bcab0f397b3054e2827be33f6e9c9127d04e13 100644
--- a/openair3/NAS/UE/ESM/SAP/esm_send.h
+++ b/openair3/NAS/UE/ESM/SAP/esm_send.h
@@ -40,6 +40,8 @@ Description Defines functions executed at the ESM Service Access
 #ifndef __ESM_SEND_H__
 #define __ESM_SEND_H__
 
+#include <stdbool.h>
+
 #include "EsmStatus.h"
 
 
@@ -90,7 +92,7 @@ int esm_send_status(int pti, int ebi, esm_status_msg *msg, int esm_cause);
  * Transaction related messages
  * ----------------------------
  */
-int esm_send_pdn_connectivity_request(int pti, int is_emergency, int pdn_type,
+int esm_send_pdn_connectivity_request(int pti, bool is_emergency, int pdn_type,
                                       const char *apn, pdn_connectivity_request_msg *msg);
 int esm_send_pdn_disconnect_request(int pti, int ebi,
                                     pdn_disconnect_request_msg *msg);
diff --git a/openair3/NAS/UE/ESM/esmData.h b/openair3/NAS/UE/ESM/esmData.h
index 16f4707a3775b73b6c619078f654c6b2125098fd..525f4ec00a7d1df28ad3feffb5b601b129cfcedb 100644
--- a/openair3/NAS/UE/ESM/esmData.h
+++ b/openair3/NAS/UE/ESM/esmData.h
@@ -37,6 +37,7 @@ Description Defines internal private data handled by EPS Session
 
 *****************************************************************************/
 #include <stdio.h>  // sprintf
+#include <stdbool.h>
 
 #include "networkDef.h"
 #include "OctetString.h"
@@ -92,7 +93,7 @@ typedef enum {
 typedef struct esm_ebr_context_s {
   unsigned char ebi;      /* EPS bearer identity          */
   esm_ebr_state status;   /* EPS bearer context status        */
-  int is_default_ebr;     /* TRUE if the bearer context is associated
+  bool is_default_ebr;     /* bool if the bearer context is associated
                  * to a default EPS bearer      */
   char cid;           /* Identifier of the PDN context the EPS
                  * bearer context has been assigned to  */
@@ -137,7 +138,7 @@ typedef struct esm_bearer_s {
 typedef struct esm_pdn_s {
   unsigned int pti;   /* Identity of the procedure transaction executed
              * to activate the PDN connection entry     */
-  int is_emergency;   /* Emergency bearer services indicator      */
+  bool is_emergency;   /* Emergency bearer services indicator      */
   OctetString apn;    /* Access Point Name currently in used      */
   int ambr;       /* Aggregate Maximum Bit Rate of this APN   */
   int type;       /* Address PDN type (IPv4, IPv6, IPv4v6)    */
@@ -147,7 +148,7 @@ typedef struct esm_pdn_s {
                                      ESM_DATA_IPV6_ADDRESS_SIZE)
   /* IPv4 PDN address and/or IPv6 prefix      */
   char ip_addr[ESM_DATA_IP_ADDRESS_SIZE+1];
-  int addr_realloc;   /* Indicates whether the UE is allowed to subsequently
+  bool addr_realloc;   /* Indicates whether the UE is allowed to subsequently
              * request another PDN connectivity to the same APN
              * using an address PDN type (IPv4 or IPv6) other
              * than the one already activated       */
@@ -175,7 +176,7 @@ typedef struct esm_data_context_s {
 #define ESM_DATA_PDN_MAX    4
   struct {
     int pid;     /* Identifier of the PDN connection        */
-    int is_active;   /* TRUE/FALSE if the PDN connection is active/inactive
+    bool is_active;   /* true/false if the PDN connection is active/inactive
               * or the process to activate/deactivate the PDN
               * connection is in progress           */
     esm_pdn_t *data; /* Active PDN connection data          */
diff --git a/openair3/NAS/UE/ESM/esm_ebr.c b/openair3/NAS/UE/ESM/esm_ebr.c
index 3a62812eca7128f6d06eba008b988b3f97c6b50b..4c6b56cec9a903ade5aa05b2d1d7a5b0ffdd9c36 100644
--- a/openair3/NAS/UE/ESM/esm_ebr.c
+++ b/openair3/NAS/UE/ESM/esm_ebr.c
@@ -153,7 +153,7 @@ void esm_ebr_register_callback(esm_indication_callback_t cb)
  **      ebi:       Identity of the new EPS bearer context     **
  **      cid:       Identifier of the PDN context the EPS bea- **
  **             rer context is associated to               **
- **      default_ebr    TRUE if the new bearer context is associa- **
+ **      default_ebr    bool if the new bearer context is associa- **
  **             ted to a default EPS bearer                **
  **      Others:    None                                       **
  **                                                                        **
@@ -163,7 +163,7 @@ void esm_ebr_register_callback(esm_indication_callback_t cb)
  **             the not assigned EBI (0) otherwise.        **
  **                                                                        **
  ***************************************************************************/
-int esm_ebr_assign(esm_ebr_data_t *esm_ebr_data, int ebi, int cid, int default_ebr)
+int esm_ebr_assign(esm_ebr_data_t *esm_ebr_data, int ebi, int cid, bool default_ebr)
 {
   esm_ebr_context_t *ebr_ctx = NULL;
   int                i;
@@ -284,7 +284,7 @@ int esm_ebr_release(esm_ebr_data_t *esm_ebr_data,
  **                                                                        **
  **      ebi:       The identity of the EPS bearer             **
  **      status:    The new EPS bearer context status          **
- **      ue_requested:  TRUE/FALSE if the modification of the EPS  **
+ **      ue_requested:  true/false if the modification of the EPS  **
  **             bearer context status was requested by the **
  **             UE/network                                 **
  **      Others:    None                                       **
@@ -294,7 +294,7 @@ int esm_ebr_release(esm_ebr_data_t *esm_ebr_data,
  **                                                                        **
  ***************************************************************************/
 int esm_ebr_set_status(user_api_id_t *user_api_id, esm_ebr_data_t *esm_ebr_data,
-  int ebi, esm_ebr_state status, int ue_requested)
+  int ebi, esm_ebr_state status, bool ue_requested)
 {
   esm_ebr_context_t *ebr_ctx;
   esm_ebr_state old_status;
@@ -385,11 +385,11 @@ esm_ebr_state esm_ebr_get_status(esm_ebr_data_t *esm_ebr_data,
  **      Others:    None                                       **
  **                                                                        **
  ** Outputs:     None                                                      **
- **      Return:    TRUE, FALSE                                **
+ **      Return:    true, false                                **
  **      Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
-int esm_ebr_is_reserved(esm_ebr_data_t *esm_ebr_data, int ebi)
+bool esm_ebr_is_reserved(esm_ebr_data_t *esm_ebr_data, int ebi)
 {
   return ( (ebi != ESM_EBI_UNASSIGNED) && (ebi < ESM_EBI_MIN) );
 }
@@ -404,12 +404,11 @@ int esm_ebr_is_reserved(esm_ebr_data_t *esm_ebr_data, int ebi)
  **      ebi:       The identity of the EPS bearer             **
  **                                                                        **
  ** Outputs:     None                                                      **
- **      Return:    TRUE, FALSE                                **
+ **      Return:    true, false                                **
  **      Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
-int esm_ebr_is_not_in_use(esm_ebr_data_t *esm_ebr_data,
-  int ebi)
+bool esm_ebr_is_not_in_use(esm_ebr_data_t *esm_ebr_data, int ebi)
 {
 
   return ( (ebi == ESM_EBI_UNASSIGNED) ||
diff --git a/openair3/NAS/UE/ESM/esm_ebr.h b/openair3/NAS/UE/ESM/esm_ebr.h
index 6de4a048a49ef7b32bc073a00a90b3df373a72fe..4447a227baa9d1630ce8cd6c57317e315963937c 100644
--- a/openair3/NAS/UE/ESM/esm_ebr.h
+++ b/openair3/NAS/UE/ESM/esm_ebr.h
@@ -75,15 +75,15 @@ typedef int (*esm_indication_callback_t) (user_api_id_t *user_api_id, int, netwo
 
 void esm_ebr_register_callback(esm_indication_callback_t cb);
 
-int esm_ebr_is_reserved(esm_ebr_data_t *esm_ebr_data, int ebi);
+bool esm_ebr_is_reserved(esm_ebr_data_t *esm_ebr_data, int ebi);
 
 esm_ebr_data_t *esm_ebr_initialize(void);
-int esm_ebr_assign(esm_ebr_data_t *esm_ebr_data, int ebi, int cid, int default_ebr);
+int esm_ebr_assign(esm_ebr_data_t *esm_ebr_data, int ebi, int cid, bool default_ebr);
 int esm_ebr_release(esm_ebr_data_t *esm_ebr_data, int ebi);
 
-int esm_ebr_set_status(user_api_id_t *user_api_id, esm_ebr_data_t *esm_ebr_data, int ebi, esm_ebr_state status, int ue_requested);
+int esm_ebr_set_status(user_api_id_t *user_api_id, esm_ebr_data_t *esm_ebr_data, int ebi, esm_ebr_state status, bool ue_requested);
 esm_ebr_state esm_ebr_get_status(esm_ebr_data_t *esm_ebr_data, int ebi);
 
-int esm_ebr_is_not_in_use(esm_ebr_data_t *esm_ebr_data, int ebi);
+bool esm_ebr_is_not_in_use(esm_ebr_data_t *esm_ebr_data, int ebi);
 
 #endif /* __ESM_EBR_H__*/
diff --git a/openair3/NAS/UE/ESM/esm_ebr_context.c b/openair3/NAS/UE/ESM/esm_ebr_context.c
index b801ca2ad54e788a884f0e5cb2a6ee28a3a5f263..ca69687abe5230849e6b697c6b1d554042c9f792 100644
--- a/openair3/NAS/UE/ESM/esm_ebr_context.c
+++ b/openair3/NAS/UE/ESM/esm_ebr_context.c
@@ -84,7 +84,7 @@ static int _esm_ebr_context_check_precedence(const network_tft_t *,
  ** Inputs: **
  **      pid:       PDN connection identifier                  **
  **      ebi:       EPS bearer identity                        **
- **      is_default:    TRUE if the new bearer is a default EPS    **
+ **      is_default:    true if the new bearer is a default EPS    **
  **             bearer context                             **
  **      esm_qos:   EPS bearer level QoS parameters            **
  **      tft:       Traffic flow template parameters           **
@@ -98,7 +98,7 @@ static int _esm_ebr_context_check_precedence(const network_tft_t *,
  ***************************************************************************/
 int esm_ebr_context_create(
   esm_data_t *esm_data, int ueid,
-  int pid, int ebi, int is_default,
+  int pid, int ebi, bool is_default,
   const network_qos_t *qos, const network_tft_t *tft) {
   int                 bid     = 0;
   esm_data_context_t *esm_ctx = NULL;
@@ -185,11 +185,11 @@ int esm_ebr_context_create(
 
       if (is_default) {
         /* Set the PDN connection activation indicator */
-        esm_ctx->pdn[pid].is_active = TRUE;
+        esm_ctx->pdn[pid].is_active = true;
 
         /* Update the emergency bearer services indicator */
         if (pdn->is_emergency) {
-          esm_ctx->emergency = TRUE;
+          esm_ctx->emergency = true;
         }
 
         // LG ADD TEMP
@@ -383,7 +383,7 @@ int esm_ebr_context_create(
  ***************************************************************************/
 int esm_ebr_context_release(nas_user_t *user,
                             int ebi, int *pid, int *bid) {
-  int found = FALSE;
+  bool found = false;
   esm_pdn_t *pdn = NULL;
   esm_data_context_t *esm_ctx;
   esm_ebr_data_t *esm_ebr_data = user->esm_ebr_data;
@@ -416,7 +416,7 @@ int esm_ebr_context_release(nas_user_t *user,
             }
 
             /* The EPS bearer context entry is found */
-            found = TRUE;
+            found = true;
             break;
           }
         }
@@ -450,7 +450,7 @@ int esm_ebr_context_release(nas_user_t *user,
 
         if (pdn->bearer[*bid] != NULL) {
           ebi = pdn->bearer[*bid]->ebi;
-          found = TRUE;
+          found = true;
         }
       }
     }
@@ -503,7 +503,7 @@ int esm_ebr_context_release(nas_user_t *user,
 
           /* Set the EPS bearer context state to INACTIVE */
           esm_ebr_set_status(user_api_id, esm_ebr_data, pdn->bearer[i]->ebi,
-                             ESM_EBR_INACTIVE, TRUE);
+                             ESM_EBR_INACTIVE, true);
           /* Release EPS bearer data */
           esm_ebr_release(esm_ebr_data, pdn->bearer[i]->ebi);
           // esm_ebr_release()
@@ -519,11 +519,11 @@ int esm_ebr_context_release(nas_user_t *user,
       }
 
       /* Reset the PDN connection activation indicator */
-      esm_ctx->pdn[*pid].is_active = FALSE;
+      esm_ctx->pdn[*pid].is_active = false;
 
       /* Update the emergency bearer services indicator */
       if (pdn->is_emergency) {
-        esm_ctx->emergency = FALSE;
+        esm_ctx->emergency = false;
       }
     }
 
@@ -534,7 +534,7 @@ int esm_ebr_context_release(nas_user_t *user,
     if (esm_ctx->n_ebrs == 0) {
       emm_sap_t emm_sap;
       emm_sap.primitive = EMMESM_ESTABLISH_CNF;
-      emm_sap.u.emm_esm.u.establish.is_attached = FALSE;
+      emm_sap.u.emm_esm.u.establish.is_attached = false;
       (void) emm_sap_send(user, &emm_sap);
     }
     /* 3GPP TS 24.301, section 6.4.4.3, 6.4.4.6
@@ -546,8 +546,8 @@ int esm_ebr_context_release(nas_user_t *user,
     else if (esm_ctx->emergency && (esm_ctx->n_ebrs == 1) ) {
       emm_sap_t emm_sap;
       emm_sap.primitive = EMMESM_ESTABLISH_CNF;
-      emm_sap.u.emm_esm.u.establish.is_attached = TRUE;
-      emm_sap.u.emm_esm.u.establish.is_emergency = TRUE;
+      emm_sap.u.emm_esm.u.establish.is_attached = true;
+      emm_sap.u.emm_esm.u.establish.is_emergency = true;
       (void) emm_sap_send(user, &emm_sap);
     }
 
diff --git a/openair3/NAS/UE/ESM/esm_ebr_context.h b/openair3/NAS/UE/ESM/esm_ebr_context.h
index d7dfb1da70f2c1a4f8861dadd1cf71e205eaa5b4..c72f3f0e8b62a834fb41e6f4771dd846490d4a34 100644
--- a/openair3/NAS/UE/ESM/esm_ebr_context.h
+++ b/openair3/NAS/UE/ESM/esm_ebr_context.h
@@ -66,7 +66,7 @@ typedef enum {
 /******************  E X P O R T E D    F U N C T I O N S  ******************/
 /****************************************************************************/
 
-int esm_ebr_context_create(esm_data_t *esm_data, int ueid, int pid, int ebi, int is_default,
+int esm_ebr_context_create(esm_data_t *esm_data, int ueid, int pid, int ebi, bool is_default,
                            const network_qos_t *qos, const network_tft_t *tft);
 
 int esm_ebr_context_release(nas_user_t *user, int ebi, int *pid, int *bid);
diff --git a/openair3/NAS/UE/ESM/esm_main.c b/openair3/NAS/UE/ESM/esm_main.c
index 288e7486796f68a4efa0ce3b5af16ba34cf9555f..895e463726bf7ba2447b2d0b97c854cb94186bfb 100644
--- a/openair3/NAS/UE/ESM/esm_main.c
+++ b/openair3/NAS/UE/ESM/esm_main.c
@@ -96,12 +96,12 @@ void esm_main_initialize(nas_user_t *user, esm_indication_callback_t cb)
 
   for (i = 0; i < ESM_DATA_PDN_MAX + 1; i++) {
     esm_data->pdn[i].pid = -1;
-    esm_data->pdn[i].is_active = FALSE;
+    esm_data->pdn[i].is_active = false;
     esm_data->pdn[i].data = NULL;
   }
 
   /* Emergency bearer services indicator */
-  esm_data->emergency = FALSE;
+  esm_data->emergency = false;
 
   /* Initialize the procedure transaction identity manager */
 
@@ -225,12 +225,12 @@ int esm_main_get_nb_pdns(esm_data_t *esm_data)
  ** Inputs:  None                                                      **
  **                                                                        **
  ** Outputs:     None                                                      **
- **      Return:    TRUE if a PDN connection for emergency     **
+ **      Return:    true if a PDN connection for emergency     **
  **             bearer services is established             **
  **      Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
-int esm_main_has_emergency(esm_data_t *esm_data)
+bool esm_main_has_emergency(esm_data_t *esm_data)
 {
   LOG_FUNC_IN;
 
@@ -245,16 +245,16 @@ int esm_main_has_emergency(esm_data_t *esm_data)
  **                                                                        **
  ** Inputs:  cid:       PDN connection identifier                  **
  **                                                                        **
- ** Outputs:     state:     TRUE if the current state of the PDN con-  **
- **             nection is ACTIVE; FALSE otherwise.        **
- **      Return:    TRUE if the specified PDN connection has a **
- **             PDN context defined; FALSE if no any PDN   **
+ ** Outputs:     state:     true if the current state of the PDN con-  **
+ **             nection is ACTIVE; false otherwise.        **
+ **      Return:    true if the specified PDN connection has a **
+ **             PDN context defined; false if no any PDN   **
  **             context has been defined for the specified **
  **             connection.                                **
  **      Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
-int esm_main_get_pdn_status(nas_user_t *user, int cid, int *state)
+bool esm_main_get_pdn_status(nas_user_t *user, int cid, bool *state)
 {
   LOG_FUNC_IN;
 
@@ -263,14 +263,14 @@ int esm_main_get_pdn_status(nas_user_t *user, int cid, int *state)
   esm_ebr_data_t *esm_ebr_data = user-> esm_ebr_data;
 
   if (pid >= ESM_DATA_PDN_MAX) {
-    return (FALSE);
+    return (false);
   } else if (pid != esm_data->pdn[pid].pid) {
     LOG_TRACE(WARNING, "ESM-MAIN  - PDN connection %d is not defined", cid);
-    return (FALSE);
+    return (false);
   } else if (esm_data->pdn[pid].data == NULL) {
     LOG_TRACE(ERROR, "ESM-MAIN  - PDN connection %d has not been allocated",
               cid);
-    return (FALSE);
+    return (false);
   }
 
   if (esm_data->pdn[pid].data->bearer[0] != NULL) {
@@ -281,7 +281,7 @@ int esm_main_get_pdn_status(nas_user_t *user, int cid, int *state)
   }
 
   /* The PDN connection has not been activated yet */
-  LOG_FUNC_RETURN (TRUE);
+  LOG_FUNC_RETURN (true);
 }
 
 /****************************************************************************
@@ -301,7 +301,7 @@ int esm_main_get_pdn_status(nas_user_t *user, int cid, int *state)
  **                                                                        **
  ***************************************************************************/
 int esm_main_get_pdn(esm_data_t *esm_data, int cid, int *type, const char **apn,
-                     int *is_emergency, int *is_active)
+                     bool *is_emergency, bool *is_active)
 {
   LOG_FUNC_IN;
 
diff --git a/openair3/NAS/UE/ESM/esm_main.h b/openair3/NAS/UE/ESM/esm_main.h
index 6e6ecc0db4668b806449ecab5f2c90171adb9c48..ca8679c5b7a6cb2f90846f63b0b7db7f21b82dbf 100644
--- a/openair3/NAS/UE/ESM/esm_main.h
+++ b/openair3/NAS/UE/ESM/esm_main.h
@@ -69,10 +69,9 @@ void esm_main_cleanup(esm_data_t *esm_data);
 /* User's getter for PDN connections and EPS bearer contexts */
 int esm_main_get_nb_pdns_max(esm_data_t *esm_data);
 int esm_main_get_nb_pdns(esm_data_t *esm_data);
-int esm_main_has_emergency(esm_data_t *esm_data);
-int esm_main_get_pdn_status(nas_user_t *user, int cid, int *state);
-int esm_main_get_pdn(esm_data_t *esm_data, int cid, int *type, const char **apn, int *is_emergency,
-                     int *is_active);
+bool esm_main_has_emergency(esm_data_t *esm_data);
+bool esm_main_get_pdn_status(nas_user_t *user, int cid, bool *state);
+int esm_main_get_pdn(esm_data_t *esm_data, int cid, int *type, const char **apn, bool *is_emergency, bool *is_active);
 int esm_main_get_pdn_addr(esm_data_t *esm_data, int cid, const char **ipv4addr, const char **ipv6addr);
 
 
diff --git a/openair3/NAS/UE/ESM/esm_proc.h b/openair3/NAS/UE/ESM/esm_proc.h
index 941cfa620db3f35fc87a2787a65238f8a29f34b1..42a925327e3bfa7a0005e3d90ff529ed4bfd5625 100644
--- a/openair3/NAS/UE/ESM/esm_proc.h
+++ b/openair3/NAS/UE/ESM/esm_proc.h
@@ -79,7 +79,7 @@ typedef enum {
  * Type of the ESM procedure callback executed when requested by the UE
  * or initiated by the network
  */
-typedef int (*esm_proc_procedure_t) (nas_user_t *user, int, int, OctetString *, int);
+typedef int (*esm_proc_procedure_t) (nas_user_t *user, bool, int, OctetString *, bool);
 
 /* EPS bearer level QoS parameters */
 typedef network_qos_t esm_proc_qos_t;
@@ -113,8 +113,7 @@ typedef struct {
  * --------------------------------------------------------------------------
  */
 int esm_proc_status_ind(int pti, int ebi, int *esm_cause);
-int esm_proc_status(nas_user_t *user, int is_standalone, int pti, OctetString *msg,
-                    int sent_by_ue);
+int esm_proc_status(nas_user_t *user, bool is_standalone, int pti, OctetString *msg, bool sent_by_ue);
 
 
 /*
@@ -123,10 +122,10 @@ int esm_proc_status(nas_user_t *user, int is_standalone, int pti, OctetString *m
  * --------------------------------------------------------------------------
  */
 int esm_proc_pdn_connectivity(nas_user_t *user, int cid, int to_define,
-                              esm_proc_pdn_type_t pdn_type, const OctetString *apn, int is_emergency,
+                              esm_proc_pdn_type_t pdn_type, const OctetString *apn, bool is_emergency,
                               unsigned int *pti);
-int esm_proc_pdn_connectivity_request(nas_user_t *user, int is_standalone, int pti,
-                                      OctetString *msg, int sent_by_ue);
+int esm_proc_pdn_connectivity_request(nas_user_t *user, bool is_standalone, int pti,
+                                      OctetString *msg, bool sent_by_ue);
 int esm_proc_pdn_connectivity_accept(nas_user_t *user, int pti, esm_proc_pdn_type_t pdn_type,
                                      const OctetString *pdn_address, const OctetString *apn, int *esm_cause);
 int esm_proc_pdn_connectivity_reject(nas_user_t *user, int pti, int *esm_cause);
@@ -140,8 +139,8 @@ int esm_proc_pdn_connectivity_failure(nas_user_t *user, int is_pending);
  * --------------------------------------------------------------------------
  */
 int esm_proc_pdn_disconnect(esm_data_t *esm_data, int cid, unsigned int *pti, unsigned int *ebi);
-int esm_proc_pdn_disconnect_request(nas_user_t *user, int is_standalone, int pti,
-                                    OctetString *msg, int sent_by_ue);
+int esm_proc_pdn_disconnect_request(nas_user_t *user, bool is_standalone, int pti,
+                                    OctetString *msg, bool sent_by_ue);
 
 int esm_proc_pdn_disconnect_accept(esm_pt_data_t *esm_pt_data, int pti, int *esm_cause);
 int esm_proc_pdn_disconnect_reject(nas_user_t *user, int pti, int *esm_cause);
@@ -157,10 +156,10 @@ int esm_proc_default_eps_bearer_context_request(nas_user_t *user, int pid, int e
 int esm_proc_default_eps_bearer_context_complete(default_eps_bearer_context_data_t *default_eps_bearer_context_data);
 int esm_proc_default_eps_bearer_context_failure(nas_user_t *user);
 
-int esm_proc_default_eps_bearer_context_accept(nas_user_t *user, int is_standalone, int ebi,
-    OctetString *msg, int ue_triggered);
-int esm_proc_default_eps_bearer_context_reject(nas_user_t *user, int is_standalone, int ebi,
-    OctetString *msg, int ue_triggered);
+int esm_proc_default_eps_bearer_context_accept(nas_user_t *user, bool is_standalone, int ebi,
+    OctetString *msg, bool ue_triggered);
+int esm_proc_default_eps_bearer_context_reject(nas_user_t *user, bool is_standalone, int ebi,
+    OctetString *msg, bool ue_triggered);
 
 /*
  * --------------------------------------------------------------------------
@@ -171,10 +170,10 @@ int esm_proc_default_eps_bearer_context_reject(nas_user_t *user, int is_standalo
 int esm_proc_dedicated_eps_bearer_context_request(nas_user_t *user, int ebi, int default_ebi,
     const esm_proc_qos_t *qos, const esm_proc_tft_t *tft, int *esm_cause);
 
-int esm_proc_dedicated_eps_bearer_context_accept(nas_user_t *user, int is_standalone, int ebi,
-    OctetString *msg, int ue_triggered);
-int esm_proc_dedicated_eps_bearer_context_reject(nas_user_t *user, int is_standalone, int ebi,
-    OctetString *msg, int ue_triggered);
+int esm_proc_dedicated_eps_bearer_context_accept(nas_user_t *user, bool is_standalone, int ebi,
+    OctetString *msg, bool ue_triggered);
+int esm_proc_dedicated_eps_bearer_context_reject(nas_user_t *user, bool is_standalone, int ebi,
+    OctetString *msg, bool ue_triggered);
 
 /*
  * --------------------------------------------------------------------------
@@ -182,11 +181,11 @@ int esm_proc_dedicated_eps_bearer_context_reject(nas_user_t *user, int is_standa
  * --------------------------------------------------------------------------
  */
 
-int esm_proc_eps_bearer_context_deactivate(nas_user_t *user, int is_local, int ebi, int *pid,
+int esm_proc_eps_bearer_context_deactivate(nas_user_t *user, bool is_local, int ebi, int *pid,
     int *bid);
 int esm_proc_eps_bearer_context_deactivate_request(nas_user_t *user, int ebi, int *esm_cause);
 
-int esm_proc_eps_bearer_context_deactivate_accept(nas_user_t *user, int is_standalone, int ebi,
-    OctetString *msg, int ue_triggered);
+int esm_proc_eps_bearer_context_deactivate_accept(nas_user_t *user, bool is_standalone, int ebi,
+    OctetString *msg, bool ue_triggered);
 
 #endif /* __ESM_PROC_H__*/
diff --git a/openair3/NAS/UE/ESM/esm_pt.c b/openair3/NAS/UE/ESM/esm_pt.c
index f253291fd9fdcd822f2800ee0cda62d62a936a7c..d9f593fb5718918cc45f22917e32b3811c5938a4 100644
--- a/openair3/NAS/UE/ESM/esm_pt.c
+++ b/openair3/NAS/UE/ESM/esm_pt.c
@@ -482,11 +482,11 @@ int esm_pt_get_pending_pti(esm_pt_data_t *esm_pt_data, esm_pt_state status)
  ** Inputs:  pti:       The identity of the procedure transaction  **
  **                                                                        **
  ** Outputs:     None                                                      **
- **      Return:    TRUE, FALSE                                **
+ **      Return:    true, false                                **
  **      Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
-int esm_pt_is_not_in_use(esm_pt_data_t *esm_pt_data, int pti)
+bool esm_pt_is_not_in_use(esm_pt_data_t *esm_pt_data, int pti)
 {
   return ( (pti == ESM_PT_UNASSIGNED) ||
            (esm_pt_data->context[pti - ESM_PTI_MIN] == NULL) ||
@@ -504,11 +504,11 @@ int esm_pt_is_not_in_use(esm_pt_data_t *esm_pt_data, int pti)
  **      Others:    None                                       **
  **                                                                        **
  ** Outputs:     None                                                      **
- **      Return:    TRUE, FALSE                                **
+ **      Return:    true, false                                **
  **      Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
-int esm_pt_is_reserved(int pti)
+bool esm_pt_is_reserved(int pti)
 {
   return ( (pti != ESM_PT_UNASSIGNED) && (pti > ESM_PTI_MAX) );
 }
diff --git a/openair3/NAS/UE/ESM/esm_pt.h b/openair3/NAS/UE/ESM/esm_pt.h
index 3179e0f47b7f044e105e2730cebf96859ccf7fa6..b0c62253abca39df0c3f4324c24cb5084aebc6c4 100644
--- a/openair3/NAS/UE/ESM/esm_pt.h
+++ b/openair3/NAS/UE/ESM/esm_pt.h
@@ -64,7 +64,7 @@ Description Defines functions used to handle ESM procedure transactions.
 /******************  E X P O R T E D    F U N C T I O N S  ******************/
 /****************************************************************************/
 
-int esm_pt_is_reserved(int pti);
+bool esm_pt_is_reserved(int pti);
 
 esm_pt_data_t *esm_pt_initialize(void);
 
@@ -79,6 +79,6 @@ int esm_pt_set_status(esm_pt_data_t *esm_pt_data, int pti, esm_pt_state status);
 esm_pt_state esm_pt_get_status(esm_pt_data_t *esm_pt_data, int pti);
 int esm_pt_get_pending_pti(esm_pt_data_t *esm_pt_data, esm_pt_state status);
 
-int esm_pt_is_not_in_use(esm_pt_data_t *esm_pt_data, int pti);
+bool esm_pt_is_not_in_use(esm_pt_data_t *esm_pt_data, int pti);
 
 #endif /* __ESM_PT_H__*/
diff --git a/openair3/NAS/UE/UEprocess.c b/openair3/NAS/UE/UEprocess.c
index 7b9a1be42242a98ac2998512af95cf85c16b9134..a3a1c9c79b6862600823b5c62fcda12bd30507ae 100644
--- a/openair3/NAS/UE/UEprocess.c
+++ b/openair3/NAS/UE/UEprocess.c
@@ -205,7 +205,7 @@ static void *_nas_user_mngr(void *args)
   LOG_FUNC_IN;
 
   pthread_setname_np( pthread_self(), "nas_user_mngr");
-  int exit_loop = FALSE;
+  bool exit_loop = false;
 
   int *fd = (int *) args;
 
@@ -251,7 +251,7 @@ static void *_nas_network_mngr(void *args)
   LOG_TRACE (INFO, "UE-MAIN   - Network connection manager started (%d)", *fd);
 
   /* Network receiving loop */
-  while (TRUE) {
+  while (true) {
     /* Read the network data message */
     bytes = network_api_read_data (*fd);
 
diff --git a/openair3/NAS/UE/nas_proc.c b/openair3/NAS/UE/nas_proc.c
index 9350590788a738a88a11763697e34c15ed44a433..41230696a4881a9853e4f53a821a33bfcd3de6b3 100644
--- a/openair3/NAS/UE/nas_proc.c
+++ b/openair3/NAS/UE/nas_proc.c
@@ -64,8 +64,8 @@ Description NAS procedure call manager
 #define NAS_PROC_RSRP_UNKNOWN   255
 
 
-static int _nas_proc_activate(nas_user_t *user, int cid, int apply_to_all);
-static int _nas_proc_deactivate(nas_user_t *user, int cid, int apply_to_all);
+static int _nas_proc_activate(nas_user_t *user, int cid, bool apply_to_all);
+static int _nas_proc_deactivate(nas_user_t *user, int cid, bool apply_to_all);
 
 /****************************************************************************/
 /******************  E X P O R T E D    F U N C T I O N S  ******************/
@@ -93,7 +93,7 @@ void nas_proc_initialize(nas_user_t *user, emm_indication_callback_t emm_cb,
   LOG_FUNC_IN;
 
   /* Initialize local NAS data */
-  user->proc.EPS_capability_status = FALSE;
+  user->proc.EPS_capability_status = false;
   user->proc.rsrq = NAS_PROC_RSRQ_UNKNOWN;
   user->proc.rsrp = NAS_PROC_RSRP_UNKNOWN;
 
@@ -129,7 +129,7 @@ void nas_proc_cleanup(nas_user_t *user)
   LOG_FUNC_IN;
 
   /* Detach the UE from the EPS network */
-  int rc = nas_proc_detach(user, TRUE);
+  int rc = nas_proc_detach(user, true);
 
   if (rc != RETURNok) {
     LOG_TRACE(ERROR, "NAS-PROC  - Failed to detach from the network");
@@ -176,7 +176,7 @@ int nas_proc_enable_s1_mode(nas_user_t *user)
    * Notify the EMM procedure call manager that EPS capability
    * of the UE is enabled
    */
-  user->proc.EPS_capability_status = TRUE;
+  user->proc.EPS_capability_status = true;
   emm_sap.primitive = EMMREG_S1_ENABLED;
   rc = emm_sap_send(user, &emm_sap);
 
@@ -209,7 +209,7 @@ int nas_proc_disable_s1_mode(nas_user_t *user)
    * Notify the EMM procedure call manager that EPS capability
    * of the UE is disabled
    */
-  user->proc.EPS_capability_status = FALSE;
+  user->proc.EPS_capability_status = false;
   emm_sap.primitive = EMMREG_S1_DISABLED;
   rc = emm_sap_send(user, &emm_sap);
 
@@ -231,7 +231,7 @@ int nas_proc_disable_s1_mode(nas_user_t *user)
  **      Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
-int nas_proc_get_eps(nas_user_t *user, int *stat)
+int nas_proc_get_eps(nas_user_t *user, bool *stat)
 {
   LOG_FUNC_IN;
 
@@ -449,7 +449,7 @@ int nas_proc_deregister(nas_user_t *user)
  **      Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
-int nas_proc_get_reg_data(nas_user_t *user, int *mode, int *selected, int format,
+int nas_proc_get_reg_data(nas_user_t *user, int *mode, bool *selected, int format,
                           network_plmn_t *oper, int *AcT)
 {
   LOG_FUNC_IN;
@@ -462,12 +462,12 @@ int nas_proc_get_reg_data(nas_user_t *user, int *mode, int *selected, int format
 
   if (oper_name != NULL) {
     /* An operator is currently selected */
-    *selected = TRUE;
+    *selected = true;
     /* Get the supported Radio Access Technology */
     *AcT = emm_main_get_plmn_rat(user->emm_data);
   } else {
     /* No any operator is selected */
-    *selected = FALSE;
+    *selected = false;
     *AcT = NET_ACCESS_UNAVAILABLE;
   }
 
@@ -558,7 +558,7 @@ int nas_proc_get_loc_info(nas_user_t *user, char *tac, char *ci, int *AcT)
  **                                                                        **
  ** Description: Initiates a detach procedure                              **
  **                                                                        **
- ** Inputs:  switch_off:    TRUE if the detach is due to UE switch-off **
+ ** Inputs:  switch_off:    true if the detach is due to UE switch-off **
  **      Others:    None                                       **
  **                                                                        **
  ** Outputs:     None                                                      **
@@ -566,7 +566,7 @@ int nas_proc_get_loc_info(nas_user_t *user, char *tac, char *ci, int *AcT)
  **      Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
-int nas_proc_detach(nas_user_t *user, int switch_off)
+int nas_proc_detach(nas_user_t *user, bool switch_off)
 {
   LOG_FUNC_IN;
 
@@ -607,7 +607,7 @@ int nas_proc_attach(nas_user_t *user)
   if ( !emm_main_is_attached(user->emm_data) ) {
     /* Initiate an Attach procedure */
     emm_sap.primitive = EMMREG_ATTACH_INIT;
-    emm_sap.u.emm_reg.u.attach.is_emergency = FALSE;
+    emm_sap.u.emm_reg.u.attach.is_emergency = false;
     rc = emm_sap_send(user, &emm_sap);
   }
 
@@ -624,16 +624,16 @@ int nas_proc_attach(nas_user_t *user)
  **      Others:    None                                       **
  **                                                                        **
  ** Outputs:     None                                                      **
- **      Return:    TRUE if the UE is currently attached to    **
+ **      Return:    true if the UE is currently attached to    **
  **             the network                                **
  **      Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
-int nas_proc_get_attach_status(nas_user_t *user)
+bool nas_proc_get_attach_status(nas_user_t *user)
 {
   LOG_FUNC_IN;
 
-  int is_attached = emm_main_is_attached(user->emm_data);
+  bool is_attached = emm_main_is_attached(user->emm_data);
 
   LOG_FUNC_RETURN (is_attached);
 }
@@ -690,10 +690,10 @@ int nas_proc_get_pdn_status(nas_user_t *user, int *cids, int *states, int n_pdn_
   /* For all PDN contexts */
   for (cid = 1; (cid < n_pdn+1) && (n_defined_pdn < n_pdn_max); cid++) {
     /* Get the status of this PDN */
-    int state = FALSE;
-    int is_defined = esm_main_get_pdn_status(user, cid, &state);
+    bool state = false;
+    bool is_defined = esm_main_get_pdn_status(user, cid, &state);
 
-    if (is_defined != FALSE) {
+    if (is_defined != false) {
       /* This PDN has been defined */
       *(cids++) = cid;
       *(states++) = state;
@@ -734,7 +734,7 @@ int nas_proc_get_pdn_param(esm_data_t *esm_data, int *cids, int *types, const ch
 
   /* For all PDN contexts */
   for (cid = 1; (cid < n_pdn+1) && (n_defined_pdn < n_pdn_max); cid++) {
-    int emergency, active;
+    bool emergency, active;
     /* Get PDN connection parameters */
     int rc = esm_main_get_pdn(esm_data, cid, types, apns, &emergency, &active);
 
@@ -845,8 +845,8 @@ int nas_proc_set_pdn(nas_user_t *user, int cid, int type, const char *apn, int i
 
   esm_sap_t esm_sap;
   esm_sap.primitive = ESM_PDN_CONNECTIVITY_REQ;
-  esm_sap.is_standalone = TRUE;
-  esm_sap.data.pdn_connect.is_defined = FALSE;
+  esm_sap.is_standalone = true;
+  esm_sap.data.pdn_connect.is_defined = false;
   esm_sap.data.pdn_connect.cid = cid;
   esm_sap.data.pdn_connect.pdn_type = type;
   esm_sap.data.pdn_connect.apn = apn;
@@ -882,8 +882,8 @@ int nas_proc_reset_pdn(nas_user_t *user, int cid)
 
   esm_sap_t esm_sap;
   esm_sap.primitive = ESM_PDN_CONNECTIVITY_REJ;
-  esm_sap.is_standalone = TRUE;
-  esm_sap.data.pdn_connect.is_defined = TRUE;
+  esm_sap.is_standalone = true;
+  esm_sap.data.pdn_connect.is_defined = true;
   esm_sap.data.pdn_connect.cid = cid;
   /*
    * Notify ESM that the specified PDN context has to be undefined
@@ -916,7 +916,7 @@ int nas_proc_deactivate_pdn(nas_user_t *user, int cid)
 
   if (cid > 0) {
     /* Deactivate only the specified PDN context */
-    rc = _nas_proc_deactivate(user, cid, FALSE);
+    rc = _nas_proc_deactivate(user, cid, false);
   } else {
     /* Do not deactivate the PDN connection established during initial
      * network attachment (identifier 1) */
@@ -924,7 +924,7 @@ int nas_proc_deactivate_pdn(nas_user_t *user, int cid)
 
     /* Deactivate all active PDN contexts */
     while ((rc != RETURNerror) && (cid < esm_main_get_nb_pdns_max(user->esm_data)+1)) {
-      rc = _nas_proc_deactivate(user, cid++, TRUE);
+      rc = _nas_proc_deactivate(user, cid++, true);
     }
   }
 
@@ -970,13 +970,13 @@ int nas_proc_activate_pdn(nas_user_t *user, int cid)
   if (rc != RETURNerror) {
     if (cid > 0) {
       /* Activate only the specified PDN context */
-      rc = _nas_proc_activate(user, cid, FALSE);
+      rc = _nas_proc_activate(user, cid, false);
     } else {
       cid = 1;
 
       /* Activate all defined PDN contexts */
       while ((rc != RETURNerror) && (cid < esm_main_get_nb_pdns_max(user->esm_data)+1)) {
-        rc = _nas_proc_activate(user, cid++, TRUE);
+        rc = _nas_proc_activate(user, cid++, true);
       }
     }
   }
@@ -1177,7 +1177,7 @@ int nas_proc_ul_transfer_cnf(nas_user_t *user)
    */
   emm_sap.primitive = EMMAS_DATA_IND;
   emm_sap.u.emm_as.u.data.ueid = user->ueid;
-  emm_sap.u.emm_as.u.data.delivered = TRUE;
+  emm_sap.u.emm_as.u.data.delivered = true;
   emm_sap.u.emm_as.u.data.NASmsg.length = 0;
   rc = emm_sap_send(user, &emm_sap);
 
@@ -1214,7 +1214,7 @@ int nas_proc_ul_transfer_rej(nas_user_t *user)
    */
   emm_sap.primitive = EMMAS_DATA_IND;
   emm_sap.u.emm_as.u.data.ueid = user->ueid;
-  emm_sap.u.emm_as.u.data.delivered = FALSE;
+  emm_sap.u.emm_as.u.data.delivered = false;
   emm_sap.u.emm_as.u.data.NASmsg.length = 0;
   rc = emm_sap_send(user, &emm_sap);
 
@@ -1251,7 +1251,7 @@ int nas_proc_dl_transfer_ind(nas_user_t *user, const Byte_t *data, uint32_t len)
      */
     emm_sap.primitive = EMMAS_DATA_IND;
     emm_sap.u.emm_as.u.data.ueid = user->ueid;
-    emm_sap.u.emm_as.u.data.delivered = TRUE;
+    emm_sap.u.emm_as.u.data.delivered = true;
     emm_sap.u.emm_as.u.data.NASmsg.length = len;
     emm_sap.u.emm_as.u.data.NASmsg.value = (uint8_t *)data;
     rc = emm_sap_send(user, &emm_sap);
@@ -1274,7 +1274,7 @@ int nas_proc_dl_transfer_ind(nas_user_t *user, const Byte_t *data, uint32_t len)
  **                                                                        **
  ** Inputs:  cid:       Identifier of the PDN context used to es-  **
  **             tablished connectivity to specified PDN    **
- **      apply_to_all:  TRUE if the PDN connectivity procedure is  **
+ **      apply_to_all:  true if the PDN connectivity procedure is  **
  **             initiated to establish connectivity to all **
  **             defined PDNs                               **
  **      Others:    None                                       **
@@ -1284,12 +1284,12 @@ int nas_proc_dl_transfer_ind(nas_user_t *user, const Byte_t *data, uint32_t len)
  **      Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
-static int _nas_proc_activate(nas_user_t *user, int cid, int apply_to_all)
+static int _nas_proc_activate(nas_user_t *user, int cid, bool apply_to_all)
 {
   LOG_FUNC_IN;
 
   int rc;
-  int active = FALSE;
+  bool active = false;
 
   esm_sap_t esm_sap;
 
@@ -1332,8 +1332,8 @@ static int _nas_proc_activate(nas_user_t *user, int cid, int apply_to_all)
    * for the specified PDN
    */
   esm_sap.primitive = ESM_PDN_CONNECTIVITY_REQ;
-  esm_sap.is_standalone = TRUE;
-  esm_sap.data.pdn_connect.is_defined = TRUE;
+  esm_sap.is_standalone = true;
+  esm_sap.data.pdn_connect.is_defined = true;
   esm_sap.data.pdn_connect.cid = cid;
   rc = esm_sap_send(user, &esm_sap);
 
@@ -1347,7 +1347,7 @@ static int _nas_proc_activate(nas_user_t *user, int cid, int apply_to_all)
  ** Description: Initiates a PDN disconnect procedure                      **
  **                                                                        **
  ** Inputs:  cid:       Identifier of the PDN context              **
- **      apply_to_all:  TRUE if the PDN disconnect procedure is    **
+ **      apply_to_all:  true if the PDN disconnect procedure is    **
  **             initiated to request disconnection from    **
  **             all active PDNs                            **
  **      Others:    None                                       **
@@ -1357,15 +1357,15 @@ static int _nas_proc_activate(nas_user_t *user, int cid, int apply_to_all)
  **      Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
-static int _nas_proc_deactivate(nas_user_t *user, int cid, int apply_to_all)
+static int _nas_proc_deactivate(nas_user_t *user, int cid, bool apply_to_all)
 {
   LOG_FUNC_IN;
 
   int rc;
   int pdn_type;
   const char *apn;
-  int emergency = FALSE;
-  int active = FALSE;
+  bool emergency = false;
+  bool active = false;
 
   /* Get PDN context parameters */
   rc = esm_main_get_pdn(user->esm_data, cid, &pdn_type, &apn, &emergency, &active);
diff --git a/openair3/NAS/UE/nas_proc.h b/openair3/NAS/UE/nas_proc.h
index 4e653549ae0698826f0fb69d41052a5fbbdc2429..bd88691de87f7f8176e0d1e847c9100554bf116c 100644
--- a/openair3/NAS/UE/nas_proc.h
+++ b/openair3/NAS/UE/nas_proc.h
@@ -74,7 +74,7 @@ void nas_proc_cleanup(nas_user_t *user);
 
 int nas_proc_enable_s1_mode(nas_user_t *user);
 int nas_proc_disable_s1_mode(nas_user_t *user);
-int nas_proc_get_eps(nas_user_t *user, int *stat);
+int nas_proc_get_eps(nas_user_t *user, bool *stat);
 
 int nas_proc_get_imsi(emm_data_t *emm_data, char *imsi_str);
 int nas_proc_get_msisdn(nas_user_t *user, char *msisdn_str, int *ton_npi);
@@ -83,16 +83,16 @@ int nas_proc_get_signal_quality(nas_user_t *user, int *rsrq, int *rsrp);
 
 int nas_proc_register(nas_user_t *user, int mode, int format, const network_plmn_t *oper, int AcT);
 int nas_proc_deregister(nas_user_t *user);
-int nas_proc_get_reg_data(nas_user_t *user, int *mode, int *selected, int format,
+int nas_proc_get_reg_data(nas_user_t *user, int *mode, bool *selected, int format,
                           network_plmn_t *oper, int *AcT);
 int nas_proc_get_oper_list(nas_user_t *user, const char **oper_list);
 
 int nas_proc_get_reg_status(nas_user_t *user, int *stat);
 int nas_proc_get_loc_info(nas_user_t *user, char *tac, char *ci, int *AcT);
 
-int nas_proc_detach(nas_user_t *user, int switch_off);
+int nas_proc_detach(nas_user_t *user, bool switch_off);
 int nas_proc_attach(nas_user_t *user);
-int nas_proc_get_attach_status(nas_user_t *user);
+bool nas_proc_get_attach_status(nas_user_t *user);
 
 int nas_proc_reset_pdn(nas_user_t *user, int cid);
 int nas_proc_set_pdn(nas_user_t *user, int cid, int type, const char *apn, int ipv4_addr,
diff --git a/openair3/NAS/UE/nas_proc_defs.h b/openair3/NAS/UE/nas_proc_defs.h
index 1ce2bfd929df7734eafd738df34787c388b263f6..09cf8e834e2a9113f1ebd397bd3300075ea0be01 100644
--- a/openair3/NAS/UE/nas_proc_defs.h
+++ b/openair3/NAS/UE/nas_proc_defs.h
@@ -1,12 +1,14 @@
 #ifndef _NAS_PROC_DEFS_H
 #define _NAS_PROC_DEFS_H
 
+#include <stdbool.h>
+
 /*
  * Local NAS data
  */
 typedef struct {
   /* EPS capibility status */
-  int EPS_capability_status;
+  bool EPS_capability_status;
   /* Reference signal received quality    */
   int rsrq;
   /* Reference signal received power      */
diff --git a/openair3/NAS/UE/nas_ue_task.c b/openair3/NAS/UE/nas_ue_task.c
index a94445349cf648597c913cc44d82583cd7300a8b..34bf6cb3ad5e923fe457c550326d63c47c10dc80 100644
--- a/openair3/NAS/UE/nas_ue_task.c
+++ b/openair3/NAS/UE/nas_ue_task.c
@@ -43,10 +43,10 @@ uint16_t ue_idx_standalone = 0xFFFF;
 
 char *make_port_str_from_ueid(const char *base_port_str, int ueid);
 
-static int nas_ue_process_events(nas_user_container_t *users, struct epoll_event *events, int nb_events)
+static bool nas_ue_process_events(nas_user_container_t *users, struct epoll_event *events, int nb_events)
 {
   int event;
-  int exit_loop = FALSE;
+  bool exit_loop = false;
 
   LOG_I(NAS, "[UE] Received %d events\n", nb_events);
 
@@ -310,7 +310,7 @@ void *nas_ue_task(void *args_p)
     nb_events = itti_get_events(TASK_NAS_UE, &events);
 
     if ((nb_events > 0) && (events != NULL)) {
-      if (nas_ue_process_events(users, events, nb_events) == TRUE) {
+      if (nas_ue_process_events(users, events, nb_events) == true) {
         LOG_E(NAS, "[UE] Received exit loop\n");
       }
     }
diff --git a/openair3/NAS/UE/nas_user.c b/openair3/NAS/UE/nas_user.c
index d3467eddd518349d3f8fc527bd6c27574870daeb..56e41e4610e1fc8eedef9a774740e0388e6b7017 100644
--- a/openair3/NAS/UE/nas_user.c
+++ b/openair3/NAS/UE/nas_user.c
@@ -187,10 +187,10 @@ void nas_user_initialize(nas_user_t *user, emm_indication_callback_t emm_cb,
  **                             from which data have been received         **
  **              Others:        None                                       **
  **                                                                        **
- ** Outputs:     Return:        FALSE, TRUE                                **
+ ** Outputs:     Return:        false, true                                **
  **                                                                        **
  ***************************************************************************/
-int nas_user_receive_and_process(nas_user_t *user, char *message)
+bool nas_user_receive_and_process(nas_user_t *user, char *message)
 {
   LOG_FUNC_IN;
 
@@ -212,13 +212,13 @@ int nas_user_receive_and_process(nas_user_t *user, char *message)
        * exit from the receiving loop */
       LOG_TRACE (ERROR, "UE-MAIN   - "
                  "Failed to read data from the user application layer");
-      LOG_FUNC_RETURN(TRUE);
+      LOG_FUNC_RETURN(true);
     }
   }
 
   if (bytes == 0) {
     /* A signal was caught before any data were available */
-    LOG_FUNC_RETURN(FALSE);
+    LOG_FUNC_RETURN(false);
   }
 
   /* Decode the user data message */
@@ -268,12 +268,12 @@ int nas_user_receive_and_process(nas_user_t *user, char *message)
          * exit from the receiving loop */
         LOG_TRACE (ERROR, "UE-MAIN   - "
                    "Failed to send data to the user application layer");
-        LOG_FUNC_RETURN(TRUE);
+        LOG_FUNC_RETURN(true);
       }
     }
   }
 
-  LOG_FUNC_RETURN(FALSE);
+  LOG_FUNC_RETURN(false);
 }
 
 /****************************************************************************
@@ -989,7 +989,7 @@ static int _nas_user_proc_cops(nas_user_t *user, const at_command_t *data)
   char oper_buffer[NET_FORMAT_MAX_SIZE], *oper = oper_buffer;
   memset(oper, 0, NET_FORMAT_MAX_SIZE);
 
-  int oper_is_selected;
+  bool oper_is_selected;
 
   at_response->id = data->id;
   at_response->type = data->type;
@@ -1266,7 +1266,7 @@ static int _nas_user_proc_cgatt(nas_user_t *user, const at_command_t *data)
       if (data->command.cgatt.state == AT_CGATT_ATTACHED) {
         ret_code = nas_proc_attach(user);
       } else if (data->command.cgatt.state == AT_CGATT_DETACHED) {
-        ret_code = nas_proc_detach(user, FALSE);
+        ret_code = nas_proc_detach(user, false);
       }
 
       if (ret_code != RETURNok) {
@@ -1284,7 +1284,7 @@ static int _nas_user_proc_cgatt(nas_user_t *user, const at_command_t *data)
     /*
      * Read command returns the current EPS service state.
      */
-    if (nas_proc_get_attach_status(user) != TRUE) {
+    if (nas_proc_get_attach_status(user) != true) {
       cgatt->state = AT_CGATT_DETACHED;
     } else {
       cgatt->state = AT_CGATT_ATTACHED;
@@ -1821,7 +1821,7 @@ static int _nas_user_proc_cgdcont(nas_user_t *user, const at_command_t *data)
   int emergency = AT_CGDCONT_EBS_DEFAULT;
   int p_cscf = AT_CGDCONT_PCSCF_DEFAULT;
   int im_cn_signalling = AT_CGDCONT_IM_CM_DEFAULT;
-  int reset_pdn = TRUE;
+  bool reset_pdn = true;
 
   at_response->id = data->id;
   at_response->type = data->type;
@@ -1870,7 +1870,7 @@ static int _nas_user_proc_cgdcont(nas_user_t *user, const at_command_t *data)
         break;
       }
 
-      reset_pdn = FALSE;
+      reset_pdn = false;
     }
 
     if (data->mask & AT_CGDCONT_APN_MASK) {
diff --git a/openair3/NAS/UE/nas_user.h b/openair3/NAS/UE/nas_user.h
index 1ded438ddd1c5982f42c10d3eb3121f2f1eb915a..63920540d4dd138cbe0034f02022cd7aed787f0a 100644
--- a/openair3/NAS/UE/nas_user.h
+++ b/openair3/NAS/UE/nas_user.h
@@ -63,7 +63,7 @@ Description NAS procedure functions triggered by the user
 void nas_user_initialize(nas_user_t *user, emm_indication_callback_t emm_cb,
                          esm_indication_callback_t esm_cb, const char *version);
 
-int nas_user_receive_and_process(nas_user_t *user, char *message);
+bool nas_user_receive_and_process(nas_user_t *user, char *message);
 
 int nas_user_process_data(nas_user_t *user, const void *data);
 
diff --git a/openair3/NGAP/ngap_common.h b/openair3/NGAP/ngap_common.h
index 60f7beacd06eb9ef37d86ec705b75e627ea305b3..a550b6e436781ff7e58b6095364197a7edd6ca2d 100644
--- a/openair3/NGAP/ngap_common.h
+++ b/openair3/NGAP/ngap_common.h
@@ -102,13 +102,6 @@
 # error "You are compiling ngap with the wrong version of ASN1C"
 #endif
 
-#ifndef FALSE
-# define FALSE (0)
-#endif
-#ifndef TRUE
-# define TRUE  (!FALSE)
-#endif
-
 #define NGAP_UE_ID_FMT  "0x%06"PRIX32
 
 extern int asn_debug;
diff --git a/openair3/S1AP/s1ap_common.h b/openair3/S1AP/s1ap_common.h
index 3c07f92a7f5b1dd6e91ad3a833772709caf300c4..d383b622b6197108259d1ad2b77156566fb90b4d 100644
--- a/openair3/S1AP/s1ap_common.h
+++ b/openair3/S1AP/s1ap_common.h
@@ -61,13 +61,6 @@
 # error "You are compiling s1ap with the wrong version of ASN1C"
 #endif
 
-#ifndef FALSE
-# define FALSE (0)
-#endif
-#ifndef TRUE
-# define TRUE  (!FALSE)
-#endif
-
 #define S1AP_UE_ID_FMT  "0x%06"PRIX32
 
 extern int asn_debug;
diff --git a/openair3/S1AP/s1ap_eNB_trace.c b/openair3/S1AP/s1ap_eNB_trace.c
index 695eeb4ef836a340f4639153ba06699172596f0b..de84682ec1aaf882446ee36720dc295b5d3e7acb 100644
--- a/openair3/S1AP/s1ap_eNB_trace.c
+++ b/openair3/S1AP/s1ap_eNB_trace.c
@@ -115,7 +115,7 @@ int s1ap_eNB_handle_trace_start(uint32_t         assoc_id,
     container = &pdu->choice.initiatingMessage.value.choice.TraceStart;
 
     S1AP_FIND_PROTOCOLIE_BY_ID(S1AP_TraceStartIEs_t, ie, container,
-                               S1AP_ProtocolIE_ID_id_eNB_UE_S1AP_ID, TRUE);
+                               S1AP_ProtocolIE_ID_id_eNB_UE_S1AP_ID, true);
     mme_ref_p = s1ap_eNB_get_MME(NULL, assoc_id, 0);
     DevAssert(mme_ref_p != NULL);
   if (ie != NULL) {
diff --git a/openair3/SCTP/sctp_eNB_task.c b/openair3/SCTP/sctp_eNB_task.c
index 06e606e36b616ecb61be147e548f4e3580dc6c65..df6dde0f9977f0882a833ecaa3aa504d8ab00472 100644
--- a/openair3/SCTP/sctp_eNB_task.c
+++ b/openair3/SCTP/sctp_eNB_task.c
@@ -859,7 +859,7 @@ sctp_eNB_accept_associations(
     struct sctp_cnx_list_elm_s *sctp_cnx)
 {
     int             client_sd;
-    struct sockaddr saddr;
+    struct sockaddr_in6 saddr;
     socklen_t       saddr_size;
 
     DevAssert(sctp_cnx != NULL);
@@ -868,14 +868,14 @@ sctp_eNB_accept_associations(
 
     /* There is a new client connecting. Accept it...
      */
-    if ((client_sd = accept(sctp_cnx->sd, &saddr, &saddr_size)) < 0) {
+    if ((client_sd = accept(sctp_cnx->sd, (struct sockaddr*)&saddr, &saddr_size)) < 0) {
         SCTP_ERROR("[%d] accept failed: %s:%d\n", sctp_cnx->sd, strerror(errno), errno);
     } else {
         struct sctp_cnx_list_elm_s *new_cnx;
         uint16_t port;
 
         /* This is an ipv6 socket */
-        port = ((struct sockaddr_in6*)&saddr)->sin6_port;
+        port = saddr.sin6_port;
 
         /* Contrary to BSD, client socket does not inherit O_NONBLOCK option */
         if (fcntl(client_sd, F_SETFL, O_NONBLOCK) < 0) {
diff --git a/openair3/UTILS/conversions.h b/openair3/UTILS/conversions.h
index 00b650a3025af8748abde760f2daf14d58820459..0361c34f33479331fc873378bb2d2ec8e8c4769b 100644
--- a/openair3/UTILS/conversions.h
+++ b/openair3/UTILS/conversions.h
@@ -70,8 +70,8 @@
 /* Convert an integer on 16 bits to the given bUFFER */
 #define INT16_TO_BUFFER(x, buf) \
 do {                            \
-    (buf)[0] = (x) >> 8;        \
-    (buf)[1] = (x);             \
+    (buf)[0] = ((x) >> 8) & 0xff; \
+    (buf)[1] = (x)      & 0xff; \
 } while(0)
 
 /* Convert an array of char containing vALUE to x */
@@ -84,9 +84,9 @@ do {                            \
 /* Convert an integer on 24 bits to the given bUFFER */
 #define INT24_TO_BUFFER(x, buf) \
 do {                            \
-    (buf)[0] = (x) >> 16;       \
-    (buf)[1] = (x) >> 8;        \
-    (buf)[2] = (x);             \
+    (buf)[0] = ((x) >> 16) & 0xff;\
+    (buf)[1] = ((x) >> 8) & 0xff; \
+    (buf)[2] = (x)      & 0xff; \
 } while(0)
 
 /* Convert an array of char containing vALUE to x */
@@ -101,10 +101,10 @@ do {                            \
 /* Convert an integer on 32 bits to the given bUFFER */
 #define INT32_TO_BUFFER(x, buf) \
 do {                            \
-    (buf)[0] = (x) >> 24;       \
-    (buf)[1] = (x) >> 16;       \
-    (buf)[2] = (x) >> 8;        \
-    (buf)[3] = (x);             \
+    (buf)[0] = ((x) >> 24) & 0xff;\
+    (buf)[1] = ((x) >> 16) & 0xff;\
+    (buf)[2] = ((x) >> 8) & 0xff; \
+    (buf)[3] = (x)      & 0xff; \
 } while(0)
 
 /* Convert an array of char containing vALUE to x */
diff --git a/openair3/ocp-gtpu/gtp_itf.cpp b/openair3/ocp-gtpu/gtp_itf.cpp
index 7b8ba308bfb41a979b97c5244dc9052befe74a05..e318f0cf95c317e46119fd25a18f3eeff8c54bec 100644
--- a/openair3/ocp-gtpu/gtp_itf.cpp
+++ b/openair3/ocp-gtpu/gtp_itf.cpp
@@ -17,11 +17,10 @@ extern "C" {
 #include <openair2/COMMON/gtpv1_u_messages_types.h>
 #include <openair3/ocp-gtpu/gtp_itf.h>
 #include <openair2/LAYER2/PDCP_v10.1.0/pdcp.h>
+#include <openair2/LAYER2/nr_rlc/nr_rlc_oai_api.h>
 #include "openair2/SDAP/nr_sdap/nr_sdap.h"
 //#include <openair1/PHY/phy_extern.h>
 
-static boolean_t is_gnb = false;
-
 #pragma pack(1)
 
 typedef struct Gtpv1uMsgHeader {
@@ -36,6 +35,22 @@ typedef struct Gtpv1uMsgHeader {
   teid_t teid;
 } __attribute__((packed)) Gtpv1uMsgHeaderT;
 
+//TS 38.425, Figure 5.5.2.2-1
+typedef struct DlDataDeliveryStatus_flags {
+  uint8_t LPR:1;                    //Lost packet report
+  uint8_t FFI:1;                    //Final Frame Ind
+  uint8_t deliveredPdcpSn:1;        //Highest Delivered NR PDCP SN Ind
+  uint8_t transmittedPdcpSn:1;      //Highest Transmitted NR PDCP SN Ind
+  uint8_t pduType:4;                //PDU type
+  uint8_t CR:1;                     //Cause Report
+  uint8_t deliveredReTxPdcpSn:1;    //Delivered retransmitted NR PDCP SN Ind
+  uint8_t reTxPdcpSn:1;             //Retransmitted NR PDCP SN Ind
+  uint8_t DRI:1;                    //Data Rate Indication
+  uint8_t deliveredPdcpSnRange:1;   //Delivered NR PDCP SN Range Ind
+  uint8_t spare:3;
+  uint32_t drbBufferSize;            //Desired buffer size for the data radio bearer
+} __attribute__((packed)) DlDataDeliveryStatus_flagsT;
+
 typedef struct Gtpv1uMsgHeaderOptFields {
   uint8_t seqNum1Oct;
   uint8_t seqNum2Oct;
@@ -43,24 +58,29 @@ typedef struct Gtpv1uMsgHeaderOptFields {
   uint8_t NextExtHeaderType;    
 } __attribute__((packed)) Gtpv1uMsgHeaderOptFieldsT;
 
-typedef struct PDUSessionContainer {
+#define DL_PDU_SESSION_INFORMATION 0
+#define UL_PDU_SESSION_INFORMATION 1
+
+  typedef struct PDUSessionContainer {
   uint8_t spare:4;
   uint8_t PDU_type:4;
   uint8_t QFI:6;
-  uint8_t RQI:1;
-  uint8_t PPP:1;
+  uint8_t Reflective_QoS_activation:1;
+  uint8_t Paging_Policy_Indicator:1;
 } __attribute__((packed)) PDUSessionContainerT;
 
 typedef struct Gtpv1uExtHeader {
   uint8_t ExtHeaderLen;
   PDUSessionContainerT pdusession_cntr;
-  //uint8_t NextExtHeaderType;
+  uint8_t NextExtHeaderType;
 }__attribute__((packed)) Gtpv1uExtHeaderT;
 
 #pragma pack()
 
 // TS 29.281, fig 5.2.1-3
 #define PDU_SESSION_CONTAINER       (0x85)
+#define NR_RAN_CONTAINER            (0x84)
+
 // TS 29.281, 5.2.1
 #define EXT_HDR_LNTH_OCTET_UNITS    (4)
 #define NO_MORE_EXT_HDRS            (0)
@@ -84,16 +104,19 @@ typedef struct gtpv1u_bearer_s {
   tcp_udp_port_t  outgoing_port;
   uint16_t        seqNum;
   uint8_t         npduNum;
+  int outgoing_qfi;
 } gtpv1u_bearer_t;
 
 typedef struct {
   map<int, gtpv1u_bearer_t> bearers;
+  teid_t outgoing_teid;
 } teidData_t;
 
 typedef struct {
   rnti_t rnti;
   ebi_t incoming_rb_id;
   gtpCallback callBack;
+  teid_t outgoing_teid;
   gtpCallbackSDAP callBackSDAP;
   int pdusession_id;
 } rntiData_t;
@@ -137,53 +160,81 @@ instance_t legacyInstanceMapping=0;
 #define compatInst(a) ((a)==0 || (a)==INSTANCE_DEFAULT?legacyInstanceMapping:a)
 
 #define GTPV1U_HEADER_SIZE                                  (8)
-
-
-static int gtpv1uCreateAndSendMsg(int h, uint32_t peerIp, uint16_t peerPort, int msgType, teid_t teid, uint8_t *Msg,int msgLen,
-                                  bool seqNumFlag, bool  npduNumFlag, bool extHdrFlag, int seqNum, int npduNum, int extHdrType) {
-  AssertFatal(extHdrFlag==false,"Not developped");
-  int headerAdditional=0;
-
-  if ( seqNumFlag || npduNumFlag || extHdrFlag)
-    headerAdditional=4;
-
-  int fullSize=GTPV1U_HEADER_SIZE+headerAdditional+msgLen;
-  uint8_t buffer[fullSize];
+  
+  #define HDR_MAX 256 // 256 is supposed to be larger than any gtp header
+static int gtpv1uCreateAndSendMsg(int h,
+                                  uint32_t peerIp,
+                                  uint16_t peerPort,
+                                  int msgType,
+                                  teid_t teid,
+                                  uint8_t *Msg,
+                                  int msgLen,
+                                  bool seqNumFlag,
+                                  bool npduNumFlag,
+                                  int seqNum,
+                                  int npduNum,
+                                  int extHdrType,
+                                  uint8_t *extensionHeader_buffer,
+                                  uint8_t extensionHeader_length) {
+  LOG_D(GTPU, "Peer IP:%u peer port:%u outgoing teid:%u \n", peerIp, peerPort, teid);
+
+  uint8_t buffer[msgLen+HDR_MAX]; 
+  uint8_t *curPtr=buffer;
   Gtpv1uMsgHeaderT      *msgHdr = (Gtpv1uMsgHeaderT *)buffer ;
   // N should be 0 for us (it was used only in 2G and 3G)
   msgHdr->PN=npduNumFlag;
   msgHdr->S=seqNumFlag;
-  msgHdr->E=extHdrFlag;
+  msgHdr->E = extHdrType;
   msgHdr->spare=0;
   //PT=0 is for GTP' TS 32.295 (charging)
   msgHdr->PT=1;
   msgHdr->version=1;
   msgHdr->msgType=msgType;
-  msgHdr->msgLength=htons(msgLen);
+  msgHdr->msgLength = htons(msgLen + extensionHeader_length);
+  msgHdr->teid=htonl(teid);
 
-  if ( seqNumFlag || extHdrFlag || npduNumFlag)
-    msgHdr->msgLength+=4;
+  curPtr+=sizeof(Gtpv1uMsgHeaderT);
 
-  msgHdr->teid=htonl(teid);
+  if (seqNumFlag || (extHdrType != NO_MORE_EXT_HDRS) || npduNumFlag) {
+    msgHdr->msgLength += htons(4);
+    *(uint16_t *)curPtr = seqNumFlag ? seqNum : 0x0000;
+    curPtr+=sizeof(uint16_t);
+    *(uint8_t *)curPtr = npduNumFlag ? npduNum : 0x00;
+    curPtr++;
+    *(uint8_t *)curPtr = extHdrType;
+    curPtr++;
+  }
+
+  // Bug: if there is more than one extension, infinite loop on extensionHeader_buffer
+  while (extHdrType != NO_MORE_EXT_HDRS) {
+    if (extensionHeader_length > 0) {
+      memcpy(curPtr, extensionHeader_buffer, extensionHeader_length);
+      curPtr += extensionHeader_length;
+      LOG_D(GTPU, "Extension Header for DDD added. The length is: %d, extension header type is: %x \n", extensionHeader_length, *((uint8_t *)(buffer + 11)));
+      extHdrType = extensionHeader_buffer[extensionHeader_length - 1];
+      LOG_D(GTPU, "Next extension header type is: %x \n", *((uint8_t *)(buffer + 11)));
+    } else {
+      LOG_W(GTPU, "Extension header type not supported, returning... \n");
+    }
+  }
 
-  if(seqNumFlag || extHdrFlag || npduNumFlag) {
-    *((uint16_t *) (buffer+8)) = seqNumFlag ? htons(seqNum) : 0x0000;
-    *((uint8_t *) (buffer+10)) = npduNumFlag ? htons(npduNum) : 0x00;
-    *((uint8_t *) (buffer+11)) = extHdrFlag ? htons(extHdrType) : 0x00;
+  if (Msg!= NULL){
+    memcpy(curPtr, Msg, msgLen);
+    curPtr+=msgLen;
   }
 
-  memcpy(buffer+GTPV1U_HEADER_SIZE+headerAdditional, Msg, msgLen);
+  AssertFatal(curPtr-(buffer+msgLen) < HDR_MAX, "");
   // Fix me: add IPv6 support, using flag ipVersion
   static struct sockaddr_in to= {0};
   to.sin_family      = AF_INET;
   to.sin_port        = htons(peerPort);
   to.sin_addr.s_addr = peerIp ;
-  LOG_D(GTPU,"sending packet size: %d to %s\n",fullSize, inet_ntoa(to.sin_addr) );
+  LOG_D(GTPU,"sending packet size: %ld to %s\n",curPtr-buffer, inet_ntoa(to.sin_addr) );
   int ret;
 
-  if ((ret=sendto(h, (void *)buffer, (size_t)fullSize, 0,(struct sockaddr *)&to, sizeof(to) )) != fullSize ) {
-    LOG_E(GTPU, "[SD %d] Failed to send data to " IPV4_ADDR " on port %d, buffer size %u, ret: %d, errno: %d\n",
-          h, IPV4_ADDR_FORMAT(peerIp), peerPort, fullSize, ret, errno);
+  if ((ret=sendto(h, (void *)buffer, curPtr-buffer, 0,(struct sockaddr *)&to, sizeof(to) )) != curPtr-buffer ) {
+    LOG_E(GTPU, "[SD %d] Failed to send data to " IPV4_ADDR " on port %d, buffer size %lu, ret: %d, errno: %d\n",
+          h, IPV4_ADDR_FORMAT(peerIp), peerPort, curPtr-buffer, ret, errno);
     return GTPNOK;
   }
 
@@ -225,12 +276,8 @@ static void gtpv1uSend(instance_t instance, gtpv1u_enb_tunnel_data_req_t *req, b
   // copy to release the mutex
   gtpv1u_bearer_t tmp=ptr2->second;
   pthread_mutex_unlock(&globGtp.gtp_lock);
-  gtpv1uCreateAndSendMsg(compatInst(instance),
-                         tmp.outgoing_ip_addr,
-                         tmp.outgoing_port,
-                         GTP_GPDU,
-                         tmp.teid_outgoing,
-                         buffer, length, seqNumFlag, npduNumFlag, false, tmp.seqNum, tmp.npduNum, 0) ;
+  gtpv1uCreateAndSendMsg(
+      compatInst(instance), tmp.outgoing_ip_addr, tmp.outgoing_port, GTP_GPDU, tmp.teid_outgoing, buffer, length, seqNumFlag, npduNumFlag, tmp.seqNum, tmp.npduNum, NO_MORE_EXT_HDRS, NULL, 0);
 }
 
 static void gtpv1uSend2(instance_t instance, gtpv1u_gnb_tunnel_data_req_t *req, bool seqNumFlag, bool npduNumFlag) {
@@ -268,12 +315,98 @@ static void gtpv1uSend2(instance_t instance, gtpv1u_gnb_tunnel_data_req_t *req,
   // copy to release the mutex
   gtpv1u_bearer_t tmp=ptr2->second;
   pthread_mutex_unlock(&globGtp.gtp_lock);
-  gtpv1uCreateAndSendMsg(compatInst(instance),
-                         tmp.outgoing_ip_addr,
-                         tmp.outgoing_port,
-                         GTP_GPDU,
-                         tmp.teid_outgoing,
-                         buffer, length, seqNumFlag, npduNumFlag, false, tmp.seqNum, tmp.npduNum, 0) ;
+
+  if (tmp.outgoing_qfi != -1) {
+    Gtpv1uExtHeaderT ext = { 0 };
+    ext.ExtHeaderLen = 1; // in quad bytes  EXT_HDR_LNTH_OCTET_UNITS
+    ext.pdusession_cntr.spare = 0;
+    ext.pdusession_cntr.PDU_type = UL_PDU_SESSION_INFORMATION;
+    ext.pdusession_cntr.QFI = tmp.outgoing_qfi;
+    ext.pdusession_cntr.Reflective_QoS_activation = false;
+    ext.pdusession_cntr.Paging_Policy_Indicator = false;
+    ext.NextExtHeaderType = NO_MORE_EXT_HDRS;
+
+    gtpv1uCreateAndSendMsg(compatInst(instance),
+                           tmp.outgoing_ip_addr,
+                           tmp.outgoing_port,
+                           GTP_GPDU,
+                           tmp.teid_outgoing,
+                           buffer,
+                           length,
+                           seqNumFlag,
+                           npduNumFlag,
+                           tmp.seqNum,
+                           tmp.npduNum,
+                           PDU_SESSION_CONTAINER,
+                           (uint8_t *)&ext,
+                           sizeof(ext));
+  } else {
+    gtpv1uCreateAndSendMsg(
+        compatInst(instance), tmp.outgoing_ip_addr, tmp.outgoing_port, GTP_GPDU, tmp.teid_outgoing, buffer, length, seqNumFlag, npduNumFlag, tmp.seqNum, tmp.npduNum, NO_MORE_EXT_HDRS, NULL, 0);
+  }
+}
+
+static void fillDlDeliveryStatusReport(extensionHeader_t *extensionHeader, uint32_t RLC_buffer_availability, uint32_t NR_PDCP_PDU_SN){
+
+  extensionHeader->buffer[0] = (1+sizeof(DlDataDeliveryStatus_flagsT)+(NR_PDCP_PDU_SN>0?3:0)+(NR_PDCP_PDU_SN>0?1:0)+1)/4;
+  DlDataDeliveryStatus_flagsT DlDataDeliveryStatus;
+  DlDataDeliveryStatus.deliveredPdcpSn = 0;
+  DlDataDeliveryStatus.transmittedPdcpSn= NR_PDCP_PDU_SN>0?1:0;
+  DlDataDeliveryStatus.pduType = 1;
+  DlDataDeliveryStatus.drbBufferSize = htonl(RLC_buffer_availability);
+  memcpy(extensionHeader->buffer+1, &DlDataDeliveryStatus, sizeof(DlDataDeliveryStatus_flagsT));
+  uint8_t offset = sizeof(DlDataDeliveryStatus_flagsT)+1;
+
+  if(NR_PDCP_PDU_SN>0){
+    extensionHeader->buffer[offset] =   (NR_PDCP_PDU_SN >> 16) & 0xff;
+    extensionHeader->buffer[offset+1] = (NR_PDCP_PDU_SN >> 8) & 0xff;
+    extensionHeader->buffer[offset+2] = NR_PDCP_PDU_SN & 0xff;
+    LOG_D(GTPU, "Octets reporting NR_PDCP_PDU_SN, extensionHeader->buffer[offset]: %u, extensionHeader->buffer[offset+1]:%u, extensionHeader->buffer[offset+2]:%u \n", extensionHeader->buffer[offset], extensionHeader->buffer[offset+1],extensionHeader->buffer[offset+2]);
+    extensionHeader->buffer[offset+3] = 0x00; //Padding octet
+    offset = offset+3;
+  }
+  extensionHeader->buffer[offset] = 0x00; //No more extension headers
+  /*Total size of DDD_status PDU = size of mandatory part +
+   * 3 octets for highest transmitted/delivered PDCP SN +
+   * 1 octet for padding + 1 octet for next extension header type,
+   * according to TS 38.425: Fig. 5.5.2.2-1 and section 5.5.3.24*/
+  extensionHeader->length  = 1+sizeof(DlDataDeliveryStatus_flagsT)+
+                              (NR_PDCP_PDU_SN>0?3:0)+
+                              (NR_PDCP_PDU_SN>0?1:0)+1;
+}
+
+static void gtpv1uSendDlDeliveryStatus(instance_t instance, gtpv1u_DU_buffer_report_req_t *req){
+  rnti_t rnti=req->rnti;
+  int  rab_id=req->pdusession_id;
+  pthread_mutex_lock(&globGtp.gtp_lock);
+  auto inst=&globGtp.instances[compatInst(instance)];
+  auto ptrRnti=inst->ue2te_mapping.find(rnti);
+
+  if (  ptrRnti==inst->ue2te_mapping.end() ) {
+    LOG_E(GTPU, "[%ld] GTP-U gtpv1uSend failed: while getting ue rnti %x in hashtable ue_mapping\n", instance, rnti);
+    pthread_mutex_unlock(&globGtp.gtp_lock);
+    return;
+  }
+
+  map<int, gtpv1u_bearer_t>::iterator ptr2=ptrRnti->second.bearers.find(rab_id);
+
+  if ( ptr2 == ptrRnti->second.bearers.end() ) {
+    LOG_D(GTPU,"GTP-U instance: %ld sending a packet to a non existant RNTI:RAB: %x/%x\n", instance, rnti, rab_id);
+    pthread_mutex_unlock(&globGtp.gtp_lock);
+    return;
+  }
+
+  extensionHeader_t *extensionHeader;
+  extensionHeader = (extensionHeader_t *) calloc(1, sizeof(extensionHeader_t));
+  fillDlDeliveryStatusReport(extensionHeader, req->buffer_availability,0);
+
+  LOG_I(GTPU,"[%ld] GTP-U sending DL Data Delivery status to RNTI:RAB:teid %x/%x/%x, oldseq %d, oldnum %d\n",
+        instance, rnti, rab_id,ptr2->second.teid_outgoing, ptr2->second.seqNum,ptr2->second.npduNum );
+  // copy to release the mutex
+  gtpv1u_bearer_t tmp=ptr2->second;
+  pthread_mutex_unlock(&globGtp.gtp_lock);
+  gtpv1uCreateAndSendMsg(
+      compatInst(instance), tmp.outgoing_ip_addr, tmp.outgoing_port, GTP_GPDU, tmp.teid_outgoing, NULL, 0, false, false, 0, 0, NR_RAN_CONTAINER, extensionHeader->buffer, extensionHeader->length);
 }
 
 static void gtpv1uEndTunnel(instance_t instance, gtpv1u_enb_tunnel_data_req_t *req) {
@@ -455,14 +588,22 @@ void GtpuUpdateTunnelOutgoingTeid(instance_t instance, rnti_t rnti, ebi_t bearer
   return;
 }
 
-teid_t newGtpuCreateTunnel(instance_t instance, rnti_t rnti, int incoming_bearer_id, int outgoing_bearer_id, teid_t outgoing_teid,
-                           transport_layer_addr_t remoteAddr, int port, gtpCallback callBack) {
+teid_t newGtpuCreateTunnel(instance_t instance,
+                           rnti_t rnti,
+                           int incoming_bearer_id,
+                           int outgoing_bearer_id,
+                           teid_t outgoing_teid,
+                           int outgoing_qfi,
+                           transport_layer_addr_t remoteAddr,
+                           int port,
+                           gtpCallback callBack,
+                           gtpCallbackSDAP callBackSDAP) {
   pthread_mutex_lock(&globGtp.gtp_lock);
   instance=compatInst(instance);
   auto inst=&globGtp.instances[instance];
   auto it=inst->ue2te_mapping.find(rnti);
 
-  if ( it != inst->ue2te_mapping.end() ) {
+  if ( it != inst->ue2te_mapping.end() &&  it->second.bearers.find(outgoing_bearer_id) != it->second.bearers.end()) {
     LOG_W(GTPU,"[%ld] Create a config for a already existing GTP tunnel (rnti %x)\n", instance, rnti);
     inst->ue2te_mapping.erase(it);
   }
@@ -478,9 +619,11 @@ teid_t newGtpuCreateTunnel(instance_t instance, rnti_t rnti, int incoming_bearer
 
   inst->te2ue_mapping[incoming_teid].incoming_rb_id= incoming_bearer_id;
 
+  inst->te2ue_mapping[incoming_teid].outgoing_teid= outgoing_teid;
+
   inst->te2ue_mapping[incoming_teid].callBack=callBack;
-  
-  inst->te2ue_mapping[incoming_teid].callBackSDAP = sdap_data_req;
+
+  inst->te2ue_mapping[incoming_teid].callBackSDAP = callBackSDAP;
 
   inst->te2ue_mapping[incoming_teid].pdusession_id = (uint8_t)outgoing_bearer_id;
 
@@ -511,6 +654,7 @@ teid_t newGtpuCreateTunnel(instance_t instance, rnti_t rnti, int incoming_bearer
   tmp->teid_incoming = incoming_teid;
   tmp->outgoing_port=port;
   tmp->teid_outgoing= outgoing_teid;
+  tmp->outgoing_qfi=outgoing_qfi;
   pthread_mutex_unlock(&globGtp.gtp_lock);
   char ip4[INET_ADDRSTRLEN];
   char ip6[INET6_ADDRSTRLEN];
@@ -539,12 +683,16 @@ int gtpv1u_create_s1u_tunnel(instance_t instance,
                 "From legacy code not clear, seems impossible (bearer=%d)\n",
                 create_tunnel_req->eps_bearer_id[i]);
     int incoming_rb_id=create_tunnel_req->eps_bearer_id[i]-4;
-    teid_t teid=newGtpuCreateTunnel(compatInst(instance), create_tunnel_req->rnti,
-                                    incoming_rb_id,
-                                    create_tunnel_req->eps_bearer_id[i],
-                                    create_tunnel_req->sgw_S1u_teid[i],
-                                    create_tunnel_req->sgw_addr[i],  dstport,
-                                    pdcp_data_req);
+    teid_t teid = newGtpuCreateTunnel(compatInst(instance),
+                                      create_tunnel_req->rnti,
+                                      incoming_rb_id,
+                                      create_tunnel_req->eps_bearer_id[i],
+                                      create_tunnel_req->sgw_S1u_teid[i],
+                                      -1, // no pdu session in 4G
+                                      create_tunnel_req->sgw_addr[i],
+                                      dstport,
+                                      pdcp_data_req,
+                                      NULL);
     create_tunnel_resp->status=0;
     create_tunnel_resp->rnti=create_tunnel_req->rnti;
     create_tunnel_resp->num_tunnels=create_tunnel_req->num_tunnels;
@@ -601,15 +749,18 @@ int gtpv1u_create_ngu_tunnel(  const instance_t instance,
         create_tunnel_req->rnti,
         create_tunnel_req->num_tunnels,
         create_tunnel_req->outgoing_teid[0]);
-  tcp_udp_port_t dstport=globGtp.instances[compatInst(instance)].get_dstport();
-  is_gnb = true;
+  tcp_udp_port_t dstport = globGtp.instances[compatInst(instance)].get_dstport();
   for (int i = 0; i < create_tunnel_req->num_tunnels; i++) {
-    teid_t teid=newGtpuCreateTunnel(instance, create_tunnel_req->rnti,
-                                    create_tunnel_req->incoming_rb_id[i],
-                                    create_tunnel_req->pdusession_id[i],
-                                    create_tunnel_req->outgoing_teid[i],
-                                    create_tunnel_req->dst_addr[i], dstport,
-                                    pdcp_data_req);
+    teid_t teid = newGtpuCreateTunnel(instance,
+                                      create_tunnel_req->rnti,
+                                      create_tunnel_req->incoming_rb_id[i],
+                                      create_tunnel_req->pdusession_id[i],
+                                      create_tunnel_req->outgoing_teid[i],
+                                      create_tunnel_req->outgoing_qfi[i],
+                                      create_tunnel_req->dst_addr[i],
+                                      dstport,
+                                      pdcp_data_req,
+                                      sdap_data_req);
     create_tunnel_resp->status=0;
     create_tunnel_resp->rnti=create_tunnel_req->rnti;
     create_tunnel_resp->num_tunnels=create_tunnel_req->num_tunnels;
@@ -739,9 +890,7 @@ static int Gtpv1uHandleEchoReq(int h,
   uint16_t seq=ntohs(*(uint16_t *)(msgHdr+1));
   LOG_D(GTPU, "[%d] Received a echo request, TEID: %d, seq: %hu\n", h, msgHdr->teid, seq);
   uint8_t recovery[2]= {14,0};
-  return gtpv1uCreateAndSendMsg(h, peerIp, peerPort, GTP_ECHO_RSP, ntohl(msgHdr->teid),
-                                recovery, sizeof recovery,
-                                1, 0, 0, seq, 0, 0);
+  return gtpv1uCreateAndSendMsg(h, peerIp, peerPort, GTP_ECHO_RSP, ntohl(msgHdr->teid), recovery, sizeof recovery, true, false, seq, 0, NO_MORE_EXT_HDRS, NULL, 0);
 }
 
 static int Gtpv1uHandleError(int h,
@@ -850,26 +999,63 @@ static int Gtpv1uHandleGpdu(int h,
     return GTPNOK;
   }
 
-  int offset=sizeof(Gtpv1uMsgHeaderT);
-
-  uint8_t qfi = 0;
-  boolean_t rqi = FALSE;
-
-  if( msgHdr->E || msgHdr->S || msgHdr->PN){
-   Gtpv1uMsgHeaderOptFieldsT *msgHdrOpt = (Gtpv1uMsgHeaderOptFieldsT *)(msgBuf+offset);
-   offset+=sizeof(Gtpv1uMsgHeaderOptFieldsT);
-    if( msgHdr->E && msgHdrOpt->NextExtHeaderType == PDU_SESSION_CONTAINER){
-      Gtpv1uExtHeaderT *msgHdrExt = (Gtpv1uExtHeaderT *)(msgBuf+offset);
-      offset+=msgHdrExt->ExtHeaderLen*EXT_HDR_LNTH_OCTET_UNITS;
-      qfi = msgHdrExt->pdusession_cntr.QFI;
-      rqi = msgHdrExt->pdusession_cntr.RQI;
-
-      /* 
-       * Check if the next extension header type of GTP extension header is set to 0
-       * We can not put it in the struct Gtpv1uExtHeaderT because the length is dynamic.
-       */
-      if(*(msgBuf+offset-1) != NO_MORE_EXT_HDRS)
-        LOG_W(GTPU, "Warning -  Next extension header is not zero, handle it \n");
+  /* see TS 29.281 5.1 */
+  //Minimum length of GTP-U header if non of the optional fields are present
+  int offset = sizeof(Gtpv1uMsgHeaderT);
+
+  uint8_t qfi = -1;
+  bool rqi = false;
+  uint32_t NR_PDCP_PDU_SN = 0;
+
+  /* if E, S, or PN is set then there are 4 more bytes of header */
+  if( msgHdr->E ||  msgHdr->S ||msgHdr->PN)
+    offset += 4;
+
+  if (msgHdr->E) {
+    int next_extension_header_type = msgBuf[offset - 1];
+    int extension_header_length;
+
+    while (next_extension_header_type != NO_MORE_EXT_HDRS) {
+      extension_header_length = msgBuf[offset];
+      switch (next_extension_header_type) {
+        case PDU_SESSION_CONTAINER: {
+          PDUSessionContainerT *pdusession_cntr = (PDUSessionContainerT *)(msgBuf + offset + 1);
+          qfi = pdusession_cntr->QFI;
+          rqi = pdusession_cntr->Reflective_QoS_activation;
+          break;
+        }
+        case NR_RAN_CONTAINER: {
+          uint8_t PDU_type = (msgBuf[offset+1]>>4) & 0x0f;
+          if (PDU_type == 0){ //DL USER Data Format
+            int additional_offset = 6; //Additional offset capturing the first non-mandatory octet (TS 38.425, Figure 5.5.2.1-1)
+            if(msgBuf[offset+1]>>2 & 0x1){ //DL Discard Blocks flag is present
+              LOG_I(GTPU, "DL User Data: DL Discard Blocks handling not enabled\n"); 
+              additional_offset = additional_offset + 9; //For the moment ignore
+            }
+            if(msgBuf[offset+1]>>1 & 0x1){ //DL Flush flag is present
+              LOG_I(GTPU, "DL User Data: DL Flush handling not enabled\n");
+              additional_offset = additional_offset + 3; //For the moment ignore
+            }
+            if((msgBuf[offset+2]>>3)& 0x1){ //"Report delivered" enabled (TS 38.425, 5.4)
+              /*Store the NR PDCP PDU SN for which a delivery status report shall be generated once the
+               *PDU gets forwarded to the lower layers*/
+              //NR_PDCP_PDU_SN = msgBuf[offset+6] << 16 | msgBuf[offset+7] << 8 | msgBuf[offset+8];
+              NR_PDCP_PDU_SN = msgBuf[offset+additional_offset] << 16 | msgBuf[offset+additional_offset+1] << 8 | msgBuf[offset+additional_offset+2]; 
+              LOG_D(GTPU, " NR_PDCP_PDU_SN: %u \n",  NR_PDCP_PDU_SN);
+            }
+          }
+          else{
+            LOG_W(GTPU, "NR-RAN container type: %d not supported \n", PDU_type);
+          }
+          break;
+        }
+        default:
+          LOG_W(GTPU, "unhandled extension 0x%2.2x, skipping\n", next_extension_header_type);
+          break;
+      }
+
+      offset += extension_header_length * EXT_HDR_LNTH_OCTET_UNITS;
+      next_extension_header_type = msgBuf[offset - 1];
     }
   }
 
@@ -896,7 +1082,7 @@ static int Gtpv1uHandleGpdu(int h,
   const uint32_t destinationL2Id=0;
   pthread_mutex_unlock(&globGtp.gtp_lock);
 
-  if(is_gnb && qfi){
+  if (qfi != -1 && tunnel->second.callBackSDAP) {
     if ( !tunnel->second.callBackSDAP(&ctxt,
                                       srb_flag,
                                       rb_id,
@@ -925,6 +1111,40 @@ static int Gtpv1uHandleGpdu(int h,
       LOG_E(GTPU,"[%d] down layer refused incoming packet\n", h);
   }
 
+  if(NR_PDCP_PDU_SN > 0 && NR_PDCP_PDU_SN %5 ==0){
+    LOG_D (GTPU, "Create and send DL DATA Delivery status for the previously received PDU, NR_PDCP_PDU_SN: %u \n", NR_PDCP_PDU_SN);
+    int rlc_tx_buffer_space = nr_rlc_get_available_tx_space(ctxt.rnti, rb_id);
+    LOG_D(GTPU, "Available buffer size in RLC for Tx: %d \n", rlc_tx_buffer_space);
+    /*Total size of DDD_status PDU = 1 octet to report extension header length
+     * size of mandatory part + 3 octets for highest transmitted/delivered PDCP SN
+     * 1 octet for padding + 1 octet for next extension header type,
+     * according to TS 38.425: Fig. 5.5.2.2-1 and section 5.5.3.24*/
+    extensionHeader_t *extensionHeader;
+    extensionHeader = (extensionHeader_t *) calloc(1, sizeof(extensionHeader_t)) ;
+    extensionHeader->buffer[0] = (1+sizeof(DlDataDeliveryStatus_flagsT)+3+1+1)/4;
+    DlDataDeliveryStatus_flagsT DlDataDeliveryStatus;
+    DlDataDeliveryStatus.deliveredPdcpSn = 0;
+    DlDataDeliveryStatus.transmittedPdcpSn= 1; 
+    DlDataDeliveryStatus.pduType = 1;
+    DlDataDeliveryStatus.drbBufferSize = htonl(rlc_tx_buffer_space); //htonl(10000000); //hardcoded for now but normally we should extract it from RLC
+    memcpy(extensionHeader->buffer+1, &DlDataDeliveryStatus, sizeof(DlDataDeliveryStatus_flagsT));
+    uint8_t offset = sizeof(DlDataDeliveryStatus_flagsT)+1;
+
+    extensionHeader->buffer[offset] =   (NR_PDCP_PDU_SN >> 16) & 0xff;
+    extensionHeader->buffer[offset+1] = (NR_PDCP_PDU_SN >> 8) & 0xff;
+    extensionHeader->buffer[offset+2] = NR_PDCP_PDU_SN & 0xff;
+    LOG_D(GTPU, "Octets reporting NR_PDCP_PDU_SN, extensionHeader->buffer[offset]: %u, extensionHeader->buffer[offset+1]:%u, extensionHeader->buffer[offset+2]:%u \n", extensionHeader->buffer[offset], extensionHeader->buffer[offset+1],extensionHeader->buffer[offset+2]);
+    extensionHeader->buffer[offset+3] = 0x00; //Padding octet
+    extensionHeader->buffer[offset+4] = 0x00; //No more extension headers
+    /*Total size of DDD_status PDU = size of mandatory part +
+     * 3 octets for highest transmitted/delivered PDCP SN +
+     * 1 octet for padding + 1 octet for next extension header type,
+     * according to TS 38.425: Fig. 5.5.2.2-1 and section 5.5.3.24*/
+    extensionHeader->length  = 1+sizeof(DlDataDeliveryStatus_flagsT)+3+1+1;
+    gtpv1uCreateAndSendMsg(
+        h, peerIp, peerPort, GTP_GPDU, inst->te2ue_mapping[ntohl(msgHdr->teid)].outgoing_teid, NULL, 0, false, false, 0, 0, NR_RAN_CONTAINER, extensionHeader->buffer, extensionHeader->length);
+  }
+
   LOG_D(GTPU,"[%d] Received a %d bytes packet for: teid:%x\n", h,
         msgBufLen-offset,
         ntohl(msgHdr->teid));
@@ -1009,6 +1229,12 @@ void *gtpv1uTask(void *args)  {
         }
         break;
 
+        case GTPV1U_DU_BUFFER_REPORT_REQ:{
+          gtpv1uSendDlDeliveryStatus(compatInst(ITTI_MSG_DESTINATION_INSTANCE(message_p)),
+              &GTPV1U_DU_BUFFER_REPORT_REQ(message_p));
+        }
+        break;
+
         case TERMINATE_MESSAGE:
           break;
 
diff --git a/openair3/ocp-gtpu/gtp_itf.h b/openair3/ocp-gtpu/gtp_itf.h
index 17882ebf1e7e0f04846782a2e0733c123a5def7f..7951c4db09b8854e55c5c11213d44fc300d9db3c 100644
--- a/openair3/ocp-gtpu/gtp_itf.h
+++ b/openair3/ocp-gtpu/gtp_itf.h
@@ -8,32 +8,30 @@
 extern "C" {
 #endif
 
-typedef boolean_t (*gtpCallback)(
-  protocol_ctxt_t  *ctxt_pP,
-  const srb_flag_t     srb_flagP,
-  const rb_id_t        rb_idP,
-  const mui_t          muiP,
-  const confirm_t      confirmP,
-  const sdu_size_t     sdu_buffer_sizeP,
-  unsigned char *const sdu_buffer_pP,
-  const pdcp_transmission_mode_t modeP,
-  const uint32_t *sourceL2Id,
-  const uint32_t *destinationL2Id);
+typedef bool (*gtpCallback)(protocol_ctxt_t  *ctxt_pP,
+                            const srb_flag_t     srb_flagP,
+                            const rb_id_t        rb_idP,
+                            const mui_t          muiP,
+                            const confirm_t      confirmP,
+                            const sdu_size_t     sdu_buffer_sizeP,
+                            unsigned char *const sdu_buffer_pP,
+                            const pdcp_transmission_mode_t modeP,
+                            const uint32_t *sourceL2Id,
+                            const uint32_t *destinationL2Id);
 
-typedef boolean_t (*gtpCallbackSDAP)(
-  protocol_ctxt_t  *ctxt_pP,
-  const srb_flag_t     srb_flagP,
-  const rb_id_t        rb_idP,
-  const mui_t          muiP,
-  const confirm_t      confirmP,
-  const sdu_size_t     sdu_buffer_sizeP,
-  unsigned char *const sdu_buffer_pP,
-  const pdcp_transmission_mode_t modeP,
-  const uint32_t *sourceL2Id,
-  const uint32_t *destinationL2Id,
-  const uint8_t   qfi,
-  const boolean_t rqi,
-  const int       pdusession_id);
+typedef bool (*gtpCallbackSDAP)(protocol_ctxt_t  *ctxt_pP,
+                                const srb_flag_t     srb_flagP,
+                                const rb_id_t        rb_idP,
+                                const mui_t          muiP,
+                                const confirm_t      confirmP,
+                                const sdu_size_t     sdu_buffer_sizeP,
+                                unsigned char *const sdu_buffer_pP,
+                                const pdcp_transmission_mode_t modeP,
+                                const uint32_t *sourceL2Id,
+                                const uint32_t *destinationL2Id,
+                                const uint8_t   qfi,
+                                const bool      rqi,
+                                const int       pdusession_id);
 
 typedef struct openAddr_s {
   char originHost[HOST_NAME_MAX];
@@ -43,6 +41,11 @@ typedef struct openAddr_s {
   instance_t originInstance;
 } openAddr_t;
 
+typedef struct extensionHeader_s{
+  uint8_t buffer[500];
+  uint8_t length;
+}extensionHeader_t;
+
 // the init function create a gtp instance and return the gtp instance id
 // the parameter originInstance will be sent back in each message from gtp to the creator
 void gtpv1uReceiver(int h);
@@ -63,8 +66,16 @@ int gtpv1u_create_x2u_tunnel(
 
 
 // New API
-teid_t newGtpuCreateTunnel(instance_t instance, rnti_t rnti, int incoming_bearer_id, int outgoing_rb_id, teid_t teid,
-                           transport_layer_addr_t remoteAddr, int port, gtpCallback callBack);
+teid_t newGtpuCreateTunnel(instance_t instance,
+                           rnti_t rnti,
+                           int incoming_bearer_id,
+                           int outgoing_rb_id,
+                           teid_t teid,
+                           int outgoing_qfi,
+                           transport_layer_addr_t remoteAddr,
+                           int port,
+                           gtpCallback callBack,
+                           gtpCallbackSDAP callBackSDAP);
 void GtpuUpdateTunnelOutgoingTeid(instance_t instance, rnti_t rnti, ebi_t bearer_id, teid_t newOutgoingTeid);
 int newGtpuDeleteAllTunnels(instance_t instance, rnti_t rnti);
 int newGtpuDeleteTunnels(instance_t instance, rnti_t rnti, int nbTunnels, pdusessionid_t *pdusession_id);
diff --git a/rxsigF0.m b/rxsigF0.m
new file mode 100644
index 0000000000000000000000000000000000000000..3309e1aa6f53c7d6ac22df8bb7ffa40b6b1c6a80
--- /dev/null
+++ b/rxsigF0.m
@@ -0,0 +1,57345 @@
+rxsF0 = [173 + j*(-306)
+-141 + j*(-130)
+-166 + j*(-246)
+-107 + j*(-42)
+-105 + j*(0)
+-179 + j*(-28)
+-87 + j*(186)
+-95 + j*(151)
+-1 + j*(228)
+172 + j*(-62)
+110 + j*(-5)
+-178 + j*(-33)
+-18 + j*(57)
+9 + j*(146)
+-11 + j*(103)
+-67 + j*(64)
+28 + j*(-375)
+-72 + j*(-75)
+-14 + j*(-318)
+194 + j*(193)
+-173 + j*(-228)
+295 + j*(119)
+203 + j*(-179)
+-238 + j*(-276)
+-286 + j*(112)
+-409 + j*(95)
+-260 + j*(84)
+72 + j*(40)
+105 + j*(-120)
+57 + j*(66)
+58 + j*(173)
+-170 + j*(-189)
+192 + j*(-50)
+-88 + j*(160)
+-187 + j*(-132)
+120 + j*(41)
+239 + j*(-115)
+80 + j*(263)
+-45 + j*(-30)
+396 + j*(192)
+161 + j*(-11)
+-325 + j*(296)
+-64 + j*(-192)
+-181 + j*(-59)
+-272 + j*(192)
+11 + j*(192)
+-215 + j*(50)
+122 + j*(177)
+-255 + j*(26)
+87 + j*(11)
+-86 + j*(-129)
+-199 + j*(199)
+-238 + j*(163)
+29 + j*(134)
+175 + j*(81)
+30 + j*(-214)
+-344 + j*(131)
+124 + j*(-252)
+134 + j*(-325)
+224 + j*(-78)
+223 + j*(-190)
+-15 + j*(88)
+-223 + j*(128)
+-48 + j*(-223)
+-109 + j*(-209)
+-17 + j*(-84)
+179 + j*(73)
+-25 + j*(-81)
+6 + j*(88)
+8 + j*(83)
+-75 + j*(38)
+-119 + j*(51)
+15 + j*(199)
+140 + j*(42)
+44 + j*(-132)
+-247 + j*(118)
+242 + j*(-82)
+140 + j*(-258)
+-98 + j*(28)
+262 + j*(107)
+-141 + j*(-21)
+137 + j*(382)
+64 + j*(-163)
+-81 + j*(62)
+54 + j*(245)
+-132 + j*(75)
+196 + j*(-219)
+-146 + j*(211)
+-64 + j*(64)
+-146 + j*(-37)
+-37 + j*(-94)
+-318 + j*(160)
+-237 + j*(112)
+-98 + j*(2)
+-286 + j*(209)
+-69 + j*(192)
+-52 + j*(105)
+-63 + j*(-35)
+119 + j*(59)
+-19 + j*(-25)
+110 + j*(54)
+45 + j*(-37)
+42 + j*(-107)
+57 + j*(74)
+190 + j*(105)
+246 + j*(20)
+233 + j*(93)
+290 + j*(180)
+232 + j*(-113)
+281 + j*(243)
+280 + j*(-250)
+47 + j*(-245)
+144 + j*(-150)
+-272 + j*(25)
+-94 + j*(163)
+-135 + j*(-334)
+16 + j*(-211)
+-165 + j*(214)
+88 + j*(34)
+27 + j*(-36)
+-161 + j*(-243)
+94 + j*(151)
+112 + j*(-66)
+-180 + j*(48)
+-77 + j*(-64)
+-293 + j*(300)
+-42 + j*(-139)
+-177 + j*(91)
+-37 + j*(-39)
+-88 + j*(216)
+-123 + j*(1)
+141 + j*(-250)
+100 + j*(-148)
+-11 + j*(265)
+30 + j*(-212)
+-9 + j*(146)
+281 + j*(223)
+-166 + j*(141)
+-7 + j*(-51)
+69 + j*(-37)
+-91 + j*(45)
+198 + j*(-225)
+560 + j*(-64)
+-245 + j*(-145)
+194 + j*(231)
+-96 + j*(216)
+8 + j*(-158)
+117 + j*(42)
+-42 + j*(132)
+97 + j*(178)
+-182 + j*(-65)
+-59 + j*(118)
+129 + j*(-45)
+75 + j*(-6)
+-88 + j*(20)
+-425 + j*(35)
+140 + j*(424)
+-40 + j*(116)
+27 + j*(-297)
+123 + j*(230)
+86 + j*(-293)
+104 + j*(-127)
+47 + j*(-89)
+60 + j*(97)
+-23 + j*(197)
+-7 + j*(-93)
+115 + j*(205)
+271 + j*(-159)
+-56 + j*(159)
+-57 + j*(556)
+-48 + j*(-196)
+-71 + j*(-63)
+-353 + j*(-221)
+-84 + j*(-173)
+30 + j*(45)
+-302 + j*(371)
+354 + j*(-22)
+-233 + j*(35)
+-308 + j*(-202)
+-433 + j*(-44)
+-158 + j*(73)
+185 + j*(-150)
+48 + j*(124)
+-7 + j*(168)
+190 + j*(78)
+211 + j*(-9)
+-71 + j*(-193)
+-119 + j*(97)
+-234 + j*(-197)
+341 + j*(-197)
+-346 + j*(74)
+105 + j*(17)
+57 + j*(-105)
+-161 + j*(-138)
+-180 + j*(180)
+-156 + j*(91)
+-9 + j*(-139)
+-87 + j*(165)
+-64 + j*(-238)
+15 + j*(-221)
+-113 + j*(8)
+-331 + j*(59)
+90 + j*(-150)
+-136 + j*(-325)
+73 + j*(178)
+-18 + j*(170)
+67 + j*(-96)
+85 + j*(-37)
+-9 + j*(-114)
+-22 + j*(136)
+-175 + j*(165)
+-87 + j*(-25)
+-31 + j*(-152)
+-301 + j*(-18)
+42 + j*(-54)
+-32 + j*(-168)
+-74 + j*(163)
+-54 + j*(-52)
+-76 + j*(-21)
+67 + j*(73)
+129 + j*(-255)
+-270 + j*(203)
+-112 + j*(-71)
+-106 + j*(13)
+175 + j*(-194)
+6 + j*(110)
+115 + j*(135)
+-22 + j*(-50)
+143 + j*(220)
+-17 + j*(-82)
+-65 + j*(204)
+-46 + j*(-112)
+86 + j*(-199)
+3 + j*(-52)
+88 + j*(116)
+184 + j*(227)
+-65 + j*(189)
+-54 + j*(-150)
+139 + j*(206)
+122 + j*(72)
+-71 + j*(194)
+-134 + j*(287)
+44 + j*(-124)
+13 + j*(-250)
+-100 + j*(95)
+-110 + j*(16)
+233 + j*(-139)
+228 + j*(-39)
+-252 + j*(133)
+-122 + j*(-129)
+21 + j*(-143)
+-55 + j*(-144)
+-199 + j*(14)
+110 + j*(-195)
+85 + j*(-45)
+-243 + j*(-35)
+59 + j*(-86)
+-361 + j*(179)
+69 + j*(34)
+-22 + j*(42)
+-267 + j*(-294)
+28 + j*(-84)
+40 + j*(-247)
+-112 + j*(128)
+54 + j*(182)
+71 + j*(-33)
+-40 + j*(448)
+-75 + j*(-132)
+10 + j*(-37)
+272 + j*(-126)
+-209 + j*(-100)
+-98 + j*(58)
+72 + j*(391)
+25 + j*(21)
+-126 + j*(-110)
+-238 + j*(138)
+227 + j*(-283)
+64 + j*(-523)
+-42 + j*(392)
+103 + j*(-288)
+-131 + j*(-207)
+88 + j*(3)
+-81 + j*(382)
+-4 + j*(119)
+177 + j*(-137)
+-95 + j*(228)
+39 + j*(-127)
+-265 + j*(202)
+145 + j*(66)
+-358 + j*(127)
+-320 + j*(-144)
+-48 + j*(-260)
+119 + j*(37)
+-359 + j*(49)
+257 + j*(-112)
+112 + j*(84)
+30 + j*(171)
+136 + j*(-186)
+-250 + j*(-115)
+-274 + j*(-281)
+-37 + j*(1)
+69 + j*(130)
+-125 + j*(-184)
+-315 + j*(-75)
+-93 + j*(104)
+64 + j*(-6)
+198 + j*(141)
+-88 + j*(18)
+248 + j*(-57)
+-107 + j*(74)
+-71 + j*(26)
+-90 + j*(-21)
+-282 + j*(-201)
+57 + j*(47)
+-15 + j*(33)
+-144 + j*(153)
+-202 + j*(-221)
+-124 + j*(-175)
+-146 + j*(-276)
+-74 + j*(39)
+-91 + j*(512)
+125 + j*(213)
+139 + j*(168)
+-233 + j*(-91)
+60 + j*(-132)
+-36 + j*(-132)
+21 + j*(105)
+-129 + j*(231)
+-283 + j*(191)
+320 + j*(134)
+-171 + j*(70)
+-133 + j*(66)
+189 + j*(47)
+188 + j*(-88)
+-16 + j*(263)
+-44 + j*(4)
+93 + j*(-2)
+33 + j*(2)
+30 + j*(211)
+-114 + j*(-76)
+54 + j*(12)
+-128 + j*(-8)
+-23 + j*(265)
+-235 + j*(224)
+-56 + j*(260)
+30 + j*(106)
+-150 + j*(-223)
+-37 + j*(-291)
+-175 + j*(177)
+-165 + j*(259)
+-206 + j*(63)
+131 + j*(-61)
+-43 + j*(-186)
+-90 + j*(14)
+79 + j*(-190)
+-127 + j*(115)
+48 + j*(28)
+-5 + j*(17)
+-28 + j*(47)
+163 + j*(135)
+44 + j*(-125)
+-86 + j*(275)
+1 + j*(117)
+49 + j*(-62)
+147 + j*(80)
+85 + j*(84)
+-31 + j*(-101)
+243 + j*(150)
+-181 + j*(-219)
+-138 + j*(-10)
+-214 + j*(-151)
+27 + j*(-88)
+211 + j*(86)
+-162 + j*(-350)
+-455 + j*(77)
+237 + j*(30)
+18 + j*(189)
+-131 + j*(119)
+18 + j*(96)
+85 + j*(78)
+182 + j*(155)
+6 + j*(250)
+195 + j*(-153)
+-74 + j*(-51)
+44 + j*(-60)
+-234 + j*(221)
+359 + j*(-139)
+-228 + j*(291)
+-28 + j*(173)
+-147 + j*(-59)
+-357 + j*(100)
+-86 + j*(464)
+-113 + j*(-74)
+-282 + j*(356)
+16 + j*(-52)
+204 + j*(-316)
+258 + j*(178)
+-75 + j*(100)
+-113 + j*(83)
+158 + j*(309)
+65 + j*(-170)
+91 + j*(-125)
+-151 + j*(318)
+-52 + j*(-18)
+-138 + j*(176)
+-226 + j*(30)
+-177 + j*(39)
+-150 + j*(-13)
+35 + j*(-183)
+204 + j*(-308)
+186 + j*(-243)
+-115 + j*(-71)
+66 + j*(55)
+-88 + j*(-128)
+-109 + j*(195)
+-244 + j*(-90)
+175 + j*(-177)
+231 + j*(-194)
+-59 + j*(101)
+23 + j*(-8)
+-117 + j*(209)
+-16 + j*(-97)
+4 + j*(190)
+-28 + j*(-67)
+-94 + j*(3)
+-54 + j*(-21)
+-27 + j*(83)
+-127 + j*(-21)
+187 + j*(-289)
+3 + j*(-82)
+-1 + j*(-223)
+-168 + j*(232)
+-148 + j*(163)
+274 + j*(-324)
+-156 + j*(-82)
+384 + j*(162)
+-91 + j*(94)
+-37 + j*(10)
+-66 + j*(330)
+-85 + j*(-8)
+62 + j*(216)
+-98 + j*(95)
+126 + j*(189)
+196 + j*(-243)
+81 + j*(-42)
+-250 + j*(-2)
+118 + j*(146)
+-1 + j*(-98)
+88 + j*(-234)
+-151 + j*(25)
+175 + j*(235)
+36 + j*(-182)
+-108 + j*(69)
+105 + j*(-38)
+-175 + j*(-36)
+-327 + j*(-45)
+80 + j*(268)
+13 + j*(-43)
+-87 + j*(57)
+-70 + j*(-112)
+192 + j*(71)
+-369 + j*(-114)
+224 + j*(341)
+-144 + j*(-145)
+262 + j*(105)
+-91 + j*(-185)
+-6 + j*(116)
+-344 + j*(-245)
+90 + j*(-101)
+147 + j*(-123)
+-76 + j*(-71)
+6 + j*(197)
+-44 + j*(-130)
+21 + j*(-84)
+448 + j*(74)
+175 + j*(-3)
+-175 + j*(-156)
+-18 + j*(-110)
+-95 + j*(-250)
+-107 + j*(172)
+-110 + j*(157)
+132 + j*(6)
+47 + j*(146)
+212 + j*(-167)
+95 + j*(40)
+-239 + j*(-44)
+97 + j*(134)
+-104 + j*(-193)
+-363 + j*(-244)
+86 + j*(-1)
+72 + j*(-13)
+62 + j*(157)
+214 + j*(-103)
+-161 + j*(-3)
+-252 + j*(-139)
+147 + j*(39)
+30 + j*(-73)
+-100 + j*(-203)
+159 + j*(-250)
+-323 + j*(-118)
+-35 + j*(-88)
+-76 + j*(-105)
+-24 + j*(28)
+-194 + j*(-233)
+-272 + j*(23)
+-204 + j*(89)
+-83 + j*(-110)
+-88 + j*(110)
+254 + j*(-103)
+32 + j*(136)
+92 + j*(-226)
+-92 + j*(-203)
+-136 + j*(94)
+-283 + j*(-192)
+161 + j*(272)
+-102 + j*(30)
+71 + j*(-71)
+158 + j*(58)
+-71 + j*(-139)
+220 + j*(-131)
+225 + j*(-135)
+-222 + j*(332)
+-296 + j*(-165)
+-156 + j*(-104)
+-216 + j*(164)
+305 + j*(-68)
+-102 + j*(47)
+-25 + j*(66)
+28 + j*(250)
+120 + j*(-64)
+-120 + j*(-134)
+-42 + j*(114)
+18 + j*(32)
+-83 + j*(157)
+115 + j*(-25)
+-247 + j*(-110)
+-53 + j*(206)
+170 + j*(-30)
+-86 + j*(100)
+384 + j*(119)
+-332 + j*(-5)
+-37 + j*(163)
+74 + j*(285)
+139 + j*(-320)
+-286 + j*(18)
+21 + j*(313)
+125 + j*(50)
+-30 + j*(530)
+153 + j*(24)
+115 + j*(-141)
+-392 + j*(-131)
+194 + j*(-179)
+167 + j*(211)
+161 + j*(133)
+101 + j*(-263)
+-185 + j*(-81)
+-6 + j*(240)
+257 + j*(71)
+-30 + j*(68)
+-143 + j*(29)
+124 + j*(154)
+296 + j*(-67)
+360 + j*(-25)
+187 + j*(-21)
+-70 + j*(409)
+-95 + j*(39)
+53 + j*(161)
+-158 + j*(64)
+-141 + j*(112)
+414 + j*(-13)
+-153 + j*(-59)
+-189 + j*(-54)
+-69 + j*(19)
+1 + j*(-12)
+191 + j*(192)
+-133 + j*(-95)
+-245 + j*(232)
+86 + j*(-66)
+-173 + j*(129)
+63 + j*(131)
+-348 + j*(-260)
+143 + j*(-136)
+-97 + j*(-107)
+135 + j*(58)
+184 + j*(-80)
+-7 + j*(363)
+-285 + j*(-198)
+-103 + j*(290)
+134 + j*(87)
+-22 + j*(-163)
+66 + j*(-226)
+182 + j*(54)
+-204 + j*(-52)
+-194 + j*(161)
+-63 + j*(-117)
+61 + j*(98)
+49 + j*(-33)
+-152 + j*(40)
+177 + j*(-91)
+22 + j*(-106)
+89 + j*(-54)
+37 + j*(-148)
+286 + j*(-67)
+-114 + j*(69)
+13 + j*(127)
+-218 + j*(-8)
+-154 + j*(19)
+73 + j*(138)
+-132 + j*(16)
+185 + j*(117)
+-136 + j*(351)
+-121 + j*(98)
+184 + j*(-65)
+187 + j*(51)
+119 + j*(68)
+-85 + j*(-50)
+145 + j*(-25)
+-8 + j*(61)
+137 + j*(325)
+-124 + j*(-22)
+326 + j*(-175)
+-25 + j*(86)
+279 + j*(-95)
+8 + j*(159)
+-4 + j*(186)
+390 + j*(-138)
+-162 + j*(-42)
+-28 + j*(114)
+153 + j*(44)
+340 + j*(-112)
+-300 + j*(-58)
+-86 + j*(-173)
+267 + j*(-119)
+209 + j*(74)
+-279 + j*(105)
+-37 + j*(-37)
+-59 + j*(80)
+-148 + j*(-163)
+81 + j*(-156)
+-163 + j*(80)
+-73 + j*(378)
+-189 + j*(190)
+-35 + j*(-102)
+-49 + j*(-172)
+-177 + j*(-221)
+-4 + j*(215)
+-297 + j*(1)
+-94 + j*(-299)
+129 + j*(-374)
+-38 + j*(-16)
+-21 + j*(-97)
+-215 + j*(-75)
+147 + j*(111)
+-173 + j*(-72)
+92 + j*(-138)
+110 + j*(132)
+28 + j*(16)
+-143 + j*(-182)
+-109 + j*(325)
+-30 + j*(128)
+-200 + j*(-168)
+-148 + j*(-261)
+132 + j*(-63)
+-30 + j*(-14)
+-238 + j*(-55)
+-67 + j*(26)
+-214 + j*(1)
+-180 + j*(-286)
+-147 + j*(-66)
+205 + j*(41)
+152 + j*(-89)
+35 + j*(148)
+-112 + j*(38)
+156 + j*(-81)
+-177 + j*(104)
+-194 + j*(307)
+-46 + j*(-199)
+-290 + j*(35)
+-170 + j*(28)
+-23 + j*(214)
+-78 + j*(-90)
+-52 + j*(249)
+-140 + j*(-72)
+175 + j*(-34)
+103 + j*(115)
+266 + j*(-186)
+70 + j*(-192)
+-204 + j*(94)
+18 + j*(287)
+-173 + j*(289)
+136 + j*(216)
+-98 + j*(164)
+-37 + j*(185)
+-147 + j*(59)
+-105 + j*(-132)
+51 + j*(139)
+68 + j*(165)
+-330 + j*(-124)
+-30 + j*(-76)
+5 + j*(-193)
+209 + j*(-233)
+63 + j*(117)
+-260 + j*(-180)
+-34 + j*(182)
+40 + j*(-52)
+97 + j*(-188)
+-62 + j*(-71)
+-13 + j*(-250)
+-15 + j*(234)
+243 + j*(-193)
+26 + j*(-392)
+-129 + j*(69)
+-143 + j*(-115)
+-108 + j*(56)
+-52 + j*(282)
+-7 + j*(-90)
+37 + j*(-105)
+-615 + j*(-199)
+-74 + j*(85)
+-322 + j*(-64)
+69 + j*(-165)
+-70 + j*(101)
+29 + j*(92)
+-150 + j*(-327)
+54 + j*(89)
+-398 + j*(186)
+-102 + j*(-121)
+-269 + j*(-71)
+52 + j*(-62)
+170 + j*(-125)
+6 + j*(-69)
+-76 + j*(-327)
+35 + j*(139)
+-3 + j*(-87)
+-322 + j*(167)
+4 + j*(-26)
+184 + j*(160)
+-178 + j*(-75)
+109 + j*(62)
+50 + j*(54)
+-64 + j*(-115)
+-371 + j*(-247)
+-124 + j*(-45)
+-211 + j*(-123)
+153 + j*(86)
+-222 + j*(-161)
+-163 + j*(-173)
+-17 + j*(263)
+171 + j*(27)
+287 + j*(105)
+31 + j*(-233)
+-8 + j*(-81)
+37 + j*(120)
+-8 + j*(21)
+3 + j*(-138)
+95 + j*(202)
+511 + j*(81)
+-117 + j*(-196)
+35 + j*(28)
+-136 + j*(-301)
+182 + j*(-140)
+-60 + j*(-66)
+-206 + j*(-111)
+231 + j*(27)
+48 + j*(49)
+206 + j*(315)
+86 + j*(93)
+131 + j*(-232)
+-161 + j*(6)
+22 + j*(306)
+-307 + j*(-81)
+-170 + j*(87)
+173 + j*(1)
+-286 + j*(-155)
+-278 + j*(-192)
+10 + j*(-42)
+-153 + j*(202)
+377 + j*(35)
+8 + j*(-47)
+-54 + j*(-46)
+138 + j*(-201)
+26 + j*(-49)
+235 + j*(-73)
+-143 + j*(-291)
+-103 + j*(-30)
+18 + j*(-281)
+311 + j*(122)
+9 + j*(-27)
+-240 + j*(50)
+-110 + j*(209)
+187 + j*(-209)
+68 + j*(247)
+498 + j*(-59)
+161 + j*(-189)
+-132 + j*(72)
+-127 + j*(18)
+-193 + j*(-185)
+-127 + j*(-276)
+-104 + j*(235)
+-26 + j*(165)
+148 + j*(-181)
+87 + j*(-107)
+-177 + j*(136)
+173 + j*(2)
+-298 + j*(-63)
+218 + j*(29)
+-330 + j*(-167)
+110 + j*(127)
+-18 + j*(-42)
+-85 + j*(153)
+-92 + j*(-119)
+23 + j*(115)
+149 + j*(-76)
+-132 + j*(85)
+-163 + j*(-52)
+-139 + j*(303)
+151 + j*(113)
+264 + j*(74)
+48 + j*(115)
+-38 + j*(-9)
+-232 + j*(262)
+412 + j*(123)
+28 + j*(108)
+-53 + j*(-95)
+-79 + j*(184)
+-252 + j*(192)
+170 + j*(39)
+220 + j*(249)
+-5 + j*(-8)
+125 + j*(27)
+147 + j*(-80)
+25 + j*(-272)
+52 + j*(47)
+248 + j*(-56)
+-84 + j*(-51)
+-93 + j*(-395)
+-179 + j*(221)
+-110 + j*(108)
+13 + j*(26)
+332 + j*(336)
+31 + j*(-141)
+-2 + j*(76)
+334 + j*(-79)
+28 + j*(86)
+307 + j*(-129)
+-251 + j*(197)
+-21 + j*(-36)
+-117 + j*(71)
+-279 + j*(42)
+220 + j*(216)
+135 + j*(-161)
+345 + j*(-245)
+40 + j*(-155)
+-61 + j*(159)
+105 + j*(52)
+278 + j*(-63)
+-40 + j*(35)
+-47 + j*(326)
+-171 + j*(-151)
+83 + j*(177)
+-250 + j*(-70)
+20 + j*(-68)
+87 + j*(-123)
+-325 + j*(-98)
+-3 + j*(81)
+-21 + j*(165)
+97 + j*(295)
+554 + j*(168)
+-192 + j*(-154)
+14 + j*(-11)
+-201 + j*(67)
+-163 + j*(153)
+-23 + j*(-153)
+-44 + j*(-7)
+-18 + j*(63)
+-110 + j*(-35)
+471 + j*(-202)
+267 + j*(-194)
+-140 + j*(-358)
+-204 + j*(-94)
+-25 + j*(-147)
+59 + j*(199)
+58 + j*(-13)
+-36 + j*(-114)
+115 + j*(-163)
+190 + j*(226)
+-142 + j*(-144)
+51 + j*(-93)
+68 + j*(-77)
+1 + j*(-323)
+95 + j*(-72)
+-112 + j*(3)
+202 + j*(284)
+-261 + j*(18)
+-358 + j*(122)
+-129 + j*(-37)
+80 + j*(-91)
+59 + j*(132)
+274 + j*(-385)
+54 + j*(-131)
+-49 + j*(-127)
+-94 + j*(-332)
+276 + j*(-44)
+332 + j*(139)
+13 + j*(-103)
+-63 + j*(137)
+115 + j*(-137)
+-117 + j*(233)
+10 + j*(-170)
+-358 + j*(-182)
+-37 + j*(15)
+68 + j*(9)
+342 + j*(-268)
+-127 + j*(-199)
+141 + j*(-452)
+-265 + j*(1)
+-180 + j*(236)
+-18 + j*(4)
+35 + j*(228)
+-30 + j*(8)
+182 + j*(-211)
+-233 + j*(0)
+-79 + j*(-53)
+-159 + j*(100)
+-29 + j*(-131)
+-22 + j*(27)
+-136 + j*(165)
+44 + j*(146)
+-162 + j*(21)
+60 + j*(-158)
+-127 + j*(-2)
+-11 + j*(191)
+-139 + j*(9)
+315 + j*(115)
+175 + j*(-193)
+-45 + j*(250)
+36 + j*(2)
+141 + j*(-198)
+-307 + j*(2)
+144 + j*(-59)
+122 + j*(-27)
+-211 + j*(-483)
+185 + j*(58)
+39 + j*(127)
+-238 + j*(-109)
+106 + j*(345)
+76 + j*(33)
+239 + j*(207)
+-109 + j*(-249)
+-146 + j*(45)
+-38 + j*(-150)
+78 + j*(-186)
+8 + j*(71)
+-207 + j*(-255)
+85 + j*(16)
+-23 + j*(-153)
+82 + j*(-11)
+-10 + j*(116)
+162 + j*(-201)
+66 + j*(-116)
+277 + j*(163)
+102 + j*(-358)
+54 + j*(10)
+37 + j*(-112)
+127 + j*(-64)
+-74 + j*(-93)
+-54 + j*(214)
+149 + j*(-37)
+-269 + j*(-66)
+-13 + j*(-220)
+-120 + j*(76)
+97 + j*(75)
+238 + j*(-78)
+263 + j*(-293)
+-57 + j*(-131)
+127 + j*(-202)
+235 + j*(-105)
+226 + j*(-18)
+-107 + j*(-286)
+194 + j*(-118)
+104 + j*(-121)
+21 + j*(117)
+380 + j*(92)
+22 + j*(-190)
+79 + j*(37)
+175 + j*(180)
+42 + j*(-70)
+40 + j*(-174)
+-36 + j*(-141)
+-165 + j*(92)
+9 + j*(-335)
+328 + j*(-194)
+-198 + j*(-147)
+342 + j*(-129)
+71 + j*(-201)
+176 + j*(-66)
+16 + j*(-255)
+179 + j*(-119)
+89 + j*(133)
+144 + j*(-78)
+106 + j*(235)
+175 + j*(-324)
+-68 + j*(315)
+-265 + j*(-374)
+-28 + j*(14)
+-213 + j*(106)
+106 + j*(-163)
+49 + j*(-71)
+-151 + j*(6)
+-421 + j*(119)
+-244 + j*(23)
+81 + j*(-57)
+-259 + j*(-230)
+177 + j*(101)
+-48 + j*(-308)
+147 + j*(57)
+152 + j*(47)
+-194 + j*(-25)
+-116 + j*(356)
+-68 + j*(149)
+7 + j*(-132)
+-126 + j*(-159)
+-177 + j*(272)
+226 + j*(-257)
+-158 + j*(51)
+-73 + j*(214)
+47 + j*(-237)
+161 + j*(250)
+83 + j*(105)
+103 + j*(35)
+99 + j*(81)
+-6 + j*(0)
+-122 + j*(39)
+-116 + j*(-209)
+-172 + j*(-250)
+179 + j*(-8)
+-174 + j*(134)
+-71 + j*(-194)
+105 + j*(257)
+-124 + j*(100)
+33 + j*(-117)
+-73 + j*(53)
+144 + j*(-12)
+-185 + j*(-141)
+136 + j*(110)
+45 + j*(117)
+-7 + j*(-195)
+-86 + j*(172)
+-23 + j*(-103)
+-263 + j*(-26)
+-37 + j*(124)
+166 + j*(392)
+-373 + j*(111)
+-34 + j*(-202)
+63 + j*(299)
+474 + j*(273)
+-264 + j*(-284)
+-119 + j*(33)
+227 + j*(-117)
+-98 + j*(135)
+-47 + j*(-141)
+-158 + j*(-36)
+160 + j*(38)
+-29 + j*(66)
+144 + j*(-272)
+-171 + j*(-107)
+357 + j*(-86)
+-231 + j*(-86)
+-75 + j*(-76)
+216 + j*(156)
+-13 + j*(-187)
+-88 + j*(37)
+119 + j*(270)
+31 + j*(-77)
+-140 + j*(37)
+21 + j*(-17)
+211 + j*(-33)
+-287 + j*(101)
+-112 + j*(142)
+-3 + j*(-140)
+-91 + j*(-151)
+150 + j*(-243)
+-64 + j*(96)
+-262 + j*(163)
+196 + j*(-39)
+-126 + j*(-71)
+-161 + j*(102)
+-125 + j*(35)
+292 + j*(98)
+-6 + j*(192)
+107 + j*(-71)
+83 + j*(-193)
+272 + j*(-25)
+235 + j*(67)
+-87 + j*(-159)
+-54 + j*(-118)
+-279 + j*(-4)
+29 + j*(-20)
+132 + j*(314)
+-73 + j*(-148)
+-470 + j*(86)
+262 + j*(-260)
+-76 + j*(-42)
+256 + j*(64)
+-18 + j*(-144)
+40 + j*(-151)
+75 + j*(-166)
+-196 + j*(21)
+-45 + j*(184)
+121 + j*(18)
+-89 + j*(-148)
+-170 + j*(-18)
+338 + j*(-150)
+-276 + j*(221)
+-177 + j*(236)
+139 + j*(-134)
+139 + j*(213)
+33 + j*(233)
+-53 + j*(16)
+-219 + j*(-206)
+301 + j*(-21)
+83 + j*(-59)
+47 + j*(-66)
+325 + j*(-275)
+53 + j*(10)
+-25 + j*(106)
+85 + j*(-86)
+-150 + j*(-16)
+-172 + j*(-122)
+317 + j*(-115)
+66 + j*(-1)
+-176 + j*(4)
+-47 + j*(-43)
+-122 + j*(-28)
+79 + j*(519)
+-87 + j*(190)
+81 + j*(-124)
+149 + j*(-67)
+-68 + j*(-148)
+-154 + j*(-199)
+-127 + j*(94)
+-21 + j*(-108)
+-185 + j*(155)
+-327 + j*(223)
+127 + j*(27)
+140 + j*(118)
+260 + j*(-68)
+-228 + j*(200)
+-431 + j*(-226)
+97 + j*(153)
+68 + j*(25)
+-226 + j*(245)
+-83 + j*(133)
+23 + j*(45)
+70 + j*(52)
+-4 + j*(-66)
+-137 + j*(71)
+-110 + j*(78)
+95 + j*(-11)
+93 + j*(-266)
+-163 + j*(103)
+-246 + j*(-91)
+-9 + j*(-296)
+177 + j*(-14)
+-151 + j*(-157)
+60 + j*(73)
+54 + j*(308)
+165 + j*(-85)
+106 + j*(-66)
+-205 + j*(-183)
+45 + j*(107)
+71 + j*(-59)
+249 + j*(27)
+10 + j*(168)
+-153 + j*(-134)
+-40 + j*(208)
+-214 + j*(156)
+77 + j*(220)
+115 + j*(103)
+52 + j*(-8)
+-93 + j*(133)
+-163 + j*(78)
+283 + j*(22)
+-500 + j*(-91)
+-42 + j*(-286)
+25 + j*(143)
+-62 + j*(350)
+303 + j*(157)
+-164 + j*(-109)
+36 + j*(-296)
+166 + j*(19)
+298 + j*(161)
+99 + j*(-253)
+37 + j*(-6)
+-117 + j*(245)
+191 + j*(-123)
+153 + j*(-14)
+107 + j*(77)
+-71 + j*(-195)
+266 + j*(-438)
+163 + j*(3)
+-202 + j*(-173)
+-95 + j*(62)
+11 + j*(337)
+33 + j*(-120)
+206 + j*(-425)
+-189 + j*(-49)
+183 + j*(118)
+-66 + j*(144)
+-214 + j*(-160)
+88 + j*(-28)
+-49 + j*(102)
+-262 + j*(-225)
+-136 + j*(-174)
+-87 + j*(265)
+-43 + j*(-2)
+68 + j*(36)
+47 + j*(-197)
+-139 + j*(194)
+14 + j*(332)
+89 + j*(-95)
+-348 + j*(-112)
+122 + j*(-240)
+221 + j*(132)
+170 + j*(-24)
+310 + j*(-73)
+-103 + j*(-392)
+61 + j*(-144)
+112 + j*(-128)
+73 + j*(52)
+48 + j*(435)
+224 + j*(169)
+116 + j*(-322)
+91 + j*(-1)
+-40 + j*(243)
+72 + j*(-96)
+159 + j*(-83)
+69 + j*(30)
+-173 + j*(316)
+322 + j*(-42)
+99 + j*(208)
+76 + j*(-222)
+-35 + j*(-66)
+4 + j*(-345)
+-223 + j*(-115)
+-37 + j*(212)
+-119 + j*(6)
+-23 + j*(-83)
+-25 + j*(-12)
+-78 + j*(-47)
+166 + j*(69)
+116 + j*(72)
+-60 + j*(105)
+165 + j*(53)
+83 + j*(-57)
+-48 + j*(337)
+35 + j*(-71)
+-260 + j*(124)
+-185 + j*(49)
+-117 + j*(-358)
+138 + j*(-20)
+-103 + j*(-228)
+-87 + j*(105)
+-141 + j*(-50)
+160 + j*(124)
+-448 + j*(42)
+-87 + j*(36)
+-227 + j*(-343)
+-188 + j*(-226)
+-101 + j*(-183)
+-8 + j*(-93)
+-264 + j*(-92)
+233 + j*(57)
+5 + j*(6)
+-47 + j*(122)
+46 + j*(11)
+-13 + j*(-95)
+-35 + j*(60)
+203 + j*(-5)
+-267 + j*(25)
+112 + j*(-79)
+329 + j*(-30)
+111 + j*(-98)
+-238 + j*(286)
+-76 + j*(-166)
+103 + j*(-232)
+-41 + j*(-90)
+28 + j*(182)
+190 + j*(-57)
+203 + j*(-90)
+-51 + j*(-117)
+74 + j*(120)
+-161 + j*(-360)
+72 + j*(-57)
+296 + j*(-36)
+146 + j*(-111)
+149 + j*(-75)
+-59 + j*(-81)
+104 + j*(-30)
+198 + j*(124)
+-120 + j*(-214)
+-98 + j*(63)
+-127 + j*(-165)
+284 + j*(-8)
+-92 + j*(-310)
+-368 + j*(105)
+-314 + j*(-363)
+184 + j*(265)
+-100 + j*(-36)
+-134 + j*(-56)
+-158 + j*(121)
+72 + j*(-204)
+130 + j*(44)
+-209 + j*(-211)
+62 + j*(-212)
+177 + j*(100)
+78 + j*(-333)
+-42 + j*(-40)
+-37 + j*(125)
+57 + j*(21)
+182 + j*(-21)
+3 + j*(-171)
+243 + j*(-354)
+344 + j*(57)
+-157 + j*(-167)
+121 + j*(59)
+151 + j*(145)
+-162 + j*(-107)
+181 + j*(-11)
+-32 + j*(383)
+86 + j*(7)
+-135 + j*(-260)
+-79 + j*(-11)
+-136 + j*(-334)
+66 + j*(219)
+300 + j*(1)
+-116 + j*(-202)
+186 + j*(-223)
+228 + j*(400)
+-150 + j*(-101)
+161 + j*(-204)
+-10 + j*(53)
+-236 + j*(172)
+143 + j*(-182)
+10 + j*(272)
+55 + j*(184)
+32 + j*(-390)
+-69 + j*(317)
+-37 + j*(11)
+-74 + j*(30)
+140 + j*(-83)
+53 + j*(-136)
+200 + j*(-285)
+-189 + j*(-378)
+-101 + j*(-253)
+-25 + j*(78)
+17 + j*(-104)
+-180 + j*(196)
+-148 + j*(-309)
+-317 + j*(119)
+141 + j*(79)
+-41 + j*(-72)
+-162 + j*(-63)
+-65 + j*(-35)
+-110 + j*(49)
+110 + j*(-48)
+19 + j*(92)
+-148 + j*(14)
+-102 + j*(280)
+139 + j*(43)
+-36 + j*(-207)
+40 + j*(-76)
+172 + j*(-279)
+-35 + j*(224)
+414 + j*(-378)
+157 + j*(-112)
+529 + j*(-307)
+-1 + j*(-74)
+-11 + j*(330)
+236 + j*(-36)
+-158 + j*(-353)
+-215 + j*(-29)
+185 + j*(174)
+-8 + j*(-27)
+306 + j*(170)
+-214 + j*(-102)
+-73 + j*(37)
+199 + j*(-156)
+230 + j*(-113)
+-2 + j*(-106)
+-80 + j*(204)
+40 + j*(-276)
+196 + j*(-459)
+-330 + j*(-98)
+-267 + j*(83)
+-15 + j*(-58)
+-163 + j*(403)
+-126 + j*(-262)
+-215 + j*(178)
+89 + j*(121)
+-132 + j*(130)
+154 + j*(210)
+-159 + j*(337)
+-264 + j*(161)
+25 + j*(201)
+-21 + j*(102)
+-132 + j*(101)
+6 + j*(98)
+-19 + j*(-328)
+62 + j*(-122)
+-151 + j*(-103)
+-72 + j*(316)
+150 + j*(-520)
+438 + j*(378)
+144 + j*(462)
+161 + j*(15)
+42 + j*(-182)
+-123 + j*(479)
+-248 + j*(145)
+-416 + j*(305)
+34 + j*(-459)
+334 + j*(133)
+391 + j*(-385)
+-167 + j*(324)
+-98 + j*(104)
+444 + j*(-168)
+151 + j*(-241)
+-143 + j*(56)
+-148 + j*(281)
+-276 + j*(269)
+260 + j*(-255)
+173 + j*(-64)
+534 + j*(206)
+-692 + j*(597)
+173 + j*(-259)
+235 + j*(346)
+-59 + j*(-310)
+124 + j*(334)
+-416 + j*(-148)
+438 + j*(66)
+-269 + j*(421)
+-455 + j*(235)
+355 + j*(-293)
+-326 + j*(-148)
+-332 + j*(-433)
+-89 + j*(75)
+468 + j*(-103)
+376 + j*(-51)
+-180 + j*(12)
+91 + j*(-346)
+-95 + j*(447)
+-214 + j*(281)
+107 + j*(256)
+179 + j*(-77)
+-397 + j*(-168)
+-208 + j*(528)
+-342 + j*(282)
+212 + j*(-330)
+-327 + j*(119)
+339 + j*(-146)
+112 + j*(346)
+361 + j*(142)
+-556 + j*(260)
+-226 + j*(-152)
+-368 + j*(-221)
+-532 + j*(-147)
+-494 + j*(-18)
+614 + j*(-132)
+274 + j*(-102)
+-269 + j*(-486)
+-263 + j*(134)
+-486 + j*(426)
+-143 + j*(-286)
+-215 + j*(-343)
+-383 + j*(-17)
+-139 + j*(245)
+346 + j*(157)
+2 + j*(60)
+264 + j*(64)
+304 + j*(-49)
+298 + j*(-491)
+-375 + j*(-129)
+170 + j*(109)
+-226 + j*(-220)
+450 + j*(117)
+-173 + j*(221)
+-119 + j*(484)
+-325 + j*(-109)
+-301 + j*(-263)
+-227 + j*(-337)
+-144 + j*(-313)
+-93 + j*(-265)
+-14 + j*(-269)
+-456 + j*(25)
+-330 + j*(127)
+-286 + j*(351)
+482 + j*(-336)
+-387 + j*(436)
+-182 + j*(260)
+-327 + j*(-333)
+-502 + j*(-140)
+-131 + j*(-227)
+-261 + j*(-309)
+183 + j*(195)
+-160 + j*(-465)
+-325 + j*(-431)
+212 + j*(-549)
+19 + j*(-120)
+73 + j*(-1)
+-316 + j*(347)
+192 + j*(265)
+-192 + j*(-124)
+260 + j*(417)
+431 + j*(-404)
+192 + j*(-508)
+-54 + j*(-424)
+370 + j*(18)
+-393 + j*(-101)
+434 + j*(-268)
+50 + j*(-37)
+504 + j*(-91)
+462 + j*(337)
+-223 + j*(-328)
+298 + j*(-308)
+140 + j*(-303)
+-208 + j*(-406)
+378 + j*(-223)
+-325 + j*(105)
+-467 + j*(-122)
+297 + j*(279)
+-589 + j*(-381)
+252 + j*(185)
+161 + j*(-177)
+348 + j*(605)
+-329 + j*(116)
+122 + j*(-226)
+-303 + j*(-57)
+357 + j*(-264)
+-152 + j*(-261)
+-234 + j*(-112)
+-66 + j*(37)
+239 + j*(446)
+-20 + j*(170)
+-202 + j*(72)
+-132 + j*(-164)
+-121 + j*(-69)
+-368 + j*(-541)
+-16 + j*(356)
+-226 + j*(-168)
+-274 + j*(-315)
+606 + j*(-180)
+-187 + j*(-28)
+-444 + j*(333)
+-466 + j*(-235)
+-121 + j*(-71)
+-236 + j*(-49)
+506 + j*(-332)
+218 + j*(248)
+-22 + j*(-289)
+308 + j*(-8)
+-85 + j*(414)
+-154 + j*(360)
+46 + j*(-332)
+199 + j*(10)
+-243 + j*(485)
+-368 + j*(-624)
+-367 + j*(170)
+-339 + j*(274)
+895 + j*(286)
+148 + j*(-251)
+167 + j*(156)
+195 + j*(205)
+27 + j*(-98)
+86 + j*(-226)
+-197 + j*(-206)
+417 + j*(-226)
+308 + j*(503)
+401 + j*(-250)
+-139 + j*(158)
+108 + j*(190)
+462 + j*(257)
+14 + j*(-387)
+360 + j*(155)
+-435 + j*(-99)
+361 + j*(416)
+258 + j*(-62)
+25 + j*(-333)
+66 + j*(352)
+546 + j*(-286)
+-180 + j*(-458)
+280 + j*(-151)
+72 + j*(-216)
+-368 + j*(403)
+464 + j*(527)
+-344 + j*(-60)
+-129 + j*(516)
+-279 + j*(348)
+-249 + j*(257)
+95 + j*(226)
+180 + j*(170)
+-97 + j*(-238)
+-234 + j*(-164)
+148 + j*(-344)
+-190 + j*(-359)
+152 + j*(537)
+187 + j*(-93)
+-264 + j*(311)
+100 + j*(115)
+329 + j*(-129)
+-264 + j*(495)
+281 + j*(296)
+-216 + j*(-100)
+255 + j*(635)
+-410 + j*(324)
+368 + j*(349)
+-515 + j*(-427)
+-296 + j*(-91)
+-89 + j*(-357)
+23 + j*(-220)
+-39 + j*(-482)
+366 + j*(613)
+359 + j*(44)
+270 + j*(-241)
+146 + j*(-653)
+-220 + j*(441)
+269 + j*(125)
+-350 + j*(321)
+284 + j*(12)
+-209 + j*(-60)
+305 + j*(144)
+-368 + j*(272)
+468 + j*(-231)
+176 + j*(12)
+-149 + j*(-216)
+424 + j*(-84)
+-462 + j*(-520)
+349 + j*(-377)
+-361 + j*(166)
+165 + j*(238)
+-78 + j*(201)
+-188 + j*(330)
+-70 + j*(-25)
+-220 + j*(330)
+-206 + j*(308)
+378 + j*(-181)
+-203 + j*(-356)
+501 + j*(-574)
+63 + j*(134)
+-493 + j*(-103)
+-26 + j*(-341)
+-390 + j*(158)
+69 + j*(249)
+279 + j*(358)
+441 + j*(-253)
+-142 + j*(142)
+-346 + j*(-387)
+332 + j*(-606)
+187 + j*(240)
+431 + j*(-35)
+308 + j*(-181)
+240 + j*(-338)
+240 + j*(-168)
+-429 + j*(-134)
+161 + j*(-89)
+-460 + j*(-346)
+-382 + j*(247)
+-521 + j*(-66)
+99 + j*(318)
+-193 + j*(-20)
+148 + j*(551)
+366 + j*(200)
+560 + j*(-170)
+281 + j*(280)
+-462 + j*(-173)
+-424 + j*(66)
+190 + j*(354)
+-135 + j*(-346)
+-283 + j*(-282)
+306 + j*(-280)
+308 + j*(341)
+57 + j*(-380)
+-439 + j*(-147)
+46 + j*(-188)
+-189 + j*(136)
+-167 + j*(281)
+-73 + j*(-352)
+286 + j*(165)
+-353 + j*(152)
+255 + j*(-443)
+458 + j*(300)
+126 + j*(-267)
+-147 + j*(430)
+756 + j*(232)
+-462 + j*(-200)
+-246 + j*(368)
+392 + j*(501)
+593 + j*(-118)
+-341 + j*(274)
+240 + j*(221)
+-474 + j*(-129)
+277 + j*(418)
+-134 + j*(231)
+-302 + j*(115)
+101 + j*(337)
+-122 + j*(-20)
+503 + j*(-217)
+473 + j*(-235)
+-338 + j*(-158)
+-43 + j*(472)
+-428 + j*(-216)
+-344 + j*(75)
+-728 + j*(233)
+-86 + j*(6)
+337 + j*(-549)
+-318 + j*(4)
+-322 + j*(177)
+141 + j*(-152)
+445 + j*(85)
+260 + j*(178)
+54 + j*(128)
+-45 + j*(103)
+-320 + j*(307)
+-640 + j*(-346)
+-98 + j*(445)
+-356 + j*(-291)
+173 + j*(229)
+-5 + j*(130)
+142 + j*(248)
+-248 + j*(412)
+-18 + j*(494)
+238 + j*(195)
+-159 + j*(-196)
+338 + j*(211)
+767 + j*(-549)
+516 + j*(185)
+252 + j*(87)
+-416 + j*(387)
+371 + j*(-352)
+-396 + j*(34)
+455 + j*(34)
+298 + j*(-147)
+-377 + j*(119)
+214 + j*(-19)
+-242 + j*(-141)
+115 + j*(305)
+542 + j*(292)
+58 + j*(-453)
+199 + j*(-347)
+-431 + j*(-128)
+260 + j*(-252)
+-175 + j*(491)
+535 + j*(-119)
+330 + j*(69)
+-240 + j*(-301)
+499 + j*(525)
+-400 + j*(-455)
+549 + j*(636)
+247 + j*(-328)
+-293 + j*(-170)
+-178 + j*(270)
+-119 + j*(250)
+183 + j*(57)
+252 + j*(97)
+-539 + j*(-34)
+-353 + j*(-15)
+-105 + j*(-148)
+-272 + j*(-336)
+-338 + j*(-402)
+-396 + j*(57)
+292 + j*(41)
+-204 + j*(-299)
+281 + j*(333)
+77 + j*(323)
+-190 + j*(-385)
+426 + j*(-128)
+263 + j*(282)
+16 + j*(18)
+327 + j*(-40)
+-411 + j*(-99)
+387 + j*(91)
+-238 + j*(166)
+-72 + j*(11)
+-508 + j*(233)
+244 + j*(-490)
+-442 + j*(216)
+178 + j*(-419)
+313 + j*(187)
+266 + j*(-521)
+390 + j*(-337)
+448 + j*(-103)
+425 + j*(-349)
+-151 + j*(310)
+283 + j*(-153)
+320 + j*(-281)
+56 + j*(99)
+-202 + j*(-406)
+-141 + j*(-409)
+121 + j*(317)
+380 + j*(371)
+-177 + j*(-47)
+361 + j*(-379)
+-448 + j*(-28)
+296 + j*(-269)
+508 + j*(-238)
+659 + j*(-47)
+-298 + j*(-180)
+104 + j*(174)
+49 + j*(-67)
+233 + j*(-449)
+339 + j*(156)
+258 + j*(-158)
+-181 + j*(426)
+278 + j*(-175)
+-68 + j*(-334)
+327 + j*(-599)
+118 + j*(-216)
+45 + j*(-304)
+-158 + j*(216)
+-257 + j*(204)
+396 + j*(-415)
+338 + j*(229)
+-194 + j*(256)
+-583 + j*(306)
+103 + j*(-457)
+185 + j*(-439)
+478 + j*(66)
+-255 + j*(464)
+-145 + j*(346)
+-660 + j*(-47)
+-511 + j*(-410)
+-288 + j*(453)
+-258 + j*(250)
+-115 + j*(-121)
+134 + j*(344)
+349 + j*(-287)
+-503 + j*(205)
+-383 + j*(-410)
+-470 + j*(240)
+325 + j*(-687)
+221 + j*(-151)
+426 + j*(418)
+134 + j*(206)
+88 + j*(-121)
+-111 + j*(362)
+-305 + j*(-182)
+93 + j*(-185)
+-174 + j*(406)
+-417 + j*(240)
+104 + j*(-155)
+146 + j*(375)
+618 + j*(146)
+134 + j*(196)
+-393 + j*(343)
+-454 + j*(-76)
+260 + j*(-24)
+132 + j*(-68)
+242 + j*(426)
+106 + j*(-454)
+-266 + j*(-200)
+337 + j*(576)
+180 + j*(95)
+-257 + j*(116)
+459 + j*(417)
+-129 + j*(-160)
+142 + j*(-197)
+219 + j*(504)
+154 + j*(170)
+132 + j*(185)
+316 + j*(264)
+-440 + j*(200)
+97 + j*(-3)
+-9 + j*(-173)
+249 + j*(-28)
+612 + j*(-663)
+-484 + j*(-26)
+419 + j*(425)
+-228 + j*(330)
+4 + j*(-297)
+445 + j*(201)
+519 + j*(37)
+333 + j*(158)
+362 + j*(45)
+333 + j*(-542)
+187 + j*(-188)
+-148 + j*(-273)
+-329 + j*(241)
+-148 + j*(-251)
+423 + j*(-16)
+90 + j*(-232)
+-293 + j*(551)
+-190 + j*(165)
+-256 + j*(-518)
+143 + j*(-260)
+463 + j*(-392)
+-295 + j*(-20)
+14 + j*(-130)
+2 + j*(293)
+-354 + j*(-299)
+409 + j*(298)
+185 + j*(238)
+383 + j*(220)
+316 + j*(-39)
+177 + j*(-8)
+-269 + j*(-223)
+-332 + j*(132)
+-312 + j*(137)
+-254 + j*(-224)
+-279 + j*(-206)
+103 + j*(276)
+-81 + j*(235)
+106 + j*(-356)
+-250 + j*(170)
+146 + j*(-256)
+375 + j*(206)
+35 + j*(285)
+179 + j*(-480)
+-4 + j*(262)
+286 + j*(339)
+349 + j*(3)
+262 + j*(-317)
+-188 + j*(314)
+258 + j*(280)
+-60 + j*(-63)
+-358 + j*(-431)
+355 + j*(-313)
+602 + j*(-572)
+-97 + j*(29)
+-361 + j*(112)
+426 + j*(-446)
+-334 + j*(-248)
+-468 + j*(-301)
+-134 + j*(-296)
+344 + j*(-398)
+-33 + j*(361)
+339 + j*(-470)
+238 + j*(311)
+455 + j*(372)
+-419 + j*(47)
+-267 + j*(-6)
+313 + j*(-315)
+-314 + j*(148)
+-167 + j*(-559)
+371 + j*(-467)
+-377 + j*(337)
+535 + j*(-262)
+170 + j*(-213)
+-719 + j*(-409)
+-59 + j*(155)
+-137 + j*(240)
+-403 + j*(-211)
+-310 + j*(-119)
+405 + j*(-72)
+-488 + j*(136)
+-270 + j*(-495)
+375 + j*(-124)
+294 + j*(-73)
+494 + j*(406)
+423 + j*(311)
+-401 + j*(-383)
+378 + j*(293)
+-290 + j*(-348)
+111 + j*(-182)
+414 + j*(523)
+-121 + j*(746)
+129 + j*(-466)
+409 + j*(-359)
+342 + j*(63)
+-325 + j*(174)
+-292 + j*(103)
+221 + j*(407)
+298 + j*(240)
+-343 + j*(363)
+192 + j*(-296)
+-291 + j*(180)
+-76 + j*(-33)
+-58 + j*(-362)
+-260 + j*(-202)
+-301 + j*(-129)
+86 + j*(400)
+-240 + j*(337)
+77 + j*(-55)
+279 + j*(831)
+20 + j*(-13)
+305 + j*(-124)
+551 + j*(99)
+439 + j*(438)
+-194 + j*(490)
+592 + j*(216)
+-382 + j*(228)
+-316 + j*(76)
+98 + j*(30)
+216 + j*(-286)
+268 + j*(18)
+-13 + j*(233)
+-497 + j*(-483)
+25 + j*(-332)
+168 + j*(227)
+301 + j*(143)
+73 + j*(-48)
+-3 + j*(-291)
+588 + j*(16)
+192 + j*(-489)
+243 + j*(76)
+254 + j*(539)
+-380 + j*(229)
+489 + j*(15)
+241 + j*(131)
+158 + j*(-295)
+306 + j*(195)
+-283 + j*(428)
+412 + j*(-48)
+384 + j*(-260)
+-188 + j*(38)
+-104 + j*(-159)
+64 + j*(142)
+-39 + j*(92)
+-73 + j*(243)
+114 + j*(-292)
+-19 + j*(36)
+-160 + j*(345)
+123 + j*(-62)
+-45 + j*(297)
+299 + j*(33)
+117 + j*(-93)
+-214 + j*(44)
+-345 + j*(-15)
+-11 + j*(-78)
+204 + j*(16)
+132 + j*(-22)
+-45 + j*(59)
+-220 + j*(-21)
+145 + j*(-76)
+-124 + j*(120)
+156 + j*(-31)
+21 + j*(-187)
+-81 + j*(160)
+-43 + j*(-79)
+114 + j*(7)
+247 + j*(-122)
+90 + j*(96)
+-132 + j*(27)
+228 + j*(11)
+-179 + j*(40)
+78 + j*(89)
+-513 + j*(3)
+-152 + j*(246)
+-60 + j*(211)
+-108 + j*(-76)
+-30 + j*(-112)
+-68 + j*(-276)
+18 + j*(42)
+-13 + j*(-322)
+-76 + j*(-78)
+156 + j*(48)
+-25 + j*(121)
+106 + j*(-127)
+-110 + j*(257)
+263 + j*(132)
+-168 + j*(303)
+18 + j*(271)
+6 + j*(-148)
+133 + j*(-263)
+-25 + j*(130)
+71 + j*(329)
+406 + j*(-14)
+-28 + j*(-89)
+-214 + j*(40)
+-121 + j*(194)
+-138 + j*(-7)
+107 + j*(97)
+213 + j*(-98)
+114 + j*(73)
+-233 + j*(3)
+-34 + j*(290)
+18 + j*(-125)
+-28 + j*(263)
+-121 + j*(12)
+53 + j*(-48)
+95 + j*(-21)
+-461 + j*(13)
+213 + j*(110)
+223 + j*(98)
+-137 + j*(-126)
+-167 + j*(30)
+-60 + j*(-438)
+86 + j*(-72)
+94 + j*(-175)
+-103 + j*(111)
+93 + j*(57)
+-177 + j*(-207)
+-134 + j*(130)
+194 + j*(159)
+25 + j*(36)
+25 + j*(-231)
+134 + j*(7)
+117 + j*(-178)
+-200 + j*(214)
+11 + j*(51)
+-337 + j*(-10)
+259 + j*(-6)
+-61 + j*(129)
+-28 + j*(39)
+-150 + j*(-81)
+67 + j*(1)
+-139 + j*(144)
+-64 + j*(-216)
+107 + j*(-387)
+-105 + j*(93)
+342 + j*(-31)
+-133 + j*(26)
+18 + j*(-242)
+-230 + j*(-160)
+-255 + j*(-103)
+288 + j*(70)
+45 + j*(18)
+91 + j*(-15)
+95 + j*(69)
+6 + j*(193)
+-107 + j*(-19)
+264 + j*(-83)
+42 + j*(-170)
+-48 + j*(-8)
+242 + j*(4)
+320 + j*(47)
+-75 + j*(-93)
+-161 + j*(45)
+-58 + j*(-127)
+112 + j*(66)
+193 + j*(224)
+-577 + j*(-352)
+-33 + j*(142)
+117 + j*(72)
+1 + j*(-115)
+-107 + j*(167)
+-45 + j*(187)
+29 + j*(-117)
+108 + j*(-128)
+103 + j*(226)
+-436 + j*(-210)
+-245 + j*(54)
+37 + j*(-62)
+1 + j*(-59)
+-233 + j*(82)
+-101 + j*(299)
+74 + j*(46)
+59 + j*(-214)
+-245 + j*(-179)
+153 + j*(-385)
+-86 + j*(215)
+-105 + j*(-47)
+-48 + j*(-337)
+51 + j*(153)
+118 + j*(159)
+-117 + j*(-160)
+131 + j*(19)
+245 + j*(74)
+-171 + j*(86)
+-31 + j*(-61)
+-144 + j*(179)
+35 + j*(-370)
+170 + j*(-76)
+280 + j*(-52)
+-89 + j*(-163)
+78 + j*(47)
+-345 + j*(-32)
+-236 + j*(-15)
+204 + j*(-49)
+-517 + j*(-52)
+-93 + j*(-81)
+264 + j*(18)
+-144 + j*(-25)
+212 + j*(121)
+26 + j*(-342)
+165 + j*(53)
+41 + j*(-14)
+-111 + j*(197)
+-179 + j*(233)
+121 + j*(255)
+208 + j*(-71)
+187 + j*(293)
+110 + j*(-317)
+118 + j*(225)
+250 + j*(187)
+4 + j*(-260)
+-48 + j*(72)
+-195 + j*(97)
+91 + j*(-210)
+113 + j*(-173)
+-32 + j*(2)
+-112 + j*(-9)
+373 + j*(-229)
+42 + j*(-64)
+-106 + j*(-13)
+-58 + j*(25)
+68 + j*(89)
+-93 + j*(-106)
+204 + j*(-76)
+-177 + j*(13)
+-84 + j*(-198)
+168 + j*(287)
+-218 + j*(220)
+-139 + j*(-203)
+346 + j*(156)
+-194 + j*(-30)
+134 + j*(-30)
+-124 + j*(147)
+-199 + j*(-285)
+168 + j*(-201)
+122 + j*(-271)
+103 + j*(-25)
+40 + j*(-42)
+-129 + j*(42)
+119 + j*(234)
+91 + j*(185)
+154 + j*(-153)
+114 + j*(396)
+103 + j*(156)
+-127 + j*(-274)
+122 + j*(-151)
+34 + j*(112)
+-236 + j*(-66)
+266 + j*(-33)
+-177 + j*(-86)
+-26 + j*(-129)
+52 + j*(164)
+-59 + j*(-304)
+-383 + j*(-279)
+146 + j*(136)
+419 + j*(40)
+-30 + j*(113)
+-105 + j*(142)
+213 + j*(-259)
+30 + j*(363)
+168 + j*(-375)
+-107 + j*(60)
+128 + j*(199)
+-71 + j*(113)
+-95 + j*(-124)
+-17 + j*(48)
+-57 + j*(65)
+-76 + j*(23)
+-274 + j*(-206)
+125 + j*(276)
+98 + j*(-57)
+-129 + j*(-179)
+-58 + j*(311)
+54 + j*(52)
+-351 + j*(226)
+-252 + j*(55)
+-142 + j*(-17)
+202 + j*(107)
+176 + j*(-477)
+-71 + j*(18)
+-174 + j*(125)
+144 + j*(-108)
+-10 + j*(-19)
+-28 + j*(112)
+-26 + j*(132)
+-236 + j*(-8)
+37 + j*(-214)
+111 + j*(216)
+260 + j*(70)
+-30 + j*(-69)
+-91 + j*(157)
+221 + j*(-96)
+-162 + j*(-126)
+-71 + j*(110)
+16 + j*(117)
+128 + j*(-4)
+69 + j*(35)
+-62 + j*(177)
+143 + j*(88)
+-124 + j*(-195)
+-118 + j*(-61)
+26 + j*(-187)
+-76 + j*(262)
+-21 + j*(-103)
+-164 + j*(-139)
+-73 + j*(-175)
+262 + j*(-58)
+44 + j*(58)
+78 + j*(-43)
+-245 + j*(336)
+-28 + j*(-38)
+-124 + j*(-168)
+-320 + j*(34)
+-175 + j*(-11)
+-190 + j*(-241)
+119 + j*(-78)
+-242 + j*(264)
+-91 + j*(234)
+-57 + j*(-42)
+-189 + j*(11)
+130 + j*(103)
+217 + j*(-100)
+170 + j*(-62)
+-327 + j*(82)
+-132 + j*(-118)
+19 + j*(1)
+15 + j*(-6)
+-479 + j*(69)
+38 + j*(68)
+1 + j*(-229)
+93 + j*(-98)
+54 + j*(-93)
+-23 + j*(-100)
+1 + j*(-197)
+-269 + j*(-126)
+177 + j*(23)
+-412 + j*(-282)
+-78 + j*(88)
+-214 + j*(225)
+-96 + j*(127)
+-40 + j*(181)
+276 + j*(175)
+-191 + j*(-257)
+163 + j*(-84)
+-82 + j*(92)
+171 + j*(132)
+213 + j*(-79)
+234 + j*(125)
+-62 + j*(-272)
+57 + j*(-56)
+62 + j*(-363)
+-136 + j*(64)
+40 + j*(33)
+-63 + j*(-95)
+-162 + j*(172)
+-141 + j*(-281)
+-13 + j*(40)
+248 + j*(-70)
+-104 + j*(-439)
+57 + j*(192)
+21 + j*(16)
+-385 + j*(-86)
+86 + j*(-322)
+-263 + j*(279)
+238 + j*(83)
+62 + j*(-112)
+-68 + j*(-26)
+30 + j*(182)
+6 + j*(-152)
+100 + j*(-80)
+91 + j*(1)
+-49 + j*(-240)
+88 + j*(19)
+74 + j*(98)
+87 + j*(234)
+5 + j*(-245)
+-310 + j*(57)
+-78 + j*(-243)
+-163 + j*(-32)
+114 + j*(-437)
+44 + j*(150)
+158 + j*(-68)
+327 + j*(-263)
+-3 + j*(-2)
+151 + j*(268)
+-274 + j*(-351)
+-291 + j*(-420)
+-409 + j*(204)
+-454 + j*(-66)
+66 + j*(26)
+-187 + j*(277)
+73 + j*(-33)
+118 + j*(123)
+136 + j*(-40)
+87 + j*(138)
+264 + j*(47)
+93 + j*(288)
+113 + j*(107)
+-233 + j*(95)
+19 + j*(170)
+-23 + j*(-486)
+30 + j*(-47)
+146 + j*(107)
+177 + j*(226)
+-82 + j*(-301)
+155 + j*(58)
+78 + j*(-10)
+390 + j*(233)
+-5 + j*(74)
+-33 + j*(25)
+-117 + j*(394)
+202 + j*(-98)
+18 + j*(83)
+47 + j*(-127)
+230 + j*(-156)
+255 + j*(112)
+-26 + j*(358)
+50 + j*(109)
+-56 + j*(-51)
+-78 + j*(-240)
+-190 + j*(42)
+119 + j*(98)
+-146 + j*(84)
+-37 + j*(-115)
+76 + j*(38)
+99 + j*(-181)
+31 + j*(-63)
+69 + j*(61)
+-100 + j*(62)
+-81 + j*(161)
+130 + j*(-101)
+134 + j*(-168)
+40 + j*(25)
+-57 + j*(-278)
+-58 + j*(244)
+-368 + j*(-64)
+214 + j*(367)
+43 + j*(104)
+347 + j*(-150)
+293 + j*(45)
+-139 + j*(-16)
+198 + j*(120)
+286 + j*(255)
+342 + j*(-254)
+70 + j*(-104)
+-275 + j*(-223)
+-37 + j*(-50)
+-337 + j*(-89)
+-74 + j*(-56)
+133 + j*(202)
+-61 + j*(255)
+-209 + j*(-103)
+-110 + j*(-83)
+130 + j*(244)
+-274 + j*(2)
+78 + j*(-186)
+56 + j*(163)
+-122 + j*(-139)
+90 + j*(-124)
+-6 + j*(-28)
+99 + j*(-203)
+-340 + j*(-146)
+90 + j*(-62)
+215 + j*(-257)
+42 + j*(-3)
+170 + j*(380)
+2 + j*(62)
+-43 + j*(-52)
+-331 + j*(12)
+-26 + j*(33)
+77 + j*(141)
+-184 + j*(-206)
+349 + j*(74)
+128 + j*(-83)
+-309 + j*(213)
+233 + j*(22)
+155 + j*(-16)
+-82 + j*(-190)
+-129 + j*(-1)
+131 + j*(-341)
+182 + j*(-120)
+211 + j*(81)
+47 + j*(-32)
+-79 + j*(233)
+-113 + j*(-443)
+89 + j*(170)
+218 + j*(-257)
+-78 + j*(74)
+-11 + j*(-57)
+-220 + j*(233)
+-165 + j*(62)
+19 + j*(44)
+-121 + j*(-240)
+-3 + j*(-156)
+272 + j*(11)
+-161 + j*(-361)
+-133 + j*(-153)
+-51 + j*(122)
+-30 + j*(56)
+-116 + j*(-74)
+90 + j*(-298)
+97 + j*(-151)
+126 + j*(-69)
+64 + j*(49)
+-18 + j*(-126)
+-45 + j*(-190)
+72 + j*(-124)
+42 + j*(-128)
+238 + j*(-228)
+18 + j*(-296)
+182 + j*(188)
+52 + j*(-131)
+-25 + j*(47)
+66 + j*(-49)
+327 + j*(-474)
+110 + j*(71)
+-76 + j*(-78)
+86 + j*(30)
+-158 + j*(221)
+-16 + j*(-371)
+-144 + j*(100)
+9 + j*(197)
+-65 + j*(-11)
+-218 + j*(-257)
+278 + j*(75)
+-103 + j*(40)
+42 + j*(-145)
+496 + j*(53)
+-161 + j*(-137)
+-82 + j*(-205)
+116 + j*(-37)
+-134 + j*(98)
+-26 + j*(392)
+221 + j*(-45)
+-209 + j*(-288)
+-261 + j*(96)
+199 + j*(-429)
+516 + j*(-110)
+18 + j*(112)
+106 + j*(-329)
+-83 + j*(-117)
+-190 + j*(36)
+177 + j*(252)
+13 + j*(15)
+0 + j*(-269)
+18 + j*(49)
+262 + j*(17)
+-161 + j*(154)
+71 + j*(-43)
+274 + j*(-88)
+-167 + j*(67)
+192 + j*(-173)
+-156 + j*(251)
+-127 + j*(31)
+53 + j*(112)
+-47 + j*(306)
+-409 + j*(-194)
+70 + j*(172)
+-108 + j*(-223)
+-54 + j*(6)
+215 + j*(283)
+281 + j*(-138)
+53 + j*(102)
+12 + j*(-93)
+293 + j*(48)
+-223 + j*(-163)
+37 + j*(127)
+-21 + j*(-30)
+122 + j*(139)
+-6 + j*(147)
+-168 + j*(-25)
+-1 + j*(63)
+203 + j*(-30)
+-184 + j*(-281)
+0 + j*(-66)
+245 + j*(80)
+-3 + j*(-154)
+-151 + j*(-327)
+-185 + j*(-123)
+105 + j*(-202)
+-218 + j*(190)
+-54 + j*(29)
+25 + j*(-47)
+-437 + j*(-132)
+-42 + j*(-11)
+-264 + j*(-191)
+-55 + j*(-18)
+277 + j*(-223)
+69 + j*(-213)
+-334 + j*(-90)
+185 + j*(-269)
+-95 + j*(-21)
+-281 + j*(240)
+-86 + j*(132)
+-134 + j*(-120)
+17 + j*(-402)
+-30 + j*(-4)
+124 + j*(-308)
+-21 + j*(-54)
+107 + j*(-12)
+86 + j*(-109)
+23 + j*(53)
+-42 + j*(-352)
+-68 + j*(-250)
+354 + j*(-155)
+34 + j*(-111)
+-156 + j*(228)
+127 + j*(-209)
+47 + j*(69)
+-118 + j*(298)
+33 + j*(-36)
+62 + j*(392)
+-269 + j*(-88)
+-366 + j*(-47)
+-127 + j*(-98)
+91 + j*(40)
+-138 + j*(-253)
+-57 + j*(181)
+186 + j*(-102)
+83 + j*(-89)
+-9 + j*(-419)
+109 + j*(265)
+124 + j*(316)
+12 + j*(-206)
+-10 + j*(153)
+-159 + j*(27)
+53 + j*(-252)
+-21 + j*(168)
+129 + j*(91)
+-205 + j*(-82)
+85 + j*(143)
+-11 + j*(17)
+71 + j*(-145)
+45 + j*(80)
+71 + j*(50)
+180 + j*(49)
+110 + j*(0)
+-60 + j*(233)
+24 + j*(-153)
+-16 + j*(137)
+269 + j*(187)
+-115 + j*(156)
+29 + j*(81)
+-232 + j*(-161)
+206 + j*(-56)
+-47 + j*(17)
+-18 + j*(-177)
+-100 + j*(126)
+-270 + j*(82)
+-180 + j*(42)
+238 + j*(366)
+69 + j*(236)
+182 + j*(-151)
+0 + j*(180)
+232 + j*(-28)
+72 + j*(299)
+87 + j*(84)
+35 + j*(-416)
+-200 + j*(-43)
+206 + j*(-60)
+-245 + j*(-146)
+89 + j*(95)
+-127 + j*(250)
+-342 + j*(-6)
+-5 + j*(342)
+-239 + j*(-119)
+169 + j*(-29)
+-375 + j*(98)
+81 + j*(-380)
+-65 + j*(4)
+-139 + j*(-205)
+69 + j*(-94)
+-81 + j*(-175)
+16 + j*(-124)
+-81 + j*(185)
+165 + j*(378)
+-140 + j*(337)
+42 + j*(91)
+-156 + j*(201)
+-127 + j*(-64)
+-35 + j*(-177)
+-238 + j*(-87)
+-241 + j*(-294)
+88 + j*(-289)
+-164 + j*(56)
+-141 + j*(-109)
+64 + j*(29)
+-239 + j*(-172)
+88 + j*(-416)
+-188 + j*(-76)
+-222 + j*(103)
+7 + j*(-53)
+218 + j*(-284)
+82 + j*(-288)
+111 + j*(40)
+-47 + j*(111)
+-57 + j*(176)
+20 + j*(-96)
+-25 + j*(284)
+-29 + j*(87)
+63 + j*(266)
+-67 + j*(-129)
+154 + j*(-69)
+141 + j*(78)
+38 + j*(-177)
+-46 + j*(-306)
+271 + j*(125)
+378 + j*(130)
+-303 + j*(-30)
+148 + j*(-64)
+-124 + j*(-332)
+-153 + j*(71)
+-49 + j*(18)
+-78 + j*(-183)
+-334 + j*(-199)
+-238 + j*(-58)
+-269 + j*(-38)
+253 + j*(-426)
+-166 + j*(197)
+197 + j*(-147)
+-33 + j*(-86)
+190 + j*(80)
+-111 + j*(-462)
+-76 + j*(-369)
+501 + j*(-119)
+192 + j*(-117)
+106 + j*(-60)
+148 + j*(-238)
+10 + j*(79)
+97 + j*(53)
+64 + j*(-66)
+-162 + j*(-535)
+60 + j*(83)
+-188 + j*(-98)
+32 + j*(15)
+-74 + j*(-52)
+-30 + j*(-102)
+61 + j*(300)
+-64 + j*(8)
+-245 + j*(105)
+114 + j*(-330)
+83 + j*(141)
+98 + j*(98)
+-74 + j*(-268)
+112 + j*(49)
+451 + j*(-61)
+-107 + j*(52)
+136 + j*(-39)
+-157 + j*(350)
+33 + j*(-122)
+258 + j*(173)
+334 + j*(45)
+-48 + j*(170)
+78 + j*(-82)
+59 + j*(-108)
+347 + j*(75)
+-314 + j*(86)
+-387 + j*(275)
+6 + j*(132)
+-204 + j*(294)
+124 + j*(98)
+-254 + j*(22)
+-89 + j*(-156)
+-392 + j*(-168)
+141 + j*(-159)
+201 + j*(-175)
+-28 + j*(5)
+132 + j*(116)
+4 + j*(-4)
+227 + j*(-108)
+-268 + j*(-85)
+115 + j*(-98)
+-57 + j*(139)
+200 + j*(-103)
+-65 + j*(-194)
+-146 + j*(-59)
+-314 + j*(45)
+146 + j*(-1)
+26 + j*(40)
+-290 + j*(-56)
+-260 + j*(-264)
+165 + j*(35)
+235 + j*(-228)
+149 + j*(-168)
+-25 + j*(-196)
+33 + j*(-211)
+-172 + j*(-173)
+-148 + j*(168)
+-281 + j*(62)
+-56 + j*(-12)
+179 + j*(-24)
+54 + j*(45)
+-128 + j*(-153)
+72 + j*(-62)
+-12 + j*(343)
+214 + j*(-173)
+-105 + j*(41)
+151 + j*(-11)
+-226 + j*(140)
+24 + j*(175)
+-57 + j*(12)
+-25 + j*(86)
+-269 + j*(27)
+175 + j*(13)
+238 + j*(9)
+107 + j*(62)
+15 + j*(-73)
+115 + j*(-37)
+80 + j*(-197)
+-50 + j*(118)
+-206 + j*(123)
+23 + j*(35)
+-257 + j*(-112)
+-66 + j*(183)
+-155 + j*(-4)
+-161 + j*(135)
+132 + j*(-220)
+-22 + j*(-358)
+197 + j*(277)
+339 + j*(8)
+-232 + j*(-293)
+134 + j*(-162)
+-253 + j*(179)
+-255 + j*(-197)
+-110 + j*(-202)
+-216 + j*(-243)
+-247 + j*(103)
+-16 + j*(-33)
+107 + j*(-113)
+-93 + j*(-20)
+-52 + j*(299)
+-43 + j*(-234)
+-131 + j*(-33)
+135 + j*(207)
+88 + j*(-26)
+125 + j*(206)
+164 + j*(5)
+78 + j*(-178)
+-151 + j*(-197)
+190 + j*(-16)
+151 + j*(88)
+-52 + j*(255)
+19 + j*(-182)
+144 + j*(-44)
+-16 + j*(-112)
+145 + j*(81)
+-35 + j*(-1)
+-107 + j*(-6)
+148 + j*(351)
+-156 + j*(421)
+-252 + j*(-71)
+373 + j*(-182)
+228 + j*(51)
+-71 + j*(137)
+83 + j*(201)
+54 + j*(-112)
+26 + j*(-145)
+-55 + j*(4)
+161 + j*(330)
+-30 + j*(-250)
+-421 + j*(-114)
+30 + j*(-16)
+69 + j*(106)
+-43 + j*(43)
+-155 + j*(178)
+20 + j*(-208)
+-395 + j*(226)
+-147 + j*(129)
+11 + j*(-42)
+-331 + j*(91)
+81 + j*(56)
+-460 + j*(-49)
+-269 + j*(1)
+19 + j*(216)
+-124 + j*(30)
+16 + j*(190)
+-293 + j*(-240)
+-170 + j*(149)
+-101 + j*(95)
+130 + j*(-82)
+-33 + j*(116)
+28 + j*(21)
+83 + j*(-83)
+-211 + j*(257)
+-6 + j*(133)
+32 + j*(-163)
+44 + j*(-69)
+36 + j*(95)
+-80 + j*(24)
+-17 + j*(-354)
+115 + j*(130)
+28 + j*(-41)
+287 + j*(195)
+433 + j*(-71)
+-191 + j*(195)
+-75 + j*(-296)
+-195 + j*(170)
+291 + j*(-35)
+-164 + j*(128)
+271 + j*(50)
+132 + j*(-71)
+202 + j*(26)
+12 + j*(-90)
+-260 + j*(25)
+165 + j*(29)
+-89 + j*(250)
+-25 + j*(-21)
+-33 + j*(-4)
+284 + j*(108)
+-162 + j*(-106)
+76 + j*(-163)
+85 + j*(70)
+-106 + j*(61)
+-273 + j*(32)
+24 + j*(-115)
+268 + j*(-297)
+-211 + j*(58)
+243 + j*(16)
+105 + j*(-155)
+-36 + j*(-225)
+64 + j*(80)
+-42 + j*(31)
+115 + j*(276)
+-332 + j*(-232)
+111 + j*(7)
+-216 + j*(-134)
+-154 + j*(-279)
+-182 + j*(76)
+121 + j*(-49)
+-88 + j*(-52)
+167 + j*(-93)
+-135 + j*(-245)
+-210 + j*(405)
+-69 + j*(212)
+-48 + j*(-240)
+385 + j*(306)
+31 + j*(108)
+-7 + j*(-222)
+30 + j*(-53)
+-194 + j*(-183)
+-21 + j*(57)
+-330 + j*(171)
+-42 + j*(-16)
+199 + j*(221)
+-12 + j*(25)
+-70 + j*(458)
+-371 + j*(-155)
+-78 + j*(100)
+49 + j*(-85)
+110 + j*(-243)
+-23 + j*(40)
+12 + j*(-71)
+-82 + j*(-624)
+-156 + j*(53)
+-153 + j*(264)
+2 + j*(-132)
+63 + j*(86)
+133 + j*(40)
+129 + j*(221)
+192 + j*(-300)
+-122 + j*(202)
+76 + j*(-155)
+94 + j*(28)
+-17 + j*(281)
+-382 + j*(105)
+310 + j*(158)
+20 + j*(122)
+211 + j*(-99)
+217 + j*(-166)
+-1 + j*(-130)
+32 + j*(-39)
+-64 + j*(-286)
+365 + j*(-83)
+216 + j*(89)
+167 + j*(-338)
+324 + j*(67)
+223 + j*(123)
+44 + j*(-21)
+66 + j*(79)
+-109 + j*(105)
+59 + j*(-62)
+211 + j*(35)
+-165 + j*(-54)
+142 + j*(123)
+-187 + j*(-115)
+76 + j*(100)
+-290 + j*(-316)
+-78 + j*(162)
+156 + j*(49)
+-69 + j*(-29)
+202 + j*(151)
+37 + j*(11)
+-40 + j*(-138)
+31 + j*(10)
+-28 + j*(-112)
+-195 + j*(175)
+-178 + j*(187)
+51 + j*(-35)
+112 + j*(-6)
+-207 + j*(-35)
+-70 + j*(19)
+-129 + j*(-331)
+99 + j*(-210)
+275 + j*(123)
+-262 + j*(250)
+-9 + j*(129)
+156 + j*(223)
+59 + j*(42)
+-272 + j*(-320)
+-107 + j*(-27)
+-274 + j*(317)
+-271 + j*(238)
+74 + j*(-22)
+181 + j*(-249)
+286 + j*(86)
+57 + j*(268)
+-69 + j*(-50)
+22 + j*(233)
+137 + j*(168)
+156 + j*(88)
+250 + j*(165)
+175 + j*(-258)
+-250 + j*(-158)
+-57 + j*(251)
+-192 + j*(98)
+88 + j*(208)
+-175 + j*(130)
+40 + j*(-162)
+-237 + j*(-4)
+272 + j*(8)
+-54 + j*(163)
+105 + j*(72)
+216 + j*(-69)
+-257 + j*(139)
+-250 + j*(53)
+30 + j*(-439)
+78 + j*(-208)
+182 + j*(177)
+262 + j*(83)
+318 + j*(-4)
+-6 + j*(214)
+-37 + j*(-172)
+-144 + j*(-33)
+-278 + j*(42)
+195 + j*(29)
+158 + j*(76)
+-30 + j*(-395)
+189 + j*(-122)
+-165 + j*(-22)
+-307 + j*(240)
+18 + j*(-73)
+11 + j*(422)
+-108 + j*(-59)
+366 + j*(13)
+-81 + j*(-116)
+-286 + j*(244)
+99 + j*(349)
+-102 + j*(-100)
+-247 + j*(-32)
+2 + j*(175)
+-40 + j*(337)
+284 + j*(124)
+107 + j*(-8)
+126 + j*(107)
+-348 + j*(-184)
+206 + j*(-15)
+242 + j*(-8)
+248 + j*(9)
+83 + j*(65)
+-153 + j*(53)
+-117 + j*(169)
+-359 + j*(41)
+-34 + j*(3)
+-264 + j*(-237)
+42 + j*(-223)
+218 + j*(116)
+-92 + j*(-192)
+-259 + j*(-144)
+304 + j*(78)
+-10 + j*(337)
+8 + j*(122)
+-57 + j*(28)
+-35 + j*(37)
+-46 + j*(13)
+55 + j*(261)
+-244 + j*(-163)
+42 + j*(-45)
+-339 + j*(-79)
+82 + j*(412)
+7 + j*(150)
+132 + j*(199)
+137 + j*(-323)
+269 + j*(-166)
+-7 + j*(54)
+-243 + j*(232)
+-180 + j*(-30)
+-78 + j*(-49)
+-113 + j*(4)
+30 + j*(-32)
+95 + j*(64)
+-1 + j*(-146)
+20 + j*(-11)
+91 + j*(194)
+51 + j*(-269)
+-250 + j*(-105)
+-141 + j*(-33)
+-114 + j*(310)
+177 + j*(211)
+-138 + j*(417)
+-13 + j*(258)
+260 + j*(-113)
+47 + j*(169)
+11 + j*(-429)
+-204 + j*(-11)
+-370 + j*(33)
+401 + j*(-77)
+74 + j*(186)
+322 + j*(146)
+57 + j*(-364)
+18 + j*(-114)
+171 + j*(-362)
+-86 + j*(66)
+11 + j*(-148)
+-72 + j*(190)
+185 + j*(-168)
+-73 + j*(-161)
+182 + j*(18)
+-256 + j*(-304)
+-103 + j*(21)
+-41 + j*(358)
+-136 + j*(132)
+-18 + j*(-144)
+267 + j*(102)
+76 + j*(146)
+-5 + j*(-34)
+-105 + j*(29)
+-261 + j*(-179)
+-86 + j*(63)
+106 + j*(280)
+-15 + j*(-155)
+144 + j*(-52)
+-55 + j*(-344)
+156 + j*(-20)
+161 + j*(-242)
+163 + j*(-223)
+-354 + j*(64)
+-5 + j*(-21)
+20 + j*(-246)
+210 + j*(-316)
+396 + j*(-194)
+16 + j*(225)
+-228 + j*(165)
+46 + j*(21)
+-43 + j*(-298)
+-129 + j*(-132)
+-201 + j*(77)
+-32 + j*(21)
+-37 + j*(107)
+-16 + j*(94)
+18 + j*(-93)
+207 + j*(-175)
+88 + j*(226)
+216 + j*(-142)
+-170 + j*(102)
+21 + j*(-291)
+119 + j*(-173)
+-236 + j*(-33)
+49 + j*(302)
+-151 + j*(136)
+-284 + j*(-181)
+286 + j*(39)
+-70 + j*(160)
+-56 + j*(122)
+5 + j*(320)
+-34 + j*(-181)
+-272 + j*(83)
+33 + j*(-203)
+-248 + j*(-199)
+146 + j*(255)
+-190 + j*(28)
+-60 + j*(-340)
+13 + j*(-252)
+134 + j*(269)
+130 + j*(-115)
+137 + j*(-25)
+292 + j*(141)
+171 + j*(82)
+14 + j*(49)
+11 + j*(23)
+-257 + j*(124)
+-130 + j*(-160)
+-247 + j*(164)
+-13 + j*(168)
+-62 + j*(-258)
+-11 + j*(-66)
+291 + j*(274)
+42 + j*(224)
+-135 + j*(266)
+-109 + j*(47)
+-37 + j*(-110)
+84 + j*(-120)
+-73 + j*(322)
+-52 + j*(33)
+-139 + j*(24)
+42 + j*(-132)
+41 + j*(259)
+-45 + j*(165)
+248 + j*(-201)
+-334 + j*(-131)
+-92 + j*(154)
+202 + j*(7)
+88 + j*(154)
+-100 + j*(42)
+-251 + j*(9)
+129 + j*(-116)
+-187 + j*(82)
+134 + j*(-412)
+-271 + j*(-181)
+-137 + j*(-20)
+-57 + j*(79)
+136 + j*(95)
+81 + j*(157)
+-100 + j*(107)
+-235 + j*(233)
+117 + j*(-72)
+388 + j*(-156)
+-147 + j*(-264)
+0 + j*(-124)
+-18 + j*(156)
+-119 + j*(-114)
+-334 + j*(144)
+206 + j*(303)
+181 + j*(84)
+-198 + j*(-121)
+-146 + j*(91)
+-49 + j*(-77)
+313 + j*(148)
+-241 + j*(57)
+33 + j*(11)
+161 + j*(-20)
+-76 + j*(158)
+51 + j*(28)
+-106 + j*(67)
+-6 + j*(-136)
+-172 + j*(-97)
+77 + j*(112)
+0 + j*(59)
+34 + j*(-29)
+276 + j*(-67)
+-209 + j*(-214)
+21 + j*(-59)
+19 + j*(23)
+35 + j*(-177)
+-221 + j*(242)
+49 + j*(-40)
+291 + j*(248)
+220 + j*(57)
+-193 + j*(65)
+129 + j*(101)
+-36 + j*(-160)
+-431 + j*(-53)
+-78 + j*(-492)
+147 + j*(-326)
+-260 + j*(-37)
+322 + j*(-134)
+-202 + j*(-203)
+58 + j*(40)
+45 + j*(-83)
+-66 + j*(-205)
+-130 + j*(-68)
+122 + j*(47)
+124 + j*(-115)
+-37 + j*(281)
+-276 + j*(-77)
+-188 + j*(379)
+195 + j*(-42)
+-4 + j*(110)
+-288 + j*(-63)
+1 + j*(-96)
+69 + j*(-42)
+100 + j*(173)
+-129 + j*(246)
+311 + j*(-30)
+-71 + j*(-151)
+-368 + j*(-41)
+-347 + j*(190)
+-173 + j*(-92)
+-170 + j*(224)
+-40 + j*(-163)
+-103 + j*(90)
+373 + j*(301)
+-206 + j*(55)
+-8 + j*(-184)
+30 + j*(-18)
+-184 + j*(15)
+-132 + j*(103)
+69 + j*(88)
+-115 + j*(-293)
+-318 + j*(124)
+250 + j*(284)
+33 + j*(-127)
+193 + j*(317)
+-72 + j*(242)
+-32 + j*(122)
+-214 + j*(277)
+78 + j*(-18)
+-173 + j*(-41)
+-135 + j*(-180)
+-31 + j*(-104)
+-22 + j*(278)
+52 + j*(-16)
+204 + j*(-62)
+-30 + j*(-24)
+171 + j*(-48)
+-54 + j*(-339)
+-84 + j*(91)
+-95 + j*(-288)
+40 + j*(-330)
+-115 + j*(16)
+-451 + j*(-48)
+119 + j*(99)
+-36 + j*(135)
+200 + j*(144)
+127 + j*(-43)
+252 + j*(91)
+105 + j*(218)
+29 + j*(176)
+139 + j*(-190)
+-108 + j*(-139)
+144 + j*(-76)
+120 + j*(214)
+47 + j*(228)
+-42 + j*(-4)
+279 + j*(3)
+-140 + j*(-100)
+-16 + j*(49)
+-148 + j*(-21)
+102 + j*(-150)
+-48 + j*(-264)
+-204 + j*(-53)
+207 + j*(81)
+-272 + j*(-115)
+-28 + j*(-252)
+-61 + j*(-4)
+-114 + j*(116)
+64 + j*(182)
+131 + j*(101)
+117 + j*(-1)
+148 + j*(-296)
+99 + j*(248)
+112 + j*(-18)
+198 + j*(306)
+-63 + j*(13)
+-226 + j*(-149)
+93 + j*(121)
+-233 + j*(140)
+-156 + j*(-279)
+-182 + j*(-107)
+-117 + j*(-240)
+-209 + j*(36)
+32 + j*(-31)
+257 + j*(-126)
+-320 + j*(94)
+25 + j*(-454)
+-35 + j*(81)
+-132 + j*(170)
+-161 + j*(230)
+365 + j*(304)
+-53 + j*(-175)
+101 + j*(165)
+242 + j*(301)
+113 + j*(190)
+164 + j*(-160)
+25 + j*(-512)
+343 + j*(31)
+-228 + j*(4)
+185 + j*(-76)
+-13 + j*(272)
+69 + j*(6)
+45 + j*(-23)
+3 + j*(135)
+-240 + j*(-105)
+124 + j*(143)
+-40 + j*(-218)
+-35 + j*(-109)
+-23 + j*(-3)
+-96 + j*(-139)
+93 + j*(240)
+-193 + j*(-181)
+-45 + j*(80)
+165 + j*(-144)
+-176 + j*(-94)
+-85 + j*(-242)
+-100 + j*(-11)
+-73 + j*(181)
+-6 + j*(-151)
+98 + j*(109)
+-223 + j*(101)
+-279 + j*(58)
+81 + j*(86)
+14 + j*(102)
+56 + j*(-215)
+-228 + j*(-92)
+-165 + j*(-62)
+262 + j*(52)
+-40 + j*(-160)
+-183 + j*(-139)
+226 + j*(-66)
+-107 + j*(184)
+115 + j*(-64)
+-129 + j*(139)
+90 + j*(-296)
+-88 + j*(-1)
+-81 + j*(-83)
+78 + j*(-35)
+68 + j*(-37)
+-86 + j*(-149)
+-1 + j*(84)
+-124 + j*(-24)
+-319 + j*(-315)
+-105 + j*(-221)
+-185 + j*(77)
+-211 + j*(28)
+-58 + j*(-169)
+59 + j*(-424)
+97 + j*(222)
+-82 + j*(216)
+170 + j*(-109)
+185 + j*(6)
+-328 + j*(202)
+-128 + j*(-71)
+-34 + j*(-259)
+23 + j*(409)
+-218 + j*(55)
+55 + j*(-269)
+-49 + j*(368)
+62 + j*(131)
+15 + j*(29)
+79 + j*(349)
+9 + j*(-190)
+-188 + j*(232)
+194 + j*(153)
+74 + j*(291)
+-152 + j*(119)
+148 + j*(-206)
+-110 + j*(-170)
+194 + j*(-139)
+113 + j*(-100)
+-209 + j*(-302)
+2 + j*(64)
+-128 + j*(-59)
+13 + j*(-122)
+7 + j*(-200)
+25 + j*(-101)
+104 + j*(-127)
+168 + j*(-125)
+93 + j*(-216)
+-91 + j*(-49)
+-179 + j*(-68)
+-95 + j*(117)
+267 + j*(-81)
+-48 + j*(-41)
+-122 + j*(-340)
+-91 + j*(216)
+104 + j*(142)
+-69 + j*(-206)
+-82 + j*(-101)
+-93 + j*(136)
+6 + j*(-57)
+-51 + j*(-202)
+53 + j*(-167)
+-127 + j*(-216)
+-292 + j*(-243)
+170 + j*(-228)
+-241 + j*(-90)
+-132 + j*(-216)
+-81 + j*(-295)
+-40 + j*(96)
+-180 + j*(-167)
+-404 + j*(42)
+-64 + j*(-373)
+-190 + j*(100)
+75 + j*(-219)
+430 + j*(219)
+-23 + j*(-146)
+-93 + j*(25)
+18 + j*(257)
+-28 + j*(303)
+-209 + j*(261)
+748 + j*(271)
+177 + j*(154)
+352 + j*(577)
+-202 + j*(-223)
+-177 + j*(11)
+327 + j*(256)
+346 + j*(-228)
+-372 + j*(398)
+354 + j*(666)
+399 + j*(-1)
+406 + j*(-42)
+105 + j*(-37)
+-281 + j*(523)
+-76 + j*(-529)
+675 + j*(81)
+-245 + j*(418)
+333 + j*(275)
+-395 + j*(136)
+-63 + j*(338)
+-166 + j*(-158)
+-139 + j*(-445)
+-238 + j*(407)
+-342 + j*(-115)
+-323 + j*(101)
+-547 + j*(289)
+329 + j*(117)
+-255 + j*(-172)
+375 + j*(-109)
+-52 + j*(-234)
+643 + j*(-313)
+-18 + j*(258)
+11 + j*(168)
+-12 + j*(15)
+351 + j*(-247)
+-199 + j*(334)
+387 + j*(21)
+-126 + j*(63)
+-375 + j*(263)
+23 + j*(206)
+31 + j*(261)
+-211 + j*(334)
+633 + j*(210)
+-194 + j*(-467)
+335 + j*(-243)
+368 + j*(-135)
+542 + j*(-241)
+-190 + j*(-300)
+-18 + j*(-262)
+279 + j*(-42)
+-548 + j*(-407)
+107 + j*(-480)
+318 + j*(274)
+-220 + j*(-252)
+142 + j*(66)
+-156 + j*(290)
+-474 + j*(320)
+602 + j*(255)
+-226 + j*(187)
+-403 + j*(-288)
+-443 + j*(-303)
+159 + j*(-513)
+-480 + j*(-58)
+263 + j*(-127)
+-346 + j*(537)
+187 + j*(-350)
+-146 + j*(336)
+-175 + j*(-127)
+250 + j*(532)
+317 + j*(173)
+-38 + j*(-279)
+339 + j*(-542)
+168 + j*(-103)
+606 + j*(-121)
+128 + j*(-260)
+132 + j*(-116)
+487 + j*(497)
+-177 + j*(-310)
+-281 + j*(-375)
+-33 + j*(-250)
+-459 + j*(37)
+13 + j*(-3)
+206 + j*(-288)
+167 + j*(-218)
+225 + j*(163)
+-460 + j*(-350)
+-422 + j*(-256)
+-273 + j*(-288)
+145 + j*(-539)
+264 + j*(675)
+-177 + j*(-416)
+-278 + j*(92)
+256 + j*(93)
+-11 + j*(122)
+119 + j*(205)
+264 + j*(-350)
+267 + j*(320)
+628 + j*(115)
+-300 + j*(206)
+-256 + j*(127)
+46 + j*(644)
+-257 + j*(174)
+397 + j*(-358)
+437 + j*(-221)
+-404 + j*(-392)
+-453 + j*(-234)
+211 + j*(-168)
+-473 + j*(-173)
+378 + j*(297)
+206 + j*(280)
+-203 + j*(-341)
+-251 + j*(-229)
+173 + j*(-60)
+-311 + j*(-156)
+1 + j*(134)
+-24 + j*(-322)
+-291 + j*(-203)
+-424 + j*(127)
+134 + j*(-62)
+-295 + j*(-141)
+-380 + j*(-233)
+-83 + j*(320)
+-169 + j*(171)
+-419 + j*(263)
+219 + j*(-126)
+-227 + j*(221)
+-533 + j*(-33)
+139 + j*(162)
+-259 + j*(81)
+-77 + j*(-316)
+-334 + j*(368)
+78 + j*(-279)
+-127 + j*(-14)
+186 + j*(-54)
+-317 + j*(-562)
+127 + j*(424)
+23 + j*(241)
+-170 + j*(-218)
+533 + j*(511)
+-530 + j*(-110)
+-246 + j*(576)
+151 + j*(-443)
+38 + j*(358)
+-462 + j*(-40)
+-293 + j*(386)
+403 + j*(404)
+465 + j*(126)
+-39 + j*(220)
+546 + j*(-482)
+187 + j*(267)
+-166 + j*(-417)
+293 + j*(-158)
+190 + j*(-276)
+291 + j*(-456)
+-256 + j*(177)
+236 + j*(83)
+-21 + j*(566)
+-309 + j*(-536)
+-276 + j*(274)
+291 + j*(30)
+316 + j*(480)
+471 + j*(114)
+-284 + j*(197)
+344 + j*(-291)
+-263 + j*(-347)
+81 + j*(33)
+-381 + j*(-364)
+49 + j*(-97)
+300 + j*(516)
+303 + j*(-48)
+192 + j*(499)
+115 + j*(-372)
+387 + j*(-398)
+264 + j*(2)
+-104 + j*(286)
+643 + j*(-144)
+327 + j*(447)
+33 + j*(-457)
+-221 + j*(-59)
+-251 + j*(37)
+300 + j*(4)
+245 + j*(77)
+-199 + j*(-344)
+-103 + j*(16)
+-275 + j*(596)
+226 + j*(-307)
+-321 + j*(379)
+151 + j*(237)
+403 + j*(-258)
+292 + j*(-358)
+728 + j*(378)
+204 + j*(601)
+-392 + j*(-49)
+205 + j*(56)
+-96 + j*(143)
+-361 + j*(270)
+132 + j*(159)
+342 + j*(156)
+171 + j*(262)
+252 + j*(55)
+205 + j*(-261)
+272 + j*(-192)
+225 + j*(139)
+-375 + j*(241)
+-179 + j*(325)
+-121 + j*(-150)
+178 + j*(-279)
+532 + j*(-95)
+-397 + j*(361)
+149 + j*(-227)
+-253 + j*(-415)
+-622 + j*(-208)
+-309 + j*(369)
+305 + j*(361)
+224 + j*(394)
+385 + j*(617)
+-238 + j*(-120)
+524 + j*(-277)
+-209 + j*(-190)
+387 + j*(658)
+405 + j*(211)
+45 + j*(333)
+-313 + j*(137)
+-313 + j*(-31)
+492 + j*(320)
+138 + j*(-307)
+-240 + j*(364)
+316 + j*(204)
+177 + j*(-408)
+204 + j*(-63)
+358 + j*(-165)
+-47 + j*(-238)
+425 + j*(361)
+596 + j*(-56)
+409 + j*(-180)
+-61 + j*(-536)
+-389 + j*(262)
+-337 + j*(-270)
+-185 + j*(-47)
+-414 + j*(-222)
+394 + j*(200)
+102 + j*(201)
+-581 + j*(-57)
+312 + j*(118)
+284 + j*(421)
+171 + j*(242)
+385 + j*(-218)
+119 + j*(166)
+408 + j*(484)
+215 + j*(188)
+269 + j*(434)
+8 + j*(337)
+-308 + j*(514)
+366 + j*(-49)
+167 + j*(-166)
+638 + j*(185)
+344 + j*(-203)
+-331 + j*(174)
+315 + j*(-16)
+264 + j*(-185)
+-389 + j*(382)
+-76 + j*(-346)
+284 + j*(221)
+216 + j*(309)
+-296 + j*(-339)
+-290 + j*(89)
+341 + j*(400)
+126 + j*(-108)
+267 + j*(288)
+-211 + j*(177)
+355 + j*(-21)
+522 + j*(255)
+268 + j*(-234)
+436 + j*(392)
+703 + j*(57)
+-435 + j*(-436)
+284 + j*(-130)
+-115 + j*(-286)
+-614 + j*(-284)
+-152 + j*(-368)
+219 + j*(-30)
+313 + j*(-261)
+-134 + j*(-260)
+-55 + j*(-498)
+-254 + j*(291)
+196 + j*(-122)
+318 + j*(334)
+-264 + j*(366)
+13 + j*(-230)
+314 + j*(609)
+241 + j*(-139)
+-88 + j*(347)
+323 + j*(-305)
+-443 + j*(-257)
+-231 + j*(300)
+-424 + j*(479)
+320 + j*(543)
+23 + j*(-188)
+-392 + j*(22)
+-497 + j*(93)
+-218 + j*(-392)
+-286 + j*(-441)
+-263 + j*(-591)
+-153 + j*(-87)
+-125 + j*(204)
+-385 + j*(54)
+92 + j*(269)
+-45 + j*(46)
+-571 + j*(-607)
+-372 + j*(122)
+-384 + j*(19)
+193 + j*(258)
+-22 + j*(377)
+-268 + j*(331)
+-184 + j*(425)
+554 + j*(-243)
+-146 + j*(490)
+-168 + j*(-530)
+180 + j*(38)
+-352 + j*(25)
+-334 + j*(57)
+-215 + j*(188)
+57 + j*(89)
+196 + j*(182)
+397 + j*(491)
+-361 + j*(-99)
+214 + j*(161)
+-84 + j*(346)
+112 + j*(364)
+-244 + j*(346)
+-320 + j*(79)
+406 + j*(93)
+-196 + j*(-371)
+158 + j*(-298)
+82 + j*(189)
+-342 + j*(-235)
+202 + j*(-280)
+-194 + j*(-349)
+-197 + j*(-312)
+-291 + j*(-99)
+-171 + j*(283)
+87 + j*(-41)
+-266 + j*(92)
+595 + j*(573)
+-362 + j*(-139)
+154 + j*(-235)
+127 + j*(-603)
+191 + j*(663)
+387 + j*(-70)
+275 + j*(505)
+161 + j*(-393)
+411 + j*(-243)
+-258 + j*(366)
+-273 + j*(35)
+-436 + j*(-470)
+472 + j*(62)
+-401 + j*(75)
+99 + j*(-165)
+180 + j*(421)
+270 + j*(-199)
+-52 + j*(-218)
+-260 + j*(-283)
+-527 + j*(277)
+-286 + j*(456)
+-444 + j*(97)
+-276 + j*(309)
+132 + j*(-304)
+-231 + j*(-378)
+-245 + j*(153)
+406 + j*(305)
+-338 + j*(229)
+163 + j*(180)
+-281 + j*(290)
+477 + j*(-118)
+-377 + j*(457)
+169 + j*(-161)
+-347 + j*(-248)
+291 + j*(-45)
+-157 + j*(60)
+124 + j*(227)
+-281 + j*(-433)
+513 + j*(-282)
+333 + j*(235)
+299 + j*(-273)
+322 + j*(211)
+391 + j*(402)
+198 + j*(-60)
+-58 + j*(-472)
+559 + j*(125)
+130 + j*(334)
+-93 + j*(245)
+471 + j*(-211)
+93 + j*(276)
+36 + j*(-378)
+780 + j*(281)
+-291 + j*(301)
+286 + j*(334)
+227 + j*(-363)
+351 + j*(163)
+194 + j*(98)
+-512 + j*(317)
+-47 + j*(197)
+-325 + j*(393)
+122 + j*(9)
+-264 + j*(-231)
+339 + j*(141)
+-274 + j*(-426)
+330 + j*(-318)
+625 + j*(-276)
+-372 + j*(406)
+-253 + j*(-171)
+-314 + j*(-271)
+159 + j*(161)
+264 + j*(-505)
+-280 + j*(563)
+326 + j*(3)
+235 + j*(78)
+66 + j*(-384)
+368 + j*(156)
+-227 + j*(-17)
+-409 + j*(-381)
+-252 + j*(-306)
+108 + j*(218)
+-433 + j*(-35)
+16 + j*(23)
+648 + j*(-353)
+296 + j*(47)
+-291 + j*(360)
+408 + j*(-459)
+530 + j*(156)
+175 + j*(262)
+8 + j*(-363)
+57 + j*(221)
+142 + j*(161)
+-162 + j*(72)
+185 + j*(-160)
+280 + j*(-128)
+-272 + j*(-232)
+31 + j*(-88)
+-626 + j*(-132)
+122 + j*(-325)
+-274 + j*(126)
+-312 + j*(206)
+231 + j*(37)
+-261 + j*(-124)
+86 + j*(450)
+-328 + j*(-586)
+-175 + j*(-283)
+25 + j*(-170)
+340 + j*(372)
+385 + j*(181)
+354 + j*(-480)
+-204 + j*(30)
+-368 + j*(273)
+-315 + j*(204)
+-453 + j*(269)
+-433 + j*(173)
+532 + j*(258)
+351 + j*(-124)
+-26 + j*(-1)
+208 + j*(83)
+84 + j*(141)
+-620 + j*(-32)
+-229 + j*(34)
+-146 + j*(-315)
+-143 + j*(-223)
+-135 + j*(375)
+421 + j*(345)
+498 + j*(-307)
+425 + j*(-670)
+315 + j*(613)
+-361 + j*(253)
+470 + j*(-390)
+-8 + j*(132)
+-173 + j*(74)
+-375 + j*(317)
+278 + j*(-225)
+-247 + j*(156)
+-371 + j*(-346)
+-366 + j*(-146)
+417 + j*(-374)
+27 + j*(-231)
+462 + j*(311)
+-147 + j*(385)
+433 + j*(-363)
+-347 + j*(-521)
+-345 + j*(206)
+-503 + j*(473)
+238 + j*(-395)
+159 + j*(-239)
+-163 + j*(189)
+-468 + j*(-154)
+-351 + j*(-30)
+-271 + j*(491)
+277 + j*(94)
+-4 + j*(-162)
+331 + j*(-389)
+-246 + j*(496)
+165 + j*(330)
+453 + j*(257)
+-64 + j*(-125)
+-544 + j*(-247)
+135 + j*(-176)
+-383 + j*(-524)
+-16 + j*(693)
+-104 + j*(189)
+139 + j*(110)
+525 + j*(236)
+172 + j*(-342)
+313 + j*(223)
+307 + j*(-435)
+-525 + j*(-231)
+317 + j*(-317)
+-525 + j*(-696)
+245 + j*(-131)
+-568 + j*(-351)
+71 + j*(-274)
+-57 + j*(95)
+-313 + j*(-417)
+250 + j*(-74)
+338 + j*(-238)
+270 + j*(-151)
+-166 + j*(437)
+-414 + j*(460)
+-285 + j*(304)
+-274 + j*(511)
+408 + j*(-422)
+25 + j*(-37)
+-370 + j*(107)
+367 + j*(146)
+-135 + j*(-324)
+-329 + j*(180)
+163 + j*(-82)
+-568 + j*(185)
+-496 + j*(-288)
+-416 + j*(-366)
+37 + j*(-95)
+70 + j*(-424)
+88 + j*(38)
+-277 + j*(87)
+-44 + j*(404)
+-184 + j*(-651)
+-304 + j*(-487)
+-301 + j*(-136)
+-36 + j*(-501)
+416 + j*(104)
+130 + j*(-443)
+127 + j*(-177)
+387 + j*(-144)
+-186 + j*(6)
+-333 + j*(-57)
+-101 + j*(-190)
+450 + j*(161)
+85 + j*(-147)
+442 + j*(-466)
+-52 + j*(-173)
+45 + j*(13)
+289 + j*(96)
+148 + j*(461)
+-49 + j*(330)
+-6 + j*(-279)
+-44 + j*(152)
+279 + j*(-176)
+404 + j*(178)
+239 + j*(297)
+-267 + j*(449)
+-371 + j*(-45)
+-206 + j*(-267)
+144 + j*(-57)
+-352 + j*(199)
+249 + j*(472)
+-87 + j*(136)
+-147 + j*(-480)
+442 + j*(397)
+-30 + j*(129)
+-322 + j*(417)
+818 + j*(11)
+-14 + j*(338)
+-257 + j*(-72)
+352 + j*(-235)
+-411 + j*(82)
+348 + j*(-66)
+50 + j*(257)
+-315 + j*(103)
+-394 + j*(-30)
+-274 + j*(336)
+-436 + j*(-178)
+-147 + j*(-202)
+173 + j*(264)
+-167 + j*(-347)
+-430 + j*(-67)
+229 + j*(-447)
+-255 + j*(771)
+29 + j*(-579)
+412 + j*(208)
+385 + j*(-573)
+-523 + j*(-310)
+-513 + j*(-223)
+148 + j*(-237)
+-70 + j*(127)
+-346 + j*(12)
+-245 + j*(-208)
+-146 + j*(204)
+-216 + j*(23)
+4 + j*(87)
+-163 + j*(274)
+-146 + j*(-27)
+-74 + j*(250)
+-97 + j*(69)
+18 + j*(85)
+-33 + j*(-192)
+-84 + j*(-299)
+15 + j*(32)
+182 + j*(-194)
+30 + j*(-209)
+-151 + j*(-126)
+315 + j*(-103)
+-146 + j*(-21)
+79 + j*(168)
+535 + j*(44)
+169 + j*(-331)
+-139 + j*(229)
+-192 + j*(55)
+-84 + j*(-47)
+221 + j*(78)
+-83 + j*(-228)
+86 + j*(-13)
+-165 + j*(58)
+-315 + j*(72)
+-57 + j*(-23)
+16 + j*(-209)
+-50 + j*(-103)
+-206 + j*(-19)
+36 + j*(-36)
+-78 + j*(-187)
+-224 + j*(173)
+172 + j*(29)
+284 + j*(66)
+155 + j*(194)
+14 + j*(28)
+144 + j*(-105)
+-102 + j*(-113)
+-132 + j*(-83)
+15 + j*(-325)
+40 + j*(-86)
+203 + j*(-185)
+64 + j*(115)
+427 + j*(-47)
+20 + j*(40)
+-71 + j*(127)
+238 + j*(44)
+112 + j*(-142)
+39 + j*(-171)
+122 + j*(-204)
+62 + j*(-64)
+-33 + j*(-149)
+-170 + j*(106)
+296 + j*(52)
+332 + j*(279)
+203 + j*(70)
+286 + j*(76)
+-206 + j*(42)
+-11 + j*(298)
+129 + j*(-209)
+110 + j*(218)
+-17 + j*(-75)
+198 + j*(15)
+153 + j*(256)
+-6 + j*(-125)
+71 + j*(-89)
+64 + j*(-11)
+80 + j*(-31)
+192 + j*(112)
+-196 + j*(-18)
+-21 + j*(204)
+-54 + j*(305)
+10 + j*(292)
+30 + j*(238)
+-144 + j*(333)
+-230 + j*(-60)
+-354 + j*(76)
+87 + j*(-45)
+193 + j*(215)
+-170 + j*(204)
+143 + j*(93)
+-206 + j*(231)
+151 + j*(121)
+323 + j*(-74)
+-132 + j*(-209)
+-150 + j*(-150)
+-153 + j*(-82)
+-243 + j*(-144)
+310 + j*(95)
+342 + j*(-61)
+-155 + j*(-117)
+357 + j*(66)
+-360 + j*(119)
+86 + j*(-33)
+209 + j*(40)
+-105 + j*(62)
+163 + j*(43)
+-58 + j*(56)
+134 + j*(-247)
+14 + j*(84)
+-105 + j*(-28)
+-193 + j*(-215)
+-51 + j*(-180)
+97 + j*(-98)
+-116 + j*(-25)
+422 + j*(107)
+105 + j*(62)
+-30 + j*(62)
+255 + j*(141)
+-247 + j*(240)
+23 + j*(25)
+-163 + j*(6)
+0 + j*(308)
+-115 + j*(-250)
+-83 + j*(-33)
+-345 + j*(-57)
+495 + j*(-29)
+148 + j*(-51)
+-203 + j*(144)
+-57 + j*(39)
+-52 + j*(283)
+-7 + j*(218)
+300 + j*(-182)
+274 + j*(202)
+59 + j*(13)
+-74 + j*(259)
+300 + j*(28)
+1 + j*(117)
+151 + j*(242)
+267 + j*(332)
+57 + j*(-315)
+38 + j*(-178)
+65 + j*(8)
+-144 + j*(-271)
+213 + j*(-199)
+151 + j*(-91)
+-252 + j*(-130)
+-93 + j*(-66)
+74 + j*(69)
+-118 + j*(110)
+293 + j*(187)
+124 + j*(84)
+211 + j*(-75)
+-40 + j*(-15)
+123 + j*(28)
+105 + j*(-295)
+198 + j*(185)
+76 + j*(74)
+-236 + j*(203)
+-81 + j*(1)
+-135 + j*(73)
+-333 + j*(-332)
+46 + j*(64)
+-37 + j*(233)
+-17 + j*(37)
+321 + j*(182)
+146 + j*(307)
+98 + j*(-2)
+-191 + j*(-138)
+-252 + j*(124)
+168 + j*(-105)
+28 + j*(343)
+-59 + j*(-71)
+-119 + j*(-351)
+18 + j*(-82)
+319 + j*(69)
+140 + j*(-41)
+278 + j*(301)
+-142 + j*(166)
+-189 + j*(-316)
+173 + j*(-260)
+-26 + j*(-151)
+-94 + j*(-54)
+10 + j*(23)
+134 + j*(-170)
+-45 + j*(-260)
+138 + j*(-59)
+79 + j*(-220)
+2 + j*(102)
+163 + j*(74)
+-105 + j*(42)
+-295 + j*(-200)
+184 + j*(-141)
+-216 + j*(246)
+-66 + j*(-23)
+185 + j*(86)
+-378 + j*(146)
+-137 + j*(250)
+233 + j*(190)
+-66 + j*(-220)
+-30 + j*(-128)
+332 + j*(-71)
+293 + j*(-6)
+-35 + j*(-1)
+-58 + j*(247)
+252 + j*(-73)
+-75 + j*(-220)
+-57 + j*(6)
+-197 + j*(-8)
+321 + j*(149)
+-308 + j*(141)
+146 + j*(-230)
+-168 + j*(-322)
+-315 + j*(-190)
+120 + j*(-298)
+155 + j*(-344)
+-15 + j*(146)
+-156 + j*(-192)
+-91 + j*(-6)
+-62 + j*(-40)
+-40 + j*(109)
+-256 + j*(-19)
+118 + j*(-350)
+-365 + j*(-211)
+-68 + j*(-100)
+-86 + j*(-320)
+33 + j*(-34)
+136 + j*(1)
+7 + j*(430)
+161 + j*(54)
+30 + j*(-78)
+-87 + j*(-162)
+282 + j*(269)
+-277 + j*(260)
+-10 + j*(404)
+245 + j*(134)
+-96 + j*(-129)
+-183 + j*(83)
+-114 + j*(266)
+-3 + j*(-74)
+115 + j*(77)
+141 + j*(31)
+-105 + j*(50)
+-20 + j*(-341)
+148 + j*(-116)
+388 + j*(-106)
+-112 + j*(-20)
+58 + j*(-6)
+207 + j*(-138)
+124 + j*(-84)
+-174 + j*(71)
+-79 + j*(321)
+-153 + j*(48)
+-171 + j*(-315)
+-115 + j*(19)
+-73 + j*(-77)
+-2 + j*(-59)
+71 + j*(-69)
+13 + j*(1)
+129 + j*(-286)
+-316 + j*(162)
+303 + j*(210)
+32 + j*(136)
+-199 + j*(85)
+-248 + j*(169)
+246 + j*(88)
+309 + j*(-105)
+83 + j*(-149)
+-46 + j*(-25)
+-194 + j*(-202)
+-88 + j*(-108)
+76 + j*(29)
+79 + j*(-213)
+-90 + j*(14)
+-88 + j*(106)
+-194 + j*(-71)
+-57 + j*(42)
+-478 + j*(-83)
+269 + j*(-33)
+180 + j*(25)
+-47 + j*(-96)
+-190 + j*(115)
+-10 + j*(-342)
+-144 + j*(-26)
+-264 + j*(4)
+-192 + j*(48)
+-303 + j*(117)
+-49 + j*(268)
+95 + j*(-177)
+419 + j*(69)
+-131 + j*(156)
+-170 + j*(-4)
+-8 + j*(-139)
+-42 + j*(185)
+0 + j*(-301)
+20 + j*(-200)
+397 + j*(-147)
+-130 + j*(-238)
+-42 + j*(33)
+-78 + j*(12)
+-59 + j*(-111)
+-206 + j*(-145)
+-141 + j*(-148)
+-94 + j*(-163)
+146 + j*(-16)
+43 + j*(211)
+202 + j*(244)
+-67 + j*(-282)
+223 + j*(64)
+65 + j*(194)
+-76 + j*(-1)
+14 + j*(240)
+-51 + j*(136)
+-23 + j*(165)
+-44 + j*(64)
+110 + j*(132)
+-153 + j*(-107)
+-20 + j*(-114)
+-226 + j*(-141)
+-103 + j*(4)
+-113 + j*(211)
+153 + j*(-9)
+252 + j*(-18)
+-115 + j*(-216)
+-83 + j*(295)
+165 + j*(47)
+66 + j*(-152)
+194 + j*(88)
+-46 + j*(-30)
+100 + j*(-37)
+148 + j*(-224)
+167 + j*(84)
+-174 + j*(-62)
+-333 + j*(-233)
+250 + j*(-173)
+325 + j*(-9)
+36 + j*(-29)
+-85 + j*(20)
+141 + j*(179)
+-13 + j*(15)
+-179 + j*(-415)
+-358 + j*(87)
+-236 + j*(236)
+291 + j*(-188)
+-114 + j*(268)
+-187 + j*(-233)
+62 + j*(-151)
+-139 + j*(-336)
+301 + j*(-37)
+-75 + j*(74)
+12 + j*(-259)
+-351 + j*(-17)
+193 + j*(-151)
+-4 + j*(105)
+206 + j*(5)
+-153 + j*(-107)
+185 + j*(242)
+-5 + j*(-105)
+20 + j*(14)
+36 + j*(368)
+37 + j*(139)
+11 + j*(-123)
+-218 + j*(-71)
+-122 + j*(86)
+-95 + j*(95)
+-412 + j*(-148)
+-218 + j*(-69)
+-326 + j*(-87)
+-131 + j*(11)
+-11 + j*(84)
+98 + j*(-194)
+-49 + j*(-99)
+207 + j*(-170)
+-200 + j*(-292)
+-46 + j*(152)
+-144 + j*(-54)
+196 + j*(268)
+100 + j*(31)
+-132 + j*(157)
+-95 + j*(-239)
+185 + j*(-6)
+-117 + j*(-161)
+106 + j*(164)
+122 + j*(48)
+-47 + j*(45)
+47 + j*(83)
+195 + j*(361)
+68 + j*(207)
+43 + j*(17)
+-120 + j*(-76)
+1 + j*(-81)
+-138 + j*(-8)
+1 + j*(-15)
+10 + j*(-10)
+30 + j*(37)
+-24 + j*(-55)
+-235 + j*(251)
+-16 + j*(236)
+139 + j*(-286)
+62 + j*(86)
+183 + j*(-165)
+-71 + j*(-117)
+57 + j*(-56)
+71 + j*(-23)
+-518 + j*(52)
+189 + j*(-45)
+3 + j*(-190)
+89 + j*(186)
+36 + j*(-11)
+-308 + j*(283)
+153 + j*(-55)
+170 + j*(68)
+16 + j*(-214)
+141 + j*(223)
+13 + j*(163)
+-99 + j*(197)
+-350 + j*(-84)
+361 + j*(-123)
+-153 + j*(-35)
+184 + j*(-101)
+-250 + j*(104)
+-256 + j*(147)
+-56 + j*(166)
+-67 + j*(-78)
+1 + j*(-257)
+-173 + j*(-69)
+-109 + j*(-93)
+-17 + j*(71)
+243 + j*(-110)
+54 + j*(166)
+-80 + j*(-250)
+-134 + j*(-32)
+-169 + j*(-201)
+-98 + j*(-239)
+339 + j*(-90)
+-11 + j*(-78)
+25 + j*(45)
+109 + j*(-8)
+45 + j*(-274)
+-215 + j*(-130)
+-139 + j*(178)
+213 + j*(-269)
+-202 + j*(-202)
+-221 + j*(-17)
+219 + j*(-466)
+87 + j*(-278)
+358 + j*(-91)
+5 + j*(169)
+-129 + j*(330)
+42 + j*(0)
+-86 + j*(-29)
+-80 + j*(295)
+-154 + j*(-121)
+76 + j*(233)
+238 + j*(-31)
+97 + j*(-160)
+23 + j*(-81)
+5 + j*(-187)
+-39 + j*(-139)
+-262 + j*(83)
+128 + j*(23)
+-274 + j*(-51)
+229 + j*(-56)
+127 + j*(486)
+104 + j*(112)
+-46 + j*(257)
+-210 + j*(-244)
+81 + j*(111)
+112 + j*(198)
+231 + j*(319)
+-86 + j*(103)
+-7 + j*(-55)
+-6 + j*(-153)
+139 + j*(141)
+37 + j*(212)
+56 + j*(346)
+298 + j*(-73)
+-4 + j*(-55)
+163 + j*(36)
+-46 + j*(229)
+124 + j*(-144)
+-156 + j*(122)
+-209 + j*(-109)
+117 + j*(-151)
+-235 + j*(-193)
+-38 + j*(-64)
+136 + j*(28)
+66 + j*(-388)
+-102 + j*(101)
+171 + j*(182)
+-192 + j*(81)
+251 + j*(-343)
+261 + j*(-61)
+88 + j*(-33)
+-158 + j*(408)
+305 + j*(-63)
+-8 + j*(-103)
+565 + j*(250)
+-128 + j*(-51)
+-211 + j*(-122)
+-115 + j*(170)
+42 + j*(-29)
+-99 + j*(-112)
+-30 + j*(-85)
+232 + j*(213)
+282 + j*(-5)
+-86 + j*(113)
+-300 + j*(-236)
+-132 + j*(-146)
+-4 + j*(93)
+99 + j*(215)
+-70 + j*(-24)
+-95 + j*(23)
+-104 + j*(-33)
+237 + j*(-209)
+190 + j*(-75)
+15 + j*(73)
+106 + j*(86)
+3 + j*(-178)
+148 + j*(-86)
+105 + j*(209)
+34 + j*(-276)
+10 + j*(204)
+135 + j*(-187)
+-57 + j*(-210)
+69 + j*(93)
+-7 + j*(487)
+-141 + j*(-340)
+33 + j*(13)
+106 + j*(-265)
+51 + j*(105)
+-247 + j*(-185)
+-168 + j*(-27)
+-46 + j*(-325)
+79 + j*(139)
+-74 + j*(535)
+245 + j*(-96)
+334 + j*(-317)
+-103 + j*(159)
+-204 + j*(-19)
+144 + j*(239)
+36 + j*(-187)
+98 + j*(-91)
+-249 + j*(-33)
+9 + j*(-223)
+326 + j*(-165)
+-135 + j*(-42)
+-125 + j*(-16)
+15 + j*(-2)
+-243 + j*(-287)
+-33 + j*(182)
+-91 + j*(15)
+-81 + j*(-71)
+-194 + j*(-63)
+37 + j*(-23)
+-138 + j*(-11)
+-54 + j*(100)
+50 + j*(31)
+-43 + j*(115)
+-36 + j*(-128)
+153 + j*(-170)
+23 + j*(-226)
+-72 + j*(13)
+130 + j*(-53)
+-259 + j*(93)
+-315 + j*(-78)
+-141 + j*(-96)
+241 + j*(112)
+-54 + j*(159)
+58 + j*(57)
+-355 + j*(63)
+307 + j*(-132)
+192 + j*(88)
+-240 + j*(15)
+-35 + j*(-6)
+123 + j*(291)
+-161 + j*(158)
+34 + j*(-92)
+36 + j*(233)
+302 + j*(-199)
+71 + j*(56)
+-144 + j*(91)
+131 + j*(276)
+-77 + j*(151)
+-110 + j*(214)
+12 + j*(-490)
+-186 + j*(-77)
+308 + j*(84)
+-203 + j*(3)
+113 + j*(-112)
+-222 + j*(-176)
+81 + j*(-112)
+15 + j*(-14)
+-50 + j*(-186)
+144 + j*(-47)
+-120 + j*(-125)
+215 + j*(207)
+-32 + j*(-16)
+-383 + j*(247)
+-96 + j*(81)
+-148 + j*(-11)
+48 + j*(148)
+173 + j*(0)
+79 + j*(390)
+180 + j*(-223)
+274 + j*(40)
+-153 + j*(47)
+-116 + j*(112)
+121 + j*(255)
+198 + j*(176)
+74 + j*(134)
+-170 + j*(168)
+91 + j*(129)
+105 + j*(-324)
+-326 + j*(25)
+-109 + j*(74)
+174 + j*(-59)
+-244 + j*(54)
+-314 + j*(279)
+-145 + j*(213)
+238 + j*(103)
+28 + j*(190)
+46 + j*(-172)
+-28 + j*(-190)
+-122 + j*(-110)
+-112 + j*(-82)
+298 + j*(-21)
+-171 + j*(83)
+99 + j*(16)
+143 + j*(71)
+-141 + j*(-247)
+-214 + j*(-83)
+-9 + j*(14)
+-66 + j*(-51)
+-175 + j*(-115)
+233 + j*(-421)
+117 + j*(54)
+148 + j*(-204)
+-122 + j*(128)
+-4 + j*(20)
+-139 + j*(-47)
+105 + j*(-64)
+21 + j*(-56)
+-144 + j*(-13)
+-238 + j*(-225)
+-97 + j*(139)
+-83 + j*(15)
+45 + j*(80)
+-1 + j*(173)
+260 + j*(141)
+-125 + j*(2)
+117 + j*(100)
+100 + j*(-3)
+255 + j*(-33)
+-214 + j*(-199)
+243 + j*(344)
+85 + j*(158)
+-322 + j*(-165)
+-214 + j*(296)
+-128 + j*(58)
+-74 + j*(-222)
+-25 + j*(-93)
+44 + j*(5)
+-63 + j*(-137)
+-160 + j*(-328)
+29 + j*(12)
+-78 + j*(107)
+142 + j*(238)
+205 + j*(-250)
+-207 + j*(191)
+165 + j*(-142)
+199 + j*(141)
+28 + j*(-93)
+-141 + j*(175)
+-177 + j*(148)
+274 + j*(-18)
+-224 + j*(-92)
+17 + j*(-247)
+265 + j*(-45)
+-121 + j*(134)
+-66 + j*(-78)
+253 + j*(-176)
+-52 + j*(86)
+-156 + j*(13)
+-239 + j*(-81)
+51 + j*(-115)
+-134 + j*(36)
+-83 + j*(-69)
+-117 + j*(78)
+145 + j*(91)
+288 + j*(114)
+6 + j*(136)
+121 + j*(240)
+-60 + j*(37)
+197 + j*(100)
+-275 + j*(78)
+57 + j*(321)
+-260 + j*(170)
+91 + j*(-288)
+-168 + j*(-164)
+-171 + j*(-35)
+-136 + j*(344)
+43 + j*(3)
+-206 + j*(168)
+-343 + j*(124)
+-222 + j*(-301)
+98 + j*(146)
+-30 + j*(-252)
+203 + j*(-21)
+-42 + j*(-90)
+49 + j*(-36)
+-62 + j*(-53)
+-202 + j*(103)
+2 + j*(53)
+95 + j*(297)
+67 + j*(-303)
+183 + j*(-70)
+-399 + j*(74)
+-272 + j*(-213)
+-167 + j*(158)
+68 + j*(-21)
+-180 + j*(77)
+25 + j*(-18)
+-57 + j*(-4)
+136 + j*(-37)
+215 + j*(-322)
+322 + j*(34)
+-122 + j*(-172)
+185 + j*(264)
+-144 + j*(247)
+5 + j*(-125)
+36 + j*(-313)
+189 + j*(5)
+140 + j*(-150)
+7 + j*(69)
+-113 + j*(11)
+190 + j*(368)
+-284 + j*(-105)
+-62 + j*(5)
+-132 + j*(-367)
+-225 + j*(-90)
+50 + j*(-269)
+134 + j*(243)
+-141 + j*(-52)
+-226 + j*(53)
+342 + j*(-53)
+93 + j*(-263)
+-92 + j*(-141)
+125 + j*(162)
+-123 + j*(66)
+42 + j*(49)
+-93 + j*(-114)
+-92 + j*(-310)
+-271 + j*(-95)
+114 + j*(-197)
+322 + j*(158)
+-43 + j*(28)
+-215 + j*(-171)
+173 + j*(204)
+332 + j*(213)
+94 + j*(67)
+328 + j*(23)
+392 + j*(-35)
+155 + j*(-135)
+3 + j*(315)
+-211 + j*(50)
+226 + j*(-136)
+-25 + j*(-26)
+-126 + j*(78)
+-107 + j*(-45)
+24 + j*(227)
+-100 + j*(100)
+260 + j*(22)
+-76 + j*(390)
+-288 + j*(49)
+66 + j*(110)
+-163 + j*(-91)
+-273 + j*(-385)
+28 + j*(-218)
+-231 + j*(156)
+47 + j*(-76)
+75 + j*(-82)
+-43 + j*(133)
+3 + j*(-226)
+-69 + j*(-83)
+231 + j*(-101)
+-290 + j*(-52)
+47 + j*(57)
+-200 + j*(89)
+-70 + j*(265)
+55 + j*(-255)
+-156 + j*(127)
+91 + j*(337)
+-3 + j*(163)
+-129 + j*(-339)
+-16 + j*(167)
+-245 + j*(291)
+-114 + j*(168)
+-84 + j*(-148)
+-7 + j*(-243)
+-47 + j*(-44)
+166 + j*(50)
+227 + j*(-92)
+215 + j*(291)
+149 + j*(35)
+-109 + j*(-145)
+-190 + j*(-100)
+-102 + j*(-8)
+230 + j*(169)
+16 + j*(58)
+133 + j*(-169)
+-16 + j*(291)
+267 + j*(72)
+84 + j*(52)
+-342 + j*(73)
+-101 + j*(228)
+-16 + j*(180)
+-2 + j*(122)
+3 + j*(-344)
+-93 + j*(-185)
+38 + j*(92)
+226 + j*(71)
+390 + j*(-98)
+179 + j*(-201)
+-180 + j*(-31)
+-40 + j*(-165)
+109 + j*(-119)
+105 + j*(-171)
+-322 + j*(313)
+-1 + j*(-18)
+-47 + j*(256)
+282 + j*(-29)
+-383 + j*(-225)
+284 + j*(16)
+81 + j*(244)
+252 + j*(279)
+257 + j*(-23)
+-491 + j*(254)
+-102 + j*(175)
+-46 + j*(269)
+102 + j*(91)
+5 + j*(123)
+55 + j*(69)
+29 + j*(105)
+-197 + j*(4)
+-84 + j*(226)
+-12 + j*(95)
+-57 + j*(-259)
+195 + j*(-243)
+134 + j*(133)
+25 + j*(-165)
+-71 + j*(-205)
+91 + j*(-71)
+-201 + j*(18)
+-135 + j*(-405)
+180 + j*(153)
+323 + j*(276)
+376 + j*(73)
+221 + j*(65)
+-231 + j*(236)
+164 + j*(156)
+238 + j*(97)
+-18 + j*(-199)
+144 + j*(-33)
+-231 + j*(33)
+-23 + j*(154)
+50 + j*(24)
+-145 + j*(-113)
+32 + j*(138)
+110 + j*(-121)
+168 + j*(-242)
+233 + j*(20)
+30 + j*(87)
+115 + j*(-67)
+221 + j*(-12)
+23 + j*(64)
+66 + j*(161)
+-91 + j*(-159)
+-98 + j*(158)
+-73 + j*(49)
+-74 + j*(-26)
+-209 + j*(76)
+280 + j*(88)
+1 + j*(-30)
+474 + j*(136)
+-39 + j*(-202)
+61 + j*(-49)
+-82 + j*(-31)
+-25 + j*(267)
+110 + j*(286)
+-257 + j*(-42)
+288 + j*(-35)
+16 + j*(324)
+449 + j*(-50)
+-169 + j*(190)
+108 + j*(-13)
+-151 + j*(33)
+-21 + j*(119)
+82 + j*(-81)
+132 + j*(-28)
+-413 + j*(-19)
+-295 + j*(-208)
+153 + j*(145)
+-7 + j*(194)
+-110 + j*(-147)
+-145 + j*(-126)
+284 + j*(64)
+-81 + j*(110)
+263 + j*(-72)
+12 + j*(-312)
+-76 + j*(119)
+154 + j*(52)
+138 + j*(109)
+-98 + j*(-220)
+-433 + j*(-9)
+267 + j*(-3)
+-168 + j*(203)
+33 + j*(-329)
+129 + j*(-35)
+-177 + j*(-58)
+-161 + j*(-55)
+-161 + j*(108)
+-168 + j*(320)
+-258 + j*(65)
+-165 + j*(30)
+-131 + j*(-6)
+-98 + j*(25)
+136 + j*(410)
+1 + j*(332)
+6 + j*(117)
+-42 + j*(-151)
+-15 + j*(-139)
+292 + j*(-97)
+208 + j*(-216)
+113 + j*(-93)
+168 + j*(160)
+-261 + j*(88)
+226 + j*(110)
+70 + j*(-298)
+-221 + j*(312)
+54 + j*(101)
+-108 + j*(166)
+306 + j*(162)
+75 + j*(52)
+-129 + j*(-223)
+47 + j*(59)
+235 + j*(75)
+-226 + j*(45)
+238 + j*(91)
+324 + j*(168)
+132 + j*(-354)
+-504 + j*(151)
+234 + j*(112)
+236 + j*(179)
+-25 + j*(-47)
+136 + j*(-141)
+311 + j*(352)
+20 + j*(-145)
+61 + j*(-187)
+146 + j*(-66)
+-111 + j*(-25)
+238 + j*(-6)
+-248 + j*(-57)
+255 + j*(169)
+368 + j*(-76)
+13 + j*(7)
+-101 + j*(33)
+1 + j*(227)
+-243 + j*(-105)
+-4 + j*(59)
+118 + j*(38)
+-23 + j*(57)
+85 + j*(-116)
+-170 + j*(-131)
+-13 + j*(-11)
+49 + j*(-61)
+-37 + j*(294)
+118 + j*(308)
+-120 + j*(-21)
+-232 + j*(-107)
+393 + j*(312)
+25 + j*(76)
+74 + j*(23)
+59 + j*(-136)
+306 + j*(86)
+-260 + j*(-314)
+194 + j*(163)
+-199 + j*(257)
+-175 + j*(-257)
+-232 + j*(13)
+240 + j*(-95)
+-155 + j*(-172)
+361 + j*(-116)
+-132 + j*(-152)
+-110 + j*(71)
+-279 + j*(288)
+-4 + j*(-28)
+-12 + j*(154)
+89 + j*(190)
+104 + j*(42)
+-221 + j*(-151)
+-91 + j*(115)
+162 + j*(-30)
+-471 + j*(-45)
+225 + j*(-34)
+161 + j*(199)
+136 + j*(164)
+-116 + j*(87)
+-48 + j*(195)
+74 + j*(156)
+-23 + j*(7)
+204 + j*(166)
+-150 + j*(1)
+19 + j*(79)
+44 + j*(5)
+-161 + j*(76)
+122 + j*(-240)
+151 + j*(-18)
+-23 + j*(53)
+-227 + j*(97)
+-26 + j*(-221)
+-358 + j*(-142)
+217 + j*(-240)
+-139 + j*(-170)
+39 + j*(202)
+55 + j*(-36)
+122 + j*(-217)
+65 + j*(242)
+23 + j*(13)
+-46 + j*(-73)
+-81 + j*(-328)
+131 + j*(-276)
+-136 + j*(186)
+158 + j*(204)
+100 + j*(-209)
+35 + j*(43)
+4 + j*(43)
+-263 + j*(6)
+-16 + j*(159)
+316 + j*(139)
+336 + j*(-135)
+-201 + j*(-235)
+-13 + j*(-197)
+275 + j*(139)
+-188 + j*(13)
+-152 + j*(-9)
+-61 + j*(-177)
+-369 + j*(-195)
+160 + j*(-98)
+56 + j*(-1)
+-276 + j*(-13)
+112 + j*(-183)
+-231 + j*(206)
+42 + j*(-163)
+76 + j*(-34)
+25 + j*(-84)
+62 + j*(-61)
+-258 + j*(-87)
+-145 + j*(169)
+-240 + j*(289)
+-204 + j*(-272)
+-191 + j*(-68)
+45 + j*(91)
+-124 + j*(46)
+-261 + j*(-18)
+144 + j*(340)
+-24 + j*(216)
+-7 + j*(-41)
+239 + j*(52)
+-292 + j*(-157)
+210 + j*(-414)
+-299 + j*(-11)
+6 + j*(71)
+226 + j*(-406)
+27 + j*(187)
+-72 + j*(-43)
+-115 + j*(-215)
+41 + j*(-39)
+220 + j*(38)
+-158 + j*(-246)
+-24 + j*(-111)
+-69 + j*(126)
+137 + j*(-32)
+-279 + j*(11)
+-98 + j*(-329)
+-38 + j*(68)
+-366 + j*(19)
+-94 + j*(-104)
+197 + j*(-37)
+-93 + j*(34)
+-352 + j*(-19)
+64 + j*(40)
+165 + j*(-195)
+37 + j*(42)
+-177 + j*(-74)
+-194 + j*(-129)
+269 + j*(174)
+55 + j*(-28)
+-56 + j*(-37)
+-309 + j*(-131)
+69 + j*(-18)
+-173 + j*(-9)
+122 + j*(-270)
+64 + j*(-221)
+197 + j*(66)
+-66 + j*(354)
+1 + j*(133)
+-125 + j*(129)
+-255 + j*(-137)
+180 + j*(106)
+-223 + j*(385)
+335 + j*(42)
+-99 + j*(-32)
+182 + j*(91)
+213 + j*(29)
+32 + j*(-33)
+-75 + j*(37)
+-109 + j*(-296)
+134 + j*(99)
+-53 + j*(-76)
+140 + j*(176)
+248 + j*(-379)
+-76 + j*(-151)
+-132 + j*(-22)
+-116 + j*(110)
+-82 + j*(-76)
+-199 + j*(-174)
+118 + j*(240)
+-144 + j*(13)
+-25 + j*(173)
+-230 + j*(-95)
+125 + j*(182)
+-105 + j*(122)
+-101 + j*(195)
+20 + j*(-121)
+35 + j*(-342)
+-119 + j*(-385)
+-188 + j*(-165)
+-252 + j*(-393)
+-269 + j*(-127)
+-31 + j*(-12)
+336 + j*(-78)
+-52 + j*(-105)
+-25 + j*(330)
+11 + j*(149)
+-81 + j*(-163)
+-153 + j*(-223)
+107 + j*(-33)
+-294 + j*(-106)
+-189 + j*(247)
+-218 + j*(-154)
+99 + j*(-35)
+127 + j*(-290)
+404 + j*(-88)
+-135 + j*(268)
+316 + j*(313)
+206 + j*(161)
+-385 + j*(36)
+-17 + j*(266)
+4 + j*(-23)
+-83 + j*(73)
+0 + j*(116)
+160 + j*(199)
+178 + j*(-109)
+-69 + j*(-147)
+125 + j*(59)
+244 + j*(98)
+-146 + j*(197)
+59 + j*(234)
+218 + j*(386)
+23 + j*(-74)
+438 + j*(90)
+259 + j*(55)
+181 + j*(214)
+-38 + j*(-76)
+-182 + j*(55)
+-148 + j*(-138)
+-130 + j*(281)
+125 + j*(-132)
+-90 + j*(-105)
+183 + j*(255)
+-138 + j*(288)
+-165 + j*(-25)
+-207 + j*(427)
+259 + j*(-175)
+147 + j*(-359)
+116 + j*(-28)
+-263 + j*(-146)
+-217 + j*(48)
+9 + j*(-62)
+77 + j*(-11)
+61 + j*(-215)
+35 + j*(66)
+85 + j*(1)
+6 + j*(-23)
+161 + j*(37)
+-124 + j*(280)
+111 + j*(-3)
+26 + j*(233)
+-76 + j*(130)
+15 + j*(-241)
+-78 + j*(-167)
+44 + j*(-25)
+-167 + j*(205)
+-99 + j*(-188)
+-154 + j*(120)
+-61 + j*(11)
+361 + j*(-10)
+236 + j*(-204)
+139 + j*(-104)
+-106 + j*(44)
+-40 + j*(99)
+-1 + j*(-134)
+-148 + j*(30)
+-134 + j*(54)
+-239 + j*(85)
+-275 + j*(-269)
+90 + j*(-83)
+-225 + j*(-148)
+332 + j*(-88)
+-47 + j*(424)
+-128 + j*(78)
+163 + j*(69)
+-175 + j*(88)
+-146 + j*(243)
+308 + j*(25)
+301 + j*(26)
+110 + j*(-218)
+-139 + j*(-78)
+279 + j*(92)
+161 + j*(252)
+-91 + j*(81)
+-100 + j*(11)
+-90 + j*(92)
+-98 + j*(-146)
+404 + j*(216)
+178 + j*(-197)
+-50 + j*(-149)
+165 + j*(-58)
+27 + j*(-303)
+95 + j*(169)
+-108 + j*(52)
+294 + j*(-26)
+-37 + j*(-3)
+-101 + j*(-292)
+187 + j*(250)
+-71 + j*(339)
+42 + j*(-67)
+-66 + j*(50)
+-37 + j*(-90)
+93 + j*(56)
+141 + j*(-18)
+77 + j*(-32)
+74 + j*(28)
+248 + j*(223)
+232 + j*(-345)
+66 + j*(-51)
+42 + j*(49)
+54 + j*(113)
+25 + j*(-40)
+-88 + j*(156)
+52 + j*(-112)
+-214 + j*(325)
+144 + j*(122)
+-170 + j*(147)
+-251 + j*(33)
+-195 + j*(-218)
+433 + j*(224)
+-174 + j*(-269)
+-75 + j*(-378)
+-30 + j*(-155)
+227 + j*(-212)
+-1 + j*(-420)
+-45 + j*(331)
+139 + j*(-228)
+114 + j*(438)
+313 + j*(-54)
+-460 + j*(-39)
+125 + j*(-170)
+222 + j*(-85)
+-127 + j*(-302)
+97 + j*(279)
+114 + j*(121)
+-226 + j*(144)
+69 + j*(10)
+162 + j*(-109)
+206 + j*(-395)
+-243 + j*(-5)
+-86 + j*(294)
+15 + j*(68)
+206 + j*(-216)
+-190 + j*(151)
+-88 + j*(-41)
+44 + j*(202)
+-36 + j*(-110)
+-35 + j*(16)
+-29 + j*(85)
+0 + j*(155)
+-35 + j*(-83)
+221 + j*(-148)
+18 + j*(-342)
+-83 + j*(7)
+-8 + j*(-144)
+9 + j*(-88)
+-103 + j*(-317)
+191 + j*(187)
+-337 + j*(-266)
+-24 + j*(8)
+-515 + j*(-130)
+-129 + j*(142)
+78 + j*(138)
+-70 + j*(264)
+117 + j*(-196)
+214 + j*(263)
+45 + j*(-140)
+127 + j*(-354)
+-16 + j*(-46)
+-6 + j*(-17)
+-69 + j*(-194)
+8 + j*(315)
+52 + j*(119)
+243 + j*(65)
+19 + j*(1)
+-163 + j*(-174)
+124 + j*(-188)
+-438 + j*(25)
+102 + j*(-9)
+88 + j*(-352)
+214 + j*(-132)
+150 + j*(-23)
+-28 + j*(58)
+52 + j*(-147)
+-59 + j*(332)
+-248 + j*(88)
+47 + j*(138)
+210 + j*(-60)
+129 + j*(-173)
+-54 + j*(235)
+-190 + j*(284)
+-74 + j*(142)
+73 + j*(-128)
+-46 + j*(-215)
+126 + j*(328)
+-136 + j*(105)
+-32 + j*(-168)
+-313 + j*(-133)
+59 + j*(-33)
+-39 + j*(158)
+93 + j*(-158)
+-30 + j*(-192)
+119 + j*(21)
+-8 + j*(180)
+177 + j*(-231)
+211 + j*(-264)
+98 + j*(146)
+46 + j*(13)
+-170 + j*(98)
+93 + j*(18)
+-115 + j*(-21)
+-86 + j*(-20)
+76 + j*(325)
+77 + j*(33)
+199 + j*(-40)
+154 + j*(-236)
+-14 + j*(139)
+37 + j*(65)
+-121 + j*(36)
+-206 + j*(247)
+-18 + j*(65)
+573 + j*(148)
+169 + j*(-257)
+-64 + j*(40)
+53 + j*(-59)
+-46 + j*(88)
+-197 + j*(176)
+18 + j*(-134)
+-177 + j*(-109)
+-76 + j*(142)
+252 + j*(-144)
+-2 + j*(-101)
+41 + j*(-153)
+-109 + j*(-24)
+4 + j*(141)
+49 + j*(-73)
+-151 + j*(134)
+-125 + j*(151)
+-78 + j*(272)
+49 + j*(-177)
+-193 + j*(-143)
+-164 + j*(-261)
+29 + j*(-115)
+195 + j*(-140)
+85 + j*(13)
+-86 + j*(27)
+-77 + j*(-128)
+378 + j*(114)
+-436 + j*(49)
+-55 + j*(134)
+-144 + j*(-27)
+99 + j*(315)
+92 + j*(154)
+148 + j*(177)
+93 + j*(83)
+119 + j*(310)
+190 + j*(-248)
+-259 + j*(-248)
+218 + j*(310)
+63 + j*(197)
+226 + j*(81)
+22 + j*(-151)
+60 + j*(-168)
+-285 + j*(231)
+-40 + j*(-78)
+144 + j*(-128)
+-20 + j*(-402)
+66 + j*(-8)
+-71 + j*(17)
+94 + j*(-111)
+-22 + j*(-16)
+128 + j*(-156)
+-212 + j*(324)
+-320 + j*(409)
+-137 + j*(235)
+52 + j*(-438)
+205 + j*(178)
+86 + j*(-149)
+246 + j*(-124)
+129 + j*(-48)
+-23 + j*(72)
+54 + j*(-18)
+-136 + j*(225)
+-134 + j*(198)
+255 + j*(-239)
+-378 + j*(-39)
+-23 + j*(110)
+35 + j*(-124)
+47 + j*(-40)
+177 + j*(-16)
+178 + j*(-54)
+-197 + j*(33)
+141 + j*(-42)
+134 + j*(245)
+68 + j*(101)
+-353 + j*(-16)
+-375 + j*(47)
+129 + j*(-129)
+-75 + j*(-96)
+192 + j*(66)
+116 + j*(41)
+-33 + j*(17)
+103 + j*(81)
+-52 + j*(214)
+132 + j*(59)
+-342 + j*(375)
+-308 + j*(-103)
+-68 + j*(140)
+460 + j*(110)
+-18 + j*(-97)
+551 + j*(-522)
+243 + j*(69)
+534 + j*(264)
+-373 + j*(-374)
+-543 + j*(503)
+292 + j*(223)
+494 + j*(-12)
+-96 + j*(-122)
+600 + j*(-210)
+378 + j*(-357)
+39 + j*(477)
+298 + j*(82)
+-46 + j*(604)
+-197 + j*(28)
+-313 + j*(460)
+-57 + j*(168)
+368 + j*(-167)
+-82 + j*(-532)
+12 + j*(-259)
+-498 + j*(-542)
+567 + j*(190)
+18 + j*(-402)
+675 + j*(32)
+-188 + j*(272)
+778 + j*(51)
+245 + j*(479)
+-82 + j*(-250)
+342 + j*(-177)
+360 + j*(-356)
+279 + j*(286)
+-396 + j*(-656)
+154 + j*(-335)
+-88 + j*(-243)
+327 + j*(-137)
+488 + j*(274)
+322 + j*(-62)
+-43 + j*(507)
+660 + j*(265)
+-264 + j*(81)
+-158 + j*(-299)
+-449 + j*(-491)
+557 + j*(78)
+-6 + j*(-75)
+569 + j*(135)
+478 + j*(-146)
+-92 + j*(-381)
+-289 + j*(170)
+276 + j*(-35)
+-373 + j*(-409)
+-288 + j*(-107)
+173 + j*(-235)
+286 + j*(-235)
+236 + j*(-559)
+52 + j*(164)
+-2 + j*(-477)
+169 + j*(346)
+-322 + j*(-5)
+-154 + j*(151)
+250 + j*(66)
+-477 + j*(79)
+281 + j*(-82)
+214 + j*(-72)
+188 + j*(394)
+146 + j*(-163)
+-297 + j*(292)
+133 + j*(-588)
+648 + j*(-378)
+285 + j*(453)
+377 + j*(-400)
+441 + j*(349)
+388 + j*(-69)
+396 + j*(550)
+-27 + j*(-142)
+446 + j*(361)
+255 + j*(-25)
+138 + j*(-252)
+443 + j*(162)
+471 + j*(-293)
+309 + j*(359)
+187 + j*(178)
+359 + j*(-255)
+-251 + j*(292)
+-246 + j*(-288)
+-402 + j*(427)
+77 + j*(211)
+-254 + j*(364)
+123 + j*(-347)
+-223 + j*(-178)
+-245 + j*(-308)
+392 + j*(192)
+-302 + j*(453)
+-384 + j*(-284)
+-161 + j*(-283)
+117 + j*(-281)
+-272 + j*(274)
+-211 + j*(249)
+-530 + j*(-353)
+204 + j*(471)
+23 + j*(-124)
+-119 + j*(-276)
+-35 + j*(-373)
+443 + j*(-426)
+-23 + j*(-441)
+149 + j*(-441)
+-160 + j*(335)
+224 + j*(-366)
+-166 + j*(81)
+30 + j*(-435)
+213 + j*(-171)
+337 + j*(364)
+-301 + j*(121)
+163 + j*(358)
+-417 + j*(255)
+-170 + j*(-19)
+198 + j*(-239)
+418 + j*(-470)
+187 + j*(225)
+-338 + j*(-273)
+-581 + j*(87)
+167 + j*(-600)
+-685 + j*(414)
+351 + j*(-370)
+6 + j*(-515)
+-279 + j*(-240)
+45 + j*(-40)
+-130 + j*(233)
+-637 + j*(-235)
+-187 + j*(165)
+-135 + j*(386)
+16 + j*(355)
+-219 + j*(8)
+469 + j*(-107)
+71 + j*(108)
+-16 + j*(15)
+-14 + j*(-530)
+-252 + j*(68)
+288 + j*(536)
+288 + j*(-182)
+-478 + j*(-6)
+-134 + j*(151)
+-38 + j*(-388)
+-414 + j*(-317)
+440 + j*(-426)
+-218 + j*(-705)
+-304 + j*(-85)
+-662 + j*(54)
+273 + j*(-4)
+268 + j*(211)
+18 + j*(315)
+141 + j*(292)
+116 + j*(268)
+-253 + j*(146)
+235 + j*(-55)
+-259 + j*(-178)
+-197 + j*(-585)
+-64 + j*(441)
+-271 + j*(-188)
+358 + j*(506)
+13 + j*(-94)
+-339 + j*(-167)
+329 + j*(400)
+50 + j*(-484)
+91 + j*(366)
+-407 + j*(-144)
+-439 + j*(165)
+170 + j*(-325)
+-479 + j*(355)
+237 + j*(-239)
+99 + j*(-355)
+-122 + j*(281)
+515 + j*(148)
+-132 + j*(-269)
+-174 + j*(34)
+11 + j*(-386)
+291 + j*(-351)
+243 + j*(52)
+-300 + j*(129)
+344 + j*(-442)
+-232 + j*(83)
+-10 + j*(2)
+300 + j*(733)
+-139 + j*(28)
+83 + j*(-425)
+-403 + j*(-188)
+-344 + j*(-337)
+345 + j*(144)
+-245 + j*(-193)
+-552 + j*(105)
+433 + j*(-513)
+426 + j*(188)
+12 + j*(385)
+-114 + j*(-211)
+-261 + j*(-512)
+268 + j*(139)
+327 + j*(305)
+309 + j*(-86)
+366 + j*(407)
+-206 + j*(277)
+-81 + j*(319)
+-21 + j*(108)
+33 + j*(-84)
+234 + j*(349)
+-337 + j*(759)
+169 + j*(324)
+-183 + j*(333)
+1 + j*(-487)
+156 + j*(-346)
+240 + j*(-270)
+224 + j*(-426)
+-71 + j*(-328)
+117 + j*(-204)
+79 + j*(-344)
+-361 + j*(113)
+-165 + j*(332)
+-582 + j*(-463)
+504 + j*(204)
+-578 + j*(139)
+-26 + j*(209)
+-121 + j*(378)
+-511 + j*(55)
+156 + j*(-371)
+12 + j*(-390)
+231 + j*(-57)
+11 + j*(-35)
+-498 + j*(-8)
+-465 + j*(-315)
+-45 + j*(-214)
+245 + j*(53)
+-460 + j*(-199)
+-151 + j*(272)
+-453 + j*(-342)
+194 + j*(8)
+-68 + j*(-393)
+-231 + j*(168)
+-364 + j*(-337)
+-414 + j*(-211)
+701 + j*(-303)
+-287 + j*(-534)
+201 + j*(140)
+177 + j*(110)
+-54 + j*(-180)
+-344 + j*(-205)
+280 + j*(53)
+432 + j*(-19)
+376 + j*(99)
+363 + j*(509)
+404 + j*(-474)
+-279 + j*(28)
+-496 + j*(74)
+308 + j*(-384)
+680 + j*(230)
+620 + j*(-209)
+295 + j*(444)
+194 + j*(411)
+-185 + j*(-2)
+546 + j*(317)
+-5 + j*(313)
+-415 + j*(229)
+188 + j*(429)
+247 + j*(617)
+-12 + j*(495)
+175 + j*(312)
+-170 + j*(-268)
+-74 + j*(-233)
+-162 + j*(-310)
+-210 + j*(156)
+395 + j*(-435)
+-184 + j*(268)
+-24 + j*(-264)
+431 + j*(-350)
+-389 + j*(453)
+-98 + j*(-118)
+117 + j*(531)
+-165 + j*(358)
+74 + j*(-362)
+-304 + j*(61)
+-199 + j*(158)
+228 + j*(167)
+397 + j*(170)
+266 + j*(-310)
+450 + j*(93)
+-215 + j*(-63)
+-231 + j*(-31)
+411 + j*(-336)
+443 + j*(173)
+288 + j*(240)
+70 + j*(208)
+-298 + j*(-249)
+349 + j*(279)
+-82 + j*(-6)
+-282 + j*(-40)
+227 + j*(-322)
+93 + j*(695)
+-433 + j*(392)
+65 + j*(-356)
+-249 + j*(250)
+297 + j*(-205)
+107 + j*(363)
+95 + j*(270)
+310 + j*(-12)
+-228 + j*(532)
+111 + j*(78)
+227 + j*(-24)
+141 + j*(-596)
+-252 + j*(409)
+-277 + j*(-249)
+-53 + j*(532)
+-173 + j*(-244)
+519 + j*(402)
+18 + j*(234)
+-135 + j*(307)
+-309 + j*(95)
+-289 + j*(264)
+289 + j*(-284)
+147 + j*(-311)
+-377 + j*(460)
+-298 + j*(549)
+177 + j*(332)
+599 + j*(-378)
+40 + j*(355)
+373 + j*(121)
+-266 + j*(-45)
+-85 + j*(-47)
+-186 + j*(-18)
+-8 + j*(-195)
+409 + j*(-610)
+34 + j*(502)
+-576 + j*(78)
+298 + j*(164)
+409 + j*(-331)
+506 + j*(-433)
+460 + j*(-700)
+-84 + j*(269)
+-303 + j*(375)
+-5 + j*(-106)
+30 + j*(85)
+296 + j*(361)
+-179 + j*(-178)
+-477 + j*(-308)
+-141 + j*(-696)
+-149 + j*(398)
+392 + j*(431)
+-300 + j*(206)
+-248 + j*(515)
+462 + j*(217)
+253 + j*(244)
+164 + j*(-196)
+308 + j*(-40)
+28 + j*(124)
+-172 + j*(-233)
+471 + j*(-272)
+332 + j*(445)
+-217 + j*(200)
+-307 + j*(-209)
+503 + j*(207)
+499 + j*(378)
+-203 + j*(87)
+-273 + j*(438)
+170 + j*(364)
+384 + j*(-122)
+291 + j*(-509)
+-74 + j*(422)
+-571 + j*(126)
+76 + j*(264)
+-383 + j*(-128)
+333 + j*(-436)
+-105 + j*(-313)
+260 + j*(-61)
+404 + j*(465)
+-172 + j*(363)
+-225 + j*(-317)
+185 + j*(-140)
+132 + j*(40)
+-199 + j*(-365)
+470 + j*(-37)
+89 + j*(-250)
+-94 + j*(256)
+0 + j*(397)
+-326 + j*(531)
+-245 + j*(-2)
+-105 + j*(-4)
+100 + j*(274)
+-392 + j*(-227)
+-274 + j*(173)
+-93 + j*(-418)
+646 + j*(214)
+-568 + j*(-668)
+582 + j*(16)
+-129 + j*(-274)
+272 + j*(226)
+-8 + j*(-176)
+351 + j*(387)
+467 + j*(194)
+-225 + j*(166)
+-40 + j*(-489)
+82 + j*(-408)
+-168 + j*(268)
+-28 + j*(-298)
+-503 + j*(-358)
+94 + j*(-250)
+564 + j*(41)
+-468 + j*(-158)
+331 + j*(311)
+303 + j*(-211)
+185 + j*(-366)
+-262 + j*(171)
+-165 + j*(-372)
+-414 + j*(-305)
+-334 + j*(-371)
+-62 + j*(26)
+141 + j*(208)
+250 + j*(347)
+-256 + j*(-16)
+-501 + j*(552)
+452 + j*(-195)
+-239 + j*(-151)
+-426 + j*(-532)
+10 + j*(-282)
+-412 + j*(414)
+-482 + j*(-233)
+-321 + j*(256)
+-124 + j*(32)
+409 + j*(-373)
+-568 + j*(-613)
+-311 + j*(306)
+-81 + j*(-678)
+432 + j*(-555)
+-374 + j*(376)
+231 + j*(-211)
+404 + j*(-189)
+191 + j*(403)
+511 + j*(-279)
+-544 + j*(202)
+136 + j*(-401)
+363 + j*(-269)
+-499 + j*(-64)
+385 + j*(549)
+243 + j*(250)
+-209 + j*(393)
+-231 + j*(-198)
+272 + j*(-286)
+133 + j*(-260)
+-366 + j*(-317)
+-76 + j*(25)
+-270 + j*(255)
+-267 + j*(118)
+-217 + j*(-233)
+313 + j*(370)
+282 + j*(-179)
+-513 + j*(120)
+-118 + j*(-400)
+286 + j*(-403)
+-231 + j*(133)
+-175 + j*(-118)
+-161 + j*(-173)
+-118 + j*(411)
+-51 + j*(-93)
+-542 + j*(16)
+233 + j*(-422)
+-13 + j*(-86)
+345 + j*(-467)
+-296 + j*(-259)
+-23 + j*(-313)
+74 + j*(476)
+182 + j*(-244)
+-266 + j*(-231)
+-251 + j*(-226)
+-395 + j*(-360)
+-156 + j*(550)
+217 + j*(163)
+-486 + j*(433)
+-281 + j*(248)
+-65 + j*(67)
+232 + j*(-296)
+-383 + j*(-46)
+403 + j*(99)
+210 + j*(-325)
+-217 + j*(-564)
+-328 + j*(169)
+-196 + j*(132)
+-624 + j*(225)
+-480 + j*(200)
+-418 + j*(307)
+367 + j*(-327)
+-365 + j*(-371)
+422 + j*(-177)
+296 + j*(-316)
+-284 + j*(-382)
+414 + j*(163)
+-542 + j*(-593)
+332 + j*(40)
+-100 + j*(368)
+355 + j*(-380)
+542 + j*(-166)
+63 + j*(267)
+-427 + j*(293)
+-83 + j*(206)
+-610 + j*(45)
+348 + j*(-95)
+469 + j*(-153)
+235 + j*(-150)
+-285 + j*(380)
+-399 + j*(-140)
+247 + j*(-107)
+-556 + j*(472)
+-168 + j*(-3)
+-204 + j*(-325)
+590 + j*(303)
+-222 + j*(228)
+200 + j*(233)
+524 + j*(-117)
+-57 + j*(257)
+-405 + j*(-373)
+-441 + j*(-124)
+16 + j*(374)
+306 + j*(-499)
+-36 + j*(-2)
+-103 + j*(-356)
+378 + j*(214)
+-361 + j*(-255)
+-180 + j*(328)
+-267 + j*(-305)
+204 + j*(-63)
+45 + j*(-543)
+-134 + j*(-142)
+321 + j*(508)
+-412 + j*(549)
+-240 + j*(182)
+-353 + j*(177)
+-138 + j*(-158)
+165 + j*(-395)
+234 + j*(-400)
+-256 + j*(373)
+37 + j*(-249)
+69 + j*(-151)
+-211 + j*(-291)
+-209 + j*(-90)
+-366 + j*(-367)
+555 + j*(-146)
+-202 + j*(-583)
+-280 + j*(-259)
+264 + j*(-309)
+595 + j*(80)
+-318 + j*(-107)
+-306 + j*(96)
+128 + j*(-289)
+149 + j*(65)
+265 + j*(-255)
+-399 + j*(-277)
+325 + j*(-206)
+-368 + j*(122)
+306 + j*(-187)
+-261 + j*(329)
+-223 + j*(-4)
+443 + j*(477)
+-476 + j*(403)
+112 + j*(-310)
+-124 + j*(93)
+-25 + j*(-349)
+404 + j*(-98)
+-134 + j*(328)
+-289 + j*(-192)
+151 + j*(137)
+431 + j*(301)
+-76 + j*(-70)
+-161 + j*(-161)
+-590 + j*(-261)
+276 + j*(291)
+232 + j*(-365)
+-383 + j*(-45)
+409 + j*(-97)
+-266 + j*(366)
+433 + j*(-146)
+-308 + j*(18)
+238 + j*(80)
+-52 + j*(299)
+-250 + j*(499)
+-395 + j*(358)
+-83 + j*(-467)
+173 + j*(284)
+43 + j*(-25)
+97 + j*(293)
+-46 + j*(578)
+245 + j*(-372)
+-127 + j*(197)
+-59 + j*(-461)
+301 + j*(358)
+-95 + j*(205)
+-132 + j*(260)
+-337 + j*(286)
+-215 + j*(-344)
+-224 + j*(256)
+748 + j*(-341)
+402 + j*(-316)
+264 + j*(-693)
+18 + j*(115)
+127 + j*(-64)
+-18 + j*(-102)
+-95 + j*(-594)
+385 + j*(72)
+73 + j*(11)
+-237 + j*(58)
+-177 + j*(-98)
+117 + j*(-21)
+-536 + j*(173)
+231 + j*(89)
+-290 + j*(-238)
+176 + j*(-135)
+-293 + j*(50)
+112 + j*(33)
+73 + j*(-214)
+89 + j*(-269)
+62 + j*(6)
+-204 + j*(9)
+49 + j*(17)
+21 + j*(91)
+-170 + j*(49)
+-112 + j*(-310)
+-247 + j*(168)
+-28 + j*(221)
+98 + j*(-145)
+234 + j*(33)
+-22 + j*(-23)
+-81 + j*(148)
+69 + j*(117)
+-144 + j*(-127)
+-62 + j*(4)
+76 + j*(149)
+76 + j*(-45)
+-6 + j*(61)
+75 + j*(95)
+-105 + j*(-210)
+-378 + j*(-561)
+-334 + j*(86)
+309 + j*(-91)
+309 + j*(-67)
+190 + j*(-124)
+91 + j*(23)
+8 + j*(-58)
+-235 + j*(-55)
+57 + j*(-322)
+-93 + j*(133)
+-189 + j*(-179)
+278 + j*(-37)
+177 + j*(14)
+-4 + j*(-166)
+-71 + j*(-71)
+310 + j*(-178)
+107 + j*(-23)
+153 + j*(55)
+-146 + j*(350)
+17 + j*(70)
+-94 + j*(180)
+-69 + j*(181)
+-124 + j*(-424)
+-75 + j*(117)
+-124 + j*(-28)
+-194 + j*(-111)
+45 + j*(58)
+12 + j*(-58)
+197 + j*(-82)
+212 + j*(32)
+144 + j*(179)
+-9 + j*(56)
+-200 + j*(-328)
+-64 + j*(70)
+-48 + j*(332)
+-71 + j*(-75)
+-189 + j*(-15)
+35 + j*(143)
+-3 + j*(148)
+-158 + j*(-24)
+-69 + j*(165)
+74 + j*(73)
+149 + j*(-45)
+-30 + j*(-211)
+-195 + j*(158)
+-147 + j*(272)
+69 + j*(-50)
+-73 + j*(54)
+-309 + j*(-164)
+-44 + j*(-103)
+-401 + j*(132)
+-271 + j*(104)
+-269 + j*(-28)
+-303 + j*(267)
+-21 + j*(281)
+-47 + j*(34)
+-164 + j*(-165)
+-110 + j*(241)
+-37 + j*(62)
+-40 + j*(-134)
+2 + j*(19)
+241 + j*(-375)
+-301 + j*(-67)
+204 + j*(-37)
+303 + j*(-142)
+-8 + j*(184)
+60 + j*(-178)
+-158 + j*(238)
+223 + j*(-71)
+63 + j*(-277)
+144 + j*(-3)
+-375 + j*(-45)
+-186 + j*(6)
+-36 + j*(-61)
+46 + j*(-59)
+-22 + j*(191)
+-127 + j*(84)
+-202 + j*(-13)
+519 + j*(253)
+-378 + j*(129)
+16 + j*(176)
+14 + j*(66)
+-198 + j*(341)
+-16 + j*(-180)
+16 + j*(54)
+42 + j*(49)
+116 + j*(127)
+60 + j*(-39)
+-100 + j*(-65)
+94 + j*(-66)
+126 + j*(150)
+396 + j*(-101)
+-228 + j*(-126)
+188 + j*(-42)
+-88 + j*(-210)
+-1 + j*(-69)
+132 + j*(85)
+-140 + j*(28)
+-165 + j*(162)
+-105 + j*(129)
+-69 + j*(-122)
+-130 + j*(-45)
+-35 + j*(-15)
+-217 + j*(63)
+24 + j*(-269)
+67 + j*(103)
+-230 + j*(-104)
+74 + j*(-202)
+-48 + j*(-80)
+-175 + j*(-81)
+-118 + j*(-93)
+-151 + j*(-15)
+300 + j*(-88)
+-107 + j*(-209)
+113 + j*(52)
+3 + j*(162)
+-64 + j*(-366)
+-180 + j*(-201)
+291 + j*(65)
+56 + j*(-347)
+-21 + j*(28)
+99 + j*(154)
+119 + j*(5)
+-18 + j*(-43)
+101 + j*(-66)
+279 + j*(-172)
+210 + j*(-234)
+119 + j*(-100)
+4 + j*(-65)
+-221 + j*(-33)
+177 + j*(33)
+289 + j*(240)
+-134 + j*(261)
+-474 + j*(50)
+274 + j*(-269)
+79 + j*(-84)
+-164 + j*(63)
+-103 + j*(151)
+25 + j*(299)
+87 + j*(67)
+-302 + j*(93)
+378 + j*(22)
+230 + j*(-15)
+70 + j*(-76)
+74 + j*(-161)
+-108 + j*(46)
+52 + j*(-183)
+-117 + j*(20)
+351 + j*(-247)
+169 + j*(115)
+143 + j*(-125)
+122 + j*(-360)
+173 + j*(199)
+337 + j*(-138)
+-255 + j*(-175)
+76 + j*(108)
+256 + j*(-67)
+184 + j*(-215)
+103 + j*(303)
+244 + j*(-360)
+-130 + j*(-75)
+98 + j*(-192)
+-126 + j*(244)
+249 + j*(-49)
+331 + j*(-116)
+-232 + j*(-227)
+205 + j*(50)
+-46 + j*(156)
+274 + j*(153)
+-392 + j*(-40)
+-111 + j*(-1)
+45 + j*(-269)
+138 + j*(22)
+238 + j*(172)
+-24 + j*(-80)
+160 + j*(-28)
+-56 + j*(280)
+-26 + j*(-56)
+73 + j*(42)
+360 + j*(29)
+142 + j*(-410)
+-126 + j*(107)
+-134 + j*(288)
+42 + j*(414)
+-83 + j*(-246)
+170 + j*(19)
+1 + j*(-26)
+-31 + j*(-13)
+113 + j*(40)
+82 + j*(145)
+139 + j*(362)
+-89 + j*(122)
+-133 + j*(-552)
+-269 + j*(-70)
+-29 + j*(-21)
+-161 + j*(-243)
+-134 + j*(-10)
+16 + j*(117)
+13 + j*(-63)
+-160 + j*(252)
+-27 + j*(77)
+-252 + j*(-119)
+-65 + j*(167)
+-71 + j*(259)
+62 + j*(-130)
+-223 + j*(117)
+-58 + j*(-50)
+132 + j*(-72)
+21 + j*(157)
+56 + j*(-150)
+-171 + j*(-102)
+-42 + j*(106)
+-66 + j*(21)
+-83 + j*(119)
+158 + j*(252)
+-252 + j*(-111)
+-47 + j*(92)
+46 + j*(-76)
+-199 + j*(39)
+-5 + j*(-91)
+-65 + j*(-152)
+308 + j*(-76)
+36 + j*(276)
+-144 + j*(-122)
+382 + j*(330)
+212 + j*(-305)
+-23 + j*(-304)
+-19 + j*(117)
+150 + j*(-267)
+-317 + j*(-182)
+-100 + j*(33)
+-23 + j*(92)
+-258 + j*(-35)
+70 + j*(-20)
+-83 + j*(-13)
+138 + j*(98)
+301 + j*(-17)
+448 + j*(289)
+126 + j*(176)
+284 + j*(12)
+-176 + j*(-56)
+320 + j*(144)
+-188 + j*(-220)
+-7 + j*(-40)
+164 + j*(-198)
+23 + j*(148)
+260 + j*(184)
+-187 + j*(-52)
+-47 + j*(146)
+-234 + j*(-148)
+66 + j*(141)
+243 + j*(-199)
+-21 + j*(-17)
+178 + j*(42)
+204 + j*(93)
+106 + j*(135)
+14 + j*(88)
+135 + j*(-242)
+-35 + j*(-99)
+-186 + j*(-61)
+-167 + j*(-122)
+-21 + j*(-138)
+-41 + j*(-13)
+-83 + j*(-98)
+343 + j*(-217)
+180 + j*(-9)
+-476 + j*(-114)
+-110 + j*(-219)
+-272 + j*(211)
+-47 + j*(-130)
+-395 + j*(-134)
+-200 + j*(54)
+-107 + j*(-376)
+47 + j*(298)
+84 + j*(-206)
+-355 + j*(115)
+42 + j*(147)
+211 + j*(119)
+18 + j*(-42)
+-173 + j*(77)
+-40 + j*(259)
+-168 + j*(193)
+-167 + j*(-274)
+-182 + j*(-132)
+45 + j*(124)
+351 + j*(-177)
+170 + j*(-41)
+44 + j*(90)
+183 + j*(-95)
+-361 + j*(60)
+-24 + j*(-53)
+122 + j*(-78)
+-129 + j*(-28)
+-160 + j*(92)
+35 + j*(83)
+-105 + j*(41)
+-86 + j*(-101)
+-228 + j*(120)
+-27 + j*(-172)
+36 + j*(221)
+58 + j*(217)
+91 + j*(-128)
+-58 + j*(-247)
+-78 + j*(270)
+221 + j*(-192)
+267 + j*(66)
+115 + j*(48)
+200 + j*(33)
+155 + j*(-253)
+172 + j*(93)
+260 + j*(-219)
+241 + j*(-64)
+21 + j*(309)
+37 + j*(-251)
+238 + j*(-236)
+-4 + j*(121)
+38 + j*(-204)
+-116 + j*(-143)
+349 + j*(137)
+60 + j*(23)
+174 + j*(-243)
+169 + j*(-221)
+-192 + j*(-170)
+124 + j*(-182)
+43 + j*(-52)
+209 + j*(223)
+146 + j*(172)
+-155 + j*(64)
+28 + j*(129)
+-118 + j*(232)
+79 + j*(-8)
+-294 + j*(40)
+-414 + j*(-79)
+45 + j*(234)
+50 + j*(23)
+-139 + j*(61)
+40 + j*(41)
+88 + j*(-35)
+94 + j*(11)
+-35 + j*(-146)
+54 + j*(117)
+-107 + j*(5)
+-321 + j*(-30)
+-190 + j*(-89)
+227 + j*(90)
+-72 + j*(-39)
+-107 + j*(-324)
+-117 + j*(71)
+-33 + j*(99)
+-82 + j*(-171)
+75 + j*(-69)
+33 + j*(151)
+-106 + j*(-52)
+35 + j*(-5)
+-141 + j*(441)
+48 + j*(62)
+5 + j*(36)
+2 + j*(136)
+24 + j*(303)
+-137 + j*(-233)
+-249 + j*(241)
+53 + j*(-79)
+92 + j*(-265)
+98 + j*(210)
+-89 + j*(166)
+-18 + j*(-91)
+-62 + j*(-67)
+74 + j*(-53)
+91 + j*(-283)
+330 + j*(77)
+-16 + j*(-185)
+293 + j*(47)
+-54 + j*(66)
+17 + j*(28)
+-34 + j*(49)
+190 + j*(-28)
+-161 + j*(287)
+-99 + j*(187)
+5 + j*(34)
+21 + j*(116)
+-105 + j*(335)
+-28 + j*(-32)
+-74 + j*(-55)
+148 + j*(69)
+37 + j*(-168)
+-233 + j*(42)
+-66 + j*(-16)
+115 + j*(-319)
+81 + j*(-20)
+120 + j*(180)
+114 + j*(346)
+61 + j*(-107)
+143 + j*(-15)
+70 + j*(-122)
+-119 + j*(-272)
+-39 + j*(129)
+-163 + j*(103)
+76 + j*(169)
+-243 + j*(-21)
+-145 + j*(-156)
+-211 + j*(-214)
+127 + j*(340)
+79 + j*(-57)
+-16 + j*(-45)
+-24 + j*(87)
+161 + j*(52)
+-282 + j*(212)
+-62 + j*(91)
+-44 + j*(-33)
+81 + j*(151)
+69 + j*(68)
+237 + j*(-74)
+-132 + j*(260)
+143 + j*(-132)
+-11 + j*(-6)
+-49 + j*(88)
+-28 + j*(138)
+-341 + j*(6)
+231 + j*(35)
+88 + j*(81)
+-4 + j*(-156)
+296 + j*(79)
+-458 + j*(51)
+35 + j*(-387)
+-32 + j*(-234)
+88 + j*(-45)
+-173 + j*(-64)
+-33 + j*(-172)
+-204 + j*(-99)
+-202 + j*(228)
+105 + j*(-313)
+-60 + j*(-256)
+-104 + j*(-276)
+222 + j*(-34)
+-1 + j*(-357)
+-98 + j*(-369)
+-129 + j*(-107)
+344 + j*(312)
+-262 + j*(249)
+108 + j*(-228)
+364 + j*(-30)
+-10 + j*(83)
+-187 + j*(23)
+330 + j*(249)
+57 + j*(124)
+317 + j*(-185)
+-100 + j*(34)
+225 + j*(82)
+-36 + j*(-7)
+-25 + j*(71)
+-90 + j*(-27)
+-132 + j*(155)
+-106 + j*(-190)
+-29 + j*(403)
+-35 + j*(209)
+66 + j*(-105)
+137 + j*(-29)
+84 + j*(238)
+-1 + j*(-75)
+-158 + j*(-138)
+-120 + j*(349)
+-66 + j*(-279)
+127 + j*(-31)
+-247 + j*(42)
+186 + j*(-256)
+-69 + j*(-107)
+60 + j*(280)
+237 + j*(190)
+-161 + j*(47)
+-104 + j*(173)
+29 + j*(11)
+59 + j*(177)
+-43 + j*(-9)
+-207 + j*(248)
+115 + j*(-81)
+-122 + j*(57)
+20 + j*(-103)
+-25 + j*(-41)
+-13 + j*(66)
+-169 + j*(23)
+16 + j*(-243)
+-83 + j*(-59)
+121 + j*(-153)
+-38 + j*(-99)
+269 + j*(252)
+303 + j*(-616)
+-87 + j*(218)
+-23 + j*(-52)
+286 + j*(147)
+-146 + j*(28)
+185 + j*(88)
+181 + j*(88)
+58 + j*(300)
+-59 + j*(-236)
+-152 + j*(-32)
+-132 + j*(-127)
+-42 + j*(62)
+200 + j*(-16)
+178 + j*(87)
+-10 + j*(-289)
+85 + j*(-192)
+373 + j*(92)
+-641 + j*(26)
+-253 + j*(-136)
+-87 + j*(38)
+7 + j*(-527)
+79 + j*(-31)
+10 + j*(76)
+235 + j*(-160)
+78 + j*(-93)
+346 + j*(-32)
+45 + j*(-271)
+-30 + j*(269)
+180 + j*(-45)
+-39 + j*(125)
+-256 + j*(206)
+-24 + j*(-163)
+98 + j*(317)
+-194 + j*(-140)
+-76 + j*(-12)
+523 + j*(-112)
+392 + j*(28)
+58 + j*(-8)
+-118 + j*(-94)
+-129 + j*(17)
+-217 + j*(18)
+200 + j*(34)
+-261 + j*(-148)
+43 + j*(284)
+-160 + j*(16)
+332 + j*(67)
+36 + j*(-7)
+324 + j*(-185)
+-134 + j*(-88)
+-43 + j*(-363)
+161 + j*(-263)
+-59 + j*(-300)
+-127 + j*(164)
+-178 + j*(123)
+-146 + j*(44)
+-39 + j*(-35)
+-131 + j*(-76)
+-23 + j*(-384)
+-112 + j*(-11)
+86 + j*(177)
+127 + j*(107)
+-75 + j*(-81)
+198 + j*(50)
+24 + j*(-1)
+-17 + j*(78)
+-223 + j*(-136)
+257 + j*(152)
+-81 + j*(81)
+-128 + j*(255)
+-16 + j*(201)
+16 + j*(187)
+-143 + j*(-303)
+-144 + j*(-173)
+95 + j*(-123)
+-264 + j*(177)
+449 + j*(-10)
+65 + j*(21)
+-348 + j*(129)
+-72 + j*(-158)
+-283 + j*(43)
+59 + j*(-156)
+113 + j*(20)
+-1 + j*(115)
+201 + j*(25)
+-91 + j*(-21)
+46 + j*(140)
+-54 + j*(-143)
+71 + j*(-136)
+-296 + j*(-75)
+-202 + j*(293)
+-51 + j*(202)
+-33 + j*(88)
+231 + j*(-65)
+165 + j*(23)
+-1 + j*(165)
+-47 + j*(51)
+-4 + j*(-314)
+-141 + j*(-169)
+53 + j*(-211)
+89 + j*(204)
+-105 + j*(-218)
+61 + j*(-53)
+-143 + j*(-284)
+-11 + j*(-369)
+-54 + j*(-280)
+189 + j*(250)
+-209 + j*(-136)
+-65 + j*(-126)
+25 + j*(168)
+-137 + j*(165)
+41 + j*(-85)
+76 + j*(231)
+-229 + j*(-282)
+45 + j*(122)
+-92 + j*(66)
+-80 + j*(-161)
+57 + j*(-59)
+-95 + j*(-53)
+-37 + j*(-35)
+-20 + j*(103)
+-124 + j*(-59)
+-75 + j*(21)
+-260 + j*(-112)
+132 + j*(-57)
+183 + j*(6)
+243 + j*(-146)
+102 + j*(384)
+-172 + j*(-175)
+21 + j*(-363)
+192 + j*(-266)
+52 + j*(-297)
+-293 + j*(155)
+58 + j*(-263)
+207 + j*(14)
+62 + j*(-169)
+-152 + j*(250)
+46 + j*(-74)
+95 + j*(-74)
+-75 + j*(147)
+29 + j*(8)
+-140 + j*(-167)
+206 + j*(-33)
+249 + j*(168)
+47 + j*(38)
+72 + j*(-209)
+52 + j*(32)
+123 + j*(294)
+316 + j*(-170)
+-91 + j*(-158)
+-132 + j*(-92)
+124 + j*(127)
+215 + j*(110)
+95 + j*(141)
+-309 + j*(-30)
+231 + j*(-153)
+165 + j*(-54)
+71 + j*(-115)
+-250 + j*(-105)
+-8 + j*(-131)
+251 + j*(214)
+-199 + j*(-33)
+92 + j*(-49)
+86 + j*(187)
+-441 + j*(-16)
+303 + j*(46)
+163 + j*(-116)
+6 + j*(45)
+-53 + j*(209)
+97 + j*(202)
+371 + j*(-264)
+-113 + j*(-148)
+-70 + j*(-216)
+-23 + j*(123)
+-88 + j*(91)
+-146 + j*(96)
+45 + j*(-79)
+-67 + j*(-41)
+51 + j*(-138)
+-203 + j*(-65)
+-193 + j*(214)
+91 + j*(187)
+-246 + j*(-214)
+-300 + j*(153)
+21 + j*(-79)
+-18 + j*(-130)
+-165 + j*(256)
+88 + j*(182)
+-160 + j*(105)
+120 + j*(-272)
+440 + j*(327)
+98 + j*(3)
+-104 + j*(107)
+215 + j*(84)
+398 + j*(-12)
+146 + j*(32)
+343 + j*(6)
+-522 + j*(284)
+105 + j*(8)
+112 + j*(41)
+-263 + j*(84)
+-36 + j*(-168)
+45 + j*(90)
+-111 + j*(-188)
+1 + j*(83)
+-159 + j*(40)
+-345 + j*(59)
+-17 + j*(-190)
+-84 + j*(134)
+201 + j*(-206)
+46 + j*(-110)
+136 + j*(-88)
+144 + j*(92)
+-11 + j*(-25)
+-102 + j*(233)
+-190 + j*(285)
+50 + j*(123)
+112 + j*(102)
+72 + j*(387)
+14 + j*(-137)
+33 + j*(111)
+-60 + j*(-201)
+-86 + j*(118)
+52 + j*(259)
+52 + j*(28)
+73 + j*(-199)
+284 + j*(215)
+296 + j*(-136)
+-103 + j*(146)
+1 + j*(49)
+120 + j*(-55)
+38 + j*(187)
+-581 + j*(158)
+163 + j*(-325)
+-129 + j*(-29)
+257 + j*(113)
+135 + j*(250)
+-246 + j*(-14)
+-285 + j*(78)
+-181 + j*(-91)
+311 + j*(0)
+75 + j*(68)
+18 + j*(-100)
+144 + j*(43)
+324 + j*(95)
+-107 + j*(69)
+-133 + j*(-156)
+-203 + j*(-366)
+-245 + j*(-175)
+72 + j*(39)
+-6 + j*(-11)
+-67 + j*(179)
+-26 + j*(-18)
+-271 + j*(375)
+-201 + j*(-147)
+-57 + j*(-52)
+139 + j*(-216)
+-93 + j*(54)
+100 + j*(373)
+-148 + j*(33)
+-171 + j*(-137)
+-43 + j*(98)
+-4 + j*(-42)
+-115 + j*(213)
+22 + j*(-251)
+-165 + j*(16)
+-177 + j*(-170)
+-275 + j*(184)
+-153 + j*(-170)
+-73 + j*(-168)
+11 + j*(130)
+48 + j*(121)
+173 + j*(125)
+1 + j*(37)
+66 + j*(321)
+365 + j*(-200)
+240 + j*(107)
+231 + j*(-123)
+-115 + j*(41)
+-211 + j*(16)
+-192 + j*(-125)
+-108 + j*(50)
+-66 + j*(-6)
+-8 + j*(-118)
+81 + j*(68)
+372 + j*(-31)
+-280 + j*(66)
+105 + j*(16)
+-97 + j*(-85)
+-175 + j*(-276)
+-52 + j*(204)
+-220 + j*(64)
+-22 + j*(-260)
+-138 + j*(88)
+-86 + j*(-236)
+0 + j*(13)
+40 + j*(-56)
+-161 + j*(-40)
+-106 + j*(-194)
+-265 + j*(-81)
+86 + j*(83)
+-48 + j*(7)
+127 + j*(-83)
+218 + j*(-228)
+155 + j*(88)
+-195 + j*(288)
+-69 + j*(-33)
+-122 + j*(36)
+-195 + j*(-75)
+-36 + j*(127)
+-54 + j*(119)
+95 + j*(-52)
+18 + j*(-72)
+-44 + j*(-35)
+39 + j*(105)
+109 + j*(-2)
+-190 + j*(79)
+171 + j*(301)
+67 + j*(-164)
+93 + j*(-250)
+383 + j*(30)
+-233 + j*(148)
+64 + j*(25)
+-22 + j*(-25)
+73 + j*(160)
+457 + j*(196)
+-23 + j*(6)
+154 + j*(35)
+-78 + j*(-95)
+18 + j*(-118)
+-17 + j*(100)
+125 + j*(-159)
+-107 + j*(47)
+18 + j*(342)
+-83 + j*(-453)
+411 + j*(157)
+83 + j*(-192)
+143 + j*(-182)
+-266 + j*(-77)
+124 + j*(-392)
+94 + j*(-190)
+-200 + j*(261)
+-146 + j*(-107)
+80 + j*(-24)
+-113 + j*(57)
+-4 + j*(87)
+78 + j*(32)
+-257 + j*(-225)
+252 + j*(98)
+121 + j*(222)
+20 + j*(15)
+-233 + j*(-42)
+-76 + j*(-408)
+-141 + j*(40)
+146 + j*(-282)
+52 + j*(-11)
+88 + j*(-210)
+93 + j*(157)
+112 + j*(270)
+45 + j*(34)
+3 + j*(-139)
+20 + j*(197)
+86 + j*(-23)
+-154 + j*(-133)
+98 + j*(-40)
+-356 + j*(-88)
+-159 + j*(-144)
+235 + j*(289)
+7 + j*(-182)
+-52 + j*(-290)
+589 + j*(-199)
+-26 + j*(-64)
+14 + j*(-146)
+-436 + j*(45)
+-8 + j*(339)
+-64 + j*(-50)
+-325 + j*(53)
+83 + j*(223)
+-16 + j*(-254)
+192 + j*(-69)
+251 + j*(-84)
+228 + j*(8)
+114 + j*(163)
+-55 + j*(84)
+10 + j*(-61)
+193 + j*(84)
+-214 + j*(-66)
+-49 + j*(69)
+-231 + j*(-11)
+-22 + j*(-81)
+-199 + j*(90)
+264 + j*(138)
+-331 + j*(71)
+132 + j*(122)
+147 + j*(7)
+-77 + j*(-69)
+86 + j*(-34)
+-98 + j*(143)
+-408 + j*(153)
+243 + j*(32)
+-192 + j*(45)
+210 + j*(-25)
+2 + j*(16)
+-516 + j*(-149)
+80 + j*(-56)
+-145 + j*(54)
+108 + j*(8)
+-151 + j*(59)
+-255 + j*(200)
+28 + j*(30)
+-170 + j*(-214)
+-14 + j*(14)
+221 + j*(3)
+-190 + j*(-98)
+-173 + j*(-229)
+-131 + j*(-164)
+313 + j*(-194)
+97 + j*(112)
+222 + j*(-268)
+13 + j*(-59)
+117 + j*(-142)
+172 + j*(-177)
+67 + j*(221)
+-87 + j*(-32)
+-144 + j*(93)
+-135 + j*(-286)
+385 + j*(-101)
+-86 + j*(202)
+-149 + j*(127)
+-56 + j*(195)
+-2 + j*(-35)
+-5 + j*(-182)
+195 + j*(170)
+202 + j*(-215)
+-213 + j*(-109)
+101 + j*(-176)
+255 + j*(-240)
+-86 + j*(214)
+-165 + j*(-35)
+242 + j*(-112)
+-18 + j*(-156)
+81 + j*(-96)
+-4 + j*(120)
+-97 + j*(8)
+217 + j*(195)
+256 + j*(-281)
+71 + j*(-104)
+-125 + j*(153)
+-89 + j*(86)
+-69 + j*(210)
+-45 + j*(4)
+445 + j*(-89)
+-50 + j*(-165)
+-212 + j*(58)
+405 + j*(202)
+153 + j*(383)
+-74 + j*(199)
+317 + j*(-228)
+-6 + j*(-18)
+24 + j*(-126)
+234 + j*(141)
+-113 + j*(-23)
+128 + j*(80)
+202 + j*(194)
+52 + j*(110)
+-8 + j*(-151)
+-58 + j*(132)
+-171 + j*(115)
+54 + j*(49)
+-151 + j*(-103)
+132 + j*(-243)
+276 + j*(-27)
+-361 + j*(-115)
+-150 + j*(84)
+-148 + j*(-176)
+-145 + j*(82)
+219 + j*(-160)
+184 + j*(-7)
+33 + j*(-124)
+-95 + j*(114)
+190 + j*(-218)
+141 + j*(-73)
+-187 + j*(190)
+-1 + j*(9)
+149 + j*(6)
+254 + j*(-40)
+-35 + j*(-286)
+151 + j*(303)
+-139 + j*(-175)
+-104 + j*(49)
+-400 + j*(-63)
+92 + j*(-197)
+-318 + j*(10)
+25 + j*(-160)
+-183 + j*(-194)
+74 + j*(45)
+33 + j*(-66)
+124 + j*(-181)
+-93 + j*(74)
+206 + j*(-126)
+257 + j*(-97)
+18 + j*(9)
+-128 + j*(64)
+119 + j*(125)
+-140 + j*(11)
+-257 + j*(7)
+-356 + j*(-113)
+-295 + j*(287)
+-144 + j*(104)
+174 + j*(59)
+-13 + j*(-155)
+-43 + j*(92)
+-238 + j*(-49)
+-195 + j*(238)
+112 + j*(-262)
+-103 + j*(37)
+45 + j*(-238)
+-217 + j*(-295)
+-153 + j*(156)
+281 + j*(88)
+-107 + j*(-43)
+293 + j*(47)
+-215 + j*(80)
+-48 + j*(-238)
+-395 + j*(122)
+-348 + j*(-60)
+11 + j*(40)
+216 + j*(56)
+-78 + j*(163)
+8 + j*(-216)
+105 + j*(91)
+106 + j*(261)
+-95 + j*(-192)
+112 + j*(67)
+312 + j*(-171)
+168 + j*(-223)
+-7 + j*(171)
+-27 + j*(-176)
+166 + j*(206)
+40 + j*(89)
+-80 + j*(-222)
+-120 + j*(-236)
+-173 + j*(-10)
+-48 + j*(-100)
+-228 + j*(-205)
+303 + j*(134)
+222 + j*(18)
+-118 + j*(203)
+-35 + j*(40)
+29 + j*(-70)
+226 + j*(-18)
+164 + j*(59)
+173 + j*(-224)
+45 + j*(-255)
+149 + j*(-78)
+-10 + j*(-176)
+-168 + j*(216)
+60 + j*(46)
+45 + j*(-16)
+-254 + j*(-35)
+116 + j*(28)
+87 + j*(170)
+91 + j*(-139)
+204 + j*(-61)
+-131 + j*(-184)
+158 + j*(184)
+-118 + j*(-86)
+475 + j*(158)
+255 + j*(-69)
+54 + j*(-293)
+-11 + j*(91)
+-74 + j*(-40)
+-122 + j*(245)
+-371 + j*(-127)
+-13 + j*(-100)
+-156 + j*(1)
+71 + j*(-356)
+-117 + j*(1)
+-56 + j*(319)
+-126 + j*(-319)
+-159 + j*(-66)
+-115 + j*(188)
+-153 + j*(257)
+187 + j*(-379)
+64 + j*(-60)
+-56 + j*(6)
+-279 + j*(-78)
+437 + j*(-305)
+164 + j*(161)
+371 + j*(-175)
+76 + j*(143)
+240 + j*(-185)
+14 + j*(187)
+381 + j*(134)
+65 + j*(-382)
+274 + j*(-39)
+91 + j*(78)
+-284 + j*(24)
+115 + j*(82)
+-64 + j*(194)
+33 + j*(182)
+-130 + j*(-107)
+-77 + j*(-45)
+-229 + j*(-103)
+199 + j*(594)
+117 + j*(59)
+143 + j*(-350)
+123 + j*(31)
+-86 + j*(-33)
+-301 + j*(258)
+18 + j*(322)
+166 + j*(-163)
+157 + j*(-4)
+201 + j*(228)
+-115 + j*(-309)
+-33 + j*(-49)
+-257 + j*(1)
+75 + j*(-115)
+45 + j*(367)
+-37 + j*(-36)
+-77 + j*(-276)
+163 + j*(138)
+-42 + j*(103)
+13 + j*(-232)
+56 + j*(110)
+-30 + j*(-88)
+-47 + j*(-7)
+42 + j*(235)
+151 + j*(-332)
+257 + j*(-101)
+152 + j*(216)
+-316 + j*(212)
+-92 + j*(115)
+127 + j*(-179)
+-67 + j*(47)
+-197 + j*(26)
+441 + j*(-165)
+-227 + j*(124)
+49 + j*(45)
+-81 + j*(368)
+-62 + j*(-108)
+251 + j*(-332)
+-36 + j*(-64)
+147 + j*(-291)
+-129 + j*(-181)
+226 + j*(-194)
+-74 + j*(-160)
+-250 + j*(-107)
+-322 + j*(72)
+-95 + j*(15)
+-130 + j*(14)
+-42 + j*(-41)
+23 + j*(-275)
+-61 + j*(-23)
+-400 + j*(257)
+73 + j*(-130)
+-119 + j*(-42)
+-28 + j*(-104)
+27 + j*(-366)
+-64 + j*(209)
+84 + j*(206)
+-176 + j*(-442)
+103 + j*(-235)
+-76 + j*(-279)
+99 + j*(52)
+-264 + j*(-8)
+-288 + j*(71)
+14 + j*(24)
+-402 + j*(25)
+-299 + j*(156)
+-146 + j*(135)
+-21 + j*(187)
+-255 + j*(-52)
+-214 + j*(239)
+106 + j*(-19)
+63 + j*(-71)
+25 + j*(-88)
+220 + j*(426)
+-358 + j*(91)
+-252 + j*(-223)
+-54 + j*(-177)
+122 + j*(-41)
+105 + j*(-161)
+-65 + j*(84)
+252 + j*(10)
+-168 + j*(-198)
+183 + j*(-35)
+11 + j*(172)
+-226 + j*(-230)
+-184 + j*(-214)
+-151 + j*(-233)
+-92 + j*(-59)
+31 + j*(100)
+16 + j*(331)
+125 + j*(81)
+-301 + j*(-35)
+69 + j*(-139)
+-60 + j*(107)
+-64 + j*(-63)
+-43 + j*(-99)
+-130 + j*(-54)
+134 + j*(381)
+-155 + j*(17)
+-499 + j*(223)
+-148 + j*(-124)
+-95 + j*(226)
+247 + j*(-55)
+-181 + j*(-183)
+-94 + j*(-284)
+-287 + j*(-103)
+-136 + j*(59)
+59 + j*(67)
+259 + j*(-352)
+-150 + j*(-10)
+-43 + j*(119)
+69 + j*(30)
+-106 + j*(351)
+-38 + j*(-85)
+366 + j*(249)
+71 + j*(197)
+215 + j*(-37)
+-136 + j*(196)
+-231 + j*(75)
+97 + j*(-383)
+103 + j*(95)
+99 + j*(-164)
+172 + j*(-106)
+93 + j*(177)
+42 + j*(-337)
+-23 + j*(-7)
+199 + j*(262)
+-141 + j*(70)
+60 + j*(-132)
+-5 + j*(-18)
+-40 + j*(117)
+-18 + j*(127)
+-224 + j*(245)
+-200 + j*(-121)
+-22 + j*(74)
+-23 + j*(-212)
+129 + j*(119)
+42 + j*(286)
+18 + j*(261)
+-17 + j*(-211)
+-72 + j*(84)
+327 + j*(-28)
+2 + j*(-11)
+100 + j*(-301)
+-37 + j*(9)
+-66 + j*(-165)
+16 + j*(-57)
+-59 + j*(-22)
+49 + j*(158)
+338 + j*(144)
+11 + j*(87)
+-276 + j*(-42)
+-20 + j*(226)
+-117 + j*(0)
+-199 + j*(-294)
+-274 + j*(18)
+-21 + j*(-148)
+-173 + j*(216)
+103 + j*(101)
+162 + j*(18)
+301 + j*(157)
+-43 + j*(486)
+174 + j*(-354)
+-61 + j*(-138)
+-62 + j*(-337)
+24 + j*(161)
+106 + j*(-105)
+69 + j*(-204)
+247 + j*(166)
+-199 + j*(235)
+11 + j*(107)
+273 + j*(180)
+157 + j*(-83)
+174 + j*(21)
+-88 + j*(192)
+-171 + j*(-54)
+393 + j*(294)
+-23 + j*(-21)
+-6 + j*(4)
+-73 + j*(-25)
+-319 + j*(-282)
+-407 + j*(-130)
+86 + j*(76)
+293 + j*(52)
+392 + j*(-10)
+-297 + j*(-74)
+89 + j*(-230)
+-149 + j*(286)
+-185 + j*(43)
+-91 + j*(-103)
+-277 + j*(-305)
+-189 + j*(-58)
+-190 + j*(-8)
+-54 + j*(-74)
+99 + j*(26)
+-83 + j*(-206)
+223 + j*(82)
+-60 + j*(-88)
+342 + j*(-260)
+-350 + j*(-141)
+154 + j*(-4)
+48 + j*(-197)
+153 + j*(211)
+223 + j*(118)
+52 + j*(-206)
+158 + j*(-131)
+-368 + j*(49)
+-180 + j*(-28)
+19 + j*(-435)
+112 + j*(83)
+-167 + j*(-94)
+161 + j*(284)
+317 + j*(196)
+-108 + j*(-390)
+-236 + j*(105)
+-287 + j*(-153)
+-87 + j*(-1)
+-42 + j*(-37)
+-77 + j*(-438)
+-9 + j*(59)
+48 + j*(-317)
+395 + j*(133)
+-83 + j*(86)
+-60 + j*(16)
+-31 + j*(-90)
+144 + j*(-65)
+-80 + j*(-160)
+42 + j*(-12)
+-260 + j*(247)
+-56 + j*(185)
+16 + j*(70)
+-87 + j*(-107)
+74 + j*(187)
+-37 + j*(210)
+303 + j*(52)
+-42 + j*(323)
+-40 + j*(-14)
+54 + j*(119)
+-30 + j*(100)
+-129 + j*(-9)
+223 + j*(11)
+-103 + j*(34)
+225 + j*(316)
+-11 + j*(-108)
+-141 + j*(204)
+86 + j*(-39)
+50 + j*(361)
+-120 + j*(-119)
+233 + j*(-174)
+-277 + j*(-74)
+-126 + j*(169)
+58 + j*(-33)
+-177 + j*(-51)
+-153 + j*(-271)
+151 + j*(119)
+215 + j*(18)
+-69 + j*(-188)
+305 + j*(130)
+-144 + j*(7)
+-210 + j*(50)
+190 + j*(148)
+78 + j*(-69)
+37 + j*(96)
+42 + j*(209)
+243 + j*(57)
+103 + j*(-252)
+-69 + j*(101)
+-43 + j*(-157)
+-168 + j*(-206)
+27 + j*(-35)
+100 + j*(-18)
+6 + j*(33)
+-52 + j*(5)
+13 + j*(-250)
+17 + j*(268)
+204 + j*(-153)
+210 + j*(-54)
+-117 + j*(85)
+-30 + j*(22)
+-255 + j*(19)
+-3 + j*(-106)
+-87 + j*(-130)
+50 + j*(-207)
+340 + j*(143)
+-350 + j*(-105)
+190 + j*(62)
+32 + j*(-141)
+21 + j*(289)
+-322 + j*(394)
+29 + j*(-30)
+132 + j*(-94)
+114 + j*(-328)
+-195 + j*(372)
+-228 + j*(-20)
+54 + j*(66)
+-39 + j*(-59)
+186 + j*(10)
+153 + j*(258)
+12 + j*(45)
+4 + j*(-96)
+-33 + j*(54)
+-210 + j*(116)
+-369 + j*(72)
+28 + j*(180)
+93 + j*(114)
+-98 + j*(208)
+211 + j*(119)
+-148 + j*(-176)
+-391 + j*(-227)
+-63 + j*(122)
+59 + j*(30)
+41 + j*(269)
+-97 + j*(200)
+-49 + j*(-78)
+-208 + j*(261)
+25 + j*(-16)
+-253 + j*(8)
+146 + j*(68)
+71 + j*(28)
+221 + j*(-176)
+-281 + j*(-49)
+278 + j*(134)
+83 + j*(168)
+-66 + j*(543)
+260 + j*(-264)
+-245 + j*(-107)
+-205 + j*(669)
+-275 + j*(207)
+-265 + j*(294)
+88 + j*(137)
+-162 + j*(-23)
+-410 + j*(-24)
+-228 + j*(-286)
+486 + j*(-153)
+-10 + j*(112)
+113 + j*(-173)
+317 + j*(-373)
+-211 + j*(-313)
+-163 + j*(-56)
+362 + j*(-64)
+83 + j*(397)
+-247 + j*(312)
+385 + j*(-145)
+-151 + j*(74)
+361 + j*(161)
+-247 + j*(451)
+-320 + j*(-274)
+314 + j*(337)
+155 + j*(233)
+114 + j*(-267)
+115 + j*(201)
+377 + j*(-134)
+194 + j*(218)
+36 + j*(202)
+-598 + j*(232)
+122 + j*(-301)
+411 + j*(256)
+260 + j*(-323)
+12 + j*(466)
+-78 + j*(-218)
+267 + j*(-318)
+-243 + j*(-390)
+573 + j*(441)
+-57 + j*(-368)
+-492 + j*(141)
+-271 + j*(-62)
+310 + j*(246)
+226 + j*(-334)
+-395 + j*(-523)
+-323 + j*(166)
+-339 + j*(-184)
+283 + j*(90)
+-737 + j*(-246)
+196 + j*(335)
+354 + j*(-433)
+-33 + j*(13)
+-402 + j*(-357)
+322 + j*(209)
+69 + j*(109)
+453 + j*(-119)
+245 + j*(34)
+296 + j*(-48)
+283 + j*(-426)
+228 + j*(-288)
+86 + j*(185)
+453 + j*(-25)
+-137 + j*(255)
+77 + j*(-154)
+-166 + j*(-66)
+-342 + j*(179)
+-454 + j*(-412)
+387 + j*(-252)
+292 + j*(122)
+334 + j*(0)
+-254 + j*(129)
+-116 + j*(-10)
+-292 + j*(-6)
+268 + j*(-445)
+-209 + j*(-537)
+424 + j*(-64)
+279 + j*(-367)
+-361 + j*(-91)
+-243 + j*(-316)
+250 + j*(-355)
+238 + j*(-216)
+-464 + j*(386)
+-296 + j*(150)
+-192 + j*(-322)
+151 + j*(-255)
+341 + j*(361)
+-467 + j*(269)
+-282 + j*(-421)
+180 + j*(-375)
+-428 + j*(-371)
+211 + j*(272)
+65 + j*(-426)
+-378 + j*(-335)
+158 + j*(-18)
+-214 + j*(195)
+-12 + j*(-337)
+-115 + j*(116)
+433 + j*(-126)
+228 + j*(-88)
+-329 + j*(54)
+425 + j*(-19)
+-443 + j*(496)
+358 + j*(-255)
+-401 + j*(272)
+285 + j*(172)
+-81 + j*(405)
+10 + j*(-358)
+-370 + j*(102)
+-477 + j*(30)
+8 + j*(519)
+-323 + j*(447)
+-527 + j*(-167)
+-218 + j*(36)
+-116 + j*(-40)
+501 + j*(-393)
+180 + j*(-192)
+-93 + j*(-530)
+-57 + j*(-521)
+21 + j*(-306)
+252 + j*(228)
+-330 + j*(-42)
+35 + j*(-476)
+-482 + j*(-399)
+221 + j*(348)
+-257 + j*(-202)
+-110 + j*(-249)
+313 + j*(-1)
+-303 + j*(51)
+-374 + j*(683)
+339 + j*(279)
+428 + j*(363)
+18 + j*(-341)
+355 + j*(508)
+-128 + j*(265)
+-309 + j*(-98)
+-28 + j*(-35)
+-439 + j*(231)
+499 + j*(458)
+-546 + j*(-80)
+-31 + j*(395)
+-47 + j*(-1)
+135 + j*(-437)
+299 + j*(126)
+161 + j*(424)
+275 + j*(-41)
+-172 + j*(77)
+-433 + j*(57)
+477 + j*(-182)
+334 + j*(349)
+233 + j*(-412)
+414 + j*(93)
+93 + j*(103)
+-146 + j*(-267)
+-232 + j*(-346)
+324 + j*(204)
+-500 + j*(-10)
+276 + j*(-453)
+23 + j*(-245)
+343 + j*(-359)
+419 + j*(-468)
+517 + j*(83)
+332 + j*(583)
+355 + j*(-421)
+-238 + j*(-115)
+729 + j*(-23)
+218 + j*(148)
+305 + j*(-159)
+-265 + j*(102)
+-346 + j*(109)
+343 + j*(140)
+504 + j*(-364)
+-424 + j*(-228)
+-202 + j*(64)
+-35 + j*(265)
+-456 + j*(599)
+-388 + j*(-223)
+83 + j*(-33)
+375 + j*(-334)
+-115 + j*(53)
+383 + j*(387)
+110 + j*(-587)
+518 + j*(49)
+318 + j*(418)
+-219 + j*(-455)
+-37 + j*(-326)
+-233 + j*(182)
+-334 + j*(406)
+559 + j*(327)
+-398 + j*(265)
+-517 + j*(-204)
+436 + j*(204)
+260 + j*(644)
+407 + j*(-289)
+355 + j*(-119)
+377 + j*(-563)
+171 + j*(-69)
+313 + j*(-574)
+228 + j*(-445)
+-118 + j*(-154)
+-161 + j*(424)
+124 + j*(-366)
+335 + j*(-135)
+-99 + j*(-424)
+437 + j*(506)
+490 + j*(747)
+272 + j*(79)
+-28 + j*(-279)
+214 + j*(333)
+-190 + j*(251)
+220 + j*(-320)
+18 + j*(298)
+292 + j*(136)
+-164 + j*(-386)
+-437 + j*(373)
+-122 + j*(-311)
+59 + j*(-512)
+115 + j*(-47)
+371 + j*(105)
+432 + j*(-331)
+-418 + j*(247)
+-438 + j*(356)
+231 + j*(-129)
+-334 + j*(178)
+-309 + j*(-184)
+269 + j*(460)
+-460 + j*(118)
+537 + j*(36)
+550 + j*(224)
+275 + j*(-334)
+-344 + j*(245)
+-120 + j*(-237)
+122 + j*(-154)
+68 + j*(-146)
+68 + j*(-363)
+-211 + j*(-162)
+-258 + j*(-269)
+560 + j*(-274)
+145 + j*(-81)
+562 + j*(231)
+-363 + j*(-486)
+429 + j*(-189)
+317 + j*(286)
+298 + j*(-331)
+110 + j*(-121)
+4 + j*(-651)
+4 + j*(648)
+318 + j*(506)
+478 + j*(79)
+103 + j*(40)
+-136 + j*(-419)
+412 + j*(-26)
+-493 + j*(290)
+-364 + j*(513)
+158 + j*(35)
+-472 + j*(-109)
+-293 + j*(-365)
+372 + j*(437)
+-171 + j*(-282)
+-439 + j*(202)
+-136 + j*(202)
+-196 + j*(427)
+-387 + j*(283)
+-329 + j*(118)
+-320 + j*(-251)
+-141 + j*(382)
+290 + j*(-96)
+262 + j*(-165)
+-173 + j*(-39)
+126 + j*(-477)
+-247 + j*(299)
+-247 + j*(382)
+-315 + j*(356)
+141 + j*(-220)
+291 + j*(-223)
+281 + j*(448)
+287 + j*(90)
+457 + j*(-190)
+-184 + j*(438)
+302 + j*(-472)
+-176 + j*(286)
+-207 + j*(-400)
+439 + j*(-117)
+74 + j*(125)
+292 + j*(-349)
+299 + j*(-208)
+-30 + j*(-268)
+-59 + j*(-288)
+-226 + j*(-315)
+-499 + j*(-209)
+-340 + j*(423)
+-389 + j*(-105)
+-170 + j*(-335)
+-76 + j*(225)
+-312 + j*(88)
+379 + j*(303)
+284 + j*(-255)
+-291 + j*(296)
+601 + j*(220)
+207 + j*(105)
+148 + j*(313)
+281 + j*(420)
+-402 + j*(382)
+-141 + j*(148)
+-74 + j*(318)
+-618 + j*(-348)
+-385 + j*(-310)
+448 + j*(233)
+471 + j*(-279)
+9 + j*(125)
+-191 + j*(-74)
+559 + j*(529)
+-421 + j*(-25)
+615 + j*(-308)
+-161 + j*(370)
+493 + j*(-135)
+-39 + j*(-309)
+-270 + j*(-256)
+527 + j*(8)
+-204 + j*(474)
+88 + j*(514)
+-276 + j*(-429)
+238 + j*(277)
+-216 + j*(165)
+-202 + j*(-349)
+-73 + j*(-279)
+267 + j*(279)
+-186 + j*(-200)
+-404 + j*(639)
+233 + j*(-351)
+304 + j*(-202)
+-91 + j*(-161)
+383 + j*(-247)
+-437 + j*(-287)
+-275 + j*(-8)
+453 + j*(-290)
+305 + j*(-100)
+323 + j*(-377)
+22 + j*(112)
+-371 + j*(-85)
+-23 + j*(-8)
+276 + j*(173)
+226 + j*(120)
+-491 + j*(337)
+-245 + j*(497)
+368 + j*(-130)
+77 + j*(190)
+378 + j*(34)
+-298 + j*(187)
+146 + j*(322)
+-494 + j*(-216)
+-312 + j*(80)
+361 + j*(195)
+213 + j*(-537)
+-49 + j*(-452)
+-282 + j*(-228)
+-171 + j*(382)
+74 + j*(-387)
+-382 + j*(378)
+513 + j*(-339)
+67 + j*(-65)
+301 + j*(-3)
+438 + j*(-215)
+-516 + j*(100)
+55 + j*(-149)
+-47 + j*(-359)
+92 + j*(-285)
+-182 + j*(193)
+152 + j*(-314)
+-270 + j*(255)
+-334 + j*(-128)
+299 + j*(-450)
+-197 + j*(311)
+-231 + j*(-173)
+458 + j*(-262)
+-206 + j*(477)
+-338 + j*(202)
+-37 + j*(454)
+-477 + j*(-1)
+-157 + j*(-477)
+-339 + j*(-322)
+-278 + j*(607)
+257 + j*(-292)
+-199 + j*(77)
+132 + j*(182)
+-314 + j*(-312)
+-439 + j*(366)
+-319 + j*(-279)
+358 + j*(74)
+-198 + j*(-170)
+557 + j*(-256)
+-207 + j*(-424)
+-472 + j*(-307)
+158 + j*(228)
+-80 + j*(-64)
+395 + j*(383)
+-168 + j*(-6)
+-40 + j*(-215)
+78 + j*(-342)
+-28 + j*(97)
+357 + j*(73)
+-584 + j*(-170)
+-510 + j*(296)
+-155 + j*(42)
+187 + j*(13)
+510 + j*(334)
+113 + j*(-436)
+-448 + j*(265)
+-327 + j*(184)
+128 + j*(141)
+211 + j*(-30)
+139 + j*(197)
+-36 + j*(65)
+546 + j*(220)
+473 + j*(-143)
+-139 + j*(175)
+-473 + j*(243)
+247 + j*(-214)
+18 + j*(262)
+28 + j*(-354)
+140 + j*(-25)
+-325 + j*(-457)
+-284 + j*(-313)
+229 + j*(-353)
+-337 + j*(-385)
+448 + j*(501)
+-292 + j*(-126)
+484 + j*(-617)
+-291 + j*(-453)
+-297 + j*(-247)
+347 + j*(-323)
+204 + j*(-272)
+-252 + j*(-155)
+-148 + j*(-477)
+166 + j*(378)
+142 + j*(0)
+174 + j*(438)
+653 + j*(-51)
+259 + j*(458)
+-282 + j*(237)
+13 + j*(350)
+-537 + j*(365)
+215 + j*(315)
+467 + j*(129)
+244 + j*(-213)
+285 + j*(1)
+182 + j*(-56)
+135 + j*(-305)
+208 + j*(-312)
+612 + j*(-123)
+303 + j*(473)
+102 + j*(-471)
+-190 + j*(-270)
+3 + j*(-470)
+192 + j*(483)
+94 + j*(-435)
+-69 + j*(333)
+527 + j*(9)
+-203 + j*(201)
+159 + j*(1)
+-428 + j*(333)
+54 + j*(-194)
+391 + j*(303)
+-171 + j*(-295)
+315 + j*(-127)
+260 + j*(197)
+-146 + j*(-67)
+297 + j*(446)
+-474 + j*(285)
+-95 + j*(165)
+286 + j*(-295)
+-482 + j*(-386)
+37 + j*(-359)
+-295 + j*(-119)
+187 + j*(-374)
+359 + j*(-55)
+-294 + j*(-349)
+301 + j*(301)
+148 + j*(-211)
+-259 + j*(-183)
+-325 + j*(28)
+-144 + j*(39)
+-403 + j*(-242)
+-465 + j*(49)
+176 + j*(-325)
+262 + j*(-41)
+547 + j*(260)
+-316 + j*(65)
+425 + j*(-1)
+310 + j*(-226)
+-163 + j*(-569)
+-361 + j*(268)
+385 + j*(-217)
+-474 + j*(-19)
+-143 + j*(238)
+-280 + j*(-138)
+170 + j*(233)
+124 + j*(-78)
+593 + j*(348)
+-291 + j*(-136)
+98 + j*(542)
+-211 + j*(-704)
+431 + j*(-303)
+79 + j*(-228)
+134 + j*(-62)
+-247 + j*(-397)
+567 + j*(52)
+521 + j*(-226)
+368 + j*(-127)
+-654 + j*(28)
+-457 + j*(595)
+-162 + j*(-465)
+-161 + j*(-552)
+202 + j*(-199)
+-409 + j*(-440)
+623 + j*(137)
+305 + j*(6)
+-115 + j*(-160)
+206 + j*(-120)
+182 + j*(285)
+-478 + j*(-85)
+-197 + j*(-403)
+119 + j*(-354)
+-308 + j*(349)
+482 + j*(-368)
+-296 + j*(96)
+-27 + j*(141)
+665 + j*(389)
+458 + j*(179)
+-8 + j*(-435)
+-648 + j*(-80)
+-403 + j*(192)
+-212 + j*(161)
+319 + j*(-486)
+222 + j*(-178)
+308 + j*(338)
+-88 + j*(-101)
+406 + j*(-424)
+-95 + j*(-590)
+-412 + j*(-542)
+-64 + j*(-274)
+-245 + j*(320)
+144 + j*(192)
+144 + j*(300)
+225 + j*(-187)
+-200 + j*(352)
+-576 + j*(-369)
+86 + j*(-57)
+243 + j*(-177)
+-106 + j*(-433)
+275 + j*(361)
+85 + j*(164)
+-300 + j*(338)
+-659 + j*(-456)
+-293 + j*(-298)
+-453 + j*(209)
+-493 + j*(165)
+-635 + j*(-501)
+-353 + j*(357)
+-294 + j*(184)
+47 + j*(-356)
+251 + j*(37)
+490 + j*(250)
+-204 + j*(-330)
+344 + j*(291)
+110 + j*(165)
+97 + j*(18)
+540 + j*(-192)
+-569 + j*(-88)
+-135 + j*(95)
+-326 + j*(-617)
+115 + j*(-14)
+263 + j*(-353)
+436 + j*(-301)
+83 + j*(265)
+-94 + j*(269)
+-194 + j*(-245)
+-6 + j*(-158)
+-156 + j*(-540)
+476 + j*(313)
+308 + j*(-288)
+-74 + j*(-361)
+-286 + j*(-144)
+332 + j*(-60)
+327 + j*(147)
+-452 + j*(477)
+95 + j*(116)
+477 + j*(413)
+343 + j*(427)
+548 + j*(351)
+-358 + j*(108)
+-147 + j*(-146)
+-383 + j*(-209)
+-431 + j*(-528)
+555 + j*(473)
+233 + j*(-53)
+-44 + j*(-122)
+339 + j*(626)
+-10 + j*(-454)
+-10 + j*(484)
+-222 + j*(225)
+-47 + j*(90)
+170 + j*(162)
+61 + j*(-95)
+25 + j*(-11)
+74 + j*(269)
+-2 + j*(243)
+3 + j*(30)
+-267 + j*(-80)
+59 + j*(374)
+-35 + j*(-372)
+165 + j*(221)
+-102 + j*(-175)
+-34 + j*(-115)
+-75 + j*(-95)
+126 + j*(88)
+-245 + j*(194)
+-351 + j*(72)
+33 + j*(47)
+-87 + j*(-266)
+-95 + j*(165)
+-56 + j*(42)
+179 + j*(123)
+-30 + j*(170)
+5 + j*(-428)
+279 + j*(346)
+-349 + j*(-42)
+-9 + j*(-86)
+-62 + j*(293)
+344 + j*(-372)
+148 + j*(-54)
+-160 + j*(-57)
+-57 + j*(109)
+-88 + j*(128)
+-73 + j*(156)
+-130 + j*(60)
+-206 + j*(472)
+-129 + j*(4)
+231 + j*(-168)
+-84 + j*(-132)
+-189 + j*(310)
+-64 + j*(-107)
+274 + j*(-236)
+-53 + j*(-1)
+8 + j*(-197)
+327 + j*(-13)
+85 + j*(321)
+41 + j*(158)
+134 + j*(267)
+53 + j*(129)
+42 + j*(-11)
+144 + j*(-164)
+216 + j*(29)
+-70 + j*(-49)
+-153 + j*(-78)
+303 + j*(91)
+248 + j*(-240)
+60 + j*(191)
+51 + j*(51)
+38 + j*(30)
+-110 + j*(72)
+395 + j*(-380)
+-98 + j*(-201)
+-21 + j*(-40)
+26 + j*(122)
+6 + j*(268)
+-85 + j*(78)
+105 + j*(49)
+152 + j*(-69)
+277 + j*(134)
+59 + j*(-185)
+-112 + j*(-143)
+-12 + j*(275)
+-103 + j*(-44)
+-190 + j*(-227)
+-245 + j*(105)
+-21 + j*(-148)
+-67 + j*(45)
+154 + j*(128)
+-110 + j*(-153)
+-33 + j*(-143)
+-88 + j*(-81)
+163 + j*(-1)
+42 + j*(-227)
+93 + j*(1)
+202 + j*(-52)
+305 + j*(58)
+-170 + j*(-458)
+-181 + j*(418)
+291 + j*(402)
+-198 + j*(166)
+196 + j*(-259)
+-263 + j*(186)
+77 + j*(137)
+59 + j*(-204)
+379 + j*(-7)
+-19 + j*(64)
+235 + j*(35)
+81 + j*(-90)
+24 + j*(79)
+54 + j*(-92)
+-119 + j*(-243)
+99 + j*(187)
+-18 + j*(109)
+139 + j*(-76)
+-267 + j*(-52)
+-111 + j*(92)
+6 + j*(-2)
+57 + j*(158)
+158 + j*(-405)
+-224 + j*(242)
+271 + j*(-42)
+131 + j*(-201)
+151 + j*(192)
+-50 + j*(42)
+333 + j*(-21)
+-34 + j*(-134)
+-121 + j*(110)
+-480 + j*(-63)
+40 + j*(-447)
+-150 + j*(147)
+90 + j*(-212)
+-186 + j*(-5)
+174 + j*(-49)
+-319 + j*(91)
+145 + j*(-51)
+-251 + j*(-44)
+57 + j*(13)
+-9 + j*(-190)
+-72 + j*(107)
+54 + j*(114)
+156 + j*(20)
+-134 + j*(98)
+-89 + j*(-16)
+-120 + j*(-82)
+-135 + j*(-173)
+307 + j*(-235)
+-24 + j*(-242)
+132 + j*(-212)
+-139 + j*(-104)
+349 + j*(-211)
+23 + j*(146)
+65 + j*(25)
+-104 + j*(140)
+-110 + j*(115)
+-97 + j*(-174)
+162 + j*(35)
+86 + j*(-174)
+222 + j*(48)
+136 + j*(279)
+-100 + j*(-28)
+-5 + j*(-159)
+49 + j*(-167)
+-3 + j*(230)
+-57 + j*(12)
+136 + j*(-295)
+62 + j*(-274)
+-178 + j*(-213)
+-34 + j*(284)
+102 + j*(174)
+-112 + j*(83)
+99 + j*(161)
+-141 + j*(-249)
+16 + j*(21)
+135 + j*(-135)
+62 + j*(162)
+23 + j*(-67)
+-128 + j*(-1)
+-24 + j*(-153)
+8 + j*(128)
+134 + j*(-47)
+-240 + j*(185)
+18 + j*(310)
+-136 + j*(108)
+-266 + j*(-65)
+174 + j*(33)
+-188 + j*(18)
+-146 + j*(180)
+128 + j*(-28)
+339 + j*(157)
+-163 + j*(215)
+148 + j*(26)
+-57 + j*(-83)
+-116 + j*(82)
+-91 + j*(110)
+-258 + j*(1)
+-128 + j*(-60)
+26 + j*(-158)
+-87 + j*(-183)
+1 + j*(12)
+-73 + j*(313)
+265 + j*(-34)
+-39 + j*(-241)
+-30 + j*(66)
+81 + j*(-78)
+97 + j*(-133)
+-57 + j*(-127)
+94 + j*(-61)
+228 + j*(-84)
+-77 + j*(276)
+76 + j*(86)
+-38 + j*(-375)
+-130 + j*(136)
+-11 + j*(-57)
+-182 + j*(25)
+40 + j*(-249)
+-206 + j*(100)
+0 + j*(119)
+-240 + j*(-139)
+-165 + j*(55)
+170 + j*(-28)
+361 + j*(-87)
+91 + j*(132)
+10 + j*(139)
+-154 + j*(-103)
+37 + j*(39)
+-142 + j*(-283)
+181 + j*(207)
+-1 + j*(-238)
+-273 + j*(93)
+27 + j*(-272)
+-78 + j*(-228)
+322 + j*(-95)
+-100 + j*(-489)
+-257 + j*(-308)
+-112 + j*(302)
+145 + j*(243)
+-69 + j*(88)
+-78 + j*(-173)
+96 + j*(107)
+-100 + j*(178)
+-348 + j*(45)
+-27 + j*(30)
+267 + j*(-211)
+52 + j*(-66)
+236 + j*(-195)
+339 + j*(-69)
+351 + j*(125)
+-79 + j*(-368)
+71 + j*(4)
+-151 + j*(159)
+-47 + j*(-404)
+-266 + j*(209)
+175 + j*(46)
+-301 + j*(-93)
+281 + j*(-106)
+-25 + j*(-88)
+-96 + j*(-258)
+160 + j*(-1)
+128 + j*(28)
+11 + j*(43)
+137 + j*(412)
+-276 + j*(141)
+64 + j*(-101)
+-82 + j*(-85)
+-194 + j*(100)
+-305 + j*(-136)
+45 + j*(175)
+-28 + j*(-45)
+190 + j*(169)
+265 + j*(74)
+264 + j*(-54)
+-26 + j*(112)
+-264 + j*(177)
+-255 + j*(320)
+127 + j*(70)
+184 + j*(-347)
+132 + j*(244)
+298 + j*(-8)
+-182 + j*(-144)
+-226 + j*(175)
+-40 + j*(323)
+200 + j*(-257)
+-293 + j*(282)
+11 + j*(-280)
+-1 + j*(-445)
+18 + j*(-180)
+134 + j*(10)
+-3 + j*(-98)
+262 + j*(-4)
+45 + j*(153)
+376 + j*(84)
+-324 + j*(185)
+-197 + j*(-124)
+-152 + j*(-61)
+-40 + j*(-2)
+-173 + j*(-68)
+98 + j*(108)
+261 + j*(-73)
+119 + j*(76)
+28 + j*(-102)
+-305 + j*(-276)
+243 + j*(180)
+-221 + j*(128)
+64 + j*(-102)
+-108 + j*(267)
+-8 + j*(-108)
+-116 + j*(139)
+-91 + j*(-62)
+24 + j*(25)
+-83 + j*(98)
+45 + j*(-124)
+173 + j*(47)
+-124 + j*(-233)
+-47 + j*(-125)
+-88 + j*(-132)
+-21 + j*(277)
+-112 + j*(-133)
+88 + j*(97)
+-320 + j*(354)
+338 + j*(259)
+-6 + j*(-208)
+-8 + j*(-50)
+310 + j*(-15)
+-33 + j*(-134)
+93 + j*(-54)
+70 + j*(-214)
+10 + j*(-65)
+123 + j*(78)
+317 + j*(147)
+-209 + j*(-153)
+513 + j*(-206)
+-306 + j*(-128)
+27 + j*(-395)
+112 + j*(90)
+-17 + j*(35)
+-57 + j*(-4)
+-122 + j*(-385)
+30 + j*(-61)
+-167 + j*(238)
+269 + j*(265)
+203 + j*(41)
+253 + j*(70)
+52 + j*(-152)
+-53 + j*(-49)
+96 + j*(49)
+-202 + j*(-424)
+34 + j*(-286)
+-505 + j*(-199)
+-190 + j*(166)
+308 + j*(-265)
+-186 + j*(451)
+-331 + j*(-117)
+115 + j*(64)
+-171 + j*(111)
+-106 + j*(266)
+143 + j*(-148)
+-13 + j*(16)
+-168 + j*(375)
+211 + j*(150)
+-470 + j*(104)
+-274 + j*(-323)
+198 + j*(76)
+115 + j*(349)
+-244 + j*(129)
+-5 + j*(-64)
+309 + j*(-34)
+18 + j*(107)
+482 + j*(76)
+136 + j*(245)
+-91 + j*(-34)
+-130 + j*(153)
+83 + j*(-168)
+0 + j*(-32)
+23 + j*(-372)
+-44 + j*(-225)
+-228 + j*(-75)
+28 + j*(244)
+-141 + j*(82)
+-149 + j*(-58)
+-271 + j*(-217)
+-331 + j*(270)
+-100 + j*(-6)
+185 + j*(-83)
+325 + j*(-273)
+226 + j*(-206)
+240 + j*(86)
+-154 + j*(-227)
+-48 + j*(-69)
+-42 + j*(72)
+377 + j*(137)
+62 + j*(-402)
+-53 + j*(-8)
+29 + j*(63)
+-30 + j*(204)
+-255 + j*(390)
+233 + j*(180)
+-53 + j*(-97)
+-42 + j*(-55)
+-32 + j*(-76)
+66 + j*(410)
+33 + j*(243)
+163 + j*(-12)
+-195 + j*(-38)
+254 + j*(98)
+-132 + j*(-132)
+7 + j*(-87)
+136 + j*(240)
+59 + j*(42)
+225 + j*(-68)
+-159 + j*(152)
+-129 + j*(-4)
+269 + j*(-86)
+-37 + j*(79)
+-436 + j*(-71)
+-23 + j*(211)
+163 + j*(176)
+-89 + j*(-98)
+-129 + j*(-387)
+118 + j*(8)
+38 + j*(-47)
+337 + j*(-88)
+-4 + j*(-1)
+231 + j*(-82)
+54 + j*(366)
+-73 + j*(138)
+-8 + j*(-69)
+-163 + j*(135)
+-159 + j*(-257)
+-214 + j*(-268)
+-60 + j*(-36)
+69 + j*(182)
+172 + j*(115)
+-105 + j*(288)
+77 + j*(-184)
+-107 + j*(101)
+248 + j*(45)
+61 + j*(-101)
+292 + j*(-93)
+69 + j*(-192)
+143 + j*(66)
+-279 + j*(138)
+-74 + j*(-21)
+371 + j*(-74)
+134 + j*(300)
+-71 + j*(8)
+108 + j*(-291)
+4 + j*(129)
+-373 + j*(-51)
+59 + j*(-117)
+189 + j*(-206)
+206 + j*(28)
+-242 + j*(-433)
+-98 + j*(-260)
+-102 + j*(169)
+-82 + j*(33)
+-11 + j*(-184)
+-24 + j*(-47)
+77 + j*(-71)
+-117 + j*(-44)
+204 + j*(-164)
+-10 + j*(-81)
+179 + j*(-16)
+68 + j*(-293)
+22 + j*(37)
+202 + j*(104)
+30 + j*(45)
+192 + j*(180)
+-136 + j*(-117)
+120 + j*(173)
+-202 + j*(148)
+-172 + j*(173)
+-28 + j*(190)
+115 + j*(-58)
+-167 + j*(199)
+-95 + j*(212)
+168 + j*(-260)
+-250 + j*(-95)
+-35 + j*(100)
+-360 + j*(-88)
+-163 + j*(75)
+335 + j*(-58)
+-14 + j*(151)
+-169 + j*(104)
+334 + j*(105)
+-157 + j*(102)
+-45 + j*(316)
+-64 + j*(-126)
+-4 + j*(-431)
+-91 + j*(-217)
+13 + j*(-134)
+52 + j*(409)
+160 + j*(14)
+89 + j*(9)
+-217 + j*(5)
+-177 + j*(-442)
+225 + j*(-34)
+-110 + j*(-98)
+130 + j*(-428)
+-225 + j*(212)
+44 + j*(-217)
+40 + j*(-213)
+-158 + j*(30)
+16 + j*(49)
+101 + j*(-322)
+-93 + j*(38)
+330 + j*(214)
+-61 + j*(18)
+285 + j*(34)
+-228 + j*(-156)
+146 + j*(83)
+-427 + j*(-93)
+-119 + j*(58)
+-91 + j*(-428)
+-177 + j*(-75)
+62 + j*(-10)
+-29 + j*(-49)
+-76 + j*(95)
+62 + j*(-320)
+-144 + j*(88)
+197 + j*(-121)
+243 + j*(-54)
+113 + j*(223)
+59 + j*(-157)
+136 + j*(-99)
+145 + j*(-90)
+-283 + j*(-42)
+-247 + j*(-106)
+99 + j*(-380)
+-8 + j*(-124)
+-28 + j*(-31)
+407 + j*(250)
+-198 + j*(-94)
+244 + j*(154)
+119 + j*(501)
+82 + j*(315)
+16 + j*(122)
+-6 + j*(-247)
+-162 + j*(300)
+103 + j*(-98)
+221 + j*(-177)
+-80 + j*(207)
+43 + j*(105)
+8 + j*(2)
+251 + j*(-303)
+143 + j*(-45)
+209 + j*(-18)
+-35 + j*(76)
+-191 + j*(254)
+178 + j*(-18)
+66 + j*(-378)
+45 + j*(-7)
+-159 + j*(-144)
+-282 + j*(-106)
+-225 + j*(2)
+-107 + j*(-255)
+92 + j*(226)
+-39 + j*(-218)
+-102 + j*(139)
+184 + j*(77)
+-78 + j*(134)
+56 + j*(-278)
+-35 + j*(-81)
+-61 + j*(-204)
+-65 + j*(-25)
+-202 + j*(163)
+310 + j*(-28)
+-111 + j*(-95)
+-2 + j*(141)
+-173 + j*(-51)
+-21 + j*(182)
+-257 + j*(-57)
+-83 + j*(81)
+-267 + j*(52)
+2 + j*(13)
+35 + j*(59)
+105 + j*(190)
+-306 + j*(-253)
+19 + j*(88)
+-3 + j*(-221)
+234 + j*(-160)
+-9 + j*(-108)
+-325 + j*(356)
+-71 + j*(268)
+-308 + j*(364)
+-308 + j*(183)
+193 + j*(-95)
+62 + j*(-12)
+107 + j*(42)
+-100 + j*(62)
+-84 + j*(57)
+-90 + j*(-427)
+-73 + j*(-35)
+-191 + j*(134)
+-48 + j*(-85)
+193 + j*(-242)
+-80 + j*(61)
+225 + j*(-24)
+-179 + j*(-218)
+353 + j*(394)
+197 + j*(109)
+228 + j*(9)
+386 + j*(167)
+86 + j*(-8)
+55 + j*(-312)
+-18 + j*(78)
+-32 + j*(-191)
+-24 + j*(20)
+121 + j*(-126)
+-80 + j*(16)
+-161 + j*(367)
+-64 + j*(109)
+-22 + j*(37)
+-145 + j*(65)
+-197 + j*(-272)
+103 + j*(-46)
+-98 + j*(99)
+-325 + j*(-251)
+43 + j*(-93)
+-54 + j*(-3)
+193 + j*(-82)
+91 + j*(57)
+80 + j*(-122)
+151 + j*(-258)
+36 + j*(-443)
+-69 + j*(-25)
+-116 + j*(-222)
+-12 + j*(-306)
+-298 + j*(-242)
+243 + j*(-248)
+94 + j*(-47)
+-65 + j*(103)
+-246 + j*(128)
+-27 + j*(52)
+-165 + j*(235)
+-88 + j*(41)
+-21 + j*(-100)
+-2 + j*(222)
+-156 + j*(163)
+209 + j*(279)
+55 + j*(177)
+-209 + j*(-136)
+132 + j*(-42)
+-221 + j*(-51)
+91 + j*(62)
+-34 + j*(129)
+-217 + j*(-257)
+6 + j*(-36)
+-353 + j*(-90)
+-7 + j*(-86)
+105 + j*(81)
+148 + j*(-40)
+-20 + j*(-6)
+93 + j*(-156)
+145 + j*(120)
+-110 + j*(465)
+-39 + j*(23)
+-54 + j*(138)
+-69 + j*(87)
+-91 + j*(-74)
+361 + j*(26)
+513 + j*(-134)
+-293 + j*(-134)
+18 + j*(-93)
+424 + j*(177)
+-22 + j*(40)
+173 + j*(74)
+2 + j*(-207)
+-162 + j*(-165)
+57 + j*(128)
+315 + j*(80)
+-102 + j*(117)
+238 + j*(-75)
+-107 + j*(134)
+-204 + j*(-153)
+-170 + j*(-9)
+2 + j*(50)
+88 + j*(110)
+-8 + j*(-115)
+-92 + j*(-237)
+-52 + j*(265)
+-40 + j*(16)
+-74 + j*(-80)
+-150 + j*(-26)
+-33 + j*(-29)
+383 + j*(-48)
+-182 + j*(247)
+-192 + j*(260)
+108 + j*(133)
+175 + j*(-317)
+-12 + j*(-103)
+-24 + j*(-373)
+141 + j*(-220)
+170 + j*(-106)
+-112 + j*(-248)
+180 + j*(-78)
+-252 + j*(-380)
+-39 + j*(-247)
+-152 + j*(39)
+28 + j*(-119)
+-47 + j*(-174)
+101 + j*(87)
+127 + j*(77)
+103 + j*(-255)
+66 + j*(257)
+-105 + j*(32)
+78 + j*(69)
+26 + j*(-54)
+-31 + j*(73)
+346 + j*(346)
+8 + j*(26)
+-37 + j*(-59)
+21 + j*(194)
+-28 + j*(183)
+100 + j*(-55)
+-157 + j*(175)
+-322 + j*(-137)
+-33 + j*(132)
+-477 + j*(-62)
+332 + j*(-111)
+83 + j*(282)
+-134 + j*(92)
+-269 + j*(-296)
+-4 + j*(5)
+69 + j*(-35)
+-299 + j*(14)
+154 + j*(-176)
+-137 + j*(11)
+156 + j*(-180)
+-66 + j*(-36)
+-10 + j*(57)
+-261 + j*(-361)
+-36 + j*(74)
+-31 + j*(147)
+-19 + j*(-169)
+149 + j*(256)
+-332 + j*(29)
+-293 + j*(-197)
+117 + j*(-184)
+235 + j*(134)
+251 + j*(86)
+54 + j*(-310)
+13 + j*(-11)
+-385 + j*(-286)
+-2 + j*(-37)
+-115 + j*(-48)
+197 + j*(-20)
+264 + j*(136)
+-243 + j*(-59)
+-187 + j*(30)
+92 + j*(28)
+-91 + j*(-238)
+-93 + j*(-179)
+6 + j*(76)
+11 + j*(6)
+-96 + j*(78)
+25 + j*(59)
+110 + j*(523)
+141 + j*(-14)
+-94 + j*(-10)
+22 + j*(-120)
+443 + j*(-14)
+95 + j*(-174)
+-141 + j*(125)
+-12 + j*(-354)
+-193 + j*(-144)
+-156 + j*(-74)
+210 + j*(317)
+281 + j*(-52)
+77 + j*(89)
+21 + j*(-80)
+332 + j*(-6)
+292 + j*(18)
+57 + j*(-45)
+-65 + j*(113)
+-317 + j*(-109)
+-378 + j*(-298)
+185 + j*(1)
+-453 + j*(-45)
+123 + j*(279)
+27 + j*(57)
+-299 + j*(23)
+112 + j*(47)
+-47 + j*(174)
+33 + j*(-227)
+-288 + j*(9)
+-153 + j*(5)
+250 + j*(52)
+-119 + j*(-208)
+127 + j*(262)
+-30 + j*(-109)
+55 + j*(-247)
+-112 + j*(-44)
+-82 + j*(-38)
+-297 + j*(-16)
+59 + j*(60)
+-198 + j*(-55)
+204 + j*(-151)
+12 + j*(40)
+-627 + j*(-236)
+-112 + j*(-281)
+-91 + j*(-167)
+38 + j*(83)
+-146 + j*(130)
+-228 + j*(29)
+-67 + j*(-216)
+100 + j*(30)
+137 + j*(190)
+173 + j*(337)
+252 + j*(-108)
+431 + j*(-163)
+217 + j*(-54)
+-156 + j*(-250)
+286 + j*(-232)
+286 + j*(-181)
+-103 + j*(-117)
+-177 + j*(81)
+-246 + j*(-159)
+-254 + j*(58)
+69 + j*(157)
+-110 + j*(34)
+262 + j*(95)
+-130 + j*(148)
+144 + j*(345)
+152 + j*(25)
+89 + j*(236)
+257 + j*(146)
+50 + j*(-297)
+109 + j*(207)
+105 + j*(-262)
+330 + j*(-397)
+-221 + j*(-162)
+60 + j*(-54)
+49 + j*(-194)
+24 + j*(-104)
+-45 + j*(-18)
+-180 + j*(266)
+-25 + j*(183)
+64 + j*(221)
+302 + j*(409)
+-55 + j*(3)
+226 + j*(-310)
+37 + j*(-49)
+-116 + j*(66)
+115 + j*(-84)
+-155 + j*(174)
+-134 + j*(100)
+-211 + j*(-69)
+226 + j*(-11)
+397 + j*(43)
+170 + j*(81)
+-107 + j*(-122)
+433 + j*(-25)
+115 + j*(-77)
+-235 + j*(-4)
+-308 + j*(-138)
+187 + j*(241)
+49 + j*(8)
+62 + j*(105)
+-296 + j*(122)
+33 + j*(497)
+334 + j*(-1)
+194 + j*(41)
+204 + j*(-245)
+-49 + j*(15)
+-103 + j*(16)
+-217 + j*(56)
+28 + j*(196)
+343 + j*(-173)
+173 + j*(164)
+-100 + j*(167)
+-94 + j*(-25)
+-79 + j*(-95)
+30 + j*(-276)
+144 + j*(61)
+-120 + j*(-195)
+-213 + j*(-366)
+209 + j*(30)
+6 + j*(-245)
+-43 + j*(-83)
+28 + j*(61)
+4 + j*(-51)
+-167 + j*(52)
+-245 + j*(4)
+-48 + j*(-92)
+-53 + j*(210)
+-156 + j*(-160)
+-82 + j*(-115)
+-198 + j*(-206)
+-134 + j*(-6)
+203 + j*(-311)
+-317 + j*(-81)
+-66 + j*(-54)
+67 + j*(-153)
+-34 + j*(-26)
+-14 + j*(-69)
+91 + j*(163)
+-6 + j*(-6)
+-141 + j*(66)
+-91 + j*(241)
+-42 + j*(196)
+-49 + j*(-35)
+-175 + j*(-137)
+16 + j*(267)
+49 + j*(-106)
+45 + j*(97)
+-351 + j*(119)
+-276 + j*(-46)
+-109 + j*(94)
+3 + j*(170)
+-182 + j*(323)
+97 + j*(-124)
+-203 + j*(307)
+-233 + j*(231)
+-134 + j*(78)
+282 + j*(8)
+124 + j*(319)
+119 + j*(-40)
+-176 + j*(-145)
+26 + j*(42)
+97 + j*(-273)
+-319 + j*(-56)
+-148 + j*(-65)
+-12 + j*(242)
+16 + j*(165)
+264 + j*(85)
+-181 + j*(-34)
+1 + j*(-103)
+194 + j*(-12)
+14 + j*(260)
+-251 + j*(-40)
+-280 + j*(81)
+-42 + j*(-2)
+-6 + j*(152)
+155 + j*(245)
+-267 + j*(103)
+-23 + j*(-334)
+-177 + j*(100)
+8 + j*(-99)
+104 + j*(-202)
+168 + j*(94)
+59 + j*(-193)
+57 + j*(116)
+98 + j*(-116)
+-96 + j*(-264)
+-44 + j*(301)
+138 + j*(6)
+-168 + j*(187)
+-306 + j*(-88)
+-163 + j*(-206)
+-222 + j*(52)
+319 + j*(32)
+45 + j*(-178)
+-207 + j*(-179)
+160 + j*(-24)
+84 + j*(460)
+91 + j*(-168)
+168 + j*(119)
+11 + j*(-8)
+-145 + j*(195)
+-145 + j*(-81)
+39 + j*(247)
+-66 + j*(203)
+208 + j*(-63)
+167 + j*(40)
+-64 + j*(366)
+51 + j*(262)
+21 + j*(139)
+-38 + j*(-226)
+158 + j*(-107)
+-109 + j*(566)
+100 + j*(-16)
+2 + j*(43)
+1 + j*(-100)
+23 + j*(-98)
+-48 + j*(-217)
+-64 + j*(218)
+105 + j*(-83)
+-186 + j*(104)
+-64 + j*(-268)
+1 + j*(131)
+-219 + j*(-175)
+-100 + j*(69)
+34 + j*(-469)
+199 + j*(177)
+305 + j*(-176)
+-184 + j*(-29)
+-332 + j*(50)
+309 + j*(93)
+-19 + j*(-73)
+-21 + j*(-3)
+56 + j*(81)
+171 + j*(-164)
+62 + j*(-228)
+-21 + j*(-373)
+-88 + j*(-193)
+201 + j*(-6)
+340 + j*(-322)
+207 + j*(7)
+-89 + j*(-211)
+-206 + j*(12)
+-161 + j*(-84)
+49 + j*(-272)
+132 + j*(-129)
+-126 + j*(304)
+26 + j*(66)
+-39 + j*(84)
+-228 + j*(-138)
+71 + j*(13)
+-27 + j*(-319)
+157 + j*(104)
+98 + j*(291)
+187 + j*(-319)
+287 + j*(52)
+-91 + j*(228)
+-42 + j*(-133)
+297 + j*(-35)
+28 + j*(-127)
+50 + j*(38)
+253 + j*(-35)
+126 + j*(-69)
+153 + j*(-41)
+-141 + j*(203)
+-63 + j*(-108)
+-69 + j*(-134)
+274 + j*(273)
+255 + j*(-329)
+202 + j*(31)
+-158 + j*(-15)
+240 + j*(122)
+-249 + j*(205)
+-29 + j*(171)
+-209 + j*(28)
+146 + j*(-77)
+124 + j*(-155)
+-21 + j*(-257)
+342 + j*(292)
+-75 + j*(145)
+-37 + j*(199)
+124 + j*(317)
+198 + j*(48)
+197 + j*(35)
+-71 + j*(-55)
+235 + j*(-358)
+-136 + j*(62)
+-121 + j*(-194)
+-129 + j*(190)
+126 + j*(160)
+153 + j*(154)
+223 + j*(-95)
+78 + j*(-270)
+447 + j*(60)
+-184 + j*(-173)
+-121 + j*(-134)
+141 + j*(-25)
+179 + j*(-190)
+26 + j*(305)
+-180 + j*(-13)
+123 + j*(-4)
+130 + j*(-310)
+-42 + j*(-91)
+71 + j*(286)
+-192 + j*(33)
+130 + j*(206)
+147 + j*(2)
+-38 + j*(-156)
+1 + j*(327)
+-34 + j*(-42)
+-254 + j*(-168)
+189 + j*(227)
+143 + j*(32)
+-211 + j*(-264)
+-39 + j*(-439)
+-24 + j*(271)
+-25 + j*(110)
+190 + j*(-4)
+-102 + j*(-243)
+-13 + j*(40)
+-87 + j*(55)
+156 + j*(89)
+295 + j*(-50)
+210 + j*(-263)
+-303 + j*(70)
+86 + j*(-102)
+-68 + j*(4)
+79 + j*(-426)
+-152 + j*(-158)
+93 + j*(36)
+52 + j*(-144)
+27 + j*(-280)
+58 + j*(-16)
+82 + j*(2)
+57 + j*(-151)
+-76 + j*(-21)
+-67 + j*(125)
+233 + j*(-44)
+72 + j*(-83)
+203 + j*(52)
+-35 + j*(0)
+140 + j*(-147)
+110 + j*(144)
+96 + j*(23)
+288 + j*(-122)
+-67 + j*(85)
+300 + j*(-56)
+-262 + j*(39)
+201 + j*(233)
+-20 + j*(151)
+-323 + j*(-35)
+49 + j*(143)
+-89 + j*(-158)
+-66 + j*(-216)
+-244 + j*(163)
+240 + j*(-245)
+364 + j*(-71)
+-205 + j*(280)
+66 + j*(-18)
+-58 + j*(144)
+141 + j*(-151)
+154 + j*(-25)
+202 + j*(-83)
+33 + j*(-127)
+-166 + j*(-157)
+451 + j*(-244)
+-101 + j*(35)
+18 + j*(134)
+134 + j*(252)
+-95 + j*(-264)
+320 + j*(211)
+-54 + j*(-52)
+-145 + j*(122)
+-10 + j*(247)
+-359 + j*(164)
+-93 + j*(-90)
+-141 + j*(199)
+-122 + j*(-140)
+-384 + j*(-230)
+34 + j*(2)
+-190 + j*(276)
+-49 + j*(185)
+197 + j*(-12)
+-213 + j*(-105)
+-110 + j*(-62)
+-1 + j*(163)
+54 + j*(12)
+74 + j*(-148)
+-130 + j*(221)
+-86 + j*(161)
+86 + j*(50)
+-110 + j*(-74)
+129 + j*(256)
+25 + j*(-84)
+-35 + j*(-124)
+71 + j*(-105)
+274 + j*(-267)
+298 + j*(-52)
+-1 + j*(116)
+220 + j*(-17)
+147 + j*(126)
+69 + j*(53)
+-208 + j*(-60)
+197 + j*(115)
+-140 + j*(13)
+122 + j*(-74)
+36 + j*(194)
+-40 + j*(-26)
+-126 + j*(97)
+288 + j*(115)
+-142 + j*(127)
+-20 + j*(-21)
+-117 + j*(79)
+-73 + j*(308)
+-430 + j*(132)
+-129 + j*(161)
+83 + j*(56)
+-63 + j*(-355)
+-139 + j*(132)
+206 + j*(8)
+19 + j*(-193)
+156 + j*(-25)
+20 + j*(-277)
+74 + j*(207)
+-312 + j*(-97)
+-264 + j*(127)
+219 + j*(69)
+-16 + j*(126)
+92 + j*(-206)
+-227 + j*(164)
+-172 + j*(-120)
+158 + j*(-31)
+110 + j*(83)
+-103 + j*(6)
+-22 + j*(120)
+110 + j*(93)
+37 + j*(-170)
+-148 + j*(136)
+-23 + j*(12)
+59 + j*(61)
+117 + j*(119)
+163 + j*(283)
+263 + j*(95)
+334 + j*(65)
+-169 + j*(80)
+-129 + j*(543)
+-163 + j*(179)
+46 + j*(193)
+-177 + j*(232)
+206 + j*(13)
+203 + j*(67)
+42 + j*(31)
+119 + j*(-159)
+-98 + j*(104)
+68 + j*(70)
+91 + j*(155)
+55 + j*(-175)
+88 + j*(-54)
+-148 + j*(-14)
+405 + j*(30)
+250 + j*(-249)
+6 + j*(234)
+71 + j*(69)
+57 + j*(-92)
+194 + j*(44)
+-104 + j*(175)
+136 + j*(-145)
+137 + j*(-80)
+110 + j*(-363)
+240 + j*(-14)
+-110 + j*(158)
+-57 + j*(28)
+-112 + j*(-86)
+25 + j*(192)
+139 + j*(-252)
+-250 + j*(-42)
+25 + j*(61)
+-235 + j*(-152)
+310 + j*(-206)
+-341 + j*(-164)
+-113 + j*(4)
+-62 + j*(-13)
+216 + j*(90)
+-45 + j*(-161)
+-129 + j*(-240)
+124 + j*(173)
+66 + j*(180)
+80 + j*(-23)
+-62 + j*(144)
+28 + j*(-5)
+115 + j*(184)
+75 + j*(-197)
+-325 + j*(100)
+94 + j*(-126)
+-78 + j*(-344)
+-107 + j*(302)
+-243 + j*(-243)
+62 + j*(227)
+-15 + j*(-337)
+-49 + j*(-74)
+88 + j*(134)
+-91 + j*(81)
+-34 + j*(103)
+-112 + j*(233)
+253 + j*(151)
+-45 + j*(-25)
+212 + j*(-127)
+-363 + j*(66)
+251 + j*(12)
+267 + j*(27)
+280 + j*(-414)
+136 + j*(131)
+-32 + j*(-176)
+136 + j*(31)
+-139 + j*(171)
+185 + j*(103)
+84 + j*(198)
+88 + j*(81)
+104 + j*(-158)
+301 + j*(298)
+63 + j*(260)
+210 + j*(-169)
+112 + j*(-52)
+-64 + j*(119)
+-169 + j*(-281)
+-83 + j*(-310)
+274 + j*(-79)
+209 + j*(-182)
+-107 + j*(-240)
+-86 + j*(4)
+202 + j*(16)
+-387 + j*(75)
+-81 + j*(85)
+17 + j*(260)
+-348 + j*(-243)
+-39 + j*(88)
+259 + j*(-40)
+37 + j*(13)
+157 + j*(-121)
+40 + j*(-37)
+267 + j*(-28)
+85 + j*(47)
+-310 + j*(52)
+25 + j*(33)
+-366 + j*(-264)
+-58 + j*(120)
+36 + j*(-93)
+187 + j*(6)
+93 + j*(23)
+44 + j*(-240)
+235 + j*(161)
+197 + j*(293)
+-153 + j*(126)
+211 + j*(-71)
+213 + j*(-42)
+176 + j*(-6)
+-176 + j*(-40)
+33 + j*(64)
+-81 + j*(-133)
+52 + j*(256)
+160 + j*(-141)
+118 + j*(187)
+-212 + j*(26)
+-257 + j*(157)
+192 + j*(18)
+199 + j*(295)
+49 + j*(-94)
+2 + j*(208)
+-83 + j*(-170)
+-226 + j*(-139)
+-197 + j*(18)
+40 + j*(-130)
+144 + j*(-136)
+107 + j*(19)
+-102 + j*(472)
+-53 + j*(-39)
+5 + j*(265)
+173 + j*(256)
+-349 + j*(40)
+54 + j*(-140)
+66 + j*(132)
+64 + j*(73)
+-141 + j*(95)
+327 + j*(-69)
+-547 + j*(115)
+59 + j*(-115)
+-62 + j*(69)
+81 + j*(182)
+-86 + j*(-208)
+-100 + j*(-318)
+127 + j*(213)
+93 + j*(16)
+243 + j*(-7)
+-23 + j*(333)
+-21 + j*(330)
+74 + j*(-50)
+-40 + j*(-168)
+434 + j*(333)
+81 + j*(-143)
+230 + j*(163)
+209 + j*(-187)
+-33 + j*(270)
+132 + j*(-217)
+-127 + j*(-35)
+-59 + j*(40)
+187 + j*(32)
+-11 + j*(-143)
+156 + j*(245)
+-18 + j*(-28)
+-166 + j*(-27)
+332 + j*(145)
+8 + j*(-192)
+-11 + j*(-185)
+-190 + j*(72)
+-118 + j*(138)
+112 + j*(215)
+-26 + j*(52)
+137 + j*(29)
+-200 + j*(-123)
+183 + j*(-187)
+93 + j*(35)
+-336 + j*(-33)
+28 + j*(223)
+-1 + j*(-18)
+-234 + j*(98)
+117 + j*(25)
+132 + j*(-174)
+-430 + j*(-3)
+52 + j*(-205)
+95 + j*(148)
+-55 + j*(-199)
+20 + j*(-107)
+-113 + j*(-80)
+51 + j*(26)
+-13 + j*(79)
+-182 + j*(20)
+-71 + j*(-19)
+-16 + j*(-290)
+-197 + j*(204)
+42 + j*(-184)
+-63 + j*(52)
+16 + j*(-112)
+164 + j*(-293)
+-39 + j*(113)
+267 + j*(-49)
+259 + j*(-80)
+-65 + j*(55)
+151 + j*(112)
+-21 + j*(113)
+64 + j*(-163)
+71 + j*(28)
+155 + j*(126)
+226 + j*(47)
+173 + j*(195)
+11 + j*(-218)
+87 + j*(-64)
+126 + j*(-53)
+34 + j*(-310)
+225 + j*(-183)
+-148 + j*(-328)
+210 + j*(-400)
+289 + j*(49)
+3 + j*(-170)
+231 + j*(54)
+136 + j*(21)
+-83 + j*(273)
+108 + j*(251)
+429 + j*(277)
+6 + j*(294)
+103 + j*(207)
+16 + j*(-199)
+187 + j*(28)
+16 + j*(51)
+232 + j*(51)
+-148 + j*(9)
+77 + j*(-168)
+42 + j*(279)
+132 + j*(265)
+145 + j*(-90)
+-49 + j*(-211)
+90 + j*(144)
+156 + j*(3)
+27 + j*(-264)
+302 + j*(23)
+148 + j*(-5)
+-119 + j*(-27)
+-100 + j*(-138)
+-182 + j*(-56)
+-303 + j*(333)
+-101 + j*(162)
+311 + j*(-143)
+-27 + j*(-283)
+-215 + j*(-93)
+-64 + j*(120)
+-10 + j*(-337)
+-204 + j*(48)
+-91 + j*(-95)
+113 + j*(-223)
+-68 + j*(-86)
+91 + j*(-162)
+383 + j*(534)
+331 + j*(-151)
+296 + j*(-125)
+-534 + j*(195)
+68 + j*(341)
+-64 + j*(338)
+202 + j*(199)
+277 + j*(-187)
+10 + j*(-149)
+-89 + j*(-287)
+356 + j*(-535)
+136 + j*(225)
+221 + j*(-13)
+245 + j*(105)
+-55 + j*(-260)
+-246 + j*(-332)
+-146 + j*(315)
+-602 + j*(-237)
+-329 + j*(238)
+-173 + j*(-174)
+562 + j*(83)
+-189 + j*(-310)
+339 + j*(361)
+-309 + j*(-162)
+81 + j*(317)
+445 + j*(-265)
+-183 + j*(343)
+-302 + j*(33)
+-663 + j*(180)
+-257 + j*(-70)
+515 + j*(252)
+192 + j*(334)
+-560 + j*(68)
+214 + j*(11)
+-463 + j*(-437)
+66 + j*(286)
+-305 + j*(236)
+-332 + j*(40)
+-180 + j*(-321)
+420 + j*(-76)
+63 + j*(-168)
+243 + j*(-251)
+176 + j*(-378)
+328 + j*(303)
+-270 + j*(353)
+-407 + j*(-240)
+257 + j*(207)
+-107 + j*(-203)
+-100 + j*(-153)
+635 + j*(335)
+45 + j*(52)
+251 + j*(-25)
+238 + j*(232)
+-268 + j*(-144)
+183 + j*(-70)
+-237 + j*(-222)
+231 + j*(274)
+-132 + j*(372)
+383 + j*(50)
+-187 + j*(195)
+81 + j*(156)
+-145 + j*(-689)
+139 + j*(312)
+-162 + j*(419)
+387 + j*(-187)
+-168 + j*(-233)
+-344 + j*(184)
+-337 + j*(-478)
+737 + j*(-88)
+-106 + j*(486)
+44 + j*(226)
+-293 + j*(100)
+532 + j*(-33)
+534 + j*(-52)
+-527 + j*(431)
+-438 + j*(-312)
+223 + j*(-175)
+149 + j*(367)
+132 + j*(-694)
+406 + j*(306)
+222 + j*(-339)
+-68 + j*(493)
+348 + j*(123)
+16 + j*(-402)
+125 + j*(-231)
+-468 + j*(-245)
+304 + j*(74)
+439 + j*(423)
+-438 + j*(18)
+-686 + j*(327)
+-150 + j*(98)
+303 + j*(147)
+411 + j*(-9)
+-298 + j*(103)
+-185 + j*(-97)
+-288 + j*(-369)
+393 + j*(-370)
+491 + j*(433)
+412 + j*(146)
+-167 + j*(-435)
+199 + j*(-350)
+316 + j*(-90)
+204 + j*(-154)
+-333 + j*(-12)
+682 + j*(-197)
+-139 + j*(439)
+-306 + j*(49)
+-281 + j*(-679)
+454 + j*(-212)
+444 + j*(508)
+106 + j*(-67)
+-122 + j*(-80)
+268 + j*(196)
+587 + j*(-342)
+-275 + j*(379)
+443 + j*(-190)
+-606 + j*(199)
+-108 + j*(524)
+-202 + j*(201)
+-395 + j*(-388)
+511 + j*(-591)
+-265 + j*(-98)
+224 + j*(189)
+231 + j*(-250)
+45 + j*(-397)
+-286 + j*(-167)
+230 + j*(40)
+346 + j*(395)
+-400 + j*(635)
+43 + j*(-228)
+397 + j*(149)
+-160 + j*(520)
+204 + j*(213)
+335 + j*(398)
+344 + j*(504)
+-11 + j*(-309)
+59 + j*(-37)
+-390 + j*(-374)
+-361 + j*(518)
+386 + j*(131)
+233 + j*(-187)
+356 + j*(23)
+-157 + j*(-261)
+-451 + j*(-523)
+167 + j*(593)
+209 + j*(119)
+-730 + j*(-56)
+-219 + j*(-598)
+29 + j*(250)
+79 + j*(392)
+300 + j*(158)
+276 + j*(-165)
+72 + j*(-346)
+-245 + j*(-170)
+455 + j*(-394)
+48 + j*(315)
+33 + j*(-81)
+201 + j*(127)
+-37 + j*(51)
+196 + j*(180)
+-62 + j*(416)
+267 + j*(252)
+-242 + j*(-452)
+-8 + j*(397)
+124 + j*(40)
+-264 + j*(-126)
+42 + j*(404)
+558 + j*(103)
+-327 + j*(35)
+-510 + j*(528)
+-561 + j*(-597)
+-349 + j*(-397)
+41 + j*(214)
+-334 + j*(462)
+98 + j*(-105)
+-75 + j*(229)
+245 + j*(-116)
+330 + j*(186)
+-81 + j*(434)
+488 + j*(200)
+-124 + j*(-164)
+-8 + j*(68)
+-88 + j*(373)
+-312 + j*(-402)
+103 + j*(267)
+683 + j*(217)
+-341 + j*(67)
+-280 + j*(350)
+492 + j*(-231)
+-211 + j*(-218)
+240 + j*(316)
+364 + j*(272)
+370 + j*(453)
+253 + j*(171)
+184 + j*(663)
+-333 + j*(-392)
+-192 + j*(-409)
+384 + j*(-292)
+220 + j*(-143)
+-284 + j*(242)
+118 + j*(-272)
+170 + j*(-47)
+422 + j*(-353)
+494 + j*(-685)
+-88 + j*(95)
+264 + j*(232)
+153 + j*(175)
+168 + j*(205)
+-126 + j*(-213)
+-51 + j*(390)
+-283 + j*(40)
+-361 + j*(689)
+171 + j*(-141)
+435 + j*(-318)
+-141 + j*(-260)
+220 + j*(-144)
+286 + j*(155)
+-310 + j*(299)
+78 + j*(-204)
+373 + j*(273)
+-321 + j*(723)
+707 + j*(-203)
+324 + j*(102)
+-177 + j*(-383)
+245 + j*(-99)
+-380 + j*(339)
+235 + j*(-375)
+-292 + j*(77)
+23 + j*(-351)
+330 + j*(-171)
+211 + j*(167)
+455 + j*(-540)
+-448 + j*(-230)
+215 + j*(263)
+137 + j*(373)
+-66 + j*(-47)
+-300 + j*(-85)
+302 + j*(177)
+-442 + j*(197)
+-46 + j*(132)
+-419 + j*(214)
+-166 + j*(92)
+-184 + j*(447)
+94 + j*(342)
+-328 + j*(-42)
+-552 + j*(-458)
+374 + j*(-177)
+300 + j*(404)
+40 + j*(219)
+-228 + j*(-505)
+272 + j*(266)
+-192 + j*(200)
+213 + j*(-150)
+274 + j*(-355)
+492 + j*(54)
+541 + j*(-602)
+460 + j*(-52)
+98 + j*(449)
+382 + j*(-380)
+-153 + j*(-241)
+-250 + j*(-45)
+-245 + j*(-315)
+264 + j*(-289)
+154 + j*(-177)
+146 + j*(-441)
+-336 + j*(285)
+-102 + j*(388)
+236 + j*(-18)
+-115 + j*(335)
+-532 + j*(421)
+484 + j*(450)
+354 + j*(738)
+-416 + j*(523)
+-293 + j*(-193)
+115 + j*(-764)
+-327 + j*(-238)
+-425 + j*(-378)
+-269 + j*(-413)
+-642 + j*(-380)
+-43 + j*(-7)
+206 + j*(424)
+244 + j*(-416)
+453 + j*(-545)
+-165 + j*(-64)
+-138 + j*(-312)
+-499 + j*(484)
+-307 + j*(-119)
+122 + j*(578)
+-266 + j*(-390)
+-218 + j*(395)
+-188 + j*(-14)
+373 + j*(-118)
+86 + j*(629)
+-435 + j*(-107)
+390 + j*(-469)
+197 + j*(-99)
+343 + j*(-344)
+-137 + j*(-218)
+-252 + j*(354)
+-261 + j*(329)
+-214 + j*(393)
+-247 + j*(274)
+214 + j*(158)
+74 + j*(315)
+434 + j*(-211)
+-228 + j*(-161)
+-86 + j*(482)
+41 + j*(197)
+-110 + j*(217)
+182 + j*(16)
+437 + j*(-583)
+446 + j*(-162)
+-139 + j*(122)
+117 + j*(368)
+173 + j*(179)
+245 + j*(-228)
+78 + j*(450)
+-484 + j*(-112)
+-375 + j*(-177)
+-265 + j*(-155)
+185 + j*(-10)
+635 + j*(-213)
+-59 + j*(223)
+306 + j*(-93)
+8 + j*(-310)
+201 + j*(333)
+482 + j*(-70)
+-78 + j*(115)
+390 + j*(564)
+433 + j*(280)
+52 + j*(25)
+185 + j*(328)
+273 + j*(-367)
+-156 + j*(255)
+177 + j*(-170)
+-181 + j*(207)
+-466 + j*(-256)
+-279 + j*(-97)
+444 + j*(-466)
+-105 + j*(308)
+71 + j*(-127)
+-1 + j*(6)
+171 + j*(163)
+-357 + j*(440)
+346 + j*(97)
+-366 + j*(-355)
+-149 + j*(-342)
+-72 + j*(-146)
+120 + j*(185)
+190 + j*(237)
+-53 + j*(-444)
+340 + j*(68)
+103 + j*(7)
+210 + j*(183)
+282 + j*(-173)
+240 + j*(373)
+-112 + j*(463)
+-187 + j*(262)
+-260 + j*(-234)
+-33 + j*(217)
+-347 + j*(2)
+229 + j*(-414)
+163 + j*(284)
+121 + j*(61)
+-286 + j*(439)
+403 + j*(112)
+-290 + j*(122)
+339 + j*(151)
+339 + j*(-290)
+349 + j*(-248)
+-403 + j*(315)
+-318 + j*(-601)
+-293 + j*(-348)
+279 + j*(-15)
+79 + j*(-222)
+-458 + j*(-433)
+625 + j*(-496)
+-81 + j*(204)
+-222 + j*(-499)
+-486 + j*(-186)
+-113 + j*(-105)
+-199 + j*(-497)
+351 + j*(174)
+347 + j*(-373)
+233 + j*(49)
+-64 + j*(-416)
+264 + j*(-139)
+33 + j*(494)
+281 + j*(180)
+-412 + j*(-375)
+-318 + j*(502)
+-265 + j*(274)
+-260 + j*(175)
+167 + j*(-491)
+647 + j*(236)
+-25 + j*(238)
+-326 + j*(-495)
+100 + j*(-313)
+173 + j*(-786)
+-98 + j*(231)
+-238 + j*(409)
+361 + j*(-446)
+538 + j*(-350)
+-127 + j*(-153)
+-576 + j*(-199)
+-72 + j*(-510)
+363 + j*(-360)
+-482 + j*(-238)
+-352 + j*(-363)
+-295 + j*(-104)
+-119 + j*(212)
+297 + j*(351)
+-268 + j*(-371)
+97 + j*(53)
+235 + j*(90)
+209 + j*(298)
+-212 + j*(-276)
+-309 + j*(551)
+-54 + j*(-273)
+225 + j*(457)
+37 + j*(-149)
+-81 + j*(202)
+345 + j*(300)
+-322 + j*(247)
+202 + j*(425)
+-215 + j*(-173)
+-123 + j*(297)
+-227 + j*(19)
+-170 + j*(-366)
+344 + j*(-305)
+369 + j*(-191)
+-318 + j*(525)
+332 + j*(-325)
+-337 + j*(-318)
+-655 + j*(564)
+595 + j*(-511)
+436 + j*(384)
+-515 + j*(40)
+243 + j*(-459)
+-21 + j*(156)
+258 + j*(-438)
+-357 + j*(-326)
+-433 + j*(583)
+-357 + j*(-489)
+171 + j*(-34)
+122 + j*(402)
+-289 + j*(339)
+160 + j*(189)
+94 + j*(-71)
+453 + j*(-301)
+292 + j*(-117)
+338 + j*(216)
+363 + j*(400)
+-43 + j*(-35)
+217 + j*(85)
+33 + j*(241)
+173 + j*(-141)
+-266 + j*(-306)
+-264 + j*(-451)
+226 + j*(-296)
+350 + j*(-16)
+30 + j*(312)
+-566 + j*(-133)
+-195 + j*(219)
+478 + j*(-61)
+-612 + j*(-527)
+-189 + j*(-585)
+-466 + j*(-600)
+-288 + j*(445)
+-460 + j*(245)
+171 + j*(-448)
+-258 + j*(520)
+-379 + j*(-194)
+369 + j*(-410)
+-213 + j*(144)
+128 + j*(-40)
+308 + j*(277)
+-37 + j*(-508)
+226 + j*(-127)
+290 + j*(285)
+-506 + j*(-353)
+-356 + j*(-194)
+298 + j*(307)
+161 + j*(499)
+267 + j*(157)
+117 + j*(-136)
+494 + j*(-658)
+103 + j*(-286)
+415 + j*(465)
+233 + j*(-156)
+110 + j*(-371)
+-428 + j*(196)
+-377 + j*(269)
+-234 + j*(127)
+-321 + j*(-78)
+282 + j*(-223)
+-310 + j*(-246)
+45 + j*(146)
+5 + j*(38)
+-182 + j*(239)
+-430 + j*(453)
+414 + j*(-105)
+-527 + j*(147)
+-12 + j*(554)
+-296 + j*(-168)
+-147 + j*(-170)
+-504 + j*(-331)
+-313 + j*(-380)
+453 + j*(429)
+-463 + j*(-119)
+-175 + j*(-387)
+251 + j*(403)
+-143 + j*(187)
+208 + j*(-498)
+434 + j*(-214)
+600 + j*(-360)
+-251 + j*(28)
+373 + j*(-204)
+-305 + j*(-288)
+-243 + j*(356)
+53 + j*(-467)
+127 + j*(226)
+-412 + j*(-91)
+325 + j*(371)
+347 + j*(-487)
+332 + j*(327)
+-226 + j*(-306)
+482 + j*(-47)
+-62 + j*(397)
+363 + j*(-184)
+192 + j*(257)
+-390 + j*(-347)
+-15 + j*(-159)
+434 + j*(-467)
+347 + j*(-162)
+374 + j*(-216)
+-197 + j*(-21)
+195 + j*(679)
+317 + j*(451)
+206 + j*(400)
+420 + j*(421)
+-190 + j*(-107)
+-141 + j*(192)
+452 + j*(364)
+-550 + j*(44)
+-141 + j*(-274)
+-459 + j*(409)
+466 + j*(-351)
+-178 + j*(103)
+-378 + j*(351)
+-213 + j*(132)
+-322 + j*(102)
+-244 + j*(-537)
+-252 + j*(-467)
+-266 + j*(483)
+433 + j*(-273)
+-180 + j*(-474)
+69 + j*(-356)
+412 + j*(-295)
+-36 + j*(-529)
+-588 + j*(194)
+-10 + j*(-25)
+-446 + j*(-204)
+-380 + j*(1)
+-481 + j*(-128)
+-271 + j*(151)
+-303 + j*(-184)
+272 + j*(-253)
+102 + j*(284)
+-153 + j*(66)
+100 + j*(-302)
+385 + j*(-581)
+259 + j*(605)
+205 + j*(-482)
+-288 + j*(-276)
+197 + j*(-288)
+-398 + j*(325)
+358 + j*(-357)
+104 + j*(-474)
+735 + j*(38)
+306 + j*(-162)
+121 + j*(-267)
+-480 + j*(272)
+-13 + j*(-94)
+-146 + j*(131)
+-484 + j*(-257)
+-64 + j*(227)
+178 + j*(19)
+212 + j*(450)
+17 + j*(-184)
+-406 + j*(-301)
+-424 + j*(252)
+-194 + j*(444)
+-550 + j*(-138)
+361 + j*(424)
+-308 + j*(-156)
+-251 + j*(-183)
+293 + j*(-98)
+-271 + j*(249)
+-317 + j*(-79)
+-42 + j*(276)
+-88 + j*(217)
+1 + j*(327)
+-53 + j*(250)
+-42 + j*(-334)
+154 + j*(70)
+262 + j*(-33)
+-1 + j*(-104)
+35 + j*(-118)
+57 + j*(455)
+247 + j*(-148)
+0 + j*(62)
+-200 + j*(193)
+62 + j*(-139)
+95 + j*(111)
+291 + j*(-154)
+-135 + j*(118)
+66 + j*(-148)
+-337 + j*(192)
+-247 + j*(-26)
+-13 + j*(-40)
+-412 + j*(-91)
+-66 + j*(-206)
+91 + j*(179)
+-189 + j*(407)
+-152 + j*(35)
+187 + j*(28)
+206 + j*(7)
+242 + j*(-28)
+-71 + j*(-75)
+-187 + j*(-48)
+240 + j*(-105)
+-122 + j*(-187)
+-156 + j*(163)
+225 + j*(102)
+52 + j*(198)
+-62 + j*(3)
+171 + j*(-147)
+-84 + j*(-253)
+-1 + j*(-402)
+264 + j*(140)
+-2 + j*(-152)
+75 + j*(-168)
+-134 + j*(-34)
+45 + j*(155)
+-164 + j*(135)
+334 + j*(281)
+-71 + j*(-170)
+296 + j*(-413)
+44 + j*(260)
+197 + j*(204)
+71 + j*(2)
+119 + j*(-129)
+169 + j*(68)
+-196 + j*(198)
+170 + j*(-124)
+-120 + j*(-8)
+102 + j*(-120)
+-578 + j*(93)
+71 + j*(239)
+-218 + j*(91)
+-206 + j*(9)
+-287 + j*(-461)
+-260 + j*(-65)
+28 + j*(-45)
+-26 + j*(132)
+-86 + j*(-8)
+0 + j*(-16)
+-86 + j*(499)
+-49 + j*(352)
+14 + j*(108)
+299 + j*(-55)
+-255 + j*(-81)
+-375 + j*(228)
+-125 + j*(66)
+-107 + j*(159)
+-199 + j*(-283)
+158 + j*(-206)
+241 + j*(-91)
+-44 + j*(4)
+-288 + j*(127)
+-19 + j*(-119)
+83 + j*(-223)
+76 + j*(-191)
+-19 + j*(64)
+205 + j*(-267)
+209 + j*(100)
+290 + j*(175)
+96 + j*(12)
+71 + j*(15)
+231 + j*(70)
+127 + j*(-37)
+-153 + j*(195)
+29 + j*(189)
+-30 + j*(-94)
+-55 + j*(-209)
+338 + j*(-214)
+122 + j*(-64)
+-234 + j*(172)
+160 + j*(-110)
+142 + j*(114)
+157 + j*(136)
+-189 + j*(-197)
+28 + j*(-45)
+-42 + j*(-143)
+171 + j*(-12)
+-168 + j*(163)
+-199 + j*(194)
+-265 + j*(-212)
+181 + j*(-21)
+-267 + j*(-224)
+-191 + j*(110)
+-77 + j*(-215)
+83 + j*(-106)
+-52 + j*(451)
+-60 + j*(92)
+-171 + j*(-199)
+233 + j*(-231)
+-107 + j*(39)
+151 + j*(42)
+120 + j*(-6)
+-257 + j*(-182)
+110 + j*(-52)
+-208 + j*(-26)
+-130 + j*(-157)
+153 + j*(267)
+494 + j*(-45)
+178 + j*(-91)
+-59 + j*(-184)
+137 + j*(318)
+-315 + j*(254)
+-264 + j*(-67)
+42 + j*(-4)
+102 + j*(62)
+-43 + j*(-23)
+-132 + j*(79)
+-163 + j*(-138)
+-132 + j*(-232)
+106 + j*(50)
+264 + j*(56)
+-172 + j*(-100)
+318 + j*(147)
+84 + j*(-246)
+274 + j*(-330)
+177 + j*(19)
+185 + j*(81)
+201 + j*(18)
+-306 + j*(110)
+81 + j*(-6)
+65 + j*(-186)
+-278 + j*(-66)
+175 + j*(55)
+8 + j*(107)
+-85 + j*(14)
+300 + j*(395)
+-65 + j*(-403)
+293 + j*(-56)
+-187 + j*(103)
+66 + j*(-240)
+66 + j*(-302)
+-82 + j*(-214)
+194 + j*(-47)
+64 + j*(-235)
+-372 + j*(-222)
+119 + j*(-341)
+-323 + j*(40)
+-114 + j*(293)
+-208 + j*(-158)
+-95 + j*(183)
+161 + j*(231)
+47 + j*(-131)
+102 + j*(-31)
+205 + j*(-180)
+-40 + j*(-127)
+175 + j*(-288)
+79 + j*(-272)
+-245 + j*(3)
+251 + j*(-3)
+-119 + j*(243)
+-123 + j*(-339)
+-290 + j*(85)
+-100 + j*(-175)
+-205 + j*(477)
+-24 + j*(-71)
+342 + j*(-185)
+66 + j*(13)
+-56 + j*(78)
+175 + j*(-124)
+-228 + j*(117)
+-122 + j*(-62)
+72 + j*(308)
+222 + j*(-223)
+85 + j*(47)
+-59 + j*(173)
+-97 + j*(142)
+141 + j*(-108)
+-278 + j*(107)
+-141 + j*(75)
+211 + j*(74)
+319 + j*(-107)
+-98 + j*(209)
+-350 + j*(45)
+-468 + j*(-308)
+332 + j*(-157)
+-10 + j*(-57)
+21 + j*(-37)
+1 + j*(-71)
+151 + j*(18)
+-356 + j*(361)
+7 + j*(-8)
+-87 + j*(-148)
+205 + j*(-86)
+-9 + j*(85)
+419 + j*(64)
+80 + j*(60)
+199 + j*(197)
+-187 + j*(-205)
+-119 + j*(228)
+11 + j*(187)
+-212 + j*(-21)
+-160 + j*(121)
+45 + j*(-420)
+-158 + j*(-173)
+49 + j*(286)
+204 + j*(54)
+158 + j*(206)
+-1 + j*(-63)
+119 + j*(9)
+169 + j*(-116)
+325 + j*(145)
+-106 + j*(6)
+-96 + j*(44)
+-140 + j*(253)
+138 + j*(23)
+-431 + j*(-37)
+-72 + j*(5)
+-35 + j*(128)
+-165 + j*(75)
+-45 + j*(-158)
+298 + j*(119)
+105 + j*(119)
+162 + j*(-16)
+64 + j*(-173)
+-269 + j*(37)
+110 + j*(-21)
+-16 + j*(30)
+113 + j*(129)
+-164 + j*(-238)
+-189 + j*(62)
+66 + j*(-142)
+418 + j*(20)
+-264 + j*(-245)
+-251 + j*(76)
+24 + j*(-4)
+310 + j*(-84)
+-112 + j*(-76)
+-20 + j*(27)
+270 + j*(-126)
+-241 + j*(46)
+-258 + j*(123)
+-195 + j*(-302)
+294 + j*(-168)
+83 + j*(-46)
+-121 + j*(-111)
+-297 + j*(-122)
+-269 + j*(32)
+-171 + j*(-107)
+-89 + j*(336)
+-180 + j*(-263)
+-163 + j*(-48)
+265 + j*(-103)
+33 + j*(22)
+448 + j*(99)
+-49 + j*(85)
+259 + j*(-72)
+13 + j*(7)
+-156 + j*(11)
+-112 + j*(186)
+91 + j*(-44)
+127 + j*(110)
+190 + j*(-151)
+26 + j*(-373)
+115 + j*(177)
+99 + j*(-327)
+60 + j*(-87)
+-42 + j*(-71)
+80 + j*(132)
+173 + j*(276)
+6 + j*(177)
+46 + j*(-154)
+6 + j*(115)
+132 + j*(156)
+-303 + j*(257)
+105 + j*(-506)
+293 + j*(82)
+23 + j*(62)
+-563 + j*(397)
+308 + j*(17)
+-16 + j*(-53)
+-22 + j*(-210)
+256 + j*(190)
+-40 + j*(308)
+181 + j*(37)
+-179 + j*(-71)
+-42 + j*(37)
+-258 + j*(375)
+-81 + j*(115)
+-59 + j*(287)
+-66 + j*(122)
+-1 + j*(-218)
+258 + j*(-6)
+78 + j*(-95)
+97 + j*(-148)
+-255 + j*(165)
+226 + j*(0)
+39 + j*(-141)
+175 + j*(111)
+21 + j*(110)
+-93 + j*(288)
+-240 + j*(-11)
+-163 + j*(77)
+25 + j*(110)
+70 + j*(78)
+51 + j*(425)
+-74 + j*(-186)
+121 + j*(-54)
+270 + j*(64)
+115 + j*(-173)
+-143 + j*(281)
+88 + j*(-247)
+-20 + j*(-112)
+156 + j*(-362)
+33 + j*(-128)
+97 + j*(-328)
+28 + j*(-41)
+58 + j*(47)
+45 + j*(13)
+206 + j*(560)
+94 + j*(-16)
+81 + j*(41)
+270 + j*(13)
+68 + j*(95)
+-33 + j*(-120)
+-173 + j*(-166)
+-64 + j*(124)
+17 + j*(-88)
+99 + j*(13)
+-380 + j*(6)
+-65 + j*(219)
+-16 + j*(-51)
+35 + j*(146)
+138 + j*(74)
+453 + j*(-59)
+337 + j*(-5)
+-218 + j*(-105)
+-360 + j*(-43)
+99 + j*(-1)
+-12 + j*(-76)
+-183 + j*(221)
+52 + j*(13)
+86 + j*(-76)
+-265 + j*(-12)
+61 + j*(-264)
+-29 + j*(91)
+20 + j*(-177)
+89 + j*(-281)
+276 + j*(-13)
+243 + j*(-251)
+-140 + j*(-55)
+173 + j*(23)
+-14 + j*(-109)
+59 + j*(57)
+238 + j*(-78)
+50 + j*(124)
+132 + j*(70)
+-358 + j*(21)
+-228 + j*(51)
+-16 + j*(-243)
+-40 + j*(267)
+49 + j*(231)
+309 + j*(8)
+32 + j*(-109)
+-147 + j*(190)
+232 + j*(-166)
+-190 + j*(-117)
+18 + j*(-43)
+-54 + j*(129)
+145 + j*(110)
+-202 + j*(-232)
+-16 + j*(64)
+-320 + j*(354)
+69 + j*(-96)
+-233 + j*(165)
+-93 + j*(-98)
+-182 + j*(-310)
+144 + j*(-146)
+192 + j*(6)
+112 + j*(146)
+214 + j*(352)
+-153 + j*(44)
+-218 + j*(-5)
+-76 + j*(110)
+18 + j*(-194)
+-23 + j*(-85)
+-4 + j*(-256)
+8 + j*(1)
+49 + j*(111)
+-108 + j*(-100)
+-47 + j*(214)
+-72 + j*(143)
+-351 + j*(212)
+-51 + j*(62)
+-96 + j*(173)
+-56 + j*(-223)
+101 + j*(-143)
+245 + j*(-344)
+-74 + j*(103)
+381 + j*(-153)
+76 + j*(271)
+-126 + j*(-9)
+62 + j*(90)
+72 + j*(459)
+-132 + j*(-227)
+-57 + j*(161)
+-294 + j*(48)
+-158 + j*(65)
+-154 + j*(-49)
+21 + j*(156)
+-289 + j*(226)
+45 + j*(79)
+-156 + j*(61)
+50 + j*(15)
+-368 + j*(-200)
+-202 + j*(64)
+344 + j*(190)
+31 + j*(139)
+101 + j*(95)
+-446 + j*(74)
+254 + j*(-9)
+175 + j*(28)
+-158 + j*(115)
+-173 + j*(-316)
+-88 + j*(-179)
+-18 + j*(-386)
+112 + j*(144)
+-368 + j*(250)
+-233 + j*(-171)
+-165 + j*(16)
+-188 + j*(71)
+-41 + j*(-57)
+422 + j*(47)
+62 + j*(-120)
+18 + j*(4)
+-103 + j*(-131)
+-21 + j*(-190)
+-205 + j*(-158)
+268 + j*(151)
+-250 + j*(156)
+-142 + j*(-12)
+99 + j*(237)
+363 + j*(78)
+108 + j*(-13)
+291 + j*(-148)
+-243 + j*(486)
+177 + j*(33)
+117 + j*(15)
+-126 + j*(-1)
+-185 + j*(-149)
+115 + j*(108)
+1 + j*(-47)
+58 + j*(-262)
+275 + j*(-234)
+-83 + j*(155)
+291 + j*(72)
+-187 + j*(147)
+57 + j*(14)
+25 + j*(280)
+318 + j*(23)
+-229 + j*(223)
+164 + j*(86)
+293 + j*(100)
+-52 + j*(-40)
+87 + j*(118)
+-8 + j*(4)
+134 + j*(47)
+250 + j*(376)
+-73 + j*(64)
+104 + j*(-39)
+-305 + j*(-147)
+-419 + j*(-16)
+-41 + j*(8)
+-83 + j*(-453)
+-19 + j*(201)
+-124 + j*(-91)
+-175 + j*(-139)
+25 + j*(144)
+-28 + j*(303)
+-339 + j*(57)
+-139 + j*(319)
+-141 + j*(11)
+-109 + j*(-14)
+-6 + j*(-254)
+-8 + j*(80)
+319 + j*(101)
+94 + j*(-40)
+-202 + j*(-161)
+-329 + j*(-263)
+-115 + j*(-208)
+250 + j*(-221)
+214 + j*(29)
+297 + j*(-151)
+21 + j*(-16)
+3 + j*(204)
+8 + j*(-18)
+302 + j*(-215)
+-216 + j*(-25)
+-54 + j*(-63)
+-113 + j*(-21)
+-218 + j*(-19)
+102 + j*(-134)
+303 + j*(-272)
+-199 + j*(-87)
+-115 + j*(-137)
+-52 + j*(16)
+-153 + j*(-173)
+228 + j*(428)
+-43 + j*(-187)
+149 + j*(-149)
+-83 + j*(373)
+-158 + j*(512)
+-306 + j*(64)
+-59 + j*(54)
+-94 + j*(-110)
+240 + j*(-116)
+99 + j*(52)
+262 + j*(-194)
+-152 + j*(85)
+-105 + j*(218)
+-30 + j*(-55)
+187 + j*(98)
+308 + j*(-119)
+54 + j*(-221)
+103 + j*(175)
+16 + j*(129)
+149 + j*(-23)
+95 + j*(7)
+-267 + j*(-37)
+2 + j*(283)
+-237 + j*(30)
+-28 + j*(-204)
+18 + j*(10)
+-25 + j*(-262)
+-252 + j*(45)
+-7 + j*(64)
+139 + j*(325)
+-44 + j*(-243)
+-94 + j*(194)
+132 + j*(192)
+74 + j*(-332)
+212 + j*(-189)
+-20 + j*(83)
+56 + j*(-45)
+-371 + j*(-122)
+10 + j*(134)
+-163 + j*(69)
+-305 + j*(35)
+27 + j*(-186)
+106 + j*(54)
+226 + j*(8)
+-185 + j*(50)
+-3 + j*(-26)
+11 + j*(136)
+-360 + j*(-132)
+192 + j*(-67)
+189 + j*(-46)
+-23 + j*(122)
+-119 + j*(-45)
+187 + j*(-186)
+24 + j*(78)
+21 + j*(-125)
+433 + j*(-60)
+180 + j*(-35)
+-166 + j*(3)
+44 + j*(134)
+79 + j*(26)
+-82 + j*(103)
+-180 + j*(-40)
+11 + j*(49)
+147 + j*(132)
+10 + j*(-36)
+53 + j*(-157)
+170 + j*(163)
+71 + j*(213)
+82 + j*(-135)
+-56 + j*(-138)
+41 + j*(-115)
+-190 + j*(-4)
+55 + j*(199)
+-144 + j*(-113)
+-397 + j*(-207)
+-165 + j*(-22)
+46 + j*(122)
+-151 + j*(-102)
+124 + j*(-79)
+1 + j*(-262)
+313 + j*(-66)
+117 + j*(54)
+110 + j*(-117)
+-254 + j*(-152)
+-2 + j*(-24)
+-199 + j*(25)
+-178 + j*(-133)
+-164 + j*(88)
+-18 + j*(-30)
+-166 + j*(83)
+18 + j*(-286)
+230 + j*(100)
+153 + j*(-115)
+49 + j*(-59)
+-39 + j*(-12)
+-412 + j*(-168)
+-151 + j*(293)
+81 + j*(-356)
+106 + j*(11)
+101 + j*(-76)
+-103 + j*(489)
+60 + j*(327)
+-254 + j*(-398)
+-96 + j*(-74)
+115 + j*(-133)
+-114 + j*(91)
+105 + j*(23)
+-334 + j*(-8)
+421 + j*(-191)
+-281 + j*(-4)
+49 + j*(-26)
+83 + j*(-13)
+102 + j*(202)
+115 + j*(214)
+-18 + j*(322)
+201 + j*(161)
+34 + j*(-37)
+-204 + j*(181)
+412 + j*(-41)
+187 + j*(-15)
+-11 + j*(95)
+-8 + j*(-322)
+-364 + j*(40)
+-148 + j*(-52)
+351 + j*(-114)
+244 + j*(175)
+-123 + j*(-182)
+-59 + j*(-103)
+-60 + j*(98)
+-166 + j*(83)
+-192 + j*(71)
+-187 + j*(223)
+-24 + j*(-272)
+209 + j*(-320)
+-45 + j*(-89)
+438 + j*(-54)
+-64 + j*(-235)
+-346 + j*(-112)
+-12 + j*(142)
+-331 + j*(-138)
+78 + j*(-123)
+-274 + j*(28)
+-6 + j*(-132)
+-64 + j*(258)
+159 + j*(-135)
+146 + j*(-85)
+-69 + j*(-122)
+12 + j*(394)
+-24 + j*(-233)
+194 + j*(144)
+105 + j*(-107)
+47 + j*(33)
+30 + j*(-122)
+-27 + j*(-21)
+-48 + j*(-248)
+354 + j*(91)
+-3 + j*(54)
+-440 + j*(-37)
+-127 + j*(198)
+99 + j*(-142)
+252 + j*(139)
+-150 + j*(-184)
+-355 + j*(-5)
+192 + j*(243)
+-107 + j*(259)
+-95 + j*(81)
+-345 + j*(40)
+-207 + j*(-141)
+47 + j*(76)
+-118 + j*(66)
+-161 + j*(128)
+-1 + j*(186)
+-45 + j*(-187)
+106 + j*(224)
+-48 + j*(-237)
+35 + j*(-229)
+-55 + j*(-293)
+-54 + j*(-86)
+-183 + j*(79)
+-15 + j*(-41)
+-122 + j*(231)
+69 + j*(-17)
+100 + j*(279)
+320 + j*(76)
+-68 + j*(-83)
+107 + j*(-70)
+-94 + j*(158)
+-93 + j*(122)
+-141 + j*(22)
+65 + j*(91)
+-390 + j*(-91)
+-216 + j*(35)
+37 + j*(-191)
+-57 + j*(14)
+57 + j*(-288)
+378 + j*(344)
+42 + j*(448)
+38 + j*(66)
+-76 + j*(-260)
+298 + j*(-250)
+13 + j*(-370)
+156 + j*(-169)
+72 + j*(-215)
+173 + j*(289)
+194 + j*(130)
+-23 + j*(202)
+-22 + j*(298)
+148 + j*(-113)
+-131 + j*(-168)
+339 + j*(107)
+172 + j*(245)
+-136 + j*(-105)
+-186 + j*(-156)
+-67 + j*(221)
+-139 + j*(-42)
+151 + j*(247)
+-13 + j*(24)
+41 + j*(139)
+-165 + j*(185)
+-55 + j*(-143)
+35 + j*(-252)
+-148 + j*(349)
+-147 + j*(-26)
+36 + j*(-332)
+-58 + j*(-306)
+-152 + j*(107)
+157 + j*(-163)
+-195 + j*(68)
+241 + j*(282)
+18 + j*(-115)
+211 + j*(-32)
+185 + j*(309)
+-76 + j*(122)
+114 + j*(6)
+-58 + j*(-52)
+-161 + j*(-116)
+6 + j*(159)
+141 + j*(173)
+-134 + j*(-146)
+-243 + j*(250)
+38 + j*(221)
+-122 + j*(-24)
+-37 + j*(454)
+-119 + j*(-127)
+122 + j*(-71)
+52 + j*(-101)
+63 + j*(-133)
+8 + j*(-279)
+214 + j*(-154)
+-467 + j*(110)
+78 + j*(6)
+-216 + j*(-87)
+-147 + j*(-160)
+-38 + j*(161)
+124 + j*(245)
+-56 + j*(-250)
+-70 + j*(-132)
+-235 + j*(117)
+-25 + j*(36)
+67 + j*(-18)
+115 + j*(-83)
+88 + j*(278)
+-175 + j*(-8)
+285 + j*(-65)
+29 + j*(-49)
+-42 + j*(-153)
+-23 + j*(-26)
+153 + j*(-66)
+-218 + j*(251)
+-37 + j*(228)
+-21 + j*(30)
+101 + j*(-76)
+-5 + j*(-206)
+49 + j*(37)
+-100 + j*(-129)
+3 + j*(-216)
+9 + j*(49)
+247 + j*(13)
+-20 + j*(99)
+-19 + j*(134)
+-2 + j*(144)
+153 + j*(112)
+362 + j*(91)
+-74 + j*(-28)
+211 + j*(-182)
+105 + j*(226)
+-100 + j*(130)
+37 + j*(16)
+130 + j*(167)
+-88 + j*(-218)
+143 + j*(84)
+31 + j*(35)
+212 + j*(390)
+1 + j*(-293)
+-12 + j*(-161)
+-49 + j*(-143)
+-91 + j*(-130)
+6 + j*(-74)
+-59 + j*(185)
+-177 + j*(92)
+-19 + j*(25)
+-232 + j*(-138)
+110 + j*(103)
+-40 + j*(131)
+3 + j*(-152)
+-55 + j*(105)
+260 + j*(-247)
+286 + j*(-23)
+98 + j*(-16)
+54 + j*(33)
+-358 + j*(-16)
+-146 + j*(107)
+-249 + j*(-199)
+-158 + j*(87)
+-72 + j*(-110)
+133 + j*(-196)
+-141 + j*(354)
+71 + j*(-152)
+159 + j*(192)
+-162 + j*(62)
+182 + j*(344)
+-2 + j*(14)
+-293 + j*(321)
+-41 + j*(-82)
+-24 + j*(225)
+-17 + j*(-158)
+-37 + j*(103)
+42 + j*(-50)
+-33 + j*(229)
+-22 + j*(54)
+-105 + j*(-125)
+343 + j*(298)
+-211 + j*(231)
+75 + j*(-85)
+181 + j*(-33)
+194 + j*(205)
+-36 + j*(103)
+-325 + j*(-103)
+-148 + j*(-293)
+-143 + j*(-52)
+-294 + j*(16)
+-147 + j*(-192)
+-132 + j*(64)
+-75 + j*(-105)
+-279 + j*(-113)
+15 + j*(-10)
+103 + j*(-361)
+45 + j*(315)
+-8 + j*(-119)
+-352 + j*(-97)
+-8 + j*(-74)
+-363 + j*(112)
+-196 + j*(67)
+226 + j*(-40)
+235 + j*(117)
+-140 + j*(47)
+33 + j*(161)
+149 + j*(162)
+-468 + j*(-17)
+-270 + j*(-72)
+-335 + j*(-178)
+-23 + j*(184)
+156 + j*(361)
+184 + j*(177)
+151 + j*(141)
+-100 + j*(-231)
+-2 + j*(71)
+-3 + j*(103)
+230 + j*(105)
+50 + j*(306)
+-194 + j*(216)
+101 + j*(-252)
+-187 + j*(88)
+-114 + j*(43)
+6 + j*(124)
+-143 + j*(-50)
+-237 + j*(33)
+115 + j*(144)
+-112 + j*(-465)
+86 + j*(-54)
+-125 + j*(-146)
+127 + j*(-179)
+175 + j*(-162)
+146 + j*(-141)
+-272 + j*(-158)
+107 + j*(168)
+48 + j*(143)
+-42 + j*(-18)
+33 + j*(83)
+-213 + j*(269)
+58 + j*(-211)
+-140 + j*(100)
+29 + j*(-171)
+311 + j*(-104)
+-13 + j*(127)
+-55 + j*(110)
+-191 + j*(4)
+-16 + j*(93)
+-338 + j*(255)
+103 + j*(55)
+-88 + j*(-111)
+41 + j*(49)
+191 + j*(124)
+145 + j*(163)
+18 + j*(-132)
+-46 + j*(81)
+-59 + j*(-154)
+277 + j*(179)
+199 + j*(104)
+40 + j*(4)
+-46 + j*(28)
+-13 + j*(-26)
+89 + j*(11)
+-56 + j*(91)
+-228 + j*(-152)
+-7 + j*(64)
+122 + j*(-274)
+151 + j*(-303)
+-273 + j*(-251)
+-60 + j*(264)
+49 + j*(-74)
+-56 + j*(-255)
+445 + j*(210)
+33 + j*(-155)
+-271 + j*(-182)
+-36 + j*(-136)
+8 + j*(-16)
+-204 + j*(-123)
+-124 + j*(33)
+-139 + j*(32)
+90 + j*(-192)
+282 + j*(83)
+48 + j*(-245)
+129 + j*(98)
+-54 + j*(344)
+-18 + j*(252)
+-279 + j*(-146)
+-115 + j*(-52)
+79 + j*(192)
+132 + j*(22)
+-103 + j*(-162)
+-42 + j*(64)
+9 + j*(-185)
+-132 + j*(-54)
+9 + j*(129)
+211 + j*(50)
+-164 + j*(-13)
+258 + j*(-100)
+194 + j*(145)
+-420 + j*(-276)
+27 + j*(-30)
+-106 + j*(74)
+-71 + j*(378)
+-296 + j*(178)
+190 + j*(175)
+217 + j*(-64)
+455 + j*(-68)
+69 + j*(144)
+216 + j*(6)
+25 + j*(39)
+39 + j*(78)
+-31 + j*(134)
+165 + j*(-6)
+-160 + j*(-95)
+185 + j*(-281)
+71 + j*(402)
+-155 + j*(414)
+159 + j*(-88)
+302 + j*(-307)
+73 + j*(-36)
+-81 + j*(215)
+142 + j*(-110)
+103 + j*(-156)
+195 + j*(-28)
+185 + j*(167)
+-89 + j*(117)
+-147 + j*(-75)
+118 + j*(-332)
+-7 + j*(104)
+211 + j*(-114)
+201 + j*(-291)
+49 + j*(88)
+159 + j*(-75)
+-327 + j*(-508)
+26 + j*(13)
+-387 + j*(-252)
+148 + j*(-234)
+23 + j*(-49)
+78 + j*(-138)
+189 + j*(-103)
+-20 + j*(117)
+-33 + j*(6)
+149 + j*(-153)
+-85 + j*(-231)
+-127 + j*(135)
+-136 + j*(-206)
+-73 + j*(69)
+-134 + j*(7)
+-264 + j*(-69)
+-82 + j*(89)
+-248 + j*(127)
+30 + j*(-12)
+-138 + j*(-164)
+123 + j*(-185)
+237 + j*(-33)
+-187 + j*(-103)
+-115 + j*(-215)
+28 + j*(347)
+220 + j*(131)
+281 + j*(-134)
+-107 + j*(110)
+133 + j*(-53)
+204 + j*(132)
+-85 + j*(289)
+235 + j*(-135)
+-145 + j*(153)
+-87 + j*(332)
+-213 + j*(-73)
+-153 + j*(-220)
+-214 + j*(-223)
+59 + j*(-12)
+48 + j*(-79)
+11 + j*(8)
+-46 + j*(-181)
+94 + j*(141)
+39 + j*(-21)
+70 + j*(-293)
+145 + j*(13)
+32 + j*(-18)
+134 + j*(129)
+-110 + j*(-243)
+-127 + j*(292)
+4 + j*(209)
+-139 + j*(-44)
+-21 + j*(-40)
+35 + j*(-84)
+-316 + j*(-268)
+-195 + j*(166)
+-95 + j*(-24)
+233 + j*(-18)
+240 + j*(-88)
+-66 + j*(-143)
+155 + j*(9)
+266 + j*(235)
+-94 + j*(-28)
+117 + j*(35)
+-189 + j*(9)
+-205 + j*(40)
+-74 + j*(252)
+-141 + j*(150)
+-29 + j*(-57)
+49 + j*(103)
+-57 + j*(251)
+109 + j*(95)
+284 + j*(-16)
+11 + j*(-96)
+-289 + j*(-351)
+-6 + j*(-222)
+355 + j*(118)
+-139 + j*(179)
+-143 + j*(137)
+88 + j*(-86)
+243 + j*(-131)
+117 + j*(-6)
+-489 + j*(70)
+74 + j*(245)
+93 + j*(88)
+-62 + j*(54)
+218 + j*(176)
+-146 + j*(-126)
+28 + j*(-53)
+86 + j*(13)
+203 + j*(153)
+150 + j*(74)
+200 + j*(320)
+95 + j*(142)
+58 + j*(156)
+345 + j*(-52)
+-59 + j*(462)
+-22 + j*(-43)
+-160 + j*(141)
+313 + j*(-104)
+-190 + j*(-67)
+25 + j*(-103)
+-305 + j*(17)
+53 + j*(-52)
+-36 + j*(-101)
+-67 + j*(-47)
+-198 + j*(202)
+231 + j*(-218)
+-62 + j*(146)
+68 + j*(-172)
+-148 + j*(-134)
+-32 + j*(-184)
+-378 + j*(88)
+-248 + j*(12)
+-37 + j*(-68)
+11 + j*(44)
+-19 + j*(-67)
+215 + j*(262)
+-190 + j*(229)
+-277 + j*(62)
+140 + j*(-204)
+-219 + j*(-9)
+78 + j*(-64)
+249 + j*(16)
+-1 + j*(-115)
+58 + j*(276)
+-94 + j*(-193)
+80 + j*(-61)
+333 + j*(77)
+150 + j*(233)
+-251 + j*(-255)
+0 + j*(340)
+-205 + j*(-45)
+80 + j*(-305)
+112 + j*(-45)
+-28 + j*(-1)
+-1 + j*(22)
+125 + j*(-304)
+-276 + j*(-24)
+-28 + j*(-177)
+117 + j*(197)
+192 + j*(-29)
+40 + j*(158)
+-304 + j*(-122)
+-84 + j*(-35)
+160 + j*(-28)
+36 + j*(110)
+119 + j*(7)
+-35 + j*(-127)
+8 + j*(33)
+161 + j*(48)
+-65 + j*(158)
+-237 + j*(-220)
+-65 + j*(-294)
+157 + j*(155)
+-8 + j*(-296)
+18 + j*(-273)
+173 + j*(-16)
+136 + j*(23)
+85 + j*(156)
+1 + j*(144)
+147 + j*(-281)
+-95 + j*(94)
+-69 + j*(-103)
+165 + j*(-25)
+-196 + j*(257)
+80 + j*(195)
+31 + j*(-11)
+-267 + j*(-69)
+-208 + j*(-127)
+-180 + j*(-87)
+-90 + j*(48)
+69 + j*(-47)
+-163 + j*(-314)
+-4 + j*(-166)
+-45 + j*(460)
+-5 + j*(-4)
+105 + j*(-238)
+-240 + j*(158)
+-145 + j*(72)
+95 + j*(-35)
+-4 + j*(-213)
+14 + j*(182)
+-33 + j*(123)
+-385 + j*(170)
+32 + j*(-27)
+-19 + j*(-164)
+-245 + j*(68)
+-16 + j*(-67)
+226 + j*(88)
+-130 + j*(-112)
+4 + j*(-4)
+-320 + j*(54)
+-154 + j*(-131)
+184 + j*(33)
+137 + j*(-269)
+148 + j*(-68)
+-93 + j*(-13)
+94 + j*(-280)
+35 + j*(98)
+-104 + j*(-165)
+-71 + j*(-84)
+293 + j*(-71)
+247 + j*(159)
+-91 + j*(-63)
+-95 + j*(246)
+-124 + j*(49)
+-158 + j*(227)
+-146 + j*(-84)
+-185 + j*(-206)
+101 + j*(129)
+-45 + j*(-361)
+-140 + j*(115)
+8 + j*(-83)
+-426 + j*(-45)
+365 + j*(-120)
+-115 + j*(98)
+-247 + j*(192)
+23 + j*(39)
+-22 + j*(205)
+30 + j*(40)
+196 + j*(-71)
+-74 + j*(193)
+76 + j*(-51)
+-123 + j*(-93)
+-37 + j*(-251)
+-26 + j*(170)
+-263 + j*(43)
+-42 + j*(-224)
+214 + j*(153)
+-33 + j*(86)
+-137 + j*(158)
+148 + j*(122)
+68 + j*(26)
+341 + j*(-75)
+121 + j*(96)
+74 + j*(-235)
+25 + j*(-41)
+50 + j*(141)
+-183 + j*(69)
+74 + j*(-94)
+119 + j*(-129)
+55 + j*(5)
+-132 + j*(267)
+-167 + j*(-24)
+-273 + j*(139)
+270 + j*(59)
+-114 + j*(-62)
+46 + j*(63)
+-74 + j*(42)
+378 + j*(-223)
+27 + j*(122)
+121 + j*(372)
+278 + j*(116)
+-33 + j*(-276)
+9 + j*(-49)
+-403 + j*(138)
+-5 + j*(342)
+-109 + j*(-95)
+-31 + j*(-43)
+62 + j*(-186)
+163 + j*(-233)
+-28 + j*(144)
+194 + j*(93)
+69 + j*(-206)
+180 + j*(-120)
+-72 + j*(-62)
+-52 + j*(-166)
+81 + j*(128)
+239 + j*(-315)
+30 + j*(-97)
+194 + j*(-300)
+26 + j*(197)
+12 + j*(-54)
+-13 + j*(146)
+322 + j*(55)
+-341 + j*(-282)
+29 + j*(-225)
+-91 + j*(7)
+-160 + j*(64)
+7 + j*(-127)
+28 + j*(-158)
+-97 + j*(283)
+-276 + j*(62)
+-53 + j*(-362)
+59 + j*(18)
+227 + j*(-390)
+-86 + j*(132)
+-105 + j*(-513)
+-87 + j*(29)
+35 + j*(-110)
+18 + j*(47)
+180 + j*(-45)
+-112 + j*(5)
+44 + j*(-31)
+-144 + j*(66)
+-284 + j*(187)
+-373 + j*(183)
+66 + j*(-160)
+378 + j*(209)
+-360 + j*(-33)
+-181 + j*(-174)
+31 + j*(-209)
+66 + j*(-187)
+-224 + j*(-27)
+-118 + j*(-124)
+16 + j*(156)
+-29 + j*(163)
+-112 + j*(69)
+-10 + j*(191)
+114 + j*(-103)
+8 + j*(16)
+-132 + j*(105)
+-221 + j*(211)
+-187 + j*(-11)
+100 + j*(-49)
+-27 + j*(52)
+-62 + j*(1)
+48 + j*(-86)
+-243 + j*(296)
+-307 + j*(-22)
+47 + j*(-23)
+-126 + j*(-111)
+-93 + j*(-12)
+-46 + j*(-265)
+71 + j*(-1)
+-52 + j*(42)
+-180 + j*(344)
+78 + j*(-95)
+-167 + j*(-28)
+-293 + j*(196)
+247 + j*(63)
+112 + j*(383)
+225 + j*(-232)
+97 + j*(-60)
+-57 + j*(-233)
+-180 + j*(-136)
+130 + j*(-187)
+-62 + j*(-65)
+13 + j*(14)
+-9 + j*(267)
+-243 + j*(-458)
+21 + j*(267)
+-57 + j*(-45)
+-148 + j*(130)
+86 + j*(251)
+-366 + j*(93)
+-375 + j*(302)
+107 + j*(-11)
+-12 + j*(-207)
+198 + j*(-397)
+-346 + j*(15)
+-19 + j*(177)
+28 + j*(-23)
+-87 + j*(-81)
+-164 + j*(-117)
+-184 + j*(42)
+-43 + j*(231)
+-49 + j*(-143)
+-209 + j*(-252)
+-344 + j*(171)
+261 + j*(200)
+210 + j*(2)
+-78 + j*(18)
+120 + j*(-31)
+-46 + j*(37)
+105 + j*(228)
+252 + j*(-62)
+76 + j*(190)
+-200 + j*(-88)
+112 + j*(31)
+97 + j*(46)
+-14 + j*(191)
+122 + j*(70)
+-110 + j*(132)
+52 + j*(-151)
+-161 + j*(69)
+74 + j*(228)
+-170 + j*(41)
+-59 + j*(-354)
+-98 + j*(325)
+64 + j*(-64)
+-235 + j*(175)
+-230 + j*(-93)
+83 + j*(-48)
+-274 + j*(-86)
+133 + j*(-92)
+-118 + j*(190)
+-192 + j*(232)
+107 + j*(226)
+-178 + j*(-91)
+-45 + j*(35)
+212 + j*(194)
+38 + j*(-66)
+2 + j*(142)
+156 + j*(296)
+-62 + j*(38)
+34 + j*(-358)
+-133 + j*(-114)
+94 + j*(80)
+-299 + j*(41)
+23 + j*(264)
+-223 + j*(515)
+-82 + j*(-98)
+-180 + j*(175)
+-160 + j*(-163)
+-42 + j*(81)
+-110 + j*(-93)
+-95 + j*(-186)
+-182 + j*(-190)
+29 + j*(-227)
+36 + j*(107)
+-25 + j*(-239)
+-147 + j*(-128)
+214 + j*(178)
+-144 + j*(-26)
+-162 + j*(210)
+-1 + j*(-170)
+-182 + j*(76)
+-214 + j*(272)
+209 + j*(112)
+-335 + j*(199)
+202 + j*(93)
+192 + j*(-119)
+-160 + j*(65)
+231 + j*(-61)
+-37 + j*(-151)
+77 + j*(114)
+293 + j*(34)
+-203 + j*(-176)
+-164 + j*(142)
+-233 + j*(269)
+-45 + j*(227)
+313 + j*(74)
+-52 + j*(210)
+-396 + j*(-31)
+-111 + j*(-95)
+-11 + j*(83)
+112 + j*(246)
+-59 + j*(95)
+196 + j*(121)
+-364 + j*(-285)
+139 + j*(284)
+-301 + j*(-78)
+-274 + j*(-334)
+-413 + j*(-324)
+25 + j*(-57)
+-251 + j*(-60)
+552 + j*(-140)
+98 + j*(559)
+452 + j*(-165)
+334 + j*(-16)
+-477 + j*(-221)
+-273 + j*(82)
+-170 + j*(127)
+600 + j*(348)
+412 + j*(187)
+392 + j*(393)
+356 + j*(-431)
+-303 + j*(-270)
+-383 + j*(388)
+107 + j*(-441)
+-371 + j*(155)
+385 + j*(398)
+-262 + j*(-58)
+244 + j*(-265)
+494 + j*(359)
+-245 + j*(214)
+141 + j*(-274)
+281 + j*(-645)
+252 + j*(222)
+-252 + j*(-163)
+-350 + j*(371)
+143 + j*(-293)
+-426 + j*(-419)
+107 + j*(-83)
+-183 + j*(-363)
+431 + j*(-91)
+-557 + j*(-171)
+-7 + j*(576)
+393 + j*(-195)
+-415 + j*(387)
+95 + j*(-383)
+56 + j*(156)
+223 + j*(433)
+-670 + j*(232)
+-78 + j*(192)
+327 + j*(187)
+-47 + j*(-198)
+-47 + j*(379)
+158 + j*(-204)
+170 + j*(40)
+120 + j*(-402)
+-57 + j*(-609)
+363 + j*(197)
+572 + j*(240)
+159 + j*(277)
+51 + j*(594)
+284 + j*(-165)
+-221 + j*(406)
+-83 + j*(-173)
+248 + j*(-268)
+-106 + j*(67)
+-233 + j*(330)
+-208 + j*(-184)
+414 + j*(-62)
+-170 + j*(609)
+-309 + j*(177)
+278 + j*(-119)
+611 + j*(251)
+-67 + j*(438)
+354 + j*(87)
+344 + j*(225)
+388 + j*(190)
+386 + j*(273)
+-235 + j*(-399)
+450 + j*(89)
+-129 + j*(-380)
+307 + j*(-317)
+6 + j*(454)
+-21 + j*(683)
+382 + j*(607)
+26 + j*(269)
+397 + j*(394)
+525 + j*(-202)
+-373 + j*(-337)
+607 + j*(363)
+142 + j*(235)
+320 + j*(-230)
+276 + j*(223)
+-82 + j*(-39)
+-41 + j*(374)
+298 + j*(313)
+-453 + j*(136)
+-487 + j*(-484)
+-50 + j*(214)
+-265 + j*(259)
+-185 + j*(-32)
+-268 + j*(6)
+335 + j*(414)
+-385 + j*(-177)
+-438 + j*(-168)
+-153 + j*(475)
+-93 + j*(223)
+-279 + j*(283)
+481 + j*(-119)
+2 + j*(-363)
+571 + j*(346)
+342 + j*(143)
+-379 + j*(175)
+-30 + j*(-334)
+-431 + j*(237)
+113 + j*(-408)
+420 + j*(-398)
+-101 + j*(-35)
+-363 + j*(77)
+-421 + j*(129)
+378 + j*(166)
+-316 + j*(-40)
+402 + j*(-251)
+22 + j*(-351)
+223 + j*(-376)
+273 + j*(599)
+-213 + j*(30)
+269 + j*(-317)
+209 + j*(357)
+-156 + j*(517)
+97 + j*(504)
+296 + j*(-239)
+65 + j*(1)
+278 + j*(342)
+-175 + j*(-567)
+325 + j*(-247)
+-455 + j*(-64)
+512 + j*(-163)
+148 + j*(542)
+183 + j*(273)
+-224 + j*(53)
+327 + j*(256)
+124 + j*(-139)
+63 + j*(124)
+-57 + j*(-381)
+112 + j*(-13)
+269 + j*(-236)
+-104 + j*(-487)
+-227 + j*(-422)
+434 + j*(-423)
+387 + j*(-274)
+-118 + j*(110)
+197 + j*(342)
+-96 + j*(300)
+413 + j*(-33)
+-184 + j*(-374)
+451 + j*(68)
+435 + j*(-132)
+-244 + j*(-332)
+482 + j*(296)
+500 + j*(-520)
+41 + j*(-66)
+-137 + j*(678)
+-433 + j*(361)
+-573 + j*(576)
+-350 + j*(255)
+-185 + j*(-711)
+491 + j*(403)
+-203 + j*(-359)
+36 + j*(-153)
+-199 + j*(-299)
+312 + j*(-607)
+17 + j*(82)
+-284 + j*(311)
+-651 + j*(349)
+-317 + j*(-525)
+461 + j*(-175)
+-272 + j*(-30)
+-433 + j*(392)
+-204 + j*(242)
+-132 + j*(330)
+37 + j*(-193)
+461 + j*(-472)
+-188 + j*(-404)
+136 + j*(434)
+489 + j*(-688)
+-261 + j*(-331)
+-79 + j*(323)
+-181 + j*(-231)
+236 + j*(483)
+294 + j*(-152)
+118 + j*(-52)
+286 + j*(299)
+353 + j*(-41)
+-250 + j*(262)
+-332 + j*(385)
+-1 + j*(-199)
+547 + j*(-29)
+135 + j*(307)
+150 + j*(348)
+-211 + j*(386)
+-124 + j*(-317)
+197 + j*(289)
+6 + j*(224)
+-571 + j*(327)
+-127 + j*(-331)
+164 + j*(-490)
+-211 + j*(428)
+507 + j*(99)
+1 + j*(-32)
+-378 + j*(-261)
+396 + j*(-520)
+-180 + j*(332)
+318 + j*(119)
+-143 + j*(364)
+-177 + j*(527)
+-141 + j*(47)
+180 + j*(104)
+-38 + j*(-321)
+185 + j*(353)
+-414 + j*(250)
+29 + j*(-441)
+-202 + j*(247)
+16 + j*(62)
+432 + j*(467)
+-206 + j*(175)
+94 + j*(-132)
+321 + j*(369)
+705 + j*(170)
+346 + j*(512)
+-368 + j*(-420)
+53 + j*(117)
+98 + j*(-211)
+-267 + j*(251)
+366 + j*(144)
+630 + j*(144)
+-187 + j*(333)
+-271 + j*(566)
+-344 + j*(-87)
+437 + j*(316)
+-181 + j*(423)
+-280 + j*(90)
+497 + j*(226)
+-191 + j*(-57)
+334 + j*(122)
+-228 + j*(309)
+412 + j*(-351)
+289 + j*(193)
+194 + j*(124)
+293 + j*(-198)
+-175 + j*(343)
+-222 + j*(-327)
+40 + j*(-205)
+357 + j*(-335)
+-131 + j*(-187)
+5 + j*(-491)
+38 + j*(330)
+6 + j*(274)
+207 + j*(113)
+-339 + j*(-238)
+245 + j*(-246)
+-46 + j*(-59)
+-375 + j*(-393)
+-231 + j*(515)
+53 + j*(262)
+-224 + j*(190)
+-363 + j*(-43)
+224 + j*(150)
+122 + j*(-337)
+-296 + j*(-264)
+73 + j*(445)
+-217 + j*(359)
+-270 + j*(-305)
+-342 + j*(526)
+286 + j*(-655)
+-216 + j*(410)
+606 + j*(368)
+540 + j*(347)
+-66 + j*(-136)
+149 + j*(342)
+64 + j*(-315)
+-483 + j*(-236)
+-313 + j*(-325)
+-150 + j*(238)
+-175 + j*(-165)
+-239 + j*(409)
+166 + j*(-18)
+282 + j*(-151)
+-202 + j*(-446)
+452 + j*(360)
+-205 + j*(-263)
+-283 + j*(320)
+-358 + j*(266)
+170 + j*(28)
+-288 + j*(-393)
+97 + j*(423)
+122 + j*(425)
+-6 + j*(146)
+144 + j*(-282)
+368 + j*(413)
+-320 + j*(410)
+-513 + j*(-503)
+237 + j*(-528)
+-398 + j*(254)
+-237 + j*(474)
+-128 + j*(499)
+233 + j*(396)
+262 + j*(404)
+240 + j*(-390)
+-372 + j*(245)
+-313 + j*(-37)
+-99 + j*(-187)
+-301 + j*(-677)
+-321 + j*(120)
+294 + j*(-131)
+276 + j*(-228)
+-313 + j*(-604)
+-140 + j*(-262)
+-437 + j*(-173)
+98 + j*(192)
+235 + j*(394)
+256 + j*(-503)
+336 + j*(383)
+138 + j*(277)
+-56 + j*(260)
+-305 + j*(-528)
+206 + j*(59)
+221 + j*(191)
+552 + j*(-141)
+15 + j*(434)
+223 + j*(24)
+56 + j*(325)
+-49 + j*(238)
+-410 + j*(270)
+11 + j*(-322)
+-91 + j*(-492)
+-315 + j*(-44)
+-165 + j*(-332)
+242 + j*(108)
+29 + j*(226)
+95 + j*(-47)
+-218 + j*(-109)
+251 + j*(-426)
+-332 + j*(213)
+33 + j*(443)
+207 + j*(-475)
+148 + j*(-1)
+-147 + j*(-504)
+-158 + j*(1)
+378 + j*(15)
+-612 + j*(-174)
+255 + j*(182)
+240 + j*(-387)
+-206 + j*(176)
+523 + j*(-181)
+241 + j*(-255)
+-362 + j*(-265)
+84 + j*(100)
+-299 + j*(165)
+291 + j*(192)
+-109 + j*(-377)
+-72 + j*(532)
+-86 + j*(-276)
+250 + j*(489)
+-301 + j*(-421)
+187 + j*(401)
+-241 + j*(58)
+-369 + j*(-199)
+23 + j*(501)
+-194 + j*(-318)
+-278 + j*(578)
+552 + j*(223)
+-197 + j*(-253)
+231 + j*(-304)
+-33 + j*(-308)
+296 + j*(437)
+-462 + j*(445)
+57 + j*(-146)
+-127 + j*(94)
+98 + j*(21)
+392 + j*(-337)
+-290 + j*(244)
+-216 + j*(434)
+112 + j*(-111)
+1 + j*(-450)
+294 + j*(115)
+-486 + j*(-211)
+-293 + j*(-436)
+-181 + j*(315)
+231 + j*(375)
+192 + j*(-240)
+200 + j*(-343)
+-310 + j*(34)
+-459 + j*(-279)
+-173 + j*(-120)
+391 + j*(-253)
+-197 + j*(-226)
+224 + j*(-334)
+-604 + j*(325)
+-18 + j*(-379)
+269 + j*(-285)
+454 + j*(483)
+-172 + j*(-185)
+-479 + j*(135)
+319 + j*(275)
+423 + j*(-495)
+-319 + j*(315)
+22 + j*(466)
+-86 + j*(-120)
+224 + j*(198)
+210 + j*(-262)
+106 + j*(170)
+-293 + j*(220)
+491 + j*(524)
+128 + j*(525)
+-318 + j*(419)
+352 + j*(-143)
+-196 + j*(130)
+-222 + j*(317)
+302 + j*(-421)
+388 + j*(-199)
+-243 + j*(395)
+87 + j*(397)
+-383 + j*(296)
+99 + j*(-499)
+-97 + j*(-214)
+279 + j*(-408)
+-428 + j*(-327)
+250 + j*(-131)
+260 + j*(110)
+-346 + j*(323)
+-204 + j*(341)
+-344 + j*(-276)
+266 + j*(-33)
+-482 + j*(-466)
+-284 + j*(10)
+-331 + j*(236)
+66 + j*(272)
+-415 + j*(227)
+16 + j*(81)
+-647 + j*(671)
+-20 + j*(93)
+-130 + j*(-244)
+-272 + j*(74)
+-243 + j*(379)
+168 + j*(-558)
+-49 + j*(264)
+-257 + j*(231)
+-298 + j*(231)
+235 + j*(496)
+263 + j*(77)
+-192 + j*(250)
+110 + j*(87)
+-301 + j*(49)
+391 + j*(-658)
+482 + j*(-317)
+267 + j*(-197)
+89 + j*(-107)
+240 + j*(-375)
+-354 + j*(-299)
+-441 + j*(-1)
+113 + j*(-134)
+530 + j*(-79)
+405 + j*(-101)
+476 + j*(45)
+460 + j*(145)
+332 + j*(-77)
+-86 + j*(-153)
+74 + j*(-574)
+-298 + j*(-58)
+-220 + j*(-371)
+438 + j*(192)
+-325 + j*(175)
+-132 + j*(-379)
+225 + j*(96)
+307 + j*(-55)
+-137 + j*(303)
+-112 + j*(423)
+-327 + j*(-241)
+-329 + j*(351)
+62 + j*(-287)
+372 + j*(-214)
+426 + j*(-216)
+176 + j*(-170)
+-449 + j*(-296)
+522 + j*(-1)
+-66 + j*(396)
+-223 + j*(92)
+228 + j*(165)
+-233 + j*(105)
+-272 + j*(-164)
+248 + j*(121)
+-518 + j*(20)
+-65 + j*(-497)
+-272 + j*(118)
+166 + j*(-117)
+-279 + j*(-284)
+426 + j*(-590)
+-317 + j*(346)
+197 + j*(421)
+552 + j*(181)
+-163 + j*(290)
+253 + j*(-554)
+60 + j*(16)
+-336 + j*(-438)
+-154 + j*(-322)
+-202 + j*(188)
+-177 + j*(-8)
+-427 + j*(-361)
+-353 + j*(27)
+406 + j*(119)
+-326 + j*(-155)
+170 + j*(-190)
+-235 + j*(59)
+-67 + j*(287)
+106 + j*(438)
+192 + j*(-505)
+173 + j*(-77)
+-147 + j*(-275)
+-683 + j*(342)
+-411 + j*(433)
+307 + j*(4)
+-506 + j*(44)
+322 + j*(-171)
+337 + j*(-151)
+276 + j*(332)
+-269 + j*(293)
+-8 + j*(151)
+-552 + j*(216)
+-168 + j*(-276)
+195 + j*(-460)
+287 + j*(645)
+-132 + j*(-112)
+681 + j*(355)
+336 + j*(-137)
+-539 + j*(-412)
+82 + j*(433)
+-363 + j*(-254)
+-175 + j*(311)
+-180 + j*(155)
+759 + j*(222)
+-756 + j*(387)
+598 + j*(11)
+-66 + j*(47)
+354 + j*(-71)
+-262 + j*(-247)
+-397 + j*(14)
+400 + j*(-116)
+141 + j*(132)
+387 + j*(38)
+269 + j*(-296)
+457 + j*(54)
+-173 + j*(85)
+-370 + j*(191)
+53 + j*(-285)
+-457 + j*(-389)
+60 + j*(-470)
+384 + j*(-293)
+-405 + j*(139)
+-138 + j*(168)
+-107 + j*(-69)
+334 + j*(-50)
+210 + j*(-148)
+268 + j*(-327)
+-325 + j*(316)
+-157 + j*(3)
+-202 + j*(-96)
+-214 + j*(244)
+-336 + j*(-150)
+495 + j*(-384)
+380 + j*(283)
+-184 + j*(-419)
+293 + j*(339)
+178 + j*(67)
+-156 + j*(249)
+-563 + j*(407)
+-561 + j*(185)
+-93 + j*(-275)
+-299 + j*(363)
+356 + j*(482)
+301 + j*(163)
+-518 + j*(-438)
+-379 + j*(-109)
+-474 + j*(438)
+486 + j*(180)
+204 + j*(648)
+-122 + j*(190)
+-387 + j*(-214)
+10 + j*(238)
+124 + j*(406)
+420 + j*(-313)
+-163 + j*(110)
+-330 + j*(-315)
+303 + j*(262)
+371 + j*(189)
+452 + j*(-500)
+430 + j*(-48)
+-10 + j*(129)
+-278 + j*(136)
+-366 + j*(420)
+163 + j*(-250)
+337 + j*(-217)
+326 + j*(473)
+-353 + j*(-308)
+-11 + j*(-25)
+106 + j*(-86)
+237 + j*(325)
+368 + j*(340)
+53 + j*(-92)
+116 + j*(-206)
+163 + j*(206)
+-122 + j*(185)
+282 + j*(-407)
+-41 + j*(35)
+-279 + j*(110)
+-204 + j*(4)
+42 + j*(236)
+-190 + j*(66)
+2 + j*(-25)
+-112 + j*(-47)
+35 + j*(-76)
+165 + j*(293)
+-218 + j*(-17)
+-69 + j*(-71)
+-158 + j*(48)
+88 + j*(-57)
+-67 + j*(-9)
+-144 + j*(-40)
+-216 + j*(218)
+-161 + j*(88)
+100 + j*(89)
+226 + j*(219)
+-10 + j*(0)
+96 + j*(-326)
+79 + j*(-63)
+-82 + j*(219)
+345 + j*(69)
+486 + j*(-264)
+-37 + j*(11)
+373 + j*(-105)
+-292 + j*(-99)
+214 + j*(-145)
+-187 + j*(-156)
+-96 + j*(-194)
+-200 + j*(-57)
+-134 + j*(-142)
+152 + j*(-251)
+-112 + j*(25)
+-33 + j*(179)
+-177 + j*(-7)
+-245 + j*(1)
+-114 + j*(122)
+-9 + j*(-83)
+-157 + j*(132)
+-173 + j*(-385)
+-25 + j*(308)
+280 + j*(-180)
+-240 + j*(-129)
+-286 + j*(-115)
+-184 + j*(161)
+180 + j*(-82)
+-2 + j*(383)
+-139 + j*(192)
+112 + j*(-71)
+178 + j*(-163)
+104 + j*(15)
+-103 + j*(-185)
+-207 + j*(197)
+-78 + j*(108)
+86 + j*(60)
+52 + j*(296)
+-240 + j*(-98)
+-9 + j*(150)
+107 + j*(-222)
+281 + j*(223)
+-79 + j*(-42)
+49 + j*(-105)
+-157 + j*(84)
+42 + j*(-150)
+80 + j*(-23)
+178 + j*(-237)
+269 + j*(119)
+-438 + j*(-72)
+-51 + j*(-114)
+-279 + j*(-76)
+130 + j*(97)
+-125 + j*(138)
+100 + j*(-168)
+-332 + j*(155)
+112 + j*(413)
+175 + j*(-136)
+-450 + j*(77)
+34 + j*(51)
+-140 + j*(257)
+170 + j*(-117)
+-275 + j*(-221)
+30 + j*(361)
+0 + j*(35)
+-165 + j*(-214)
+227 + j*(186)
+326 + j*(363)
+175 + j*(11)
+-52 + j*(51)
+153 + j*(-244)
+0 + j*(-8)
+-78 + j*(68)
+25 + j*(-67)
+88 + j*(7)
+-204 + j*(216)
+117 + j*(127)
+-214 + j*(-161)
+192 + j*(285)
+-366 + j*(13)
+185 + j*(92)
+-117 + j*(-243)
+132 + j*(0)
+141 + j*(9)
+-138 + j*(-232)
+-107 + j*(147)
+175 + j*(-41)
+35 + j*(47)
+175 + j*(-52)
+109 + j*(-82)
+-18 + j*(-75)
+94 + j*(47)
+76 + j*(111)
+59 + j*(-148)
+137 + j*(168)
+-24 + j*(171)
+-44 + j*(262)
+-299 + j*(-66)
+130 + j*(-274)
+64 + j*(-99)
+10 + j*(-214)
+-251 + j*(330)
+-77 + j*(-100)
+-239 + j*(226)
+-83 + j*(-61)
+-240 + j*(162)
+-475 + j*(173)
+-32 + j*(-143)
+112 + j*(238)
+-8 + j*(-178)
+-95 + j*(247)
+-33 + j*(87)
+-302 + j*(298)
+202 + j*(69)
+33 + j*(-87)
+-184 + j*(-31)
+234 + j*(220)
+122 + j*(-123)
+-64 + j*(155)
+106 + j*(115)
+161 + j*(56)
+72 + j*(243)
+-27 + j*(47)
+-3 + j*(-138)
+-302 + j*(-216)
+156 + j*(-93)
+-139 + j*(-104)
+-316 + j*(45)
+-161 + j*(345)
+-354 + j*(110)
+-79 + j*(155)
+193 + j*(21)
+31 + j*(-125)
+-119 + j*(-205)
+35 + j*(21)
+-75 + j*(241)
+23 + j*(-146)
+224 + j*(-222)
+-171 + j*(231)
+-61 + j*(-42)
+-372 + j*(102)
+-19 + j*(-151)
+368 + j*(89)
+318 + j*(-52)
+-327 + j*(-301)
+47 + j*(57)
+-243 + j*(-231)
+-461 + j*(59)
+118 + j*(-65)
+67 + j*(202)
+402 + j*(-226)
+-123 + j*(-42)
+-127 + j*(325)
+-24 + j*(-166)
+185 + j*(161)
+111 + j*(-74)
+-44 + j*(-95)
+-290 + j*(137)
+-125 + j*(-220)
+54 + j*(-77)
+70 + j*(46)
+153 + j*(-112)
+17 + j*(170)
+-185 + j*(77)
+193 + j*(140)
+-388 + j*(150)
+-381 + j*(-216)
+-11 + j*(262)
+-130 + j*(8)
+149 + j*(-19)
+240 + j*(134)
+101 + j*(-161)
+147 + j*(-86)
+101 + j*(51)
+110 + j*(-91)
+67 + j*(126)
+122 + j*(-72)
+-100 + j*(-166)
+146 + j*(-159)
+-175 + j*(208)
+-90 + j*(-16)
+-288 + j*(-130)
+-256 + j*(-168)
+-29 + j*(62)
+68 + j*(95)
+18 + j*(95)
+147 + j*(-91)
+-11 + j*(162)
+136 + j*(35)
+98 + j*(33)
+-180 + j*(308)
+171 + j*(-5)
+-114 + j*(25)
+-30 + j*(-217)
+-88 + j*(184)
+45 + j*(91)
+214 + j*(-21)
+91 + j*(348)
+-92 + j*(-296)
+-58 + j*(96)
+38 + j*(-119)
+-202 + j*(135)
+-28 + j*(-60)
+-123 + j*(31)
+102 + j*(12)
+-132 + j*(217)
+-28 + j*(245)
+-267 + j*(5)
+41 + j*(249)
+-21 + j*(-147)
+102 + j*(-320)
+-274 + j*(-25)
+156 + j*(-100)
+100 + j*(-124)
+-136 + j*(275)
+320 + j*(-35)
+-115 + j*(104)
+-11 + j*(-205)
+-254 + j*(-291)
+-9 + j*(-318)
+-97 + j*(195)
+279 + j*(29)
+269 + j*(227)
+67 + j*(-39)
+-136 + j*(241)
+-96 + j*(-19)
+250 + j*(-127)
+84 + j*(-129)
+228 + j*(90)
+-98 + j*(23)
+-46 + j*(-4)
+42 + j*(47)
+-15 + j*(-37)
+-122 + j*(-230)
+67 + j*(163)
+176 + j*(-43)
+82 + j*(-132)
+115 + j*(157)
+86 + j*(33)
+-325 + j*(-20)
+-115 + j*(77)
+-33 + j*(-4)
+197 + j*(161)
+88 + j*(33)
+-55 + j*(72)
+113 + j*(-60)
+135 + j*(132)
+9 + j*(291)
+-468 + j*(99)
+122 + j*(-105)
+95 + j*(-26)
+29 + j*(-37)
+40 + j*(-100)
+-100 + j*(26)
+-369 + j*(228)
+86 + j*(-67)
+-47 + j*(-98)
+52 + j*(-129)
+271 + j*(-58)
+131 + j*(-315)
+-78 + j*(361)
+-2 + j*(-98)
+143 + j*(-180)
+78 + j*(123)
+-77 + j*(-190)
+-92 + j*(-76)
+151 + j*(71)
+-47 + j*(13)
+246 + j*(-71)
+-178 + j*(59)
+134 + j*(-88)
+243 + j*(-98)
+-51 + j*(11)
+244 + j*(45)
+-66 + j*(127)
+44 + j*(223)
+145 + j*(-98)
+-129 + j*(173)
+-226 + j*(330)
+264 + j*(168)
+-93 + j*(27)
+-146 + j*(-133)
+-203 + j*(-310)
+8 + j*(11)
+378 + j*(112)
+385 + j*(281)
+182 + j*(-64)
+35 + j*(158)
+-199 + j*(-1)
+-168 + j*(120)
+192 + j*(-133)
+-127 + j*(59)
+-130 + j*(-279)
+1 + j*(-224)
+-70 + j*(-42)
+61 + j*(80)
+-13 + j*(-11)
+-8 + j*(-95)
+132 + j*(-240)
+-215 + j*(-160)
+191 + j*(133)
+124 + j*(-373)
+-161 + j*(-139)
+110 + j*(-134)
+-245 + j*(1)
+-267 + j*(103)
+-13 + j*(-384)
+226 + j*(-58)
+21 + j*(121)
+-45 + j*(-400)
+120 + j*(76)
+69 + j*(35)
+-111 + j*(40)
+105 + j*(190)
+164 + j*(161)
+-268 + j*(-40)
+177 + j*(-25)
+-61 + j*(-80)
+185 + j*(310)
+-110 + j*(141)
+20 + j*(187)
+-299 + j*(-25)
+-24 + j*(326)
+-92 + j*(-335)
+52 + j*(-324)
+-342 + j*(-267)
+-91 + j*(-10)
+332 + j*(-119)
+18 + j*(-219)
+54 + j*(140)
+333 + j*(237)
+-201 + j*(207)
+-99 + j*(294)
+-49 + j*(-26)
+306 + j*(-37)
+-404 + j*(277)
+22 + j*(-156)
+348 + j*(-117)
+62 + j*(197)
+80 + j*(240)
+-317 + j*(402)
+226 + j*(-252)
+-26 + j*(-31)
+-107 + j*(65)
+-45 + j*(7)
+-237 + j*(-146)
+-102 + j*(-73)
+-199 + j*(63)
+-196 + j*(-39)
+68 + j*(50)
+111 + j*(-71)
+86 + j*(-13)
+-69 + j*(44)
+163 + j*(-116)
+181 + j*(-127)
+-115 + j*(527)
+112 + j*(16)
+-135 + j*(122)
+124 + j*(28)
+140 + j*(-145)
+-149 + j*(-218)
+51 + j*(-5)
+66 + j*(315)
+249 + j*(-198)
+54 + j*(60)
+283 + j*(227)
+272 + j*(237)
+228 + j*(53)
+296 + j*(212)
+-255 + j*(-52)
+252 + j*(93)
+49 + j*(-134)
+279 + j*(54)
+-21 + j*(-343)
+-116 + j*(206)
+-52 + j*(-47)
+69 + j*(187)
+21 + j*(93)
+-28 + j*(-166)
+-97 + j*(-161)
+367 + j*(-90)
+-39 + j*(53)
+400 + j*(92)
+381 + j*(-169)
+-303 + j*(219)
+2 + j*(58)
+21 + j*(248)
+-160 + j*(-125)
+379 + j*(-387)
+62 + j*(-31)
+-126 + j*(-76)
+-17 + j*(47)
+29 + j*(45)
+-286 + j*(-181)
+21 + j*(103)
+-117 + j*(29)
+86 + j*(386)
+-132 + j*(-129)
+83 + j*(178)
+243 + j*(-298)
+144 + j*(-295)
+111 + j*(-109)
+-201 + j*(168)
+55 + j*(-192)
+-13 + j*(41)
+-129 + j*(147)
+-8 + j*(-37)
+-39 + j*(32)
+28 + j*(90)
+323 + j*(-245)
+107 + j*(-77)
+-8 + j*(-421)
+187 + j*(-118)
+-54 + j*(-160)
+-91 + j*(54)
+215 + j*(267)
+239 + j*(-159)
+106 + j*(-174)
+-106 + j*(349)
+-153 + j*(33)
+45 + j*(98)
+-145 + j*(134)
+-101 + j*(-190)
+-331 + j*(40)
+-167 + j*(-255)
+129 + j*(-113)
+112 + j*(250)
+10 + j*(-317)
+125 + j*(-106)
+96 + j*(102)
+238 + j*(-6)
+-108 + j*(222)
+-82 + j*(122)
+-453 + j*(-377)
+-97 + j*(139)
+103 + j*(-56)
+-425 + j*(28)
+164 + j*(154)
+152 + j*(-62)
+74 + j*(320)
+85 + j*(-80)
+146 + j*(-23)
+-291 + j*(-153)
+-5 + j*(-3)
+-155 + j*(23)
+153 + j*(294)
+59 + j*(-132)
+5 + j*(153)
+59 + j*(-105)
+54 + j*(-325)
+177 + j*(170)
+-223 + j*(-124)
+183 + j*(-128)
+119 + j*(-180)
+332 + j*(71)
+-14 + j*(93)
+199 + j*(81)
+-101 + j*(-75)
+7 + j*(-35)
+-101 + j*(52)
+219 + j*(-284)
+-102 + j*(-143)
+16 + j*(-176)
+132 + j*(-16)
+76 + j*(-266)
+24 + j*(-6)
+-81 + j*(8)
+-240 + j*(362)
+-54 + j*(-95)
+490 + j*(-91)
+201 + j*(-194)
+-127 + j*(-102)
+48 + j*(4)
+250 + j*(-54)
+146 + j*(-409)
+260 + j*(-20)
+-40 + j*(50)
+-119 + j*(-64)
+319 + j*(-222)
+-88 + j*(-216)
+157 + j*(191)
+112 + j*(-34)
+-222 + j*(-145)
+-129 + j*(175)
+71 + j*(134)
+27 + j*(-133)
+-87 + j*(-340)
+-175 + j*(126)
+76 + j*(54)
+-261 + j*(172)
+64 + j*(-37)
+-10 + j*(-211)
+30 + j*(169)
+23 + j*(-247)
+-204 + j*(-54)
+67 + j*(63)
+191 + j*(-223)
+22 + j*(454)
+-156 + j*(91)
+-45 + j*(-122)
+-23 + j*(-189)
+-31 + j*(139)
+138 + j*(-201)
+-324 + j*(-299)
+-88 + j*(158)
+-8 + j*(-104)
+93 + j*(-129)
+112 + j*(-8)
+75 + j*(-82)
+279 + j*(182)
+118 + j*(-400)
+-162 + j*(89)
+-398 + j*(58)
+4 + j*(101)
+-133 + j*(-206)
+-42 + j*(-1)
+-276 + j*(322)
+-385 + j*(5)
+56 + j*(43)
+281 + j*(107)
+-91 + j*(70)
+31 + j*(33)
+57 + j*(4)
+71 + j*(-126)
+129 + j*(175)
+565 + j*(-270)
+-211 + j*(40)
+-54 + j*(216)
+57 + j*(-281)
+255 + j*(-197)
+-21 + j*(190)
+183 + j*(110)
+-123 + j*(46)
+111 + j*(45)
+-381 + j*(100)
+-296 + j*(153)
+-214 + j*(-46)
+-221 + j*(-68)
+348 + j*(231)
+247 + j*(24)
+-38 + j*(263)
+-146 + j*(-361)
+51 + j*(271)
+146 + j*(-119)
+-86 + j*(-81)
+-163 + j*(-21)
+92 + j*(70)
+159 + j*(139)
+-301 + j*(54)
+-13 + j*(-272)
+-105 + j*(25)
+-95 + j*(-56)
+222 + j*(54)
+250 + j*(-56)
+354 + j*(-152)
+139 + j*(59)
+-126 + j*(-175)
+332 + j*(-244)
+-88 + j*(-8)
+-214 + j*(-261)
+-282 + j*(-13)
+75 + j*(49)
+-180 + j*(-13)
+-69 + j*(66)
+-161 + j*(-1)
+51 + j*(-62)
+26 + j*(-37)
+-54 + j*(323)
+264 + j*(-8)
+-52 + j*(-44)
+86 + j*(341)
+-48 + j*(-54)
+-469 + j*(167)
+-436 + j*(-108)
+-132 + j*(-14)
+-134 + j*(74)
+364 + j*(258)
+22 + j*(156)
+-40 + j*(293)
+41 + j*(98)
+-83 + j*(-12)
+117 + j*(59)
+89 + j*(216)
+-9 + j*(146)
+40 + j*(-132)
+35 + j*(-151)
+-178 + j*(-33)
+-194 + j*(-57)
+-85 + j*(206)
+-134 + j*(256)
+110 + j*(214)
+204 + j*(-109)
+236 + j*(-13)
+113 + j*(-40)
+-409 + j*(52)
+-37 + j*(223)
+139 + j*(61)
+-145 + j*(212)
+-97 + j*(161)
+340 + j*(-211)
+-184 + j*(13)
+235 + j*(-4)
+-237 + j*(-257)
+81 + j*(49)
+196 + j*(79)
+84 + j*(131)
+6 + j*(-95)
+-291 + j*(426)
+221 + j*(89)
+-31 + j*(116)
+74 + j*(260)
+-156 + j*(47)
+-261 + j*(-265)
+-8 + j*(-291)
+23 + j*(129)
+89 + j*(87)
+71 + j*(-16)
+217 + j*(293)
+-402 + j*(-98)
+-1 + j*(4)
+84 + j*(-253)
+39 + j*(108)
+175 + j*(301)
+-257 + j*(81)
+-289 + j*(-86)
+-313 + j*(-76)
+39 + j*(-79)
+146 + j*(136)
+218 + j*(33)
+-217 + j*(31)
+-11 + j*(237)
+-117 + j*(56)
+130 + j*(100)
+178 + j*(416)
+99 + j*(84)
+165 + j*(-202)
+61 + j*(-320)
+-215 + j*(186)
+-78 + j*(220)
+-235 + j*(-151)
+-60 + j*(107)
+-40 + j*(45)
+-119 + j*(-298)
+250 + j*(-164)
+-129 + j*(-186)
+247 + j*(182)
+52 + j*(238)
+-23 + j*(165)
+122 + j*(78)
+161 + j*(-262)
+-313 + j*(44)
+1 + j*(-35)
+1 + j*(-36)
+13 + j*(-135)
+-223 + j*(-115)
+-320 + j*(303)
+-268 + j*(-66)
+-19 + j*(52)
+-12 + j*(-124)
+-28 + j*(42)
+219 + j*(-94)
+-272 + j*(-265)
+-114 + j*(-81)
+-107 + j*(28)
+-129 + j*(-131)
+-139 + j*(-63)
+55 + j*(-259)
+241 + j*(-81)
+-159 + j*(43)
+-125 + j*(221)
+119 + j*(-114)
+95 + j*(-36)
+-213 + j*(-377)
+109 + j*(-205)
+332 + j*(69)
+71 + j*(-182)
+-28 + j*(-100)
+95 + j*(-33)
+134 + j*(201)
+-81 + j*(245)
+-41 + j*(-175)
+-55 + j*(-212)
+235 + j*(-14)
+123 + j*(21)
+-86 + j*(207)
+-156 + j*(71)
+-115 + j*(363)
+339 + j*(-28)
+-325 + j*(262)
+188 + j*(-102)
+112 + j*(189)
+19 + j*(-39)
+35 + j*(-77)
+181 + j*(-13)
+-77 + j*(-12)
+202 + j*(66)
+-254 + j*(-63)
+150 + j*(131)
+-136 + j*(42)
+-238 + j*(-233)
+467 + j*(-366)
+-125 + j*(202)
+-333 + j*(52)
+-27 + j*(-125)
+-224 + j*(4)
+-52 + j*(246)
+362 + j*(-105)
+-151 + j*(-169)
+175 + j*(36)
+-5 + j*(-147)
+-59 + j*(23)
+222 + j*(86)
+-9 + j*(-178)
+95 + j*(-159)
+-40 + j*(-3)
+298 + j*(158)
+-94 + j*(354)
+48 + j*(33)
+-42 + j*(-237)
+120 + j*(115)
+-9 + j*(-30)
+172 + j*(42)
+158 + j*(153)
+-320 + j*(-88)
+22 + j*(-382)
+-199 + j*(-37)
+234 + j*(-310)
+-208 + j*(2)
+40 + j*(16)
+309 + j*(-85)
+123 + j*(-172)
+77 + j*(77)
+-30 + j*(135)
+-95 + j*(-40)
+72 + j*(-25)
+-43 + j*(37)
+237 + j*(-185)
+-68 + j*(-187)
+-298 + j*(55)
+105 + j*(-116)
+82 + j*(81)
+-107 + j*(-53)
+18 + j*(156)
+-170 + j*(257)
+-93 + j*(128)
+70 + j*(83)
+-8 + j*(-257)
+-46 + j*(-182)
+-496 + j*(-38)
+-16 + j*(-24)
+-5 + j*(-170)
+152 + j*(-168)
+-338 + j*(-136)
+-75 + j*(104)
+265 + j*(119)
+-146 + j*(231)
+-310 + j*(0)
+-7 + j*(-157)
+-48 + j*(-255)
+254 + j*(-21)
+134 + j*(-4)
+-101 + j*(146)
+-236 + j*(-372)
+-164 + j*(32)
+122 + j*(177)
+-180 + j*(108)
+57 + j*(-165)
+-6 + j*(255)
+-75 + j*(123)
+13 + j*(100)
+-170 + j*(-28)
+-135 + j*(173)
+83 + j*(151)
+-379 + j*(16)
+-8 + j*(44)
+-325 + j*(57)
+186 + j*(129)
+46 + j*(-37)
+-185 + j*(39)
+45 + j*(8)
+-170 + j*(156)
+95 + j*(231)
+180 + j*(-313)
+-371 + j*(-122)
+-106 + j*(112)
+23 + j*(303)
+-59 + j*(-170)
+45 + j*(84)
+62 + j*(169)
+-292 + j*(-88)
+60 + j*(-78)
+-204 + j*(-129)
+-61 + j*(18)
+-118 + j*(-74)
+-98 + j*(227)
+170 + j*(201)
+86 + j*(254)
+119 + j*(98)
+-173 + j*(129)
+-62 + j*(71)
+7 + j*(-236)
+216 + j*(161)
+-129 + j*(-50)
+-182 + j*(43)
+-54 + j*(-159)
+113 + j*(-342)
+107 + j*(-122)
+-175 + j*(-31)
+30 + j*(112)
+42 + j*(-136)
+123 + j*(-122)
+46 + j*(-36)
+22 + j*(-10)
+124 + j*(356)
+297 + j*(-171)
+-27 + j*(284)
+317 + j*(-117)
+-34 + j*(-349)
+177 + j*(16)
+-259 + j*(112)
+-161 + j*(-250)
+-232 + j*(43)
+-240 + j*(-83)
+-162 + j*(370)
+-13 + j*(253)
+-77 + j*(-49)
+-6 + j*(-209)
+-88 + j*(219)
+-211 + j*(107)
+147 + j*(25)
+-273 + j*(36)
+-139 + j*(-117)
+-177 + j*(52)
+223 + j*(170)
+139 + j*(-26)
+168 + j*(-164)
+124 + j*(143)
+23 + j*(-224)
+-54 + j*(-113)
+243 + j*(-158)
+-97 + j*(42)
+-169 + j*(-34)
+-30 + j*(110)
+317 + j*(6)
+173 + j*(317)
+-210 + j*(-268)
+-126 + j*(11)
+56 + j*(-126)
+78 + j*(-158)
+-82 + j*(133)
+-133 + j*(-240)
+-180 + j*(-79)
+-80 + j*(115)
+-25 + j*(-201)
+371 + j*(11)
+-68 + j*(202)
+-231 + j*(-102)
+-69 + j*(-87)
+-294 + j*(327)
+-95 + j*(-16)
+-231 + j*(-69)
+53 + j*(240)
+-58 + j*(84)
+-94 + j*(90)
+141 + j*(176)
+-90 + j*(-110)
+-153 + j*(-4)
+-58 + j*(126)
+-67 + j*(13)
+92 + j*(-43)
+-13 + j*(-36)
+-139 + j*(-202)
+-228 + j*(-331)
+180 + j*(34)
+-257 + j*(458)
+-211 + j*(111)
+-337 + j*(83)
+40 + j*(-76)
+40 + j*(-325)
+-4 + j*(-22)
+-124 + j*(2)
+112 + j*(-317)
+204 + j*(82)
+-4 + j*(-29)
+112 + j*(-193)
+-70 + j*(-98)
+-99 + j*(144)
+241 + j*(3)
+-74 + j*(-40)
+224 + j*(148)
+216 + j*(69)
+36 + j*(-23)
+-28 + j*(-166)
+40 + j*(157)
+198 + j*(52)
+-225 + j*(69)
+77 + j*(-260)
+-32 + j*(-78)
+-313 + j*(-35)
+138 + j*(28)
+-10 + j*(102)
+92 + j*(-91)
+267 + j*(-384)
+148 + j*(211)
+-44 + j*(170)
+-30 + j*(207)
+125 + j*(51)
+175 + j*(-47)
+-23 + j*(-171)
+-165 + j*(-109)
+176 + j*(83)
+-62 + j*(148)
+124 + j*(-119)
+-121 + j*(-276)
+54 + j*(-243)
+-163 + j*(-109)
+1 + j*(-34)
+-83 + j*(182)
+35 + j*(146)
+322 + j*(53)
+-175 + j*(34)
+-156 + j*(-173)
+83 + j*(428)
+195 + j*(-110)
+70 + j*(-187)
+259 + j*(107)
+99 + j*(233)
+-73 + j*(-90)
+-73 + j*(52)
+48 + j*(327)
+108 + j*(-49)
+218 + j*(-158)
+-22 + j*(-165)
+296 + j*(-61)
+-22 + j*(91)
+-109 + j*(92)
+26 + j*(-6)
+-75 + j*(41)
+52 + j*(187)
+82 + j*(184)
+42 + j*(116)
+-71 + j*(228)
+-72 + j*(190)
+-218 + j*(-179)
+156 + j*(284)
+-151 + j*(0)
+191 + j*(-107)
+-35 + j*(-240)
+245 + j*(-145)
+-96 + j*(-74)
+146 + j*(168)
+-59 + j*(-107)
+-114 + j*(115)
+60 + j*(-71)
+93 + j*(5)
+46 + j*(142)
+-16 + j*(63)
+-232 + j*(151)
+-312 + j*(-18)
+182 + j*(-24)
+227 + j*(221)
+-200 + j*(-145)
+251 + j*(254)
+25 + j*(-163)
+-110 + j*(-184)
+-256 + j*(173)
+-83 + j*(56)
+184 + j*(-23)
+-12 + j*(-21)
+-228 + j*(15)
+35 + j*(-117)
+-6 + j*(25)
+77 + j*(-12)
+-243 + j*(-4)
+29 + j*(-12)
+-221 + j*(71)
+-30 + j*(40)
+100 + j*(-631)
+-146 + j*(-156)
+310 + j*(94)
+33 + j*(76)
+-184 + j*(168)
+-2 + j*(56)
+-76 + j*(57)
+-37 + j*(93)
+266 + j*(3)
+127 + j*(-191)
+284 + j*(-4)
+63 + j*(248)
+327 + j*(-94)
+-276 + j*(119)
+-351 + j*(2)
+379 + j*(6)
+-80 + j*(163)
+135 + j*(59)
+-156 + j*(0)
+228 + j*(-18)
+566 + j*(-95)
+375 + j*(-13)
+-68 + j*(-289)
+-250 + j*(-154)
+98 + j*(79)
+-4 + j*(0)
+-165 + j*(153)
+-36 + j*(285)
+70 + j*(-14)
+-155 + j*(74)
+45 + j*(8)
+123 + j*(14)
+-197 + j*(232)
+-250 + j*(58)
+-124 + j*(319)
+125 + j*(0)
+10 + j*(-142)
+137 + j*(-70)
+-180 + j*(146)
+280 + j*(77)
+-252 + j*(-92)
+35 + j*(13)
+-135 + j*(366)
+104 + j*(37)
+-84 + j*(-117)
+11 + j*(-238)
+74 + j*(-181)
+134 + j*(21)
+-64 + j*(-122)
+-344 + j*(-146)
+194 + j*(-158)
+-59 + j*(-111)
+-286 + j*(-121)
+-225 + j*(71)
+-93 + j*(-153)
+94 + j*(21)
+1 + j*(323)
+1 + j*(138)
+-59 + j*(-13)
+5 + j*(-44)
+-55 + j*(47)
+-45 + j*(126)
+-136 + j*(105)
+-420 + j*(-415)
+-1 + j*(-133)
+-259 + j*(-263)
+-106 + j*(-181)
+-112 + j*(-18)
+18 + j*(318)
+-173 + j*(162)
+-166 + j*(7)
+11 + j*(-161)
+326 + j*(3)
+90 + j*(301)
+-198 + j*(-94)
+151 + j*(-48)
+-272 + j*(103)
+97 + j*(15)
+-125 + j*(52)
+378 + j*(-346)
+40 + j*(-30)
+-98 + j*(-186)
+207 + j*(339)
+42 + j*(-130)
+-16 + j*(13)
+-33 + j*(49)
+140 + j*(193)
+-49 + j*(233)
+-106 + j*(-242)
+-207 + j*(-18)
+177 + j*(-38)
+-520 + j*(-117)
+60 + j*(40)
+-327 + j*(279)
+342 + j*(-58)
+-39 + j*(-69)
+-127 + j*(-42)
+235 + j*(-59)
+-267 + j*(46)
+71 + j*(130)
+-88 + j*(45)
+282 + j*(-4)
+219 + j*(-82)
+-122 + j*(-25)
+-76 + j*(169)
+284 + j*(124)
+4 + j*(-43)
+83 + j*(-349)
+43 + j*(342)
+31 + j*(-173)
+345 + j*(250)
+-18 + j*(177)
+-81 + j*(155)
+355 + j*(156)
+-93 + j*(-11)
+141 + j*(3)
+-83 + j*(77)
+340 + j*(-164)
+-117 + j*(59)
+94 + j*(189)
+127 + j*(-243)
+-284 + j*(-161)
+-19 + j*(-133)
+182 + j*(86)
+-153 + j*(97)
+-16 + j*(-69)
+197 + j*(-16)
+-18 + j*(29)
+8 + j*(-72)
+-95 + j*(312)
+-76 + j*(-127)
+93 + j*(-103)
+-127 + j*(16)
+78 + j*(329)
+-69 + j*(111)
+182 + j*(192)
+43 + j*(-180)
+-77 + j*(81)
+-91 + j*(-274)
+-136 + j*(57)
+29 + j*(-122)
+291 + j*(-81)
+-227 + j*(127)
+-165 + j*(227)
+61 + j*(-100)
+-80 + j*(-31)
+-211 + j*(-145)
+-168 + j*(-113)
+-40 + j*(68)
+259 + j*(121)
+111 + j*(-69)
+245 + j*(47)
+11 + j*(-61)
+-136 + j*(104)
+3 + j*(-161)
+-105 + j*(-15)
+122 + j*(-453)
+-36 + j*(-18)
+-148 + j*(243)
+78 + j*(-107)
+181 + j*(276)
+276 + j*(-42)
+179 + j*(-117)
+-103 + j*(397)
+250 + j*(-53)
+-25 + j*(184)
+108 + j*(-56)
+171 + j*(-1)
+217 + j*(178)
+-149 + j*(-189)
+-134 + j*(-218)
+76 + j*(402)
+-10 + j*(139)
+100 + j*(236)
+61 + j*(-177)
+27 + j*(9)
+151 + j*(38)
+-110 + j*(-92)
+222 + j*(-115)
+118 + j*(-158)
+94 + j*(118)
+494 + j*(197)
+-16 + j*(-27)
+-307 + j*(-13)
+-81 + j*(262)
+231 + j*(192)
+278 + j*(21)
+56 + j*(-35)
+-328 + j*(316)
+130 + j*(32)
+-37 + j*(209)
+306 + j*(51)
+113 + j*(114)
+-228 + j*(-101)
+-45 + j*(22)
+-106 + j*(-86)
+-188 + j*(-74)
+124 + j*(57)
+-70 + j*(-83)
+-216 + j*(-23)
+-87 + j*(-109)
+97 + j*(-263)
+78 + j*(90)
+-15 + j*(256)
+-103 + j*(350)
+21 + j*(-25)
+32 + j*(115)
+76 + j*(-270)
+190 + j*(-41)
+8 + j*(195)
+127 + j*(-100)
+-8 + j*(-132)
+253 + j*(-117)
+-100 + j*(5)
+-57 + j*(-319)
+-18 + j*(82)
+163 + j*(231)
+-127 + j*(-271)
+-74 + j*(-243)
+39 + j*(-278)
+-88 + j*(179)
+-100 + j*(-33)
+-373 + j*(-333)
+-182 + j*(-299)
+-117 + j*(-78)
+34 + j*(-185)
+-117 + j*(155)
+-28 + j*(56)
+-161 + j*(-70)
+-97 + j*(-310)
+-30 + j*(13)
+-254 + j*(33)
+119 + j*(8)
+333 + j*(46)
+-383 + j*(27)
+83 + j*(188)
+73 + j*(-217)
+59 + j*(60)
+-166 + j*(266)
+-177 + j*(123)
+-356 + j*(-55)
+-339 + j*(-30)
+-143 + j*(49)
+105 + j*(-224)
+-173 + j*(305)
+-35 + j*(202)
+-185 + j*(-152)
+-221 + j*(132)
+-244 + j*(-58)
+104 + j*(276)
+-182 + j*(21)
+117 + j*(-134)
+285 + j*(-66)
+33 + j*(-86)
+91 + j*(-28)
+6 + j*(50)
+83 + j*(-8)
+-185 + j*(60)
+-32 + j*(-94)
+-179 + j*(9)
+-323 + j*(136)
+15 + j*(-417)
+197 + j*(-105)
+-71 + j*(74)
+6 + j*(-117)
+184 + j*(407)
+123 + j*(-37)
+57 + j*(12)
+-52 + j*(168)
+-188 + j*(-119)
+28 + j*(-129)
+-78 + j*(-1)
+-104 + j*(-83)
+1 + j*(-223)
+-468 + j*(42)
+157 + j*(52)
+-144 + j*(-72)
+75 + j*(296)
+45 + j*(-285)
+-221 + j*(301)
+-103 + j*(163)
+-341 + j*(-457)
+105 + j*(23)
+-23 + j*(-88)
+-264 + j*(-552)
+81 + j*(4)
+-274 + j*(-131)
+214 + j*(-18)
+151 + j*(-214)
+-1 + j*(-205)
+103 + j*(-49)
+81 + j*(-8)
+-80 + j*(16)
+246 + j*(-183)
+136 + j*(-100)
+35 + j*(-69)
+-217 + j*(254)
+252 + j*(-156)
+-47 + j*(-160)
+-162 + j*(167)
+-148 + j*(-201)
+265 + j*(-240)
+-141 + j*(-8)
+35 + j*(33)
+-99 + j*(-95)
+-4 + j*(124)
+65 + j*(-206)
+-175 + j*(279)
+-1 + j*(114)
+-52 + j*(71)
+-103 + j*(47)
+-164 + j*(-41)
+206 + j*(216)
+-148 + j*(19)
+-161 + j*(-187)
+-200 + j*(223)
+131 + j*(238)
+18 + j*(101)
+229 + j*(22)
+71 + j*(53)
+509 + j*(-293)
+139 + j*(161)
+-322 + j*(180)
+119 + j*(196)
+12 + j*(103)
+10 + j*(-187)
+104 + j*(-28)
+82 + j*(50)
+86 + j*(125)
+117 + j*(59)
+-225 + j*(129)
+167 + j*(-177)
+-125 + j*(-100)
+-178 + j*(-124)
+-144 + j*(-262)
+457 + j*(-237)
+-267 + j*(22)
+240 + j*(22)
+155 + j*(89)
+-6 + j*(-361)
+266 + j*(-358)
+-180 + j*(110)
+-73 + j*(69)
+-42 + j*(93)
+-257 + j*(-151)
+3 + j*(141)
+192 + j*(356)
+26 + j*(-76)
+103 + j*(340)
+83 + j*(70)
+75 + j*(-245)
+206 + j*(340)
+-144 + j*(360)
+344 + j*(76)
+-74 + j*(325)
+-7 + j*(208)
+-238 + j*(-206)
+25 + j*(83)
+57 + j*(-286)
+-82 + j*(232)
+251 + j*(-76)
+-218 + j*(-234)
+-170 + j*(-219)
+-75 + j*(-252)
+-112 + j*(259)
+24 + j*(31)
+-226 + j*(59)
+-67 + j*(-4)
+-344 + j*(-240)
+-86 + j*(143)
+37 + j*(-59)
+54 + j*(-173)
+-264 + j*(-52)
+78 + j*(104)
+-337 + j*(-103)
+115 + j*(-144)
+228 + j*(4)
+93 + j*(-54)
+15 + j*(-245)
+118 + j*(-70)
+-8 + j*(-69)
+195 + j*(-202)
+110 + j*(172)
+-214 + j*(-326)
+-74 + j*(199)
+81 + j*(124)
+59 + j*(141)
+88 + j*(-178)
+-28 + j*(22)
+132 + j*(144)
+71 + j*(-90)
+101 + j*(-243)
+-191 + j*(32)
+-12 + j*(-52)
+134 + j*(18)
+-416 + j*(338)
+98 + j*(-92)
+-122 + j*(-18)
+-123 + j*(-100)
+-405 + j*(86)
+59 + j*(260)
+-272 + j*(201)
+-129 + j*(320)
+-214 + j*(35)
+-24 + j*(9)
+-137 + j*(88)
+-46 + j*(-113)
+-99 + j*(105)
+-4 + j*(51)
+-59 + j*(-19)
+267 + j*(56)
+77 + j*(-30)
+66 + j*(61)
+6 + j*(-23)
+0 + j*(198)
+-4 + j*(-117)
+-58 + j*(5)
+-141 + j*(143)
+-4 + j*(100)
+-150 + j*(-117)
+88 + j*(-301)
+-90 + j*(-31)
+247 + j*(58)
+-84 + j*(-112)
+387 + j*(-145)
+-50 + j*(-57)
+-117 + j*(-25)
+-103 + j*(102)
+113 + j*(294)
+248 + j*(142)
+-61 + j*(-134)
+-152 + j*(129)
+106 + j*(-170)
+-332 + j*(-23)
+-168 + j*(206)
+240 + j*(36)
+-196 + j*(-146)
+-400 + j*(67)
+40 + j*(-26)
+110 + j*(213)
+-288 + j*(252)
+53 + j*(206)
+253 + j*(-489)
+-428 + j*(390)
+-426 + j*(339)
+162 + j*(-463)
+278 + j*(159)
+-35 + j*(426)
+-375 + j*(323)
+-243 + j*(186)
+230 + j*(325)
+-340 + j*(-334)
+-193 + j*(148)
+-640 + j*(75)
+-14 + j*(106)
+-49 + j*(233)
+93 + j*(225)
+-23 + j*(-235)
+-560 + j*(-476)
+-494 + j*(412)
+302 + j*(424)
+122 + j*(255)
+-317 + j*(320)
+-47 + j*(-134)
+-411 + j*(412)
+-241 + j*(107)
+-639 + j*(-566)
+427 + j*(-136)
+-165 + j*(-217)
+515 + j*(471)
+-91 + j*(-151)
+405 + j*(221)
+139 + j*(-260)
+-82 + j*(151)
+228 + j*(514)
+-165 + j*(231)
+425 + j*(-11)
+-210 + j*(117)
+-475 + j*(247)
+-291 + j*(500)
+18 + j*(-106)
+443 + j*(57)
+-283 + j*(348)
+226 + j*(-305)
+-211 + j*(-33)
+412 + j*(-233)
+-272 + j*(237)
+-378 + j*(8)
+299 + j*(-136)
+182 + j*(-98)
+-489 + j*(183)
+41 + j*(286)
+-64 + j*(226)
+102 + j*(351)
+375 + j*(471)
+-121 + j*(252)
+310 + j*(-366)
+194 + j*(-442)
+67 + j*(-332)
+190 + j*(-188)
+467 + j*(-81)
+-313 + j*(-344)
+-49 + j*(-161)
+-589 + j*(85)
+-91 + j*(187)
+127 + j*(11)
+-212 + j*(551)
+350 + j*(7)
+170 + j*(327)
+-387 + j*(-363)
+-190 + j*(-612)
+207 + j*(319)
+-121 + j*(315)
+-401 + j*(161)
+-432 + j*(209)
+-467 + j*(-334)
+276 + j*(90)
+185 + j*(-222)
+-506 + j*(490)
+-455 + j*(-293)
+-49 + j*(-448)
+224 + j*(293)
+427 + j*(-559)
+-267 + j*(-164)
+-23 + j*(-156)
+-324 + j*(-267)
+-215 + j*(-33)
+98 + j*(-173)
+-209 + j*(-255)
+-197 + j*(431)
+238 + j*(367)
+47 + j*(-198)
+-308 + j*(-1)
+-173 + j*(119)
+-134 + j*(-357)
+-186 + j*(71)
+198 + j*(-59)
+66 + j*(298)
+-412 + j*(45)
+416 + j*(426)
+127 + j*(231)
+285 + j*(-231)
+81 + j*(-380)
+228 + j*(52)
+-291 + j*(436)
+-28 + j*(91)
+331 + j*(-356)
+-12 + j*(800)
+-144 + j*(303)
+-334 + j*(206)
+316 + j*(250)
+272 + j*(-503)
+-192 + j*(-511)
+298 + j*(-80)
+23 + j*(-566)
+480 + j*(-347)
+222 + j*(-330)
+148 + j*(256)
+505 + j*(-419)
+270 + j*(-203)
+409 + j*(-450)
+-115 + j*(325)
+-101 + j*(-471)
+-74 + j*(23)
+-163 + j*(-351)
+-3 + j*(354)
+8 + j*(-183)
+-196 + j*(132)
+329 + j*(-443)
+342 + j*(334)
+-338 + j*(-366)
+-143 + j*(-636)
+464 + j*(-245)
+-168 + j*(204)
+216 + j*(252)
+252 + j*(-243)
+-81 + j*(342)
+-196 + j*(233)
+277 + j*(-301)
+367 + j*(-276)
+59 + j*(58)
+163 + j*(398)
+-68 + j*(144)
+47 + j*(335)
+504 + j*(-647)
+-169 + j*(-404)
+343 + j*(-343)
+-452 + j*(90)
+-189 + j*(175)
+-70 + j*(322)
+354 + j*(-152)
+422 + j*(262)
+-247 + j*(-209)
+569 + j*(157)
+75 + j*(-52)
+-169 + j*(-175)
+-334 + j*(16)
+177 + j*(605)
+434 + j*(-502)
+-339 + j*(37)
+57 + j*(-246)
+437 + j*(249)
+-235 + j*(-141)
+-247 + j*(-356)
+-54 + j*(-366)
+-305 + j*(-142)
+-237 + j*(164)
+8 + j*(-373)
+204 + j*(107)
+-617 + j*(136)
+429 + j*(-337)
+-337 + j*(-326)
+506 + j*(477)
+161 + j*(-22)
+149 + j*(231)
+202 + j*(-274)
+-176 + j*(-391)
+-252 + j*(-400)
+-28 + j*(167)
+256 + j*(-452)
+419 + j*(188)
+-142 + j*(-805)
+417 + j*(-392)
+10 + j*(197)
+-335 + j*(105)
+-114 + j*(149)
+-170 + j*(265)
+-387 + j*(-233)
+-444 + j*(-151)
+119 + j*(451)
+270 + j*(422)
+591 + j*(-421)
+-250 + j*(-196)
+62 + j*(-338)
+266 + j*(28)
+-476 + j*(69)
+71 + j*(-97)
+-52 + j*(-268)
+-136 + j*(-214)
+223 + j*(633)
+-518 + j*(220)
+595 + j*(184)
+160 + j*(124)
+-304 + j*(-202)
+246 + j*(187)
+64 + j*(300)
+368 + j*(108)
+255 + j*(-130)
+-220 + j*(-389)
+-424 + j*(41)
+508 + j*(16)
+-334 + j*(-446)
+-89 + j*(81)
+-685 + j*(169)
+273 + j*(-25)
+110 + j*(374)
+355 + j*(250)
+-29 + j*(-200)
+-298 + j*(-629)
+-508 + j*(144)
+319 + j*(-343)
+103 + j*(-57)
+-59 + j*(373)
+282 + j*(-14)
+-102 + j*(350)
+147 + j*(14)
+-185 + j*(35)
+-260 + j*(220)
+-337 + j*(-359)
+357 + j*(182)
+192 + j*(-279)
+-293 + j*(-5)
+257 + j*(217)
+247 + j*(-105)
+-5 + j*(-358)
+252 + j*(-95)
+69 + j*(-534)
+-95 + j*(-283)
+147 + j*(-37)
+170 + j*(409)
+394 + j*(452)
+-110 + j*(-421)
+-257 + j*(190)
+-450 + j*(-209)
+77 + j*(-546)
+161 + j*(16)
+337 + j*(-32)
+543 + j*(145)
+-306 + j*(-438)
+-64 + j*(159)
+-234 + j*(-197)
+-445 + j*(-51)
+-208 + j*(-62)
+-275 + j*(228)
+-445 + j*(-221)
+524 + j*(-37)
+204 + j*(516)
+246 + j*(-404)
+624 + j*(-243)
+-118 + j*(264)
+61 + j*(194)
+-132 + j*(-127)
+220 + j*(298)
+-222 + j*(-282)
+167 + j*(-286)
+330 + j*(466)
+501 + j*(0)
+620 + j*(414)
+134 + j*(-269)
+-212 + j*(193)
+373 + j*(-335)
+-107 + j*(40)
+342 + j*(-279)
+-286 + j*(138)
+190 + j*(238)
+-321 + j*(-240)
+-409 + j*(-247)
+371 + j*(505)
+247 + j*(272)
+-223 + j*(-23)
+111 + j*(349)
+-177 + j*(306)
+466 + j*(92)
+-267 + j*(322)
+301 + j*(231)
+460 + j*(-168)
+-155 + j*(-254)
+-320 + j*(-181)
+50 + j*(-330)
+283 + j*(-357)
+163 + j*(-354)
+67 + j*(379)
+-105 + j*(-199)
+245 + j*(-296)
+387 + j*(371)
+56 + j*(57)
+453 + j*(279)
+-324 + j*(33)
+-327 + j*(-474)
+-238 + j*(308)
+-28 + j*(-187)
+-252 + j*(-229)
+165 + j*(194)
+509 + j*(434)
+-337 + j*(518)
+3 + j*(-243)
+275 + j*(378)
+237 + j*(-86)
+245 + j*(192)
+225 + j*(-257)
+-325 + j*(-468)
+-482 + j*(291)
+-266 + j*(63)
+-496 + j*(315)
+408 + j*(-185)
+-536 + j*(102)
+-320 + j*(-224)
+-404 + j*(16)
+302 + j*(246)
+-263 + j*(19)
+308 + j*(-209)
+8 + j*(363)
+-605 + j*(-448)
+266 + j*(347)
+602 + j*(-82)
+-276 + j*(-238)
+296 + j*(111)
+293 + j*(-229)
+-233 + j*(-84)
+186 + j*(-148)
+193 + j*(365)
+99 + j*(-303)
+117 + j*(454)
+-98 + j*(288)
+-508 + j*(-424)
+-370 + j*(650)
+324 + j*(375)
+415 + j*(-221)
+-211 + j*(40)
+258 + j*(-7)
+-519 + j*(-225)
+-303 + j*(112)
+247 + j*(-286)
+303 + j*(-456)
+179 + j*(244)
+29 + j*(-155)
+321 + j*(458)
+144 + j*(226)
+-195 + j*(-434)
+-52 + j*(-276)
+-339 + j*(203)
+-531 + j*(35)
+-82 + j*(57)
+-717 + j*(-362)
+-407 + j*(227)
+257 + j*(343)
+140 + j*(-224)
+403 + j*(195)
+-177 + j*(469)
+158 + j*(-312)
+15 + j*(-269)
+-363 + j*(262)
+-36 + j*(-339)
+342 + j*(-153)
+-56 + j*(696)
+298 + j*(197)
+-93 + j*(134)
+-14 + j*(501)
+511 + j*(228)
+-98 + j*(269)
+235 + j*(417)
+274 + j*(-367)
+-327 + j*(228)
+-27 + j*(148)
+404 + j*(-207)
+411 + j*(332)
+449 + j*(276)
+716 + j*(725)
+42 + j*(429)
+-163 + j*(527)
+156 + j*(274)
+-593 + j*(-375)
+496 + j*(419)
+277 + j*(-330)
+513 + j*(-36)
+175 + j*(-386)
+134 + j*(-376)
+-95 + j*(-299)
+-179 + j*(57)
+465 + j*(416)
+342 + j*(317)
+158 + j*(47)
+-141 + j*(248)
+-173 + j*(206)
+-394 + j*(119)
+392 + j*(136)
+-315 + j*(195)
+335 + j*(450)
+176 + j*(8)
+613 + j*(-317)
+150 + j*(-186)
+-403 + j*(-643)
+133 + j*(-279)
+41 + j*(-164)
+276 + j*(-46)
+298 + j*(396)
+-260 + j*(-488)
+-390 + j*(114)
+32 + j*(375)
+-470 + j*(216)
+585 + j*(298)
+-443 + j*(-373)
+251 + j*(306)
+-372 + j*(318)
+-371 + j*(408)
+-92 + j*(-80)
+-286 + j*(14)
+-351 + j*(59)
+-21 + j*(366)
+-197 + j*(-182)
+-267 + j*(-47)
+177 + j*(-265)
+-443 + j*(-212)
+470 + j*(0)
+90 + j*(315)
+-68 + j*(-222)
+-506 + j*(-289)
+-236 + j*(-293)
+131 + j*(-98)
+-257 + j*(174)
+-37 + j*(-494)
+-486 + j*(35)
+195 + j*(-247)
+325 + j*(-836)
+-73 + j*(-497)
+-91 + j*(531)
+642 + j*(-362)
+344 + j*(124)
+-120 + j*(-199)
+-50 + j*(-488)
+1 + j*(-345)
+285 + j*(103)
+206 + j*(452)
+176 + j*(433)
+-323 + j*(427)
+-442 + j*(340)
+-362 + j*(-361)
+417 + j*(-184)
+-148 + j*(251)
+-289 + j*(-111)
+-426 + j*(-202)
+-597 + j*(-365)
+409 + j*(199)
+227 + j*(339)
+-284 + j*(-69)
+282 + j*(-156)
+40 + j*(473)
+-271 + j*(-76)
+-228 + j*(-424)
+-44 + j*(-64)
+28 + j*(371)
+494 + j*(-400)
+-192 + j*(368)
+199 + j*(211)
+-148 + j*(-41)
+77 + j*(-412)
+13 + j*(139)
+350 + j*(-71)
+40 + j*(117)
+-59 + j*(320)
+240 + j*(-369)
+193 + j*(180)
+25 + j*(-484)
+416 + j*(-252)
+323 + j*(-39)
+201 + j*(-394)
+-221 + j*(351)
+375 + j*(-190)
+249 + j*(562)
+197 + j*(-238)
+235 + j*(336)
+296 + j*(-149)
+-493 + j*(-477)
+310 + j*(-543)
+495 + j*(38)
+-320 + j*(308)
+-496 + j*(130)
+-392 + j*(-78)
+-478 + j*(103)
+-346 + j*(-525)
+-134 + j*(-368)
+-247 + j*(-150)
+-472 + j*(-18)
+-354 + j*(40)
+349 + j*(131)
+-284 + j*(312)
+308 + j*(189)
+67 + j*(-427)
+-1 + j*(-159)
+362 + j*(-454)
+219 + j*(262)
+-53 + j*(-28)
+-501 + j*(-225)
+-359 + j*(547)
+369 + j*(315)
+-344 + j*(-361)
+-492 + j*(403)
+500 + j*(-291)
+260 + j*(191)
+194 + j*(-170)
+324 + j*(280)
+595 + j*(120)
+185 + j*(123)
+222 + j*(670)
+-309 + j*(219)
+-237 + j*(-138)
+338 + j*(-388)
+-223 + j*(100)
+-140 + j*(-430)
+685 + j*(115)
+339 + j*(-9)
+-100 + j*(-745)
+-561 + j*(-101)
+360 + j*(446)
+191 + j*(-467)
+-243 + j*(-378)
+-107 + j*(-345)
+21 + j*(620)
+-223 + j*(-322)
+409 + j*(-306)
+-23 + j*(499)
+-259 + j*(-576)
+493 + j*(658)
+180 + j*(118)
+-378 + j*(198)
+378 + j*(-53)
+-554 + j*(-61)
+-305 + j*(305)
+95 + j*(415)
+455 + j*(-305)
+-275 + j*(-77)
+390 + j*(-62)
+-15 + j*(151)
+-238 + j*(191)
+-94 + j*(390)
+369 + j*(262)
+441 + j*(67)
+439 + j*(-121)
+315 + j*(66)
+282 + j*(216)
+-193 + j*(-280)
+-194 + j*(625)
+-240 + j*(231)
+-228 + j*(68)
+245 + j*(144)
+-467 + j*(64)
+23 + j*(523)
+46 + j*(-216)
+-248 + j*(390)
+98 + j*(462)
+-378 + j*(329)
+410 + j*(211)
+-81 + j*(277)
+293 + j*(-16)
+204 + j*(-506)
+-78 + j*(151)
+-88 + j*(455)
+242 + j*(-62)
+-426 + j*(-105)
+-320 + j*(221)
+84 + j*(-386)
+398 + j*(565)
+50 + j*(248)
+-254 + j*(-37)
+-179 + j*(479)
+-59 + j*(30)
+-225 + j*(253)
+630 + j*(-185)
+-76 + j*(-363)
+136 + j*(-498)
+289 + j*(-79)
+315 + j*(-177)
+367 + j*(60)
+-131 + j*(-190)
+-482 + j*(-127)
+-68 + j*(220)
+204 + j*(16)
+-175 + j*(45)
+421 + j*(180)
+231 + j*(-324)
+93 + j*(334)
+-344 + j*(-599)
+-257 + j*(-276)
+-134 + j*(-98)
+384 + j*(-203)
+290 + j*(-177)
+-82 + j*(-226)
+-367 + j*(-1)
+154 + j*(-307)
+-155 + j*(576)
+216 + j*(279)
+229 + j*(196)
+35 + j*(138)
+-52 + j*(-210)
+24 + j*(231)
+153 + j*(-117)
+-125 + j*(-174)
+23 + j*(-64)
+-96 + j*(-199)
+-167 + j*(16)
+158 + j*(93)
+-180 + j*(-331)
+-42 + j*(-5)
+6 + j*(521)
+-161 + j*(197)
+-6 + j*(-6)
+268 + j*(107)
+-275 + j*(156)
+245 + j*(-13)
+-52 + j*(-217)
+-221 + j*(355)
+84 + j*(-42)
+31 + j*(-204)
+-117 + j*(523)
+211 + j*(268)
+-86 + j*(104)
+-181 + j*(-62)
+-45 + j*(-198)
+141 + j*(82)
+-373 + j*(122)
+-151 + j*(5)
+-33 + j*(-191)
+69 + j*(21)
+-124 + j*(30)
+-153 + j*(-206)
+-49 + j*(-235)
+-246 + j*(-214)
+-224 + j*(-144)
+-77 + j*(-115)
+-242 + j*(-233)
+56 + j*(127)
+-137 + j*(-156)
+-108 + j*(-163)
+-60 + j*(-140)
+-91 + j*(73)
+-85 + j*(-101)
+-141 + j*(30)
+-144 + j*(34)
+82 + j*(-5)
+52 + j*(187)
+-285 + j*(-59)
+62 + j*(271)
+-29 + j*(-113)
+-1 + j*(225)
+101 + j*(-23)
+-143 + j*(196)
+-168 + j*(158)
+-211 + j*(-158)
+71 + j*(-28)
+-115 + j*(-99)
+-49 + j*(-183)
+-58 + j*(8)
+-187 + j*(303)
+-6 + j*(-127)
+188 + j*(-136)
+-66 + j*(-156)
+134 + j*(-123)
+-78 + j*(41)
+-134 + j*(-218)
+-33 + j*(194)
+-33 + j*(-91)
+15 + j*(326)
+187 + j*(336)
+9 + j*(21)
+143 + j*(-202)
+64 + j*(388)
+-179 + j*(-59)
+149 + j*(-228)
+62 + j*(255)
+-161 + j*(-35)
+-98 + j*(-286)
+-282 + j*(243)
+-2 + j*(112)
+-168 + j*(-325)
+-197 + j*(180)
+182 + j*(-438)
+-193 + j*(-105)
+103 + j*(-26)
+168 + j*(135)
+-91 + j*(266)
+-94 + j*(-79)
+165 + j*(228)
+215 + j*(-136)
+-76 + j*(-318)
+-177 + j*(-263)
+-272 + j*(156)
+337 + j*(-240)
+310 + j*(95)
+116 + j*(-1)
+243 + j*(-195)
+223 + j*(-48)
+-231 + j*(-1)
+16 + j*(21)
+-153 + j*(66)
+16 + j*(176)
+-52 + j*(136)
+144 + j*(-22)
+89 + j*(-197)
+161 + j*(252)
+-122 + j*(-67)
+-258 + j*(127)
+-168 + j*(-146)
+-155 + j*(-39)
+101 + j*(303)
+60 + j*(-25)
+-305 + j*(67)
+-253 + j*(-231)
+91 + j*(-173)
+71 + j*(81)
+23 + j*(186)
+-260 + j*(208)
+-2 + j*(149)
+-95 + j*(-175)
+21 + j*(204)
+402 + j*(-2)
+-8 + j*(-16)
+-175 + j*(150)
+45 + j*(-235)
+200 + j*(260)
+-375 + j*(-325)
+179 + j*(166)
+152 + j*(246)
+6 + j*(80)
+212 + j*(-17)
+-207 + j*(125)
+-6 + j*(12)
+119 + j*(61)
+-115 + j*(320)
+35 + j*(342)
+-184 + j*(-132)
+62 + j*(-43)
+-151 + j*(125)
+117 + j*(-96)
+2 + j*(59)
+-90 + j*(-66)
+-18 + j*(239)
+-175 + j*(-296)
+112 + j*(-147)
+68 + j*(92)
+61 + j*(-134)
+8 + j*(-170)
+59 + j*(225)
+150 + j*(135)
+-108 + j*(-182)
+120 + j*(340)
+-10 + j*(-316)
+54 + j*(4)
+-40 + j*(29)
+7 + j*(58)
+-280 + j*(143)
+-206 + j*(197)
+-183 + j*(181)
+-90 + j*(177)
+-115 + j*(26)
+-42 + j*(168)
+-34 + j*(-195)
+32 + j*(125)
+272 + j*(-323)
+-118 + j*(22)
+125 + j*(-72)
+-164 + j*(296)
+260 + j*(37)
+133 + j*(228)
+30 + j*(-123)
+90 + j*(167)
+39 + j*(83)
+63 + j*(445)
+7 + j*(-14)
+-21 + j*(83)
+-139 + j*(302)
+-600 + j*(137)
+-149 + j*(-34)
+305 + j*(-392)
+208 + j*(151)
+26 + j*(16)
+135 + j*(-170)
+-183 + j*(215)
+-78 + j*(1)
+-131 + j*(206)
+202 + j*(356)
+187 + j*(-204)
+147 + j*(-86)
+283 + j*(107)
+30 + j*(-57)
+182 + j*(36)
+-154 + j*(-84)
+24 + j*(36)
+124 + j*(52)
+-237 + j*(114)
+-218 + j*(39)
+-40 + j*(-302)
+-456 + j*(4)
+136 + j*(63)
+-20 + j*(33)
+81 + j*(-118)
+-52 + j*(140)
+46 + j*(56)
+146 + j*(-45)
+-85 + j*(-44)
+33 + j*(-86)
+-76 + j*(-269)
+143 + j*(91)
+-121 + j*(23)
+12 + j*(93)
+-57 + j*(-215)
+47 + j*(-370)
+317 + j*(22)
+-103 + j*(16)
+179 + j*(-135)
+57 + j*(0)
+-30 + j*(88)
+131 + j*(-74)
+207 + j*(-72)
+-234 + j*(179)
+-226 + j*(-16)
+226 + j*(161)
+143 + j*(108)
+-95 + j*(-100)
+-24 + j*(-88)
+380 + j*(102)
+187 + j*(57)
+-23 + j*(188)
+174 + j*(-252)
+93 + j*(498)
+194 + j*(196)
+72 + j*(-33)
+-112 + j*(20)
+-106 + j*(-163)
+-93 + j*(-49)
+98 + j*(100)
+-79 + j*(-144)
+-322 + j*(-298)
+-160 + j*(-301)
+144 + j*(-13)
+262 + j*(-20)
+-250 + j*(-38)
+59 + j*(-44)
+-1 + j*(219)
+234 + j*(-99)
+-3 + j*(-152)
+160 + j*(-97)
+359 + j*(152)
+-6 + j*(-20)
+-209 + j*(183)
+-36 + j*(192)
+-5 + j*(74)
+-171 + j*(-285)
+11 + j*(49)
+-6 + j*(103)
+18 + j*(147)
+-27 + j*(161)
+4 + j*(-77)
+193 + j*(-27)
+81 + j*(89)
+-20 + j*(140)
+-253 + j*(-40)
+246 + j*(104)
+83 + j*(87)
+160 + j*(-54)
+277 + j*(4)
+129 + j*(-228)
+89 + j*(-37)
+222 + j*(-259)
+4 + j*(-252)
+-135 + j*(-66)
+-7 + j*(228)
+190 + j*(133)
+-67 + j*(-235)
+157 + j*(-184)
+126 + j*(-25)
+-321 + j*(46)
+-291 + j*(-25)
+-365 + j*(-303)
+83 + j*(-93)
+-286 + j*(77)
+-1 + j*(-198)
+-246 + j*(-414)
+64 + j*(-129)
+142 + j*(105)
+188 + j*(-168)
+-139 + j*(-209)
+-58 + j*(330)
+-16 + j*(-140)
+-33 + j*(157)
+-77 + j*(-275)
+-151 + j*(-147)
+-37 + j*(-271)
+206 + j*(254)
+419 + j*(39)
+156 + j*(-215)
+-33 + j*(86)
+164 + j*(-355)
+-202 + j*(231)
+-162 + j*(-66)
+-112 + j*(-197)
+-72 + j*(-170)
+-66 + j*(-123)
+70 + j*(245)
+-182 + j*(-83)
+173 + j*(-288)
+148 + j*(158)
+38 + j*(324)
+67 + j*(-69)
+18 + j*(-21)
+49 + j*(-88)
+54 + j*(-108)
+-49 + j*(200)
+-228 + j*(-81)
+-436 + j*(-100)
+-21 + j*(-150)
+-58 + j*(-40)
+368 + j*(-151)
+-32 + j*(-195)
+30 + j*(-35)
+190 + j*(21)
+191 + j*(-153)
+-322 + j*(95)
+-42 + j*(-115)
+103 + j*(-181)
+-110 + j*(183)
+76 + j*(-199)
+-103 + j*(285)
+81 + j*(271)
+214 + j*(81)
+10 + j*(6)
+19 + j*(7)
+149 + j*(42)
+-22 + j*(10)
+211 + j*(-118)
+126 + j*(-46)
+276 + j*(163)
+86 + j*(155)
+-108 + j*(19)
+-16 + j*(-174)
+104 + j*(-542)
+70 + j*(125)
+168 + j*(128)
+-215 + j*(305)
+-2 + j*(35)
+-87 + j*(150)
+50 + j*(-389)
+111 + j*(136)
+-211 + j*(-159)
+-20 + j*(-172)
+240 + j*(-195)
+205 + j*(57)
+-98 + j*(43)
+194 + j*(-65)
+-37 + j*(153)
+30 + j*(123)
+-52 + j*(29)
+-266 + j*(8)
+-146 + j*(-105)
+158 + j*(15)
+69 + j*(-259)
+304 + j*(176)
+96 + j*(160)
+-39 + j*(-62)
+5 + j*(80)
+-24 + j*(214)
+152 + j*(61)
+119 + j*(-291)
+-44 + j*(168)
+48 + j*(431)
+-17 + j*(66)
+-4 + j*(264)
+-88 + j*(33)
+-160 + j*(-226)
+-238 + j*(-113)
+42 + j*(-112)
+75 + j*(30)
+130 + j*(-27)
+100 + j*(175)
+106 + j*(-87)
+-320 + j*(-256)
+122 + j*(-37)
+-141 + j*(-22)
+80 + j*(-106)
+301 + j*(-71)
+117 + j*(-21)
+93 + j*(419)
+46 + j*(-291)
+-59 + j*(-177)
+-76 + j*(47)
+-64 + j*(-56)
+-12 + j*(74)
+-79 + j*(-18)
+214 + j*(-89)
+122 + j*(-144)
+-142 + j*(-150)
+-199 + j*(-298)
+13 + j*(-134)
+-366 + j*(21)
+-2 + j*(-26)
+-30 + j*(139)
+-328 + j*(-211)
+-141 + j*(235)
+253 + j*(-21)
+-219 + j*(-209)
+-71 + j*(-62)
+82 + j*(-146)
+-127 + j*(261)
+-319 + j*(-255)
+-121 + j*(86)
+585 + j*(32)
+-54 + j*(-60)
+282 + j*(58)
+-122 + j*(221)
+84 + j*(110)
+-153 + j*(1)
+44 + j*(209)
+229 + j*(110)
+313 + j*(69)
+202 + j*(-211)
+39 + j*(21)
+194 + j*(177)
+209 + j*(69)
+-30 + j*(-167)
+127 + j*(38)
+-177 + j*(11)
+-41 + j*(86)
+-15 + j*(243)
+78 + j*(11)
+-79 + j*(-228)
+-116 + j*(-86)
+23 + j*(47)
+383 + j*(73)
+203 + j*(-68)
+111 + j*(140)
+-63 + j*(68)
+-82 + j*(-229)
+-157 + j*(-313)
+-190 + j*(279)
+-104 + j*(61)
+-180 + j*(-204)
+265 + j*(-153)
+-42 + j*(-48)
+100 + j*(172)
+-147 + j*(-308)
+267 + j*(54)
+-112 + j*(272)
+-264 + j*(-36)
+29 + j*(-332)
+140 + j*(-86)
+400 + j*(-38)
+-121 + j*(-231)
+-42 + j*(344)
+129 + j*(-81)
+-111 + j*(226)
+3 + j*(150)
+-37 + j*(18)
+0 + j*(-82)
+153 + j*(151)
+81 + j*(91)
+-136 + j*(184)
+503 + j*(-113)
+-49 + j*(319)
+70 + j*(77)
+197 + j*(-66)
+-62 + j*(149)
+254 + j*(-122)
+45 + j*(-32)
+3 + j*(9)
+25 + j*(89)
+6 + j*(-45)
+-22 + j*(161)
+-40 + j*(83)
+103 + j*(23)
+110 + j*(278)
+8 + j*(-61)
+-57 + j*(37)
+-99 + j*(86)
+-64 + j*(339)
+-37 + j*(214)
+-84 + j*(6)
+303 + j*(-178)
+205 + j*(97)
+11 + j*(194)
+129 + j*(11)
+687 + j*(-100)
+187 + j*(-238)
+40 + j*(-74)
+332 + j*(-25)
+-94 + j*(165)
+64 + j*(246)
+-291 + j*(-108)
+-121 + j*(-284)
+216 + j*(-104)
+159 + j*(23)
+75 + j*(-47)
+70 + j*(4)
+-10 + j*(-34)
+-155 + j*(34)
+-35 + j*(89)
+-13 + j*(-134)
+-99 + j*(40)
+-463 + j*(-13)
+-252 + j*(172)
+-22 + j*(-351)
+-69 + j*(88)
+-284 + j*(-21)
+13 + j*(-6)
+-35 + j*(-71)
+-40 + j*(317)
+405 + j*(-60)
+-358 + j*(104)
+56 + j*(-119)
+-135 + j*(-156)
+-66 + j*(-23)
+168 + j*(59)
+148 + j*(-76)
+-213 + j*(-190)
+-190 + j*(-27)
+103 + j*(392)
+52 + j*(110)
+211 + j*(-61)
+-165 + j*(218)
+3 + j*(-231)
+69 + j*(-161)
+-263 + j*(54)
+98 + j*(-191)
+30 + j*(167)
+45 + j*(9)
+-373 + j*(181)
+69 + j*(105)
+-23 + j*(-100)
+-127 + j*(-9)
+-64 + j*(287)
+202 + j*(290)
+115 + j*(-109)
+-72 + j*(-205)
+166 + j*(238)
+151 + j*(-25)
+186 + j*(290)
+-108 + j*(33)
+-163 + j*(-180)
+148 + j*(124)
+94 + j*(-270)
+-52 + j*(27)
+161 + j*(134)
+-61 + j*(-25)
+-23 + j*(-233)
+93 + j*(-245)
+57 + j*(162)
+-172 + j*(-354)
+133 + j*(129)
+339 + j*(107)
+12 + j*(65)
+6 + j*(-80)
+-51 + j*(-17)
+-13 + j*(-37)
+-18 + j*(-258)
+-54 + j*(-141)
+295 + j*(6)
+-215 + j*(-192)
+-109 + j*(-73)
+105 + j*(43)
+-277 + j*(-251)
+57 + j*(188)
+-38 + j*(390)
+-117 + j*(-390)
+107 + j*(233)
+131 + j*(98)
+366 + j*(-215)
+-136 + j*(-154)
+45 + j*(-112)
+-10 + j*(-6)
+27 + j*(-114)
+-119 + j*(8)
+-163 + j*(-4)
+78 + j*(261)
+221 + j*(-37)
+-92 + j*(-23)
+4 + j*(221)
+-2 + j*(-153)
+-76 + j*(-158)
+66 + j*(141)
+-182 + j*(136)
+-446 + j*(-88)
+71 + j*(-145)
+-75 + j*(-87)
+101 + j*(-97)
+-177 + j*(146)
+93 + j*(21)
+324 + j*(397)
+281 + j*(-229)
+-138 + j*(117)
+-188 + j*(112)
+39 + j*(-66)
+163 + j*(-98)
+71 + j*(57)
+-65 + j*(187)
+125 + j*(197)
+-135 + j*(141)
+-105 + j*(47)
+19 + j*(-86)
+66 + j*(-235)
+-480 + j*(225)
+76 + j*(28)
+342 + j*(47)
+0 + j*(-366)
+-140 + j*(74)
+193 + j*(144)
+-126 + j*(-43)
+-191 + j*(158)
+-180 + j*(-55)
+63 + j*(-255)
+-98 + j*(-2)
+-13 + j*(308)
+-183 + j*(207)
+144 + j*(37)
+-51 + j*(-175)
+28 + j*(-29)
+-211 + j*(356)
+-132 + j*(173)
+-173 + j*(199)
+36 + j*(329)
+-139 + j*(228)
+-311 + j*(177)
+65 + j*(-343)
+-217 + j*(-20)
+119 + j*(18)
+29 + j*(-58)
+156 + j*(129)
+-41 + j*(23)
+202 + j*(-163)
+224 + j*(196)
+-47 + j*(25)
+15 + j*(-122)
+-182 + j*(280)
+-170 + j*(21)
+8 + j*(-144)
+20 + j*(246)
+-148 + j*(143)
+91 + j*(93)
+168 + j*(44)
+-100 + j*(270)
+-51 + j*(-167)
+-285 + j*(125)
+-93 + j*(63)
+-1 + j*(-290)
+-214 + j*(-47)
+-78 + j*(243)
+-156 + j*(-314)
+152 + j*(57)
+163 + j*(267)
+8 + j*(-167)
+-262 + j*(114)
+132 + j*(49)
+199 + j*(-85)
+3 + j*(228)
+57 + j*(-151)
+104 + j*(-98)
+-45 + j*(-381)
+238 + j*(-59)
+-62 + j*(-158)
+-96 + j*(-87)
+8 + j*(279)
+-84 + j*(260)
+276 + j*(127)
+-142 + j*(-42)
+-119 + j*(-185)
+67 + j*(134)
+-20 + j*(129)
+-47 + j*(-30)
+-250 + j*(156)
+200 + j*(108)
+-450 + j*(49)
+-30 + j*(87)
+205 + j*(-137)
+-165 + j*(217)
+100 + j*(-165)
+-52 + j*(-71)
+-232 + j*(-131)
+-289 + j*(-36)
+310 + j*(-194)
+-88 + j*(127)
+17 + j*(-71)
+50 + j*(232)
+181 + j*(21)
+-65 + j*(-333)
+158 + j*(-238)
+176 + j*(-210)
+-279 + j*(173)
+-21 + j*(-192)
+-363 + j*(-361)
+6 + j*(185)
+-25 + j*(-4)
+62 + j*(-21)
+33 + j*(-59)
+2 + j*(-121)
+-192 + j*(-84)
+32 + j*(204)
+23 + j*(57)
+-186 + j*(341)
+1 + j*(-191)
+-262 + j*(-313)
+121 + j*(13)
+-211 + j*(-185)
+-470 + j*(23)
+-221 + j*(94)
+50 + j*(25)
+-277 + j*(53)
+174 + j*(29)
+-26 + j*(-297)
+-1 + j*(-285)
+90 + j*(-249)
+50 + j*(214)
+72 + j*(-9)
+-107 + j*(-288)
+-98 + j*(-368)
+-146 + j*(-28)
+-135 + j*(-53)
+-245 + j*(240)
+-88 + j*(134)
+211 + j*(-91)
+-175 + j*(42)
+117 + j*(212)
+179 + j*(-4)
+-96 + j*(202)
+-119 + j*(-134)
+22 + j*(291)
+-515 + j*(119)
+36 + j*(-319)
+190 + j*(-428)
+128 + j*(-48)
+458 + j*(-10)
+-104 + j*(-23)
+-51 + j*(173)
+93 + j*(95)
+-222 + j*(47)
+-141 + j*(-39)
+-175 + j*(-116)
+35 + j*(-10)
+56 + j*(-146)
+275 + j*(14)
+14 + j*(31)
+-105 + j*(-30)
+105 + j*(64)
+21 + j*(-163)
+-33 + j*(-29)
+-56 + j*(-397)
+-235 + j*(-142)
+-91 + j*(-166)
+-112 + j*(-132)
+342 + j*(116)
+76 + j*(-300)
+-118 + j*(71)
+-137 + j*(196)
+83 + j*(204)
+89 + j*(-214)
+78 + j*(-142)
+-82 + j*(-71)
+-301 + j*(-57)
+141 + j*(111)
+-74 + j*(4)
+-76 + j*(179)
+-545 + j*(209)
+121 + j*(-37)
+303 + j*(121)
+-182 + j*(47)
+83 + j*(-137)
+251 + j*(118)
+60 + j*(36)
+134 + j*(221)
+257 + j*(245)
+30 + j*(-115)
+192 + j*(-68)
+-280 + j*(-52)
+-197 + j*(255)
+-106 + j*(23)
+-2 + j*(-309)
+175 + j*(305)
+78 + j*(31)
+86 + j*(-110)
+-37 + j*(-164)
+-28 + j*(135)
+29 + j*(-107)
+161 + j*(228)
+269 + j*(167)
+-46 + j*(-32)
+-175 + j*(-12)
+244 + j*(-436)
+-118 + j*(276)
+-151 + j*(-311)
+-127 + j*(91)
+27 + j*(182)
+71 + j*(-19)
+170 + j*(-5)
+-67 + j*(75)
+196 + j*(233)
+253 + j*(47)
+-23 + j*(-124)
+10 + j*(-184)
+-90 + j*(-4)
+-13 + j*(-43)
+-248 + j*(-177)
+-4 + j*(-153)
+192 + j*(-52)
+-232 + j*(-206)
+238 + j*(138)
+-165 + j*(55)
+-158 + j*(-70)
+77 + j*(55)
+-6 + j*(47)
+227 + j*(-101)
+7 + j*(281)
+-52 + j*(156)
+137 + j*(-203)
+56 + j*(64)
+71 + j*(16)
+-171 + j*(-17)
+-127 + j*(325)
+8 + j*(91)
+-107 + j*(197)
+-25 + j*(22)
+-203 + j*(-243)
+120 + j*(57)
+205 + j*(-311)
+117 + j*(30)
+-167 + j*(149)
+202 + j*(27)
+-257 + j*(177)
+-293 + j*(76)
+-211 + j*(-262)
+-106 + j*(-71)
+-43 + j*(-121)
+-140 + j*(-146)
+-118 + j*(138)
+114 + j*(-126)
+114 + j*(35)
+-208 + j*(59)
+177 + j*(34)
+-18 + j*(-115)
+60 + j*(9)
+-24 + j*(-62)
+288 + j*(66)
+-176 + j*(-223)
+94 + j*(69)
+334 + j*(-168)
+281 + j*(-23)
+-40 + j*(139)
+-59 + j*(-4)
+-45 + j*(-16)
+100 + j*(-16)
+216 + j*(-39)
+30 + j*(-128)
+-351 + j*(161)
+67 + j*(-194)
+-213 + j*(-55)
+102 + j*(-107)
+236 + j*(-30)
+317 + j*(-180)
+66 + j*(-140)
+-4 + j*(157)
+-191 + j*(-49)
+-101 + j*(-248)
+-21 + j*(-175)
+-9 + j*(-108)
+-268 + j*(-51)
+158 + j*(168)
+11 + j*(117)
+-4 + j*(78)
+77 + j*(186)
+72 + j*(-84)
+-88 + j*(-228)
+-66 + j*(-83)
+-272 + j*(-322)
+-123 + j*(-65)
+-105 + j*(25)
+368 + j*(-404)
+0 + j*(-161)
+162 + j*(-31)
+96 + j*(232)
+236 + j*(-275)
+40 + j*(-96)
+250 + j*(-218)
+-234 + j*(-142)
+-10 + j*(63)
+-264 + j*(210)
+40 + j*(-186)
+-290 + j*(4)
+176 + j*(-90)
+109 + j*(282)
+13 + j*(465)
+40 + j*(7)
+129 + j*(-70)
+-30 + j*(7)
+-151 + j*(71)
+-240 + j*(152)
+-238 + j*(-159)
+50 + j*(-19)
+-81 + j*(76)
+132 + j*(-339)
+7 + j*(190)
+68 + j*(-272)
+-231 + j*(199)
+-6 + j*(-153)
+-71 + j*(224)
+-362 + j*(203)
+122 + j*(-11)
+125 + j*(-11)
+40 + j*(-13)
+69 + j*(370)
+128 + j*(-18)
+-73 + j*(77)
+-194 + j*(-13)
+144 + j*(33)
+168 + j*(331)
+-224 + j*(-53)
+18 + j*(-140)
+-47 + j*(232)
+20 + j*(-175)
+235 + j*(-91)
+241 + j*(-113)
+-290 + j*(-156)
+-180 + j*(-276)
+-187 + j*(69)
+-25 + j*(-264)
+-29 + j*(-21)
+-70 + j*(-210)
+-301 + j*(-95)
+-34 + j*(-162)
+-252 + j*(10)
+80 + j*(-33)
+-62 + j*(-161)
+14 + j*(29)
+83 + j*(170)
+154 + j*(-146)
+50 + j*(-245)
+112 + j*(82)
+-60 + j*(132)
+257 + j*(174)
+-10 + j*(-168)
+147 + j*(-98)
+-224 + j*(-255)
+-240 + j*(-171)
+155 + j*(-137)
+-81 + j*(138)
+-325 + j*(-52)
+247 + j*(141)
+-365 + j*(16)
+385 + j*(-28)
+165 + j*(-25)
+-62 + j*(60)
+-140 + j*(-218)
+426 + j*(178)
+-83 + j*(156)
+163 + j*(-32)
+263 + j*(13)
+-159 + j*(45)
+-7 + j*(-478)
+-43 + j*(221)
+37 + j*(-121)
+57 + j*(-92)
+4 + j*(207)
+-91 + j*(-10)
+-173 + j*(31)
+182 + j*(-86)
+153 + j*(59)
+-259 + j*(-192)
+185 + j*(-95)
+155 + j*(169)
+136 + j*(-41)
+-330 + j*(-250)
+-178 + j*(-422)
+218 + j*(307)
+264 + j*(-365)
+317 + j*(-4)
+424 + j*(-73)
+-162 + j*(-162)
+-238 + j*(-79)
+-28 + j*(270)
+-309 + j*(224)
+230 + j*(42)
+168 + j*(66)
+243 + j*(-93)
+-57 + j*(248)
+-28 + j*(131)
+-1 + j*(173)
+-61 + j*(-118)
+-35 + j*(104)
+156 + j*(-25)
+20 + j*(182)
+-57 + j*(-141)
+-115 + j*(-38)
+68 + j*(-209)
+97 + j*(-191)
+170 + j*(226)
+70 + j*(42)
+-115 + j*(105)
+-105 + j*(167)
+-153 + j*(-176)
+1 + j*(214)
+144 + j*(404)
+76 + j*(303)
+220 + j*(2)
+-428 + j*(-21)
+-53 + j*(49)
+-35 + j*(262)
+29 + j*(-51)
+104 + j*(-71)
+161 + j*(-219)
+57 + j*(-207)
+-167 + j*(200)
+-170 + j*(174)
+-46 + j*(-60)
+4 + j*(-160)
+117 + j*(50)
+390 + j*(21)
+-37 + j*(16)
+3 + j*(-183)
+-27 + j*(194)
+93 + j*(42)
+-457 + j*(214)
+310 + j*(-107)
+-8 + j*(-76)
+282 + j*(183)
+-30 + j*(56)
+201 + j*(322)
+421 + j*(227)
+230 + j*(-49)
+156 + j*(-142)
+-208 + j*(-272)
+-81 + j*(-156)
+-293 + j*(-89)
+-108 + j*(-82)
+225 + j*(73)
+-69 + j*(91)
+-227 + j*(-105)
+350 + j*(-50)
+8 + j*(-212)
+-149 + j*(234)
+-61 + j*(139)
+134 + j*(-105)
+177 + j*(-169)
+-113 + j*(113)
+178 + j*(44)
+120 + j*(62)
+-1 + j*(253)
+-45 + j*(-24)
+240 + j*(-194)
+23 + j*(90)
+237 + j*(68)
+-13 + j*(83)
+-148 + j*(-37)
+136 + j*(-278)
+-175 + j*(334)
+160 + j*(-148)
+153 + j*(-133)
+60 + j*(124)
+-221 + j*(-114)
+96 + j*(116)
+-43 + j*(30)
+38 + j*(-186)
+-302 + j*(-27)
+93 + j*(-78)
+-64 + j*(274)
+-75 + j*(-1)
+66 + j*(232)
+199 + j*(22)
+-64 + j*(40)
+-199 + j*(66)
+168 + j*(-209)
+122 + j*(-142)
+305 + j*(71)
+-11 + j*(-146)
+-418 + j*(5)
+24 + j*(133)
+203 + j*(-218)
+394 + j*(165)
+-156 + j*(-112)
+93 + j*(-129)
+-204 + j*(59)
+95 + j*(317)
+-151 + j*(-274)
+-122 + j*(-175)
+-115 + j*(-29)
+-50 + j*(-112)
+224 + j*(-140)
+47 + j*(-1)
+-80 + j*(-177)
+-244 + j*(-238)
+-102 + j*(45)
+-117 + j*(-63)
+62 + j*(8)
+-85 + j*(20)
+-209 + j*(-100)
+-118 + j*(-187)
+-158 + j*(57)
+-174 + j*(-190)
+-23 + j*(389)
+-24 + j*(110)
+-163 + j*(-100)
+45 + j*(234)
+-49 + j*(76)
+-349 + j*(193)
+-40 + j*(-93)
+162 + j*(120)
+-119 + j*(-11)
+-126 + j*(322)
+42 + j*(240)
+49 + j*(-10)
+445 + j*(175)
+-243 + j*(78)
+95 + j*(-86)
+237 + j*(66)
+148 + j*(-190)
+-105 + j*(37)
+112 + j*(40)
+-134 + j*(-176)
+241 + j*(-241)
+-398 + j*(185)
+-57 + j*(36)
+323 + j*(36)
+206 + j*(-162)
+-100 + j*(231)
+-121 + j*(192)
+52 + j*(68)
+113 + j*(-16)
+-312 + j*(-42)
+185 + j*(-37)
+-140 + j*(124)
+252 + j*(-82)
+74 + j*(-66)
+-182 + j*(-21)
+-168 + j*(-48)
+-198 + j*(-36)
+-100 + j*(-97)
+108 + j*(-23)
+16 + j*(-69)
+-303 + j*(-143)
+-182 + j*(-119)
+149 + j*(-485)
+279 + j*(110)
+-151 + j*(-129)
+263 + j*(-245)
+166 + j*(28)
+216 + j*(74)
+25 + j*(96)
+-122 + j*(146)
+81 + j*(103)
+129 + j*(-6)
+-167 + j*(-17)
+-351 + j*(-259)
+3 + j*(-125)
+-163 + j*(68)
+279 + j*(91)
+-49 + j*(-257)
+195 + j*(-93)
+47 + j*(118)
+-197 + j*(-392)
+-125 + j*(-238)
+284 + j*(48)
+218 + j*(-397)
+72 + j*(-14)
+-46 + j*(223)
+-140 + j*(-227)
+182 + j*(-205)
+-218 + j*(-226)
+-57 + j*(-305)
+-48 + j*(-37)
+-199 + j*(-303)
+16 + j*(-168)
+38 + j*(-11)
+-73 + j*(-53)
+-142 + j*(-253)
+-83 + j*(246)
+77 + j*(-91)
+-128 + j*(-83)
+-315 + j*(-84)
+-229 + j*(-173)
+-238 + j*(-5)
+118 + j*(-53)
+-119 + j*(124)
+57 + j*(-78)
+33 + j*(-105)
+-52 + j*(-35)
+-11 + j*(87)
+-172 + j*(18)
+-40 + j*(-88)
+-42 + j*(188)
+3 + j*(-257)
+-205 + j*(97)
+244 + j*(337)
+-30 + j*(35)
+52 + j*(-91)
+-379 + j*(-11)
+-187 + j*(-46)
+-99 + j*(-209)
+-197 + j*(-16)
+-168 + j*(-129)
+-429 + j*(34)
+-54 + j*(-23)
+-110 + j*(-78)
+328 + j*(98)
+-142 + j*(139)
+-204 + j*(124)
+-123 + j*(-131)
+-110 + j*(-260)
+47 + j*(-187)
+138 + j*(121)
+-160 + j*(91)
+-414 + j*(-91)
+-73 + j*(169)
+-91 + j*(-195)
+-343 + j*(-139)
+-105 + j*(-62)
+127 + j*(308)
+43 + j*(147)
+-381 + j*(40)
+-107 + j*(197)
+264 + j*(-93)
+-170 + j*(122)
+156 + j*(-71)
+-37 + j*(233)
+77 + j*(51)
+152 + j*(14)
+-35 + j*(76)
+-259 + j*(124)
+-253 + j*(10)
+234 + j*(-71)
+562 + j*(-276)
+0 + j*(88)
+45 + j*(115)
+-56 + j*(-43)
+262 + j*(25)
+-69 + j*(119)
+-143 + j*(-172)
+176 + j*(-386)
+-144 + j*(38)
+-18 + j*(170)
+259 + j*(-262)
+-8 + j*(88)
+-113 + j*(-90)
+139 + j*(74)
+141 + j*(-67)
+208 + j*(-146)
+118 + j*(46)
+-156 + j*(-5)
+-69 + j*(-154)
+-252 + j*(115)
+93 + j*(6)
+55 + j*(257)
+19 + j*(62)
+211 + j*(129)
+-421 + j*(107)
+120 + j*(77)
+-86 + j*(-219)
+-292 + j*(-37)
+-13 + j*(-209)
+-185 + j*(-60)
+-71 + j*(163)
+-301 + j*(-11)
+-138 + j*(188)
+110 + j*(6)
+310 + j*(356)
+101 + j*(-104)
+-11 + j*(125)
+107 + j*(81)
+157 + j*(-269)
+-98 + j*(-77)
+427 + j*(-223)
+-159 + j*(154)
+11 + j*(148)
+-168 + j*(-61)
+19 + j*(-80)
+-69 + j*(276)
+-376 + j*(283)
+23 + j*(91)
+-237 + j*(41)
+-194 + j*(11)
+-209 + j*(-356)
+-21 + j*(170)
+-204 + j*(92)
+180 + j*(89)
+-72 + j*(52)
+-102 + j*(128)
+155 + j*(-105)
+-308 + j*(215)
+-206 + j*(187)
+-31 + j*(27)
+-264 + j*(33)
+192 + j*(50)
+-184 + j*(-98)
+-213 + j*(-190)
+-296 + j*(-141)
+42 + j*(-74)
+59 + j*(153)
+-2 + j*(-122)
+124 + j*(-98)
+37 + j*(-61)
+-5 + j*(-226)
+-327 + j*(-73)
+187 + j*(238)
+-193 + j*(145)
+-49 + j*(199)
+12 + j*(-103)
+254 + j*(-51)
+138 + j*(-86)
+166 + j*(-317)
+61 + j*(-37)
+-264 + j*(37)
+-108 + j*(-327)
+-274 + j*(312)
+-293 + j*(146)
+-120 + j*(-36)
+153 + j*(-57)
+91 + j*(205)
+-26 + j*(432)
+-310 + j*(168)
+137 + j*(171)
+-57 + j*(11)
+233 + j*(-103)
+-19 + j*(-187)
+-33 + j*(-207)
+-239 + j*(153)
+250 + j*(-412)
+23 + j*(-238)
+218 + j*(-332)
+284 + j*(-149)
+68 + j*(37)
+-3 + j*(303)
+145 + j*(90)
+7 + j*(-6)
+93 + j*(-117)
+218 + j*(-139)
+-204 + j*(30)
+-51 + j*(-193)
+-52 + j*(-139)
+-104 + j*(-123)
+-164 + j*(55)
+169 + j*(12)
+-155 + j*(-104)
+230 + j*(26)
+-1 + j*(93)
+-243 + j*(-438)
+-313 + j*(98)
+22 + j*(-40)
+-18 + j*(166)
+116 + j*(-16)
+-221 + j*(156)
+10 + j*(-282)
+-21 + j*(41)
+-111 + j*(-107)
+78 + j*(68)
+-165 + j*(14)
+-99 + j*(16)
+315 + j*(66)
+11 + j*(-98)
+65 + j*(97)
+-82 + j*(227)
+35 + j*(-300)
+-29 + j*(30)
+222 + j*(-175)
+89 + j*(91)
+133 + j*(-55)
+-165 + j*(26)
+294 + j*(-19)
+-134 + j*(173)
+-6 + j*(-123)
+265 + j*(316)
+-37 + j*(-37)
+37 + j*(-9)
+-28 + j*(54)
+66 + j*(52)
+-2 + j*(-216)
+111 + j*(-18)
+144 + j*(153)
+46 + j*(17)
+-18 + j*(184)
+-277 + j*(-111)
+136 + j*(-34)
+181 + j*(-19)
+-358 + j*(42)
+112 + j*(24)
+-58 + j*(-71)
+21 + j*(89)
+250 + j*(2)
+-151 + j*(7)
+-45 + j*(29)
+-100 + j*(-1)
+-96 + j*(148)
+197 + j*(52)
+-18 + j*(-540)
+7 + j*(-98)
+-18 + j*(27)
+74 + j*(166)
+-16 + j*(-130)
+62 + j*(108)
+37 + j*(88)
+-97 + j*(-153)
+-11 + j*(36)
+-204 + j*(48)
+70 + j*(115)
+-161 + j*(142)
+-72 + j*(-76)
+156 + j*(112)
+149 + j*(317)
+-163 + j*(193)
+353 + j*(-178)
+160 + j*(-74)
+67 + j*(201)
+-218 + j*(146)
+111 + j*(42)
+-27 + j*(28)
+-207 + j*(-126)
+115 + j*(68)
+178 + j*(95)
+110 + j*(-12)
+74 + j*(-181)
+-38 + j*(-50)
+147 + j*(321)
+132 + j*(110)
+297 + j*(158)
+-107 + j*(59)
+100 + j*(142)
+-35 + j*(252)
+122 + j*(69)
+105 + j*(-229)
+34 + j*(-2)
+479 + j*(-9)
+-16 + j*(96)
+201 + j*(-258)
+-104 + j*(133)
+129 + j*(-23)
+194 + j*(134)
+-106 + j*(-35)
+-281 + j*(-300)
+36 + j*(-212)
+-175 + j*(21)
+-287 + j*(86)
+79 + j*(-139)
+173 + j*(133)
+16 + j*(-117)
+-152 + j*(33)
+201 + j*(-59)
+-149 + j*(150)
+-75 + j*(-175)
+-416 + j*(-181)
+-64 + j*(-284)
+0 + j*(401)
+-170 + j*(425)
+-214 + j*(-47)
+-211 + j*(247)
+-98 + j*(8)
+-129 + j*(447)
+271 + j*(272)
+9 + j*(-279)
+-64 + j*(-25)
+176 + j*(240)
+-462 + j*(-388)
+-25 + j*(391)
+132 + j*(-235)
+173 + j*(-240)
+371 + j*(-346)
+230 + j*(-164)
+-228 + j*(18)
+-81 + j*(323)
+150 + j*(89)
+197 + j*(-226)
+387 + j*(-117)
+170 + j*(-281)
+-300 + j*(-19)
+-4 + j*(-175)
+428 + j*(-17)
+523 + j*(419)
+168 + j*(455)
+-202 + j*(-57)
+-372 + j*(-344)
+-133 + j*(-50)
+87 + j*(-18)
+-21 + j*(347)
+237 + j*(446)
+-267 + j*(-60)
+-407 + j*(-203)
+-99 + j*(-204)
+259 + j*(247)
+-342 + j*(342)
+273 + j*(330)
+-400 + j*(238)
+365 + j*(-625)
+400 + j*(-322)
+5 + j*(168)
+371 + j*(329)
+148 + j*(443)
+134 + j*(-100)
+-497 + j*(272)
+-395 + j*(400)
+-403 + j*(267)
+411 + j*(-407)
+-341 + j*(-416)
+155 + j*(-460)
+332 + j*(-323)
+-194 + j*(42)
+-268 + j*(133)
+224 + j*(-124)
+535 + j*(478)
+143 + j*(-390)
+368 + j*(-152)
+-110 + j*(-284)
+-693 + j*(-241)
+-386 + j*(450)
+-215 + j*(373)
+-156 + j*(189)
+349 + j*(-105)
+390 + j*(61)
+269 + j*(-430)
+183 + j*(-207)
+-150 + j*(-489)
+518 + j*(531)
+186 + j*(692)
+395 + j*(-305)
+166 + j*(249)
+243 + j*(-417)
+-135 + j*(-226)
+103 + j*(46)
+281 + j*(125)
+182 + j*(351)
+-250 + j*(40)
+-157 + j*(-467)
+-240 + j*(178)
+170 + j*(-20)
+-379 + j*(-303)
+-149 + j*(295)
+444 + j*(-149)
+595 + j*(231)
+-92 + j*(-199)
+-362 + j*(-141)
+-561 + j*(33)
+588 + j*(-375)
+-267 + j*(-479)
+327 + j*(100)
+-598 + j*(-174)
+-42 + j*(406)
+342 + j*(-147)
+336 + j*(-131)
+140 + j*(115)
+438 + j*(119)
+-50 + j*(100)
+277 + j*(402)
+-230 + j*(-449)
+202 + j*(367)
+388 + j*(-771)
+288 + j*(-619)
+204 + j*(-395)
+-47 + j*(-322)
+-293 + j*(322)
+-315 + j*(-171)
+-141 + j*(127)
+-414 + j*(-54)
+36 + j*(366)
+-325 + j*(466)
+471 + j*(-397)
+-284 + j*(-148)
+-380 + j*(111)
+277 + j*(-126)
+252 + j*(220)
+81 + j*(-233)
+241 + j*(-114)
+-260 + j*(417)
+462 + j*(-177)
+-95 + j*(398)
+-182 + j*(-351)
+-76 + j*(-392)
+-268 + j*(-288)
+351 + j*(-228)
+501 + j*(62)
+51 + j*(273)
+-418 + j*(-262)
+385 + j*(198)
+-156 + j*(497)
+185 + j*(-89)
+-111 + j*(-339)
+-297 + j*(260)
+141 + j*(-395)
+202 + j*(-265)
+291 + j*(-190)
+344 + j*(83)
+-349 + j*(64)
+-132 + j*(284)
+361 + j*(363)
+212 + j*(241)
+527 + j*(514)
+69 + j*(530)
+403 + j*(281)
+-375 + j*(-121)
+-355 + j*(-482)
+177 + j*(158)
+187 + j*(-8)
+696 + j*(-346)
+132 + j*(-311)
+1 + j*(213)
+395 + j*(-237)
+303 + j*(246)
+320 + j*(-262)
+308 + j*(187)
+527 + j*(18)
+-641 + j*(192)
+-265 + j*(-494)
+703 + j*(446)
+412 + j*(116)
+-544 + j*(392)
+219 + j*(387)
+-129 + j*(351)
+-192 + j*(187)
+-379 + j*(-465)
+322 + j*(-293)
+192 + j*(-500)
+22 + j*(351)
+-387 + j*(-301)
+-67 + j*(456)
+194 + j*(450)
+218 + j*(-581)
+-276 + j*(-107)
+187 + j*(198)
+28 + j*(-418)
+-85 + j*(292)
+-156 + j*(-344)
+-214 + j*(-260)
+-151 + j*(-267)
+41 + j*(-289)
+347 + j*(329)
+-33 + j*(-435)
+76 + j*(298)
+202 + j*(222)
+-78 + j*(284)
+575 + j*(-494)
+291 + j*(204)
+197 + j*(523)
+-494 + j*(-342)
+86 + j*(328)
+257 + j*(600)
+236 + j*(-177)
+-128 + j*(-152)
+-214 + j*(-280)
+251 + j*(352)
+-202 + j*(17)
+74 + j*(424)
+-280 + j*(276)
+-160 + j*(293)
+337 + j*(310)
+-448 + j*(-120)
+-243 + j*(-566)
+-279 + j*(-2)
+298 + j*(483)
+-263 + j*(459)
+-253 + j*(-158)
+-312 + j*(-397)
+-192 + j*(228)
+-249 + j*(-423)
+51 + j*(-308)
+526 + j*(-261)
+74 + j*(446)
+-124 + j*(-276)
+-95 + j*(444)
+16 + j*(163)
+-301 + j*(110)
+457 + j*(-303)
+-216 + j*(-169)
+429 + j*(-260)
+-603 + j*(436)
+57 + j*(324)
+-115 + j*(-294)
+313 + j*(295)
+470 + j*(-225)
+518 + j*(129)
+-504 + j*(-204)
+-540 + j*(-33)
+-177 + j*(-329)
+253 + j*(-247)
+-467 + j*(-372)
+185 + j*(-238)
+267 + j*(186)
+-384 + j*(141)
+250 + j*(-291)
+-3 + j*(-309)
+-214 + j*(-30)
+118 + j*(635)
+-256 + j*(327)
+312 + j*(-137)
+197 + j*(-70)
+18 + j*(-503)
+317 + j*(367)
+181 + j*(-424)
+-344 + j*(-240)
+57 + j*(-547)
+-364 + j*(13)
+-27 + j*(-107)
+-59 + j*(80)
+369 + j*(51)
+-217 + j*(-81)
+-407 + j*(509)
+291 + j*(182)
+-293 + j*(334)
+28 + j*(-156)
+-438 + j*(400)
+343 + j*(-96)
+477 + j*(371)
+-287 + j*(-291)
+482 + j*(328)
+-282 + j*(-414)
+61 + j*(179)
+-224 + j*(-69)
+-153 + j*(331)
+188 + j*(-46)
+41 + j*(-78)
+-571 + j*(556)
+-293 + j*(91)
+-260 + j*(90)
+239 + j*(-81)
+-174 + j*(-201)
+262 + j*(189)
+-197 + j*(-334)
+368 + j*(311)
+-501 + j*(88)
+-48 + j*(-481)
+325 + j*(389)
+-238 + j*(86)
+-356 + j*(-254)
+-293 + j*(-133)
+287 + j*(380)
+527 + j*(33)
+497 + j*(-288)
+432 + j*(-242)
+409 + j*(-207)
+28 + j*(-156)
+-240 + j*(181)
+-320 + j*(-711)
+-104 + j*(-373)
+341 + j*(-32)
+-406 + j*(-363)
+155 + j*(57)
+-262 + j*(190)
+210 + j*(742)
+65 + j*(-220)
+-291 + j*(-206)
+-197 + j*(352)
+-100 + j*(-406)
+356 + j*(320)
+-412 + j*(217)
+-3 + j*(602)
+382 + j*(-284)
+-122 + j*(93)
+-682 + j*(-298)
+276 + j*(62)
+-551 + j*(75)
+607 + j*(474)
+26 + j*(235)
+252 + j*(-453)
+-262 + j*(-438)
+-40 + j*(-168)
+-53 + j*(71)
+192 + j*(431)
+435 + j*(-244)
+380 + j*(358)
+-403 + j*(-416)
+-105 + j*(-338)
+58 + j*(-154)
+-199 + j*(-422)
+-193 + j*(391)
+281 + j*(-103)
+298 + j*(-147)
+426 + j*(-414)
+398 + j*(100)
+165 + j*(140)
+126 + j*(-89)
+122 + j*(300)
+-155 + j*(-434)
+-440 + j*(69)
+391 + j*(-152)
+-307 + j*(-64)
+285 + j*(-441)
+-154 + j*(-491)
+-419 + j*(-529)
+-31 + j*(-330)
+60 + j*(81)
+-173 + j*(132)
+488 + j*(338)
+-42 + j*(-450)
+-159 + j*(-192)
+-74 + j*(-560)
+235 + j*(-305)
+-415 + j*(-184)
+-165 + j*(-223)
+158 + j*(383)
+27 + j*(-197)
+-255 + j*(-47)
+438 + j*(315)
+138 + j*(-294)
+-40 + j*(-127)
+337 + j*(-310)
+257 + j*(239)
+25 + j*(385)
+-507 + j*(55)
+-337 + j*(185)
+355 + j*(501)
+-223 + j*(258)
+161 + j*(-298)
+-408 + j*(-71)
+-342 + j*(351)
+256 + j*(-382)
+-455 + j*(194)
+-324 + j*(457)
+-124 + j*(509)
+-184 + j*(209)
+51 + j*(-226)
+-337 + j*(-282)
+-38 + j*(-43)
+95 + j*(110)
+163 + j*(-158)
+-318 + j*(-346)
+160 + j*(321)
+-257 + j*(310)
+305 + j*(-486)
+258 + j*(214)
+-281 + j*(-214)
+293 + j*(9)
+-225 + j*(-240)
+207 + j*(-445)
+-308 + j*(185)
+-59 + j*(-70)
+-493 + j*(-380)
+655 + j*(-197)
+-268 + j*(-100)
+315 + j*(-30)
+382 + j*(-180)
+45 + j*(-370)
+396 + j*(391)
+-488 + j*(-400)
+-333 + j*(-64)
+-162 + j*(456)
+-315 + j*(-665)
+229 + j*(205)
+-97 + j*(441)
+278 + j*(227)
+-42 + j*(-278)
+-182 + j*(413)
+286 + j*(69)
+-286 + j*(530)
+86 + j*(326)
+196 + j*(257)
+-218 + j*(161)
+444 + j*(-151)
+-243 + j*(11)
+-325 + j*(329)
+648 + j*(55)
+546 + j*(632)
+-120 + j*(370)
+127 + j*(-274)
+341 + j*(356)
+605 + j*(-571)
+129 + j*(441)
+-491 + j*(-367)
+427 + j*(-232)
+-573 + j*(33)
+99 + j*(240)
+-359 + j*(-138)
+229 + j*(165)
+309 + j*(119)
+242 + j*(284)
+-192 + j*(27)
+621 + j*(-439)
+-198 + j*(181)
+-245 + j*(275)
+-130 + j*(-330)
+286 + j*(187)
+295 + j*(-190)
+665 + j*(218)
+266 + j*(-188)
+-49 + j*(-291)
+-264 + j*(-29)
+156 + j*(-284)
+106 + j*(200)
+342 + j*(250)
+456 + j*(8)
+-72 + j*(-268)
+132 + j*(385)
+190 + j*(-104)
+125 + j*(-565)
+233 + j*(103)
+260 + j*(9)
+6 + j*(-413)
+358 + j*(-296)
+-222 + j*(-221)
+-90 + j*(335)
+361 + j*(-165)
+440 + j*(344)
+-477 + j*(81)
+-384 + j*(-272)
+366 + j*(144)
+482 + j*(268)
+368 + j*(-361)
+270 + j*(-76)
+238 + j*(-549)
+-412 + j*(-489)
+-165 + j*(28)
+-234 + j*(303)
+53 + j*(263)
+-335 + j*(463)
+435 + j*(-43)
+402 + j*(-403)
+573 + j*(438)
+-498 + j*(-515)
+-197 + j*(243)
+456 + j*(28)
+-546 + j*(409)
+-193 + j*(-208)
+66 + j*(417)
+-84 + j*(330)
+-218 + j*(-150)
+378 + j*(202)
+177 + j*(-46)
+472 + j*(106)
+-259 + j*(-188)
+291 + j*(-82)
+251 + j*(423)
+187 + j*(-513)
+385 + j*(206)
+-281 + j*(-349)
+105 + j*(202)
+-230 + j*(448)
+-470 + j*(-348)
+13 + j*(-522)
+-318 + j*(-141)
+-642 + j*(-298)
+82 + j*(-451)
+-448 + j*(419)
+349 + j*(435)
+-437 + j*(618)
+-74 + j*(-261)
+207 + j*(-99)
+-386 + j*(292)
+290 + j*(-264)
+431 + j*(-342)
+346 + j*(-221)
+240 + j*(151)
+-209 + j*(-525)
+-188 + j*(-429)
+-590 + j*(-514)
+409 + j*(-223)
+-315 + j*(285)
+-521 + j*(-451)
+202 + j*(458)
+-221 + j*(-139)
+236 + j*(378)
+-672 + j*(421)
+1 + j*(315)
+-83 + j*(-494)
+-306 + j*(396)
+185 + j*(-515)
+-528 + j*(120)
+-441 + j*(96)
+-17 + j*(-30)
+213 + j*(271)
+631 + j*(-5)
+364 + j*(26)
+289 + j*(-235)
+-78 + j*(269)
+-317 + j*(-59)
+-365 + j*(-119)
+-433 + j*(439)
+524 + j*(208)
+-506 + j*(479)
+144 + j*(-102)
+218 + j*(486)
+166 + j*(308)
+340 + j*(-202)
+195 + j*(376)
+-243 + j*(18)
+666 + j*(-218)
+-438 + j*(-264)
+-342 + j*(328)
+-4 + j*(-325)
+266 + j*(344)
+-282 + j*(80)
+-177 + j*(581)
+-470 + j*(-49)
+173 + j*(-510)
+-232 + j*(204)
+192 + j*(-291)
+-95 + j*(-459)
+-422 + j*(420)
+-381 + j*(442)
+-5 + j*(-301)
+23 + j*(-64)
+-246 + j*(-320)
+86 + j*(22)
+227 + j*(153)
+523 + j*(-78)
+-17 + j*(234)
+152 + j*(221)
+361 + j*(127)
+477 + j*(-136)
+-260 + j*(-223)
+-452 + j*(-424)
+-38 + j*(316)
+7 + j*(41)
+314 + j*(-93)
+-199 + j*(-49)
+373 + j*(27)
+138 + j*(-133)
+670 + j*(440)
+279 + j*(-281)
+651 + j*(-272)
+-327 + j*(352)
+-197 + j*(-193)
+50 + j*(-195)
+-464 + j*(169)
+91 + j*(299)
+-268 + j*(-354)
+-175 + j*(243)
+209 + j*(-299)
+246 + j*(-74)
+-211 + j*(32)
+-590 + j*(-237)
+-349 + j*(-13)
+493 + j*(91)
+163 + j*(-473)
+-229 + j*(-415)
+341 + j*(-74)
+-523 + j*(-462)
+233 + j*(354)
+476 + j*(-384)
+-311 + j*(429)
+-110 + j*(129)
+316 + j*(-384)
+-472 + j*(187)
+276 + j*(-151)
+-118 + j*(-93)
+290 + j*(212)
+427 + j*(168)
+-263 + j*(495)
+173 + j*(170)
+-376 + j*(113)
+-264 + j*(252)
+-285 + j*(-351)
+477 + j*(-281)
+-305 + j*(39)
+-271 + j*(75)
+-76 + j*(113)
+-59 + j*(45)
+64 + j*(-188)
+131 + j*(244)
+23 + j*(242)
+6 + j*(-276)
+34 + j*(-119)
+-132 + j*(123)
+158 + j*(-139)
+-154 + j*(-136)
+-228 + j*(-295)
+-5 + j*(-81)
+-198 + j*(-13)
+-163 + j*(-329)
+123 + j*(-270)
+-20 + j*(-197)
+-28 + j*(-51)
+145 + j*(-162)
+157 + j*(24)
+-126 + j*(54)
+371 + j*(-254)
+-260 + j*(-204)
+-182 + j*(-146)
+156 + j*(264)
+168 + j*(-101)
+11 + j*(-81)
+-284 + j*(-288)
+-79 + j*(-81)
+76 + j*(137)
+-160 + j*(-287)
+165 + j*(-95)
+83 + j*(7)
+83 + j*(-138)
+-11 + j*(134)
+-58 + j*(281)
+11 + j*(-214)
+-231 + j*(-128)
+124 + j*(-11)
+-13 + j*(-123)
+-122 + j*(154)
+286 + j*(-387)
+-153 + j*(59)
+-168 + j*(-157)
+-93 + j*(204)
+143 + j*(237)
+164 + j*(47)
+-13 + j*(170)
+-236 + j*(-96)
+57 + j*(395)
+71 + j*(-207)
+-18 + j*(-145)
+-165 + j*(-25)
+-185 + j*(-54)
+144 + j*(6)
+-3 + j*(202)
+-39 + j*(137)
+75 + j*(64)
+65 + j*(-144)
+57 + j*(-88)
+130 + j*(-175)
+86 + j*(268)
+-220 + j*(99)
+-303 + j*(-27)
+-86 + j*(-230)
+0 + j*(-168)
+-86 + j*(-19)
+-112 + j*(-159)
+-46 + j*(-31)
+-248 + j*(334)
+47 + j*(23)
+109 + j*(130)
+-86 + j*(-11)
+48 + j*(-79)
+-115 + j*(35)
+-107 + j*(139)
+-181 + j*(244)
+33 + j*(-192)
+72 + j*(235)
+13 + j*(-37)
+-188 + j*(-218)
+-122 + j*(139)
+83 + j*(211)
+11 + j*(-64)
+-1 + j*(80)
+6 + j*(296)
+-327 + j*(32)
+51 + j*(-163)
+5 + j*(-147)
+89 + j*(-125)
+72 + j*(-122)
+163 + j*(119)
+45 + j*(-27)
+-14 + j*(194)
+67 + j*(35)
+-115 + j*(138)
+-69 + j*(352)
+-124 + j*(264)
+358 + j*(-136)
+16 + j*(-250)
+-62 + j*(148)
+-21 + j*(-112)
+100 + j*(-281)
+-192 + j*(256)
+-50 + j*(113)
+83 + j*(-140)
+-53 + j*(-184)
+26 + j*(226)
+-146 + j*(-12)
+59 + j*(323)
+92 + j*(-313)
+74 + j*(182)
+-87 + j*(371)
+-54 + j*(388)
+102 + j*(-137)
+-317 + j*(235)
+113 + j*(-13)
+-125 + j*(-184)
+-296 + j*(-134)
+-24 + j*(-75)
+211 + j*(-616)
+-286 + j*(-27)
+153 + j*(129)
+-287 + j*(221)
+139 + j*(-23)
+211 + j*(-58)
+34 + j*(-3)
+68 + j*(58)
+-232 + j*(52)
+-57 + j*(-89)
+30 + j*(-63)
+412 + j*(81)
+44 + j*(65)
+-155 + j*(248)
+-379 + j*(57)
+226 + j*(-62)
+40 + j*(-147)
+50 + j*(-100)
+223 + j*(-29)
+-38 + j*(-45)
+-107 + j*(103)
+-33 + j*(-237)
+-35 + j*(5)
+49 + j*(-75)
+230 + j*(-153)
+36 + j*(-48)
+-76 + j*(64)
+17 + j*(-260)
+-31 + j*(134)
+-52 + j*(-53)
+-49 + j*(-129)
+-400 + j*(531)
+103 + j*(29)
+-274 + j*(317)
+-204 + j*(297)
+33 + j*(2)
+-34 + j*(27)
+-18 + j*(-21)
+118 + j*(49)
+-165 + j*(-112)
+20 + j*(48)
+112 + j*(-151)
+-61 + j*(-64)
+-165 + j*(-1)
+-86 + j*(205)
+-132 + j*(-49)
+227 + j*(115)
+-112 + j*(-151)
+-229 + j*(208)
+-18 + j*(288)
+-11 + j*(-17)
+-87 + j*(-221)
+59 + j*(-103)
+178 + j*(34)
+-68 + j*(78)
+-331 + j*(236)
+-50 + j*(202)
+-406 + j*(300)
+168 + j*(360)
+66 + j*(135)
+210 + j*(-129)
+261 + j*(-44)
+-182 + j*(100)
+-231 + j*(-123)
+-11 + j*(49)
+-225 + j*(-245)
+299 + j*(-52)
+57 + j*(-13)
+-121 + j*(342)
+-224 + j*(191)
+13 + j*(-150)
+-9 + j*(-26)
+146 + j*(-146)
+192 + j*(-49)
+-19 + j*(-104)
+92 + j*(-254)
+214 + j*(-313)
+-219 + j*(19)
+-65 + j*(-359)
+-255 + j*(-38)
+65 + j*(177)
+-96 + j*(-128)
+-78 + j*(6)
+16 + j*(-17)
+-260 + j*(-66)
+-95 + j*(-110)
+193 + j*(87)
+77 + j*(-107)
+-19 + j*(-52)
+-70 + j*(-187)
+547 + j*(262)
+-59 + j*(-39)
+126 + j*(46)
+-47 + j*(-180)
+18 + j*(-137)
+18 + j*(-50)
+110 + j*(354)
+273 + j*(18)
+-44 + j*(-349)
+97 + j*(-141)
+112 + j*(173)
+42 + j*(204)
+-33 + j*(-132)
+157 + j*(-131)
+62 + j*(-146)
+84 + j*(-30)
+-169 + j*(163)
+90 + j*(-85)
+-211 + j*(215)
+-147 + j*(-100)
+-325 + j*(17)
+11 + j*(132)
+-309 + j*(99)
+-291 + j*(-136)
+183 + j*(32)
+25 + j*(-317)
+-243 + j*(-312)
+115 + j*(129)
+-78 + j*(79)
+249 + j*(-482)
+160 + j*(-260)
+-12 + j*(130)
+-395 + j*(1)
+330 + j*(-161)
+21 + j*(9)
+-133 + j*(-103)
+361 + j*(-362)
+222 + j*(204)
+-265 + j*(88)
+-35 + j*(197)
+-187 + j*(123)
+-22 + j*(101)
+-37 + j*(12)
+-42 + j*(-145)
+112 + j*(-66)
+-208 + j*(-199)
+-221 + j*(181)
+2 + j*(-8)
+-106 + j*(-108)
+238 + j*(28)
+113 + j*(-265)
+-43 + j*(-2)
+-194 + j*(151)
+485 + j*(0)
+-87 + j*(-110)
+-52 + j*(-28)
+-11 + j*(144)
+63 + j*(-206)
+75 + j*(292)
+-385 + j*(157)
+-62 + j*(223)
+-265 + j*(-31)
+153 + j*(-35)
+-298 + j*(-184)
+78 + j*(26)
+-50 + j*(192)
+42 + j*(150)
+27 + j*(-25)
+310 + j*(175)
+48 + j*(-118)
+100 + j*(55)
+120 + j*(175)
+327 + j*(-191)
+65 + j*(-161)
+-13 + j*(94)
+60 + j*(62)
+-109 + j*(-181)
+-36 + j*(-14)
+-128 + j*(-132)
+-124 + j*(-5)
+88 + j*(-116)
+233 + j*(-172)
+124 + j*(-318)
+93 + j*(-222)
+-46 + j*(-119)
+25 + j*(115)
+-62 + j*(-232)
+182 + j*(-144)
+115 + j*(-137)
+209 + j*(-123)
+-194 + j*(156)
+141 + j*(-25)
+54 + j*(-33)
+228 + j*(151)
+161 + j*(-208)
+-235 + j*(-128)
+77 + j*(433)
+-103 + j*(186)
+-173 + j*(105)
+-28 + j*(-249)
+199 + j*(255)
+-308 + j*(-40)
+72 + j*(-93)
+-238 + j*(-285)
+549 + j*(58)
+-267 + j*(-106)
+-11 + j*(-100)
+95 + j*(41)
+112 + j*(185)
+17 + j*(-157)
+-20 + j*(163)
+-278 + j*(8)
+-92 + j*(-59)
+-197 + j*(37)
+-441 + j*(-72)
+-11 + j*(68)
+4 + j*(-237)
+166 + j*(-2)
+15 + j*(-119)
+-309 + j*(-29)
+-144 + j*(-14)
+-230 + j*(-114)
+-5 + j*(151)
+-181 + j*(-371)
+18 + j*(-228)
+163 + j*(-178)
+13 + j*(248)
+-243 + j*(-315)
+-116 + j*(101)
+146 + j*(206)
+88 + j*(60)
+111 + j*(-144)
+0 + j*(281)
+10 + j*(-163)
+-59 + j*(127)
+517 + j*(11)
+73 + j*(35)
+172 + j*(12)
+47 + j*(4)
+-83 + j*(-124)
+53 + j*(50)
+-148 + j*(-124)
+-141 + j*(238)
+-54 + j*(41)
+-139 + j*(-158)
+-196 + j*(374)
+-301 + j*(265)
+-39 + j*(2)
+97 + j*(-139)
+-106 + j*(133)
+-305 + j*(62)
+114 + j*(90)
+-55 + j*(-114)
+-122 + j*(-102)
+8 + j*(-168)
+-252 + j*(-70)
+-70 + j*(42)
+-141 + j*(-4)
+-69 + j*(226)
+56 + j*(244)
+49 + j*(2)
+-57 + j*(57)
+-194 + j*(122)
+-329 + j*(-75)
+167 + j*(-91)
+-197 + j*(279)
+117 + j*(-48)
+30 + j*(-26)
+-132 + j*(159)
+332 + j*(76)
+36 + j*(230)
+-37 + j*(-238)
+-40 + j*(-260)
+151 + j*(91)
+-77 + j*(60)
+98 + j*(27)
+251 + j*(-101)
+-18 + j*(120)
+-93 + j*(-235)
+-76 + j*(8)
+404 + j*(191)
+-8 + j*(-64)
+30 + j*(58)
+-175 + j*(281)
+-102 + j*(-7)
+-254 + j*(144)
+-15 + j*(13)
+393 + j*(-165)
+-185 + j*(-293)
+-86 + j*(59)
+-87 + j*(-224)
+-60 + j*(-87)
+177 + j*(-240)
+455 + j*(64)
+78 + j*(-25)
+41 + j*(-100)
+-71 + j*(-47)
+8 + j*(138)
+18 + j*(-21)
+-141 + j*(195)
+127 + j*(185)
+-158 + j*(-86)
+-62 + j*(5)
+206 + j*(103)
+156 + j*(-23)
+46 + j*(0)
+83 + j*(119)
+-12 + j*(-33)
+-260 + j*(-20)
+-59 + j*(-342)
+159 + j*(52)
+112 + j*(228)
+137 + j*(212)
+-153 + j*(-200)
+-134 + j*(-71)
+262 + j*(312)
+-369 + j*(-21)
+129 + j*(-147)
+-73 + j*(-161)
+-117 + j*(110)
+110 + j*(113)
+-8 + j*(49)
+52 + j*(296)
+-158 + j*(-57)
+-72 + j*(94)
+-134 + j*(-95)
+41 + j*(-303)
+177 + j*(-135)
+-338 + j*(182)
+-182 + j*(33)
+-183 + j*(97)
+144 + j*(-33)
+-47 + j*(-262)
+139 + j*(95)
+-286 + j*(88)
+318 + j*(-64)
+119 + j*(252)
+-46 + j*(-5)
+372 + j*(201)
+-144 + j*(103)
+-52 + j*(165)
+59 + j*(214)
+232 + j*(-100)
+-237 + j*(85)
+-396 + j*(-92)
+-230 + j*(126)
+-81 + j*(-54)
+205 + j*(71)
+-80 + j*(-67)
+322 + j*(-10)
+-101 + j*(-81)
+-22 + j*(110)
+280 + j*(-179)
+26 + j*(-250)
+49 + j*(143)
+-253 + j*(16)
+-140 + j*(70)
+238 + j*(177)
+165 + j*(27)
+-12 + j*(233)
+281 + j*(147)
+49 + j*(-413)
+190 + j*(-138)
+-115 + j*(280)
+184 + j*(-147)
+174 + j*(4)
+-112 + j*(56)
+-163 + j*(-38)
+-260 + j*(201)
+257 + j*(-362)
+344 + j*(141)
+-185 + j*(-252)
+257 + j*(135)
+-119 + j*(-91)
+-13 + j*(-37)
+133 + j*(21)
+72 + j*(58)
+71 + j*(368)
+276 + j*(279)
+-87 + j*(293)
+46 + j*(-38)
+-127 + j*(-140)
+-55 + j*(40)
+180 + j*(-16)
+-54 + j*(267)
+59 + j*(213)
+24 + j*(-54)
+-160 + j*(-71)
+-115 + j*(-206)
+0 + j*(-27)
+30 + j*(63)
+175 + j*(48)
+250 + j*(107)
+141 + j*(-119)
+-46 + j*(-228)
+141 + j*(55)
+-11 + j*(-161)
+71 + j*(-49)
+132 + j*(-453)
+-171 + j*(134)
+-240 + j*(-64)
+-238 + j*(-89)
+215 + j*(143)
+95 + j*(-177)
+-115 + j*(12)
+-98 + j*(-80)
+168 + j*(-66)
+83 + j*(33)
+-310 + j*(256)
+108 + j*(-310)
+206 + j*(83)
+103 + j*(61)
+-42 + j*(-98)
+117 + j*(-24)
+12 + j*(66)
+-107 + j*(-325)
+-97 + j*(-29)
+279 + j*(-264)
+-112 + j*(-161)
+-330 + j*(88)
+-315 + j*(-161)
+-74 + j*(-153)
+102 + j*(235)
+-49 + j*(358)
+298 + j*(-292)
+170 + j*(292)
+139 + j*(254)
+-199 + j*(-175)
+238 + j*(181)
+-100 + j*(77)
+-125 + j*(382)
+69 + j*(40)
+-155 + j*(-226)
+-220 + j*(-99)
+-39 + j*(-467)
+-185 + j*(-52)
+-100 + j*(-15)
+-55 + j*(84)
+80 + j*(278)
+52 + j*(-245)
+-37 + j*(-181)
+194 + j*(358)
+180 + j*(25)
+215 + j*(-21)
+-254 + j*(128)
+208 + j*(43)
+148 + j*(-43)
+80 + j*(168)
+168 + j*(-79)
+-107 + j*(-41)
+98 + j*(250)
+-51 + j*(-281)
+81 + j*(-32)
+-45 + j*(-207)
+95 + j*(31)
+29 + j*(60)
+-104 + j*(-112)
+16 + j*(175)
+64 + j*(-142)
+-16 + j*(-264)
+90 + j*(-200)
+106 + j*(-193)
+-76 + j*(-26)
+-81 + j*(226)
+4 + j*(-62)
+-105 + j*(-92)
+-64 + j*(-13)
+-118 + j*(-20)
+-76 + j*(-79)
+153 + j*(52)
+-29 + j*(216)
+-237 + j*(305)
+-57 + j*(43)
+251 + j*(-64)
+65 + j*(-22)
+-66 + j*(-105)
+-46 + j*(30)
+-124 + j*(-200)
+186 + j*(108)
+-303 + j*(98)
+127 + j*(-165)
+35 + j*(-56)
+-58 + j*(30)
+150 + j*(155)
+-151 + j*(-247)
+-194 + j*(-41)
+-150 + j*(6)
+-230 + j*(92)
+-91 + j*(37)
+219 + j*(-158)
+-185 + j*(44)
+97 + j*(-40)
+-209 + j*(43)
+-160 + j*(44)
+111 + j*(-115)
+-206 + j*(2)
+-380 + j*(-145)
+-291 + j*(185)
+-16 + j*(211)
+65 + j*(73)
+-13 + j*(137)
+14 + j*(68)
+19 + j*(24)
+-10 + j*(235)
+21 + j*(-56)
+36 + j*(-182)
+-54 + j*(25)
+209 + j*(-83)
+-146 + j*(305)
+138 + j*(-47)
+-152 + j*(-73)
+218 + j*(23)
+56 + j*(-35)
+267 + j*(17)
+214 + j*(-84)
+-240 + j*(309)
+98 + j*(45)
+211 + j*(-54)
+133 + j*(-213)
+1 + j*(87)
+-165 + j*(78)
+-58 + j*(-218)
+10 + j*(-103)
+-237 + j*(82)
+-180 + j*(17)
+-169 + j*(-69)
+-100 + j*(-223)
+339 + j*(34)
+288 + j*(-133)
+-148 + j*(-80)
+124 + j*(-6)
+278 + j*(115)
+88 + j*(39)
+-99 + j*(-206)
+54 + j*(198)
+-30 + j*(92)
+-75 + j*(-107)
+237 + j*(185)
+-15 + j*(-160)
+141 + j*(182)
+129 + j*(169)
+72 + j*(9)
+-214 + j*(236)
+133 + j*(21)
+-25 + j*(74)
+-122 + j*(-70)
+-260 + j*(163)
+-24 + j*(-200)
+-235 + j*(45)
+185 + j*(207)
+-279 + j*(54)
+-241 + j*(-18)
+-153 + j*(-87)
+-255 + j*(40)
+-113 + j*(-238)
+369 + j*(24)
+218 + j*(57)
+205 + j*(637)
+19 + j*(61)
+66 + j*(25)
+-217 + j*(-431)
+62 + j*(208)
+269 + j*(-142)
+16 + j*(122)
+56 + j*(-24)
+-279 + j*(-170)
+-141 + j*(233)
+339 + j*(-234)
+-99 + j*(-257)
+-145 + j*(263)
+57 + j*(-175)
+36 + j*(250)
+-94 + j*(-114)
+-196 + j*(13)
+57 + j*(242)
+18 + j*(216)
+-37 + j*(291)
+264 + j*(-162)
+-219 + j*(178)
+349 + j*(211)
+204 + j*(-43)
+21 + j*(93)
+21 + j*(-221)
+41 + j*(-16)
+-98 + j*(-230)
+-264 + j*(-47)
+126 + j*(-108)
+268 + j*(-69)
+41 + j*(65)
+76 + j*(301)
+-84 + j*(-194)
+-156 + j*(-68)
+-6 + j*(-103)
+-9 + j*(-292)
+-274 + j*(-38)
+-128 + j*(-166)
+57 + j*(127)
+-155 + j*(-173)
+-35 + j*(-301)
+-120 + j*(390)
+-71 + j*(-32)
+-16 + j*(-83)
+-28 + j*(-132)
+146 + j*(-89)
+-233 + j*(134)
+-136 + j*(-153)
+-62 + j*(-111)
+0 + j*(-173)
+240 + j*(314)
+-331 + j*(-113)
+215 + j*(99)
+-129 + j*(92)
+81 + j*(183)
+103 + j*(-28)
+-305 + j*(25)
+64 + j*(165)
+31 + j*(-141)
+503 + j*(144)
+-18 + j*(-52)
+-139 + j*(9)
+-247 + j*(102)
+-14 + j*(-35)
+139 + j*(-177)
+-218 + j*(1)
+-123 + j*(-48)
+-13 + j*(152)
+164 + j*(342)
+-188 + j*(-28)
+102 + j*(-18)
+-275 + j*(-183)
+-140 + j*(105)
+-89 + j*(-166)
+150 + j*(-127)
+153 + j*(202)
+-160 + j*(98)
+-30 + j*(-16)
+136 + j*(36)
+164 + j*(165)
+-61 + j*(-130)
+232 + j*(-411)
+-65 + j*(129)
+184 + j*(-213)
+-237 + j*(134)
+-322 + j*(240)
+-18 + j*(45)
+52 + j*(-71)
+202 + j*(-8)
+-103 + j*(-185)
+-91 + j*(56)
+-245 + j*(-260)
+-168 + j*(260)
+-35 + j*(30)
+57 + j*(-226)
+57 + j*(49)
+199 + j*(-151)
+43 + j*(28)
+-358 + j*(64)
+-94 + j*(-109)
+270 + j*(-82)
+132 + j*(7)
+206 + j*(10)
+506 + j*(-12)
+-49 + j*(-83)
+-315 + j*(-318)
+-15 + j*(277)
+-157 + j*(-344)
+379 + j*(221)
+377 + j*(59)
+308 + j*(-408)
+-211 + j*(228)
+16 + j*(-142)
+-260 + j*(-234)
+-285 + j*(-187)
+272 + j*(170)
+-99 + j*(209)
+-125 + j*(86)
+-326 + j*(-369)
+-164 + j*(-24)
+-109 + j*(388)
+-103 + j*(-238)
+-169 + j*(-40)
+10 + j*(-123)
+190 + j*(-354)
+-339 + j*(141)
+176 + j*(-11)
+-105 + j*(4)
+-83 + j*(-327)
+-14 + j*(-84)
+86 + j*(65)
+206 + j*(100)
+279 + j*(-349)
+-328 + j*(191)
+21 + j*(-1)
+77 + j*(174)
+49 + j*(-45)
+32 + j*(-206)
+-141 + j*(75)
+-64 + j*(33)
+174 + j*(88)
+328 + j*(-105)
+222 + j*(400)
+-209 + j*(493)
+-165 + j*(-93)
+-6 + j*(126)
+30 + j*(-97)
+-117 + j*(-136)
+-81 + j*(-33)
+12 + j*(2)
+261 + j*(93)
+11 + j*(-62)
+10 + j*(98)
+-125 + j*(-16)
+141 + j*(226)
+182 + j*(-117)
+94 + j*(283)
+-136 + j*(-20)
+455 + j*(-54)
+-87 + j*(75)
+-151 + j*(226)
+-253 + j*(54)
+-8 + j*(-204)
+-62 + j*(-136)
+-182 + j*(148)
+-16 + j*(74)
+-17 + j*(-224)
+-67 + j*(-27)
+138 + j*(30)
+81 + j*(71)
+-7 + j*(-83)
+127 + j*(98)
+22 + j*(-260)
+312 + j*(-258)
+-189 + j*(31)
+159 + j*(158)
+240 + j*(-91)
+-32 + j*(-305)
+78 + j*(26)
+48 + j*(242)
+-66 + j*(117)
+176 + j*(-287)
+-78 + j*(0)
+300 + j*(119)
+128 + j*(-288)
+22 + j*(161)
+373 + j*(192)
+272 + j*(70)
+-50 + j*(84)
+3 + j*(54)
+26 + j*(86)
+49 + j*(182)
+46 + j*(-55)
+-124 + j*(188)
+-196 + j*(277)
+37 + j*(26)
+-77 + j*(-10)
+130 + j*(-244)
+-35 + j*(421)
+9 + j*(219)
+177 + j*(49)
+48 + j*(-383)
+-43 + j*(141)
+-102 + j*(76)
+132 + j*(47)
+-154 + j*(56)
+-26 + j*(-116)
+-93 + j*(30)
+-99 + j*(-182)
+-301 + j*(-375)
+47 + j*(-53)
+196 + j*(-124)
+-271 + j*(-64)
+-61 + j*(-177)
+-325 + j*(-323)
+8 + j*(147)
+32 + j*(67)
+-158 + j*(-103)
+97 + j*(-142)
+193 + j*(-113)
+168 + j*(-134)
+12 + j*(122)
+-45 + j*(172)
+153 + j*(59)
+271 + j*(-115)
+296 + j*(-90)
+-117 + j*(-60)
+-380 + j*(-109)
+-173 + j*(-264)
+25 + j*(-51)
+484 + j*(32)
+-175 + j*(52)
+-358 + j*(212)
+81 + j*(-68)
+10 + j*(128)
+-103 + j*(-35)
+44 + j*(351)
+202 + j*(36)
+-97 + j*(279)
+87 + j*(103)
+-70 + j*(27)
+133 + j*(235)
+109 + j*(199)
+146 + j*(88)
+-90 + j*(-188)
+-433 + j*(-84)
+-101 + j*(-179)
+202 + j*(-115)
+209 + j*(-90)
+28 + j*(103)
+-146 + j*(168)
+128 + j*(134)
+273 + j*(158)
+-272 + j*(169)
+-179 + j*(-197)
+-387 + j*(-228)
+-86 + j*(-306)
+161 + j*(-260)
+-61 + j*(-40)
+-128 + j*(-26)
+-1 + j*(188)
+133 + j*(-36)
+-50 + j*(41)
+-20 + j*(-163)
+163 + j*(68)
+134 + j*(183)
+-278 + j*(-277)
+168 + j*(294)
+-473 + j*(-18)
+25 + j*(364)
+61 + j*(-151)
+83 + j*(59)
+45 + j*(-225)
+76 + j*(105)
+162 + j*(-346)
+101 + j*(94)
+-37 + j*(-292)
+-23 + j*(-143)
+170 + j*(49)
+-14 + j*(-16)
+22 + j*(71)
+-111 + j*(-79)
+188 + j*(-58)
+-122 + j*(-239)
+252 + j*(161)
+-45 + j*(-11)
+25 + j*(-204)
+279 + j*(-64)
+-137 + j*(-185)
+-114 + j*(23)
+133 + j*(185)
+188 + j*(212)
+-41 + j*(51)
+141 + j*(-110)
+-96 + j*(-378)
+58 + j*(-146)
+152 + j*(-47)
+35 + j*(30)
+144 + j*(-59)
+-202 + j*(64)
+-265 + j*(-29)
+69 + j*(-327)
+-15 + j*(54)
+13 + j*(-119)
+-33 + j*(273)
+-203 + j*(81)
+-108 + j*(275)
+-109 + j*(119)
+-165 + j*(-93)
+-108 + j*(309)
+-100 + j*(-303)
+269 + j*(-175)
+-293 + j*(95)
+-129 + j*(183)
+187 + j*(-76)
+317 + j*(-244)
+131 + j*(30)
+-293 + j*(-280)
+-96 + j*(170)
+11 + j*(219)
+-88 + j*(-159)
+-386 + j*(-183)
+-385 + j*(141)
+13 + j*(252)
+-184 + j*(-351)
+473 + j*(213)
+6 + j*(-129)
+13 + j*(216)
+66 + j*(1)
+257 + j*(-221)
+332 + j*(164)
+-60 + j*(74)
+-113 + j*(-6)
+-59 + j*(264)
+-11 + j*(37)
+-74 + j*(263)
+80 + j*(-193)
+-12 + j*(-102)
+74 + j*(-3)
+-25 + j*(-152)
+358 + j*(121)
+134 + j*(69)
+-374 + j*(77)
+323 + j*(-186)
+47 + j*(72)
+-14 + j*(-469)
+-23 + j*(-97)
+-92 + j*(264)
+100 + j*(-27)
+158 + j*(-268)
+32 + j*(55)
+291 + j*(-216)
+-260 + j*(194)
+97 + j*(159)
+-21 + j*(-142)
+-152 + j*(-19)
+-64 + j*(358)
+162 + j*(18)
+-225 + j*(90)
+-127 + j*(234)
+64 + j*(43)
+141 + j*(45)
+-250 + j*(9)
+52 + j*(-197)
+202 + j*(114)
+-103 + j*(90)
+306 + j*(-103)
+385 + j*(21)
+-66 + j*(-288)
+-187 + j*(-74)
+-9 + j*(-46)
+420 + j*(146)
+-13 + j*(166)
+-168 + j*(81)
+-267 + j*(-56)
+98 + j*(-157)
+-362 + j*(155)
+339 + j*(76)
+190 + j*(25)
+-40 + j*(324)
+-40 + j*(135)
+-176 + j*(-10)
+-62 + j*(-112)
+42 + j*(201)
+-52 + j*(-45)
+290 + j*(-97)
+190 + j*(98)
+134 + j*(-165)
+-162 + j*(-31)
+-290 + j*(92)
+-80 + j*(-121)
+-72 + j*(217)
+-151 + j*(-44)
+42 + j*(140)
+185 + j*(-230)
+144 + j*(9)
+188 + j*(107)
+-9 + j*(174)
+32 + j*(-89)
+387 + j*(107)
+185 + j*(232)
+-91 + j*(40)
+-83 + j*(137)
+114 + j*(14)
+180 + j*(12)
+-35 + j*(318)
+-139 + j*(-17)
+-3 + j*(-109)
+163 + j*(-286)
+-211 + j*(-83)
+29 + j*(21)
+401 + j*(-445)
+-81 + j*(-83)
+-98 + j*(-218)
+-121 + j*(-2)
+115 + j*(17)
+78 + j*(-435)
+98 + j*(40)
+304 + j*(139)
+53 + j*(166)
+185 + j*(130)
+-115 + j*(-383)
+-170 + j*(-74)
+-49 + j*(-89)
+7 + j*(77)
+229 + j*(-230)
+91 + j*(-82)
+19 + j*(60)
+-278 + j*(-250)
+-127 + j*(25)
+229 + j*(-180)
+-57 + j*(36)
+-25 + j*(163)
+84 + j*(-128)
+59 + j*(88)
+-171 + j*(-7)
+114 + j*(255)
+35 + j*(109)
+-44 + j*(409)
+-210 + j*(-250)
+-69 + j*(66)
+-121 + j*(48)
+125 + j*(-195)
+107 + j*(55)
+-1 + j*(-103)
+264 + j*(24)
+35 + j*(-345)
+-250 + j*(-409)
+195 + j*(6)
+-60 + j*(-27)
+-64 + j*(147)
+-33 + j*(92)
+-25 + j*(-93)
+-228 + j*(-18)
+-37 + j*(-191)
+78 + j*(-4)
+-69 + j*(-494)
+-152 + j*(261)
+-6 + j*(146)
+-361 + j*(-142)
+-65 + j*(176)
+244 + j*(78)
+-58 + j*(-261)
+-58 + j*(-259)
+-66 + j*(-286)
+-186 + j*(181)
+-257 + j*(-41)
+194 + j*(354)
+47 + j*(93)
+-121 + j*(31)
+136 + j*(-87)
+10 + j*(190)
+-272 + j*(-148)
+-107 + j*(-56)
+115 + j*(-47)
+-53 + j*(-172)
+45 + j*(-48)
+347 + j*(-141)
+66 + j*(-78)
+-156 + j*(122)
+50 + j*(-180)
+217 + j*(-42)
+-210 + j*(-83)
+228 + j*(189)
+583 + j*(-493)
+196 + j*(153)
+40 + j*(-85)
+105 + j*(8)
+-49 + j*(-282)
+164 + j*(-246)
+-35 + j*(-301)
+129 + j*(252)
+-268 + j*(125)
+-144 + j*(116)
+-309 + j*(112)
+40 + j*(-140)
+42 + j*(-145)
+39 + j*(161)
+-340 + j*(243)
+-55 + j*(-122)
+167 + j*(135)
+-185 + j*(122)
+66 + j*(-51)
+200 + j*(46)
+67 + j*(-173)
+-50 + j*(126)
+536 + j*(-277)
+66 + j*(-58)
+-182 + j*(208)
+-59 + j*(-201)
+253 + j*(46)
+-20 + j*(-202)
+66 + j*(269)
+395 + j*(128)
+-171 + j*(263)
+-45 + j*(-102)
+-135 + j*(13)
+-194 + j*(109)
+-115 + j*(313)
+21 + j*(310)
+-22 + j*(-176)
+-59 + j*(-142)
+274 + j*(33)
+50 + j*(-194)
+-39 + j*(210)
+-163 + j*(-13)
+-247 + j*(316)
+163 + j*(-173)
+54 + j*(-386)
+49 + j*(293)
+-6 + j*(286)
+-254 + j*(-59)
+-308 + j*(-129)
+141 + j*(-104)
+-262 + j*(-76)
+-92 + j*(346)
+318 + j*(-88)
+134 + j*(248)
+-27 + j*(-118)
+119 + j*(145)
+-185 + j*(-234)
+-141 + j*(-91)
+-95 + j*(-129)
+151 + j*(-233)
+-91 + j*(-215)
+-105 + j*(-1)
+-32 + j*(-80)
+133 + j*(-57)
+-52 + j*(-29)
+-103 + j*(-84)
+-65 + j*(-89)
+-83 + j*(38)
+-42 + j*(-209)
+-243 + j*(-137)
+-74 + j*(-73)
+-167 + j*(33)
+-197 + j*(-66)
+12 + j*(-21)
+88 + j*(-200)
+129 + j*(108)
+335 + j*(71)
+54 + j*(-274)
+-129 + j*(-361)
+338 + j*(-28)
+35 + j*(-118)
+-44 + j*(-242)
+-66 + j*(-45)
+-290 + j*(-136)
+-23 + j*(180)
+176 + j*(86)
+63 + j*(-119)
+68 + j*(-148)
+-366 + j*(-110)
+138 + j*(86)
+-22 + j*(80)
+72 + j*(28)
+-49 + j*(-218)
+64 + j*(14)
+364 + j*(-48)
+221 + j*(-61)
+212 + j*(175)
+-34 + j*(199)
+-25 + j*(135)
+239 + j*(-129)
+-253 + j*(-223)
+103 + j*(148)
+100 + j*(199)
+331 + j*(103)
+256 + j*(-104)
+194 + j*(78)
+170 + j*(-54)
+-51 + j*(83)
+-112 + j*(288)
+298 + j*(88)
+-196 + j*(-251)
+-5 + j*(33)
+104 + j*(-231)
+-233 + j*(-22)
+115 + j*(-112)
+15 + j*(7)
+147 + j*(-501)
+223 + j*(60)
+-243 + j*(-366)
+-35 + j*(100)
+-64 + j*(-82)
+-236 + j*(-47)
+137 + j*(-5)
+31 + j*(-117)
+401 + j*(436)
+-192 + j*(-45)
+78 + j*(-392)
+-258 + j*(263)
+-303 + j*(-162)
+119 + j*(169)
+211 + j*(58)
+-53 + j*(117)
+-28 + j*(-269)
+107 + j*(-180)
+107 + j*(-92)
+-80 + j*(22)
+356 + j*(127)
+-168 + j*(91)
+-199 + j*(-310)
+-117 + j*(-108)
+-193 + j*(-369)
+60 + j*(156)
+62 + j*(77)
+-21 + j*(-73)
+-219 + j*(-141)
+-418 + j*(11)
+-44 + j*(-158)
+297 + j*(-14)
+183 + j*(285)
+-77 + j*(-115)
+-92 + j*(-203)
+302 + j*(-100)
+234 + j*(-197)
+275 + j*(88)
+57 + j*(-214)
+52 + j*(-255)
+164 + j*(214)
+119 + j*(-187)
+117 + j*(86)
+-3 + j*(340)
+95 + j*(-66)
+32 + j*(-25)
+-200 + j*(105)
+-76 + j*(126)
+91 + j*(37)
+-245 + j*(-36)
+-120 + j*(77)
+120 + j*(-119)
+-99 + j*(-166)
+-4 + j*(137)
+41 + j*(151)
+-182 + j*(35)
+-151 + j*(-89)
+-63 + j*(-212)
+269 + j*(164)
+284 + j*(163)
+123 + j*(87)
+-55 + j*(-116)
+68 + j*(-134)
+-62 + j*(-74)
+57 + j*(100)
+204 + j*(159)
+255 + j*(182)
+40 + j*(-157)
+-81 + j*(118)
+-11 + j*(-113)
+168 + j*(-326)
+158 + j*(8)
+-139 + j*(-2)
+103 + j*(-64)
+54 + j*(606)
+202 + j*(32)
+-240 + j*(-212)
+-236 + j*(-55)
+25 + j*(-208)
+124 + j*(-163)
+127 + j*(-118)
+-194 + j*(50)
+23 + j*(106)
+178 + j*(-280)
+92 + j*(-33)
+-42 + j*(126)
+208 + j*(159)
+-103 + j*(-33)
+247 + j*(70)
+-337 + j*(253)
+-83 + j*(-166)
+-199 + j*(12)
+-92 + j*(542)
+178 + j*(-195)
+-115 + j*(-338)
+146 + j*(82)
+-163 + j*(-86)
+-88 + j*(-90)
+19 + j*(-390)
+-59 + j*(-48)
+81 + j*(165)
+103 + j*(-173)
+47 + j*(-240)
+-453 + j*(-52)
+-102 + j*(234)
+-272 + j*(161)
+81 + j*(-75)
+-143 + j*(-223)
+-126 + j*(-250)
+134 + j*(-209)
+45 + j*(-143)
+-290 + j*(-23)
+-88 + j*(14)
+382 + j*(-177)
+-407 + j*(-16)
+-9 + j*(-69)
+401 + j*(-166)
+127 + j*(-6)
+149 + j*(-99)
+-124 + j*(-21)
+17 + j*(-229)
+-5 + j*(23)
+-173 + j*(34)
+34 + j*(59)
+204 + j*(-1)
+48 + j*(253)
+247 + j*(154)
+-158 + j*(172)
+-81 + j*(340)
+-23 + j*(-86)
+-18 + j*(26)
+6 + j*(-112)
+-252 + j*(-152)
+186 + j*(148)
+-199 + j*(76)
+330 + j*(6)
+13 + j*(-215)
+-279 + j*(-163)
+52 + j*(-40)
+-167 + j*(-231)
+-236 + j*(129)
+78 + j*(-25)
+147 + j*(-44)
+119 + j*(125)
+-149 + j*(-324)
+1 + j*(-77)
+-201 + j*(-49)
+250 + j*(-146)
+15 + j*(-36)
+56 + j*(-78)
+-35 + j*(-8)
+-110 + j*(14)
+170 + j*(-251)
+-460 + j*(-7)
+-32 + j*(-224)
+-18 + j*(86)
+-17 + j*(-165)
+417 + j*(-276)
+-87 + j*(72)
+-205 + j*(-112)
+0 + j*(-154)
+-8 + j*(-245)
+147 + j*(27)
+89 + j*(-115)
+-16 + j*(-88)
+-187 + j*(-146)
+-93 + j*(8)
+-11 + j*(181)
+-159 + j*(4)
+-132 + j*(92)
+-23 + j*(-123)
+223 + j*(69)
+-5 + j*(249)
+-127 + j*(291)
+95 + j*(4)
+59 + j*(228)
+75 + j*(-275)
+-171 + j*(11)
+-136 + j*(-105)
+-198 + j*(204)
+-57 + j*(5)
+3 + j*(-324)
+-538 + j*(-66)
+74 + j*(-358)
+467 + j*(20)
+-421 + j*(-13)
+46 + j*(-384)
+-553 + j*(-285)
+178 + j*(18)
+-197 + j*(97)
+333 + j*(-331)
+-301 + j*(-172)
+50 + j*(-204)
+291 + j*(331)
+-132 + j*(-193)
+-199 + j*(382)
+-44 + j*(-281)
+33 + j*(177)
+18 + j*(624)
+291 + j*(-469)
+-192 + j*(71)
+-414 + j*(254)
+-331 + j*(-499)
+281 + j*(-560)
+-112 + j*(-367)
+-390 + j*(-414)
+274 + j*(-482)
+373 + j*(-433)
+320 + j*(128)
+250 + j*(-570)
+-4 + j*(364)
+345 + j*(329)
+-415 + j*(450)
+384 + j*(-269)
+-269 + j*(337)
+-714 + j*(-90)
+-144 + j*(-327)
+92 + j*(-220)
+-202 + j*(-617)
+368 + j*(187)
+-391 + j*(445)
+-446 + j*(485)
+606 + j*(-561)
+-156 + j*(266)
+346 + j*(262)
+44 + j*(288)
+6 + j*(132)
+199 + j*(107)
+517 + j*(165)
+59 + j*(218)
+371 + j*(-624)
+278 + j*(0)
+-479 + j*(-395)
+390 + j*(-21)
+233 + j*(52)
+-342 + j*(371)
+-434 + j*(473)
+-187 + j*(-260)
+-327 + j*(412)
+-393 + j*(179)
+-523 + j*(-187)
+-343 + j*(-66)
+295 + j*(193)
+132 + j*(-379)
+298 + j*(-465)
+-434 + j*(26)
+-532 + j*(284)
+-207 + j*(-152)
+-286 + j*(412)
+-233 + j*(-143)
+49 + j*(185)
+11 + j*(10)
+-176 + j*(527)
+395 + j*(203)
+-45 + j*(356)
+264 + j*(-517)
+189 + j*(-214)
+325 + j*(-169)
+-23 + j*(114)
+-362 + j*(190)
+-424 + j*(-215)
+442 + j*(496)
+-311 + j*(-489)
+347 + j*(19)
+-66 + j*(-206)
+-299 + j*(-675)
+-133 + j*(-135)
+369 + j*(312)
+-94 + j*(467)
+222 + j*(-23)
+177 + j*(240)
+-163 + j*(-114)
+278 + j*(-13)
+168 + j*(523)
+-314 + j*(127)
+-484 + j*(119)
+298 + j*(522)
+-288 + j*(-101)
+-369 + j*(448)
+62 + j*(138)
+74 + j*(176)
+-442 + j*(-165)
+25 + j*(-23)
+540 + j*(622)
+92 + j*(82)
+-477 + j*(187)
+134 + j*(-74)
+308 + j*(176)
+213 + j*(-274)
+-223 + j*(-270)
+-400 + j*(393)
+544 + j*(-454)
+337 + j*(-287)
+-313 + j*(466)
+304 + j*(397)
+118 + j*(-298)
+-496 + j*(358)
+58 + j*(-314)
+-18 + j*(56)
+-37 + j*(-183)
+85 + j*(-219)
+470 + j*(-586)
+-557 + j*(-581)
+425 + j*(194)
+-148 + j*(-387)
+111 + j*(66)
+433 + j*(412)
+330 + j*(-301)
+284 + j*(-236)
+-71 + j*(156)
+243 + j*(-194)
+323 + j*(692)
+49 + j*(547)
+-98 + j*(232)
+-141 + j*(-212)
+57 + j*(250)
+313 + j*(-370)
+-641 + j*(-368)
+-259 + j*(-291)
+-16 + j*(-18)
+-689 + j*(241)
+-308 + j*(-279)
+392 + j*(-391)
+271 + j*(-156)
+40 + j*(334)
+84 + j*(-208)
+-247 + j*(123)
+122 + j*(-320)
+293 + j*(-576)
+-299 + j*(446)
+-459 + j*(-285)
+-474 + j*(-351)
+119 + j*(129)
+-264 + j*(110)
+-203 + j*(411)
+245 + j*(52)
+215 + j*(-194)
+-147 + j*(333)
+-242 + j*(-580)
+255 + j*(140)
+107 + j*(-214)
+223 + j*(139)
+-246 + j*(-601)
+219 + j*(-79)
+232 + j*(-344)
+250 + j*(-248)
+76 + j*(64)
+380 + j*(-157)
+125 + j*(325)
+-306 + j*(257)
+317 + j*(199)
+-364 + j*(435)
+-135 + j*(-126)
+47 + j*(-95)
+-303 + j*(-332)
+-411 + j*(416)
+-205 + j*(-384)
+341 + j*(-59)
+-47 + j*(-214)
+-64 + j*(-122)
+284 + j*(352)
+-300 + j*(270)
+419 + j*(175)
+201 + j*(-445)
+269 + j*(409)
+381 + j*(225)
+262 + j*(487)
+-52 + j*(-374)
+33 + j*(-332)
+-221 + j*(-178)
+57 + j*(-252)
+-325 + j*(325)
+218 + j*(546)
+-151 + j*(0)
+262 + j*(-284)
+240 + j*(428)
+144 + j*(123)
+254 + j*(-41)
+-361 + j*(365)
+-5 + j*(288)
+392 + j*(-202)
+316 + j*(238)
+296 + j*(165)
+16 + j*(468)
+36 + j*(290)
+-267 + j*(-337)
+119 + j*(396)
+-428 + j*(401)
+-301 + j*(-145)
+288 + j*(-189)
+506 + j*(-230)
+-116 + j*(-116)
+-217 + j*(-225)
+171 + j*(-210)
+444 + j*(-202)
+223 + j*(124)
+-432 + j*(522)
+133 + j*(235)
+-234 + j*(-372)
+-84 + j*(-268)
+-142 + j*(-271)
+189 + j*(148)
+67 + j*(16)
+342 + j*(278)
+355 + j*(319)
+115 + j*(-101)
+631 + j*(-556)
+267 + j*(344)
+-472 + j*(-622)
+-483 + j*(433)
+327 + j*(373)
+-462 + j*(457)
+-331 + j*(139)
+-59 + j*(-136)
+276 + j*(-262)
+-57 + j*(182)
+-319 + j*(168)
+-277 + j*(132)
+351 + j*(-30)
+-111 + j*(260)
+-291 + j*(560)
+425 + j*(622)
+221 + j*(-26)
+121 + j*(54)
+-103 + j*(271)
+-273 + j*(-501)
+608 + j*(-200)
+-373 + j*(-40)
+103 + j*(-91)
+33 + j*(107)
+-253 + j*(302)
+208 + j*(-200)
+-401 + j*(78)
+-143 + j*(-327)
+354 + j*(-397)
+-85 + j*(-421)
+280 + j*(-222)
+320 + j*(-242)
+283 + j*(-122)
+-399 + j*(407)
+-46 + j*(9)
+244 + j*(171)
+462 + j*(-53)
+-617 + j*(-304)
+-309 + j*(115)
+493 + j*(-261)
+-403 + j*(140)
+-300 + j*(86)
+643 + j*(4)
+339 + j*(-296)
+-363 + j*(-57)
+-72 + j*(472)
+199 + j*(-41)
+-198 + j*(212)
+369 + j*(185)
+228 + j*(-564)
+-215 + j*(-262)
+-423 + j*(-37)
+-159 + j*(371)
+-373 + j*(-308)
+-371 + j*(241)
+-204 + j*(-335)
+68 + j*(182)
+-284 + j*(-345)
+-332 + j*(-184)
+418 + j*(255)
+3 + j*(-298)
+437 + j*(219)
+66 + j*(-67)
+98 + j*(-235)
+-384 + j*(288)
+-322 + j*(271)
+-377 + j*(-383)
+517 + j*(-313)
+53 + j*(211)
+356 + j*(158)
+131 + j*(23)
+-161 + j*(-13)
+284 + j*(-383)
+414 + j*(50)
+295 + j*(-61)
+239 + j*(-342)
+289 + j*(-161)
+458 + j*(-262)
+-348 + j*(-588)
+-573 + j*(215)
+266 + j*(463)
+344 + j*(-51)
+4 + j*(383)
+226 + j*(-94)
+306 + j*(-347)
+206 + j*(11)
+347 + j*(151)
+-305 + j*(337)
+433 + j*(302)
+-28 + j*(527)
+-534 + j*(-516)
+248 + j*(206)
+33 + j*(70)
+-18 + j*(-231)
+231 + j*(-226)
+-456 + j*(-378)
+112 + j*(-158)
+-90 + j*(-523)
+52 + j*(-177)
+-156 + j*(-113)
+46 + j*(268)
+22 + j*(422)
+-191 + j*(-325)
+-315 + j*(-511)
+-562 + j*(-180)
+-69 + j*(-325)
+591 + j*(288)
+-554 + j*(337)
+-305 + j*(358)
+-340 + j*(-383)
+-443 + j*(412)
+98 + j*(-349)
+-403 + j*(219)
+401 + j*(-107)
+209 + j*(-242)
+-416 + j*(307)
+470 + j*(-292)
+249 + j*(344)
+84 + j*(520)
+-99 + j*(-9)
+-381 + j*(240)
+52 + j*(-255)
+-315 + j*(228)
+165 + j*(-340)
+-385 + j*(-367)
+378 + j*(11)
+486 + j*(-447)
+574 + j*(-212)
+-550 + j*(-66)
+296 + j*(443)
+-421 + j*(-38)
+-15 + j*(334)
+156 + j*(-60)
+291 + j*(184)
+-148 + j*(-100)
+-99 + j*(294)
+214 + j*(76)
+349 + j*(-234)
+291 + j*(263)
+-121 + j*(-279)
+-119 + j*(-69)
+187 + j*(204)
+340 + j*(-244)
+-297 + j*(244)
+-8 + j*(-47)
+-105 + j*(-7)
+-196 + j*(-63)
+-105 + j*(35)
+405 + j*(69)
+423 + j*(219)
+-462 + j*(-112)
+-197 + j*(-422)
+224 + j*(81)
+-612 + j*(71)
+363 + j*(209)
+133 + j*(-302)
+235 + j*(418)
+-315 + j*(479)
+-166 + j*(-6)
+-97 + j*(140)
+278 + j*(451)
+-301 + j*(212)
+-412 + j*(-291)
+446 + j*(224)
+108 + j*(-417)
+487 + j*(269)
+-527 + j*(156)
+-550 + j*(-249)
+543 + j*(424)
+-126 + j*(57)
+-230 + j*(-80)
+-40 + j*(-153)
+-22 + j*(-342)
+-75 + j*(-334)
+339 + j*(-45)
+-105 + j*(36)
+151 + j*(81)
+-457 + j*(499)
+207 + j*(-512)
+-276 + j*(462)
+-246 + j*(-299)
+-155 + j*(-314)
+-18 + j*(-281)
+233 + j*(-358)
+564 + j*(-344)
+-448 + j*(-518)
+477 + j*(84)
+-371 + j*(-276)
+453 + j*(187)
+-252 + j*(-148)
+459 + j*(370)
+-31 + j*(-509)
+-215 + j*(-175)
+-177 + j*(-291)
+-182 + j*(-204)
+298 + j*(47)
+200 + j*(-255)
+-353 + j*(-530)
+182 + j*(-202)
+-296 + j*(-480)
+370 + j*(-175)
+-250 + j*(-131)
+-74 + j*(-313)
+-115 + j*(-626)
+326 + j*(274)
+-16 + j*(-218)
+-151 + j*(-180)
+-474 + j*(374)
+378 + j*(-107)
+141 + j*(245)
+113 + j*(-241)
+-526 + j*(1)
+-300 + j*(-199)
+550 + j*(-174)
+392 + j*(166)
+110 + j*(-38)
+301 + j*(-351)
+284 + j*(-59)
+223 + j*(-526)
+-282 + j*(608)
+317 + j*(332)
+-503 + j*(-453)
+-366 + j*(518)
+349 + j*(1)
+310 + j*(279)
+-163 + j*(-223)
+-21 + j*(-283)
+443 + j*(-171)
+262 + j*(-201)
+317 + j*(441)
+75 + j*(-129)
+-223 + j*(223)
+296 + j*(91)
+-455 + j*(-91)
+-651 + j*(175)
+359 + j*(-354)
+-51 + j*(512)
+540 + j*(-234)
+-161 + j*(-114)
+349 + j*(-91)
+-20 + j*(290)
+-208 + j*(-203)
+-25 + j*(161)
+-315 + j*(373)
+286 + j*(-8)
+125 + j*(395)
+-95 + j*(53)
+332 + j*(-238)
+-211 + j*(-252)
+-69 + j*(-207)
+-617 + j*(268)
+-103 + j*(356)
+-131 + j*(393)
+-310 + j*(-280)
+-245 + j*(-274)
+-2 + j*(-759)
+-375 + j*(-166)
+-215 + j*(182)
+315 + j*(230)
+-190 + j*(158)
+-446 + j*(333)
+226 + j*(355)
+344 + j*(-258)
+16 + j*(-428)
+-372 + j*(301)
+393 + j*(189)
+293 + j*(-177)
+455 + j*(-136)
+-35 + j*(-170)
+16 + j*(-351)
+-16 + j*(-304)
+-127 + j*(205)
+-550 + j*(-288)
+-10 + j*(-56)
+-173 + j*(-178)
+-307 + j*(164)
+-329 + j*(175)
+-215 + j*(-426)
+397 + j*(211)
+289 + j*(-257)
+-272 + j*(23)
+-107 + j*(-281)
+179 + j*(168)
+26 + j*(-535)
+23 + j*(234)
+302 + j*(392)
+-164 + j*(-396)
+52 + j*(231)
+194 + j*(-21)
+-352 + j*(-203)
+-338 + j*(146)
+-677 + j*(-162)
+-191 + j*(-365)
+-387 + j*(493)
+-414 + j*(242)
+-103 + j*(243)
+-315 + j*(-6)
+-612 + j*(210)
+41 + j*(-360)
+-133 + j*(-148)
+-368 + j*(241)
+54 + j*(-62)
+398 + j*(-445)
+-71 + j*(-591)
+98 + j*(273)
+-729 + j*(338)
+-323 + j*(-267)
+355 + j*(-348)
+163 + j*(510)
+508 + j*(-466)
+-651 + j*(-209)
+189 + j*(168)
+487 + j*(150)
+364 + j*(111)
+267 + j*(-54)
+427 + j*(211)
+-412 + j*(594)
+-238 + j*(-31)
+-233 + j*(328)
+192 + j*(115)
+305 + j*(297)
+484 + j*(436)
+-35 + j*(180)
+-129 + j*(-513)
+-51 + j*(-513)
+-398 + j*(-67)
+162 + j*(373)
+638 + j*(376)
+641 + j*(-561)
+-204 + j*(-426)
+551 + j*(-218)
+-161 + j*(556)
+474 + j*(226)
+-243 + j*(-293)
+16 + j*(-136)
+-474 + j*(-295)
+-490 + j*(-260)
+252 + j*(-169)
+-363 + j*(209)
+-151 + j*(457)
+-361 + j*(-232)
+-168 + j*(460)
+32 + j*(-496)
+-92 + j*(-243)
+-503 + j*(-238)
+367 + j*(148)
+-56 + j*(258)
+-156 + j*(98)
+-250 + j*(-78)
+-107 + j*(-18)
+298 + j*(257)
+-404 + j*(-225)
+-339 + j*(-220)
+-61 + j*(-391)
+-600 + j*(-141)
+304 + j*(-457)
+-280 + j*(146)
+206 + j*(421)
+355 + j*(709)
+153 + j*(225)
+124 + j*(-206)
+373 + j*(-447)
+-442 + j*(88)
+269 + j*(-115)
+-335 + j*(-300)
+-158 + j*(-78)
+-320 + j*(-414)
+491 + j*(-345)
+559 + j*(252)
+-67 + j*(-332)
+-394 + j*(-370)
+242 + j*(-639)
+-349 + j*(286)
+98 + j*(57)
+506 + j*(286)
+117 + j*(-76)
+-506 + j*(47)
+-100 + j*(156)
+-59 + j*(-168)
+162 + j*(363)
+-142 + j*(298)
+110 + j*(139)
+163 + j*(184)
+-107 + j*(-296)
+40 + j*(231)
+-26 + j*(-117)
+-184 + j*(8)
+156 + j*(-24)
+-98 + j*(-288)
+192 + j*(-55)
+-138 + j*(-66)
+161 + j*(276)
+337 + j*(-55)
+122 + j*(-122)
+233 + j*(-233)
+-29 + j*(-118)
+-36 + j*(0)
+-259 + j*(5)
+63 + j*(18)
+-158 + j*(-301)
+-95 + j*(-240)
+549 + j*(309)
+184 + j*(53)
+-141 + j*(328)
+-11 + j*(258)
+-41 + j*(237)
+-107 + j*(35)
+-265 + j*(-267)
+205 + j*(-198)
+-274 + j*(284)
+-211 + j*(-33)
+-326 + j*(-124)
+-64 + j*(-79)
+-161 + j*(-294)
+122 + j*(32)
+-248 + j*(-27)
+-3 + j*(-115)
+-145 + j*(-153)
+-308 + j*(35)
+138 + j*(-127)
+-254 + j*(-220)
+-139 + j*(49)
+-33 + j*(-45)
+41 + j*(23)
+4 + j*(-356)
+-192 + j*(50)
+-81 + j*(200)
+157 + j*(266)
+110 + j*(252)
+51 + j*(-231)
+-297 + j*(-110)
+-142 + j*(-7)
+-208 + j*(13)
+-236 + j*(-299)
+-43 + j*(190)
+312 + j*(-10)
+157 + j*(-322)
+171 + j*(-177)
+-15 + j*(-80)
+-320 + j*(103)
+-58 + j*(208)
+192 + j*(-77)
+424 + j*(-43)
+83 + j*(56)
+218 + j*(83)
+46 + j*(-98)
+-73 + j*(74)
+-149 + j*(35)
+-199 + j*(47)
+-54 + j*(-18)
+-68 + j*(136)
+327 + j*(240)
+-45 + j*(337)
+-107 + j*(-88)
+-52 + j*(224)
+238 + j*(58)
+-213 + j*(-77)
+105 + j*(56)
+163 + j*(-331)
+119 + j*(-413)
+-66 + j*(-121)
+-112 + j*(176)
+93 + j*(35)
+199 + j*(98)
+177 + j*(-56)
+-216 + j*(-6)
+-44 + j*(-34)
+-244 + j*(-201)
+53 + j*(-68)
+133 + j*(149)
+85 + j*(179)
+-88 + j*(-4)
+-91 + j*(28)
+-173 + j*(16)
+-13 + j*(135)
+-147 + j*(120)
+-85 + j*(-152)
+24 + j*(-194)
+-226 + j*(-117)
+-8 + j*(120)
+301 + j*(350)
+110 + j*(-192)
+-210 + j*(-33)
+-57 + j*(-59)
+-57 + j*(-199)
+71 + j*(-110)
+6 + j*(-235)
+-84 + j*(100)
+38 + j*(-43)
+-40 + j*(151)
+-187 + j*(224)
+-156 + j*(138)
+148 + j*(-41)
+204 + j*(-564)
+144 + j*(-85)
+16 + j*(-325)
+-55 + j*(78)
+-21 + j*(-2)
+77 + j*(152)
+-99 + j*(-4)
+-256 + j*(228)
+221 + j*(0)
+-71 + j*(226)
+-83 + j*(-78)
+-5 + j*(173)
+-42 + j*(-68)
+116 + j*(-40)
+44 + j*(-258)
+-39 + j*(-39)
+-7 + j*(-173)
+-223 + j*(-71)
+40 + j*(89)
+-86 + j*(-344)
+-243 + j*(190)
+286 + j*(48)
+-284 + j*(227)
+156 + j*(98)
+180 + j*(-112)
+-327 + j*(-141)
+180 + j*(11)
+-76 + j*(-96)
+-55 + j*(-71)
+-104 + j*(-48)
+276 + j*(-40)
+-4 + j*(-30)
+281 + j*(-175)
+425 + j*(192)
+33 + j*(-87)
+279 + j*(42)
+-97 + j*(-129)
+76 + j*(-5)
+26 + j*(69)
+48 + j*(-472)
+-218 + j*(-209)
+-143 + j*(-159)
+-59 + j*(1)
+221 + j*(25)
+-95 + j*(32)
+-69 + j*(79)
+95 + j*(-206)
+159 + j*(-54)
+-121 + j*(107)
+-23 + j*(33)
+-68 + j*(-163)
+40 + j*(-171)
+190 + j*(-384)
+-162 + j*(-95)
+23 + j*(-211)
+-136 + j*(0)
+-46 + j*(-2)
+381 + j*(-231)
+128 + j*(-233)
+-30 + j*(-272)
+-98 + j*(86)
+-109 + j*(-287)
+-30 + j*(-47)
+-94 + j*(235)
+-144 + j*(0)
+257 + j*(210)
+-68 + j*(-23)
+195 + j*(123)
+-221 + j*(122)
+244 + j*(110)
+-126 + j*(-84)
+59 + j*(-195)
+-64 + j*(305)
+186 + j*(74)
+85 + j*(-304)
+-126 + j*(96)
+245 + j*(165)
+23 + j*(-156)
+267 + j*(-207)
+-306 + j*(-105)
+-195 + j*(131)
+-52 + j*(-120)
+13 + j*(-123)
+-27 + j*(-401)
+51 + j*(-105)
+-214 + j*(121)
+-68 + j*(-316)
+64 + j*(83)
+-260 + j*(-67)
+-200 + j*(66)
+-270 + j*(108)
+-496 + j*(-64)
+-40 + j*(-259)
+-36 + j*(365)
+29 + j*(61)
+271 + j*(139)
+-46 + j*(-204)
+112 + j*(301)
+73 + j*(-66)
+211 + j*(-33)
+24 + j*(161)
+-153 + j*(-43)
+4 + j*(-89)
+107 + j*(202)
+-52 + j*(-315)
+23 + j*(59)
+-80 + j*(-99)
+115 + j*(-133)
+127 + j*(-4)
+56 + j*(278)
+-90 + j*(17)
+-215 + j*(176)
+39 + j*(-146)
+-180 + j*(21)
+-135 + j*(146)
+297 + j*(-195)
+-173 + j*(13)
+227 + j*(153)
+107 + j*(-227)
+-42 + j*(94)
+-177 + j*(176)
+157 + j*(40)
+-243 + j*(30)
+-65 + j*(-271)
+-162 + j*(218)
+574 + j*(-124)
+64 + j*(-87)
+-106 + j*(21)
+-64 + j*(-85)
+105 + j*(78)
+170 + j*(252)
+171 + j*(-236)
+301 + j*(157)
+257 + j*(-142)
+-198 + j*(127)
+8 + j*(402)
+-31 + j*(137)
+-168 + j*(-62)
+331 + j*(-171)
+95 + j*(-11)
+260 + j*(-33)
+358 + j*(-293)
+-36 + j*(63)
+-6 + j*(151)
+177 + j*(-247)
+60 + j*(-130)
+199 + j*(49)
+-54 + j*(83)
+0 + j*(27)
+-158 + j*(-120)
+190 + j*(-147)
+-168 + j*(138)
+161 + j*(-16)
+-5 + j*(14)
+-260 + j*(-122)
+-65 + j*(118)
+-136 + j*(-20)
+97 + j*(0)
+-78 + j*(0)
+89 + j*(-169)
+141 + j*(-215)
+-119 + j*(191)
+114 + j*(-15)
+-366 + j*(300)
+-267 + j*(373)
+-71 + j*(211)
+220 + j*(136)
+3 + j*(91)
+170 + j*(275)
+159 + j*(-59)
+-163 + j*(-139)
+-148 + j*(-9)
+161 + j*(321)
+167 + j*(26)
+-87 + j*(-114)
+-143 + j*(33)
+47 + j*(145)
+30 + j*(-80)
+64 + j*(-204)
+70 + j*(-93)
+-183 + j*(37)
+-71 + j*(-274)
+-81 + j*(-93)
+243 + j*(197)
+-277 + j*(-307)
+-103 + j*(-231)
+32 + j*(168)
+18 + j*(-4)
+320 + j*(267)
+-28 + j*(-4)
+64 + j*(195)
+-165 + j*(-17)
+-72 + j*(-80)
+-83 + j*(236)
+-95 + j*(-298)
+-310 + j*(4)
+43 + j*(-100)
+219 + j*(-225)
+99 + j*(184)
+-158 + j*(-57)
+-32 + j*(-35)
+-405 + j*(-144)
+329 + j*(9)
+191 + j*(47)
+-65 + j*(98)
+-28 + j*(-207)
+-56 + j*(103)
+-9 + j*(30)
+-59 + j*(249)
+-161 + j*(-89)
+105 + j*(-37)
+-136 + j*(-25)
+-461 + j*(-19)
+238 + j*(-184)
+-49 + j*(-118)
+-171 + j*(-199)
+208 + j*(-146)
+-117 + j*(-15)
+-72 + j*(192)
+351 + j*(-381)
+-117 + j*(-57)
+-37 + j*(-335)
+-4 + j*(-30)
+-269 + j*(-141)
+351 + j*(107)
+-214 + j*(-186)
+154 + j*(-385)
+-10 + j*(-100)
+-200 + j*(-194)
+120 + j*(-171)
+16 + j*(-36)
+-6 + j*(64)
+53 + j*(-182)
+-21 + j*(66)
+-244 + j*(-162)
+-187 + j*(107)
+257 + j*(6)
+254 + j*(183)
+21 + j*(-123)
+-260 + j*(-235)
+-198 + j*(208)
+67 + j*(-178)
+-156 + j*(171)
+23 + j*(-328)
+50 + j*(-82)
+273 + j*(91)
+-465 + j*(11)
+-252 + j*(-271)
+66 + j*(159)
+-349 + j*(-22)
+-38 + j*(-395)
+63 + j*(-30)
+-83 + j*(-186)
+-167 + j*(-312)
+231 + j*(17)
+168 + j*(-475)
+216 + j*(-16)
+-141 + j*(-285)
+-185 + j*(72)
+88 + j*(-3)
+-132 + j*(-122)
+63 + j*(245)
+158 + j*(-104)
+-301 + j*(-276)
+-28 + j*(226)
+129 + j*(40)
+-146 + j*(-64)
+-306 + j*(-209)
+35 + j*(50)
+390 + j*(30)
+-264 + j*(-94)
+-201 + j*(30)
+4 + j*(21)
+-325 + j*(-134)
+-270 + j*(-317)
+402 + j*(4)
+-135 + j*(181)
+221 + j*(69)
+-272 + j*(-63)
+-79 + j*(169)
+-31 + j*(249)
+25 + j*(238)
+69 + j*(39)
+38 + j*(119)
+-13 + j*(54)
+218 + j*(-204)
+-118 + j*(-271)
+-123 + j*(-87)
+-215 + j*(-211)
+8 + j*(-20)
+-113 + j*(-134)
+118 + j*(330)
+184 + j*(52)
+-52 + j*(8)
+170 + j*(-322)
+59 + j*(-35)
+-247 + j*(372)
+-42 + j*(-73)
+119 + j*(111)
+-25 + j*(-49)
+-2 + j*(-87)
+-310 + j*(-179)
+250 + j*(70)
+-49 + j*(18)
+100 + j*(-186)
+-135 + j*(28)
+-71 + j*(153)
+45 + j*(428)
+3 + j*(-249)
+-119 + j*(111)
+321 + j*(223)
+25 + j*(-214)
+199 + j*(-301)
+36 + j*(-147)
+182 + j*(-100)
+138 + j*(-7)
+-115 + j*(-452)
+147 + j*(52)
+31 + j*(-32)
+-359 + j*(243)
+-57 + j*(-26)
+288 + j*(-342)
+-114 + j*(362)
+-314 + j*(-102)
+-130 + j*(-46)
+90 + j*(184)
+46 + j*(-83)
+-231 + j*(151)
+-25 + j*(-37)
+-51 + j*(-51)
+-491 + j*(88)
+-45 + j*(141)
+62 + j*(-93)
+-115 + j*(189)
+-167 + j*(556)
+-111 + j*(-173)
+-148 + j*(-122)
+-70 + j*(-202)
+226 + j*(315)
+47 + j*(82)
+107 + j*(92)
+-71 + j*(159)
+-201 + j*(96)
+-279 + j*(312)
+178 + j*(-182)
+21 + j*(30)
+93 + j*(-142)
+330 + j*(-162)
+88 + j*(49)
+91 + j*(118)
+-88 + j*(186)
+157 + j*(76)
+-174 + j*(79)
+172 + j*(-34)
+175 + j*(-133)
+-195 + j*(-25)
+100 + j*(-73)
+237 + j*(213)
+-206 + j*(-190)
+209 + j*(-362)
+-407 + j*(407)
+-188 + j*(88)
+-54 + j*(264)
+-172 + j*(-100)
+127 + j*(-121)
+-132 + j*(-37)
+-45 + j*(96)
+221 + j*(111)
+167 + j*(-11)
+57 + j*(19)
+119 + j*(-85)
+-74 + j*(69)
+12 + j*(-302)
+-69 + j*(-177)
+-21 + j*(181)
+-117 + j*(157)
+82 + j*(328)
+393 + j*(29)
+186 + j*(77)
+371 + j*(-147)
+93 + j*(-47)
+-169 + j*(-63)
+-48 + j*(215)
+9 + j*(-59)
+73 + j*(-226)
+-295 + j*(-11)
+-247 + j*(158)
+-114 + j*(-120)
+-83 + j*(-57)
+53 + j*(-2)
+-151 + j*(-27)
+-251 + j*(-245)
+-193 + j*(-12)
+31 + j*(-63)
+235 + j*(208)
+53 + j*(-342)
+138 + j*(-112)
+93 + j*(-262)
+5 + j*(65)
+-266 + j*(-119)
+-149 + j*(-166)
+-25 + j*(38)
+184 + j*(7)
+-290 + j*(-71)
+157 + j*(293)
+-90 + j*(-56)
+458 + j*(-84)
+-99 + j*(-19)
+164 + j*(153)
+224 + j*(174)
+-101 + j*(-18)
+-81 + j*(154)
+158 + j*(154)
+-127 + j*(-254)
+175 + j*(-91)
+292 + j*(21)
+-170 + j*(0)
+148 + j*(-99)
+-146 + j*(133)
+136 + j*(121)
+114 + j*(-186)
+-29 + j*(60)
+39 + j*(108)
+-83 + j*(-29)
+25 + j*(254)
+-4 + j*(-291)
+28 + j*(199)
+-47 + j*(-40)
+-95 + j*(203)
+-223 + j*(18)
+109 + j*(-144)
+-82 + j*(-18)
+148 + j*(302)
+42 + j*(58)
+291 + j*(205)
+69 + j*(25)
+-135 + j*(-63)
+73 + j*(-18)
+-325 + j*(-216)
+-100 + j*(62)
+-17 + j*(-175)
+-198 + j*(93)
+-25 + j*(216)
+92 + j*(-165)
+122 + j*(-248)
+165 + j*(166)
+121 + j*(85)
+81 + j*(-57)
+105 + j*(167)
+211 + j*(-134)
+18 + j*(-106)
+-33 + j*(-170)
+73 + j*(-61)
+286 + j*(-19)
+2 + j*(286)
+-436 + j*(426)
+-118 + j*(-88)
+-47 + j*(-100)
+-127 + j*(266)
+58 + j*(-47)
+-15 + j*(210)
+117 + j*(130)
+-325 + j*(146)
+91 + j*(108)
+127 + j*(-89)
+41 + j*(-191)
+-69 + j*(283)
+-24 + j*(-206)
+-237 + j*(-129)
+24 + j*(1)
+-15 + j*(188)
+159 + j*(-438)
+-153 + j*(177)
+91 + j*(84)
+196 + j*(99)
+-199 + j*(-139)
+-26 + j*(161)
+-98 + j*(-145)
+139 + j*(208)
+8 + j*(-177)
+106 + j*(83)
+107 + j*(-57)
+-309 + j*(-213)
+-96 + j*(16)
+88 + j*(-123)
+-114 + j*(145)
+238 + j*(-22)
+46 + j*(-329)
+156 + j*(-65)
+-183 + j*(112)
+61 + j*(-93)
+11 + j*(154)
+47 + j*(8)
+-110 + j*(-246)
+-185 + j*(-25)
+383 + j*(-152)
+6 + j*(-38)
+162 + j*(-64)
+-345 + j*(178)
+-4 + j*(-176)
+-76 + j*(49)
+50 + j*(-157)
+-230 + j*(-141)
+-103 + j*(-71)
+286 + j*(134)
+-431 + j*(-79)
+153 + j*(34)
+-320 + j*(-55)
+178 + j*(292)
+-25 + j*(-117)
+189 + j*(57)
+158 + j*(105)
+-108 + j*(-551)
+170 + j*(-34)
+-298 + j*(-87)
+187 + j*(-165)
+69 + j*(59)
+-166 + j*(453)
+111 + j*(-119)
+172 + j*(-110)
+-185 + j*(158)
+-131 + j*(-267)
+-54 + j*(-285)
+-57 + j*(65)
+94 + j*(-38)
+382 + j*(-139)
+-119 + j*(-199)
+-252 + j*(48)
+-190 + j*(421)
+-119 + j*(30)
+165 + j*(236)
+77 + j*(42)
+14 + j*(210)
+-52 + j*(-196)
+144 + j*(-216)
+28 + j*(99)
+-242 + j*(151)
+-19 + j*(-17)
+62 + j*(-230)
+146 + j*(130)
+-67 + j*(-202)
+158 + j*(-134)
+-318 + j*(192)
+48 + j*(-28)
+-322 + j*(180)
+-263 + j*(187)
+58 + j*(226)
+-1 + j*(96)
+8 + j*(304)
+-31 + j*(-8)
+214 + j*(-35)
+-35 + j*(-71)
+-22 + j*(-124)
+-321 + j*(-234)
+305 + j*(-367)
+-170 + j*(-57)
+-206 + j*(124)
+-64 + j*(-117)
+35 + j*(-8)
+-74 + j*(-139)
+-81 + j*(200)
+355 + j*(189)
+115 + j*(158)
+-22 + j*(1)
+-117 + j*(319)
+48 + j*(193)
+-66 + j*(-28)
+-78 + j*(-221)
+77 + j*(204)
+-308 + j*(187)
+-373 + j*(223)
+-246 + j*(224)
+277 + j*(147)
+64 + j*(-37)
+-13 + j*(-129)
+6 + j*(-28)
+80 + j*(15)
+173 + j*(60)
+-112 + j*(98)
+-279 + j*(-98)
+103 + j*(29)
+115 + j*(13)
+49 + j*(-102)
+233 + j*(81)
+189 + j*(-76)
+192 + j*(52)
+-54 + j*(-86)
+-33 + j*(-18)
+-248 + j*(105)
+76 + j*(177)
+433 + j*(-158)
+-190 + j*(-6)
+-139 + j*(93)
+-57 + j*(-262)
+165 + j*(-156)
+305 + j*(-173)
+-5 + j*(323)
+33 + j*(335)
+-156 + j*(-53)
+-235 + j*(111)
+-19 + j*(78)
+-34 + j*(-106)
+254 + j*(62)
+-130 + j*(185)
+5 + j*(-9)
+53 + j*(-91)
+-107 + j*(357)
+-16 + j*(-24)
+41 + j*(-177)
+-18 + j*(135)
+102 + j*(223)
+-88 + j*(87)
+173 + j*(251)
+-35 + j*(-85)
+-260 + j*(-141)
+13 + j*(35)
+235 + j*(136)
+45 + j*(109)
+57 + j*(-5)
+59 + j*(-38)
+148 + j*(78)
+134 + j*(-247)
+-215 + j*(40)
+243 + j*(-28)
+42 + j*(-71)
+-59 + j*(-18)
+63 + j*(-50)
+-286 + j*(-103)
+-140 + j*(-54)
+43 + j*(-92)
+117 + j*(-78)
+58 + j*(-70)
+-2 + j*(-187)
+33 + j*(1)
+-328 + j*(189)
+-151 + j*(-17)
+70 + j*(56)
+-33 + j*(110)
+-56 + j*(-232)
+139 + j*(211)
+68 + j*(-8)
+-23 + j*(-332)
+-84 + j*(-69)
+-124 + j*(-66)
+238 + j*(-9)
+165 + j*(-138)
+117 + j*(153)
+-3 + j*(-95)
+252 + j*(-83)
+-146 + j*(81)
+-163 + j*(-2)
+231 + j*(206)
+103 + j*(-237)
+14 + j*(-40)
+187 + j*(175)
+-88 + j*(171)
+66 + j*(202)
+71 + j*(-172)
+-182 + j*(-47)
+-193 + j*(96)
+158 + j*(197)
+-11 + j*(-202)
+-110 + j*(86)
+-76 + j*(-20)
+23 + j*(-204)
+-110 + j*(228)
+30 + j*(-39)
+182 + j*(-27)
+104 + j*(30)
+-421 + j*(55)
+-124 + j*(-89)
+275 + j*(140)
+-114 + j*(65)
+188 + j*(221)
+-515 + j*(152)
+-315 + j*(-170)
+1 + j*(-225)
+294 + j*(14)
+202 + j*(6)
+255 + j*(-163)
+-30 + j*(-192)
+-179 + j*(141)
+148 + j*(-154)
+-74 + j*(-300)
+-235 + j*(18)
+247 + j*(-79)
+177 + j*(-129)
+-186 + j*(182)
+-50 + j*(-11)
+356 + j*(-52)
+148 + j*(-117)
+136 + j*(99)
+93 + j*(-328)
+-4 + j*(26)
+7 + j*(-222)
+-58 + j*(-41)
+236 + j*(106)
+-535 + j*(89)
+356 + j*(320)
+-111 + j*(38)
+58 + j*(-325)
+-165 + j*(103)
+-176 + j*(-89)
+-93 + j*(-48)
+-6 + j*(69)
+110 + j*(-194)
+-19 + j*(1)
+18 + j*(-311)
+407 + j*(-1)
+64 + j*(161)
+142 + j*(-227)
+-356 + j*(-335)
+195 + j*(366)
+-200 + j*(-170)
+160 + j*(194)
+-43 + j*(-305)
+168 + j*(-30)
+221 + j*(146)
+-13 + j*(194)
+366 + j*(-336)
+-265 + j*(107)
+-216 + j*(133)
+-73 + j*(124)
+-288 + j*(-79)
+-6 + j*(78)
+359 + j*(126)
+-62 + j*(180)
+205 + j*(-325)
+-21 + j*(-49)
+54 + j*(-180)
+77 + j*(-340)
+-77 + j*(-49)
+-87 + j*(166)
+129 + j*(115)
+-167 + j*(25)
+192 + j*(-13)
+395 + j*(-304)
+358 + j*(-41)
+8 + j*(135)
+-91 + j*(-146)
+-103 + j*(-84)
+136 + j*(98)
+-123 + j*(-60)
+298 + j*(-141)
+-117 + j*(-283)
+335 + j*(-21)
+143 + j*(-44)
+-249 + j*(-75)
+11 + j*(47)
+-146 + j*(-163)
+185 + j*(232)
+313 + j*(59)
+-227 + j*(-141)
+-214 + j*(-50)
+-64 + j*(143)
+73 + j*(-165)
+185 + j*(-30)
+55 + j*(48)
+-152 + j*(-82)
+-35 + j*(-16)
+49 + j*(-21)
+4 + j*(313)
+279 + j*(42)
+48 + j*(-219)
+40 + j*(37)
+-71 + j*(99)
+-75 + j*(-37)
+11 + j*(-197)
+118 + j*(40)
+-59 + j*(45)
+-106 + j*(79)
+84 + j*(-100)
+-6 + j*(-39)
+-144 + j*(418)
+52 + j*(351)
+187 + j*(264)
+-26 + j*(25)
+-1 + j*(-44)
+-93 + j*(515)
+63 + j*(-93)
+296 + j*(78)
+-311 + j*(363)
+4 + j*(-178)
+63 + j*(265)
+-204 + j*(-132)
+59 + j*(-104)
+-294 + j*(8)
+-167 + j*(76)
+-74 + j*(288)
+105 + j*(-91)
+105 + j*(21)
+19 + j*(-169)
+132 + j*(-124)
+83 + j*(43)
+-302 + j*(-35)
+155 + j*(206)
+151 + j*(100)
+-242 + j*(188)
+1 + j*(269)
+-30 + j*(-129)
+387 + j*(-134)
+135 + j*(89)
+15 + j*(-282)
+130 + j*(-124)
+387 + j*(10)
+136 + j*(74)
+-83 + j*(-74)
+-450 + j*(-119)
+-84 + j*(-28)
+-62 + j*(161)
+-76 + j*(-78)
+75 + j*(-597)
+273 + j*(80)
+-9 + j*(109)
+4 + j*(62)
+106 + j*(62)
+105 + j*(199)
+-132 + j*(158)
+-21 + j*(5)
+-142 + j*(98)
+-282 + j*(170)
+180 + j*(131)
+211 + j*(-172)
+-155 + j*(192)
+-393 + j*(-5)
+-84 + j*(-328)
+-30 + j*(-112)
+-71 + j*(-198)
+120 + j*(-38)
+-223 + j*(-73)
+-11 + j*(196)
+170 + j*(76)
+-129 + j*(67)
+-121 + j*(-35)
+-66 + j*(103)
+-183 + j*(148)
+-215 + j*(-71)
+-158 + j*(-179)
+-211 + j*(13)
+-78 + j*(201)
+245 + j*(132)
+-139 + j*(-11)
+-58 + j*(204)
+-103 + j*(-175)
+-12 + j*(73)
+-52 + j*(-126)
+29 + j*(40)
+67 + j*(-36)
+18 + j*(-4)
+15 + j*(-45)
+268 + j*(-138)
+62 + j*(25)
+-344 + j*(-20)
+16 + j*(93)
+-122 + j*(119)
+-44 + j*(-205)
+137 + j*(-150)
+197 + j*(-11)
+56 + j*(-64)
+25 + j*(-168)
+112 + j*(141)
+-144 + j*(29)
+-170 + j*(-252)
+-190 + j*(-37)
+-8 + j*(-127)
+-10 + j*(247)
+193 + j*(-303)
+-122 + j*(-218)
+165 + j*(-90)
+28 + j*(-100)
+31 + j*(19)
+-96 + j*(-121)
+-98 + j*(30)
+-281 + j*(-203)
+250 + j*(-42)
+-244 + j*(109)
+-47 + j*(-231)
+16 + j*(-291)
+40 + j*(-218)
+-300 + j*(34)
+-152 + j*(173)
+-74 + j*(73)
+-23 + j*(-93)
+-45 + j*(-342)
+24 + j*(-52)
+-193 + j*(183)
+-151 + j*(-307)
+-26 + j*(24)
+207 + j*(-115)
+-58 + j*(139)
+-33 + j*(-112)
+-409 + j*(149)
+-1 + j*(-136)
+-288 + j*(-105)
+-30 + j*(-198)
+187 + j*(39)
+71 + j*(33)
+-371 + j*(64)
+-27 + j*(-169)
+40 + j*(4)
+-234 + j*(72)
+-243 + j*(-18)
+29 + j*(71)
+189 + j*(-243)
+-201 + j*(-335)
+-214 + j*(-97)
+-161 + j*(185)
+-247 + j*(45)
+-260 + j*(-303)
+-206 + j*(245)
+-127 + j*(12)
+49 + j*(156)
+-52 + j*(-3)
+193 + j*(69)
+203 + j*(62)
+111 + j*(-100)
+-105 + j*(-18)
+25 + j*(-121)
+-134 + j*(104)
+-275 + j*(233)
+100 + j*(-326)
+-230 + j*(-73)
+139 + j*(-256)
+300 + j*(23)
+-189 + j*(-491)
+137 + j*(-88)
+133 + j*(-263)
+-106 + j*(-373)
+-18 + j*(-103)
+-98 + j*(223)
+-4 + j*(-18)
+6 + j*(266)
+60 + j*(-30)
+-188 + j*(-150)
+-118 + j*(40)
+-140 + j*(-16)
+88 + j*(59)
+-22 + j*(-28)
+110 + j*(-66)
+160 + j*(-157)
+139 + j*(31)
+19 + j*(-97)
+69 + j*(101)
+-49 + j*(172)
+245 + j*(-80)
+14 + j*(274)
+-71 + j*(1)
+-33 + j*(29)
+-208 + j*(66)
+184 + j*(227)
+-239 + j*(-216)
+127 + j*(-18)
+469 + j*(177)
+-91 + j*(263)
+4 + j*(46)
+-212 + j*(102)
+25 + j*(-23)
+153 + j*(10)
+-97 + j*(-8)
+-236 + j*(-30)
+-46 + j*(-418)
+-104 + j*(288)
+78 + j*(-39)
+136 + j*(1)
+43 + j*(-76)
+34 + j*(-223)
+110 + j*(-4)
+146 + j*(-64)
+-5 + j*(45)
+89 + j*(44)
+-12 + j*(-76)
+-5 + j*(-25)
+20 + j*(243)
+47 + j*(-218)
+-81 + j*(71)
+-73 + j*(187)
+314 + j*(94)
+-119 + j*(-69)
+136 + j*(88)
+158 + j*(75)
+-196 + j*(-190)
+-5 + j*(-135)
+134 + j*(228)
+-108 + j*(-257)
+-16 + j*(414)
+-16 + j*(96)
+151 + j*(163)
+93 + j*(4)
+-204 + j*(-71)
+-107 + j*(213)
+187 + j*(26)
+-30 + j*(242)
+89 + j*(-8)
+4 + j*(-206)
+-54 + j*(-242)
+110 + j*(-37)
+-175 + j*(-238)
+-148 + j*(15)
+208 + j*(-152)
+-28 + j*(-235)
+-183 + j*(-280)
+189 + j*(-124)
+-19 + j*(8)
+-250 + j*(-168)
+-24 + j*(-89)
+-247 + j*(140)
+216 + j*(385)
+88 + j*(-119)
+356 + j*(-173)
+4 + j*(145)
+-193 + j*(-115)
+109 + j*(-45)
+203 + j*(172)
+-103 + j*(337)
+-80 + j*(187)
+-129 + j*(179)
+158 + j*(-235)
+-52 + j*(-272)
+-91 + j*(327)
+-25 + j*(117)
+-143 + j*(-141)
+92 + j*(310)
+129 + j*(33)
+-202 + j*(159)
+86 + j*(43)
+-43 + j*(69)
+-130 + j*(-140)
+-139 + j*(371)
+-1 + j*(92)
+-301 + j*(-141)
+170 + j*(83)
+6 + j*(-224)
+-183 + j*(132)
+-187 + j*(74)
+141 + j*(-238)
+-102 + j*(346)
+-230 + j*(298)
+71 + j*(280)
+-360 + j*(311)
+-85 + j*(173)
+117 + j*(-69)
+23 + j*(314)
+-179 + j*(234)
+95 + j*(8)
+18 + j*(-133)
+-137 + j*(-108)
+115 + j*(122)
+-23 + j*(-101)
+18 + j*(2)
+96 + j*(-134)
+21 + j*(3)
+373 + j*(-148)
+162 + j*(41)
+240 + j*(244)
+-114 + j*(192)
+86 + j*(-23)
+-55 + j*(67)
+-188 + j*(163)
+-23 + j*(10)
+18 + j*(-76)
+-27 + j*(21)
+163 + j*(198)
+-44 + j*(33)
+70 + j*(66)
+-132 + j*(356)
+-43 + j*(-99)
+-134 + j*(165)
+225 + j*(-81)
+-55 + j*(-30)
+143 + j*(88)
+64 + j*(-105)
+-44 + j*(-93)
+-69 + j*(-28)
+-184 + j*(-154)
+-315 + j*(184)
+49 + j*(-148)
+-220 + j*(91)
+-91 + j*(-29)
+-177 + j*(-166)
+35 + j*(86)
+-190 + j*(-197)
+-281 + j*(-106)
+-211 + j*(-90)
+-185 + j*(27)
+50 + j*(298)
+71 + j*(-78)
+268 + j*(-33)
+79 + j*(-139)
+218 + j*(125)
+400 + j*(190)
+-83 + j*(17)
+-129 + j*(385)
+-5 + j*(-299)
+-202 + j*(-363)
+233 + j*(24)
+13 + j*(-80)
+-256 + j*(-156)
+194 + j*(-125)
+233 + j*(104)
+-206 + j*(145)
+-181 + j*(137)
+-342 + j*(253)
+91 + j*(13)
+-117 + j*(164)
+-138 + j*(58)
+227 + j*(-179)
+-38 + j*(42)
+-46 + j*(-65)
+98 + j*(302)
+-18 + j*(167)
+135 + j*(136)
+111 + j*(16)
+-107 + j*(-140)
+69 + j*(-180)
+69 + j*(-49)
+-100 + j*(190)
+-161 + j*(302)
+-57 + j*(261)
+78 + j*(-50)
+62 + j*(45)
+298 + j*(24)
+65 + j*(288)
+-132 + j*(4)
+186 + j*(4)
+53 + j*(84)
+-94 + j*(177)
+258 + j*(-5)
+82 + j*(-281)
+282 + j*(295)
+119 + j*(-278)
+-65 + j*(-95)
+-216 + j*(-46)
+116 + j*(105)
+13 + j*(287)
+105 + j*(165)
+221 + j*(-129)
+27 + j*(115)
+-284 + j*(5)
+-20 + j*(190)
+39 + j*(128)
+-301 + j*(-53)
+-198 + j*(-95)
+-39 + j*(129)
+-34 + j*(-30)
+-25 + j*(280)
+134 + j*(176)
+-54 + j*(-99)
+64 + j*(-139)
+-147 + j*(191)
+77 + j*(-8)
+-140 + j*(1)
+29 + j*(6)
+-252 + j*(-90)
+66 + j*(-373)
+-273 + j*(177)
+-53 + j*(-73)
+426 + j*(209)
+303 + j*(-223)
+230 + j*(78)
+-146 + j*(-151)
+32 + j*(169)
+408 + j*(48)
+149 + j*(54)
+-18 + j*(-1)
+320 + j*(122)
+-23 + j*(28)
+89 + j*(-202)
+33 + j*(-117)
+274 + j*(-25)
+23 + j*(-18)
+-88 + j*(-291)
+-51 + j*(407)
+-50 + j*(18)
+-4 + j*(-36)
+115 + j*(124)
+-13 + j*(150)
+223 + j*(-66)
+-48 + j*(108)
+-82 + j*(-92)
+40 + j*(219)
+-216 + j*(148)
+-187 + j*(-291)
+-45 + j*(56)
+185 + j*(47)
+94 + j*(-248)
+-107 + j*(-1)
+-199 + j*(-47)
+20 + j*(60)
+117 + j*(141)
+-151 + j*(-326)
+51 + j*(-210)
+121 + j*(-66)
+-40 + j*(-173)
+-83 + j*(-199)
+-54 + j*(-74)
+83 + j*(-98)
+243 + j*(170)
+217 + j*(-255)
+242 + j*(-443)
+-148 + j*(-34)
+42 + j*(201)
+29 + j*(-47)
+-98 + j*(-1)
+45 + j*(141)
+-148 + j*(-74)
+161 + j*(-137)
+116 + j*(169)
+49 + j*(-519)
+9 + j*(-118)
+144 + j*(169)
+-106 + j*(77)
+-124 + j*(-10)
+-298 + j*(303)
+268 + j*(-8)
+44 + j*(-12)
+165 + j*(-390)
+-98 + j*(-107)
+199 + j*(197)
+194 + j*(49)
+-206 + j*(412)
+68 + j*(-216)
+274 + j*(139)
+-237 + j*(60)
+85 + j*(285)
+4 + j*(-130)
+168 + j*(-20)
+284 + j*(175)
+316 + j*(-301)
+62 + j*(148)
+54 + j*(-270)
+95 + j*(266)
+-95 + j*(-28)
+-46 + j*(29)
+-254 + j*(-30)
+-159 + j*(117)
+-9 + j*(-117)
+-64 + j*(-76)
+59 + j*(19)
+-45 + j*(-144)
+-358 + j*(-110)
+-302 + j*(218)
+140 + j*(335)
+233 + j*(12)
+386 + j*(96)
+-37 + j*(-218)
+-187 + j*(-46)
+16 + j*(290)
+59 + j*(18)
+158 + j*(-102)
+104 + j*(-3)
+-23 + j*(204)
+131 + j*(161)
+105 + j*(339)
+-226 + j*(-220)
+-144 + j*(202)
+-95 + j*(-191)
+-44 + j*(49)
+69 + j*(-114)
+-105 + j*(221)
+12 + j*(58)
+264 + j*(-68)
+-21 + j*(88)
+-357 + j*(15)
+-122 + j*(-136)
+-35 + j*(129)
+139 + j*(-16)
+-175 + j*(-110)
+24 + j*(67)
+17 + j*(56)
+-100 + j*(-48)
+-75 + j*(-260)
+-28 + j*(-51)
+52 + j*(-117)
+445 + j*(41)
+35 + j*(159)
+-68 + j*(112)
+-208 + j*(158)
+-182 + j*(-253)
+-3 + j*(-115)
+-30 + j*(371)
+8 + j*(30)
+-223 + j*(-93)
+274 + j*(57)
+-313 + j*(-148)
+244 + j*(195)
+10 + j*(-305)
+296 + j*(88)
+7 + j*(87)
+-40 + j*(91)
+-315 + j*(-76)
+-16 + j*(88)
+-83 + j*(-124)
+-98 + j*(-20)
+-94 + j*(-92)
+-143 + j*(-262)
+-87 + j*(49)
+252 + j*(-49)
+-119 + j*(354)
+134 + j*(46)
+-167 + j*(-270)
+-130 + j*(-144)
+103 + j*(151)
+-87 + j*(243)
+70 + j*(132)
+-128 + j*(2)
+58 + j*(114)
+215 + j*(14)
+-81 + j*(183)
+37 + j*(65)
+-151 + j*(38)
+-92 + j*(75)
+-240 + j*(-64)
+-23 + j*(-105)
+-359 + j*(-221)
+-107 + j*(18)
+88 + j*(-301)
+-308 + j*(542)
+-77 + j*(-313)
+221 + j*(-117)
+-18 + j*(-79)
+118 + j*(-240)
+-389 + j*(-11)
+57 + j*(0)
+-142 + j*(-67)
+-115 + j*(-76)
+39 + j*(-61)
+182 + j*(0)
+-65 + j*(46)
+57 + j*(-47)
+-304 + j*(33)
+-430 + j*(489)
+-425 + j*(47)
+261 + j*(597)
+-67 + j*(314)
+-337 + j*(167)
+-143 + j*(-90)
+-353 + j*(-21)
+-335 + j*(162)
+605 + j*(390)
+-31 + j*(-196)
+-340 + j*(-206)
+-275 + j*(-161)
+-332 + j*(120)
+422 + j*(202)
+316 + j*(192)
+-141 + j*(535)
+-296 + j*(-251)
+209 + j*(-497)
+-286 + j*(-75)
+165 + j*(470)
+-82 + j*(273)
+99 + j*(267)
+-262 + j*(188)
+-15 + j*(172)
+-30 + j*(403)
+212 + j*(272)
+-204 + j*(-431)
+-351 + j*(-269)
+589 + j*(204)
+311 + j*(-122)
+391 + j*(-222)
+-371 + j*(286)
+-566 + j*(-589)
+202 + j*(-261)
+-151 + j*(-124)
+474 + j*(-434)
+272 + j*(-49)
+359 + j*(75)
+129 + j*(-83)
+-320 + j*(-96)
+140 + j*(-76)
+-211 + j*(-550)
+305 + j*(417)
+-412 + j*(64)
+226 + j*(-547)
+407 + j*(-380)
+-83 + j*(-97)
+396 + j*(-173)
+255 + j*(-368)
+213 + j*(-57)
+313 + j*(110)
+42 + j*(158)
+-93 + j*(-151)
+-267 + j*(12)
+-50 + j*(119)
+-161 + j*(-238)
+-6 + j*(-322)
+-392 + j*(-337)
+472 + j*(-371)
+142 + j*(421)
+-317 + j*(400)
+447 + j*(-417)
+487 + j*(-246)
+-265 + j*(420)
+-237 + j*(279)
+-163 + j*(188)
+-423 + j*(341)
+-38 + j*(-321)
+492 + j*(101)
+-297 + j*(-282)
+-43 + j*(210)
+247 + j*(262)
+219 + j*(253)
+446 + j*(250)
+-492 + j*(-336)
+272 + j*(-373)
+289 + j*(241)
+-71 + j*(-12)
+-334 + j*(684)
+-156 + j*(294)
+219 + j*(168)
+222 + j*(391)
+-127 + j*(585)
+458 + j*(-467)
+400 + j*(-296)
+-229 + j*(1)
+-195 + j*(130)
+-42 + j*(-72)
+-548 + j*(46)
+168 + j*(17)
+-109 + j*(307)
+274 + j*(-205)
+181 + j*(-606)
+23 + j*(216)
+-359 + j*(13)
+91 + j*(288)
+-216 + j*(141)
+-315 + j*(-303)
+165 + j*(450)
+-474 + j*(64)
+450 + j*(-318)
+-443 + j*(348)
+131 + j*(450)
+259 + j*(401)
+-464 + j*(-486)
+74 + j*(-565)
+-122 + j*(-119)
+512 + j*(-184)
+-305 + j*(201)
+199 + j*(-392)
+158 + j*(-424)
+156 + j*(43)
+-610 + j*(289)
+172 + j*(-296)
+47 + j*(297)
+-458 + j*(-441)
+222 + j*(-376)
+-399 + j*(8)
+-208 + j*(371)
+-65 + j*(-204)
+-322 + j*(663)
+-438 + j*(-144)
+144 + j*(123)
+97 + j*(363)
+164 + j*(-170)
+-237 + j*(167)
+117 + j*(55)
+342 + j*(-199)
+-254 + j*(226)
+-356 + j*(474)
+-164 + j*(171)
+393 + j*(-431)
+-197 + j*(-47)
+192 + j*(179)
+183 + j*(-356)
+377 + j*(-268)
+465 + j*(407)
+-193 + j*(-66)
+-267 + j*(-235)
+607 + j*(416)
+-198 + j*(310)
+403 + j*(542)
+182 + j*(-26)
+-594 + j*(-251)
+-167 + j*(-284)
+-265 + j*(667)
+171 + j*(-404)
+122 + j*(-467)
+-266 + j*(57)
+-361 + j*(-285)
+348 + j*(23)
+-206 + j*(-553)
+-160 + j*(309)
+491 + j*(283)
+-422 + j*(-171)
+-202 + j*(-250)
+-229 + j*(99)
+183 + j*(95)
+134 + j*(-175)
+172 + j*(-517)
+147 + j*(385)
+-446 + j*(392)
+228 + j*(106)
+90 + j*(-122)
+-284 + j*(-69)
+-255 + j*(-495)
+99 + j*(-112)
+-347 + j*(-191)
+355 + j*(173)
+-342 + j*(175)
+407 + j*(-28)
+223 + j*(-71)
+-313 + j*(26)
+156 + j*(-120)
+392 + j*(-379)
+-321 + j*(-26)
+-399 + j*(160)
+187 + j*(228)
+-249 + j*(-415)
+404 + j*(399)
+198 + j*(253)
+438 + j*(82)
+479 + j*(237)
+363 + j*(318)
+576 + j*(-229)
+-667 + j*(-161)
+300 + j*(-527)
+92 + j*(596)
+-7 + j*(-363)
+-397 + j*(414)
+142 + j*(220)
+535 + j*(395)
+306 + j*(418)
+-162 + j*(-406)
+354 + j*(-330)
+-219 + j*(162)
+-331 + j*(-506)
+496 + j*(225)
+133 + j*(115)
+214 + j*(218)
+197 + j*(-316)
+587 + j*(9)
+-30 + j*(397)
+-547 + j*(-593)
+352 + j*(-108)
+-219 + j*(142)
+-383 + j*(286)
+-216 + j*(-329)
+390 + j*(276)
+-157 + j*(-122)
+236 + j*(122)
+31 + j*(-37)
+174 + j*(-285)
+253 + j*(-253)
+427 + j*(-403)
+-315 + j*(345)
+-428 + j*(-682)
+15 + j*(-400)
+-339 + j*(496)
+-588 + j*(91)
+229 + j*(-165)
+529 + j*(296)
+553 + j*(346)
+-144 + j*(66)
+-397 + j*(452)
+445 + j*(406)
+-112 + j*(-163)
+301 + j*(253)
+296 + j*(274)
+354 + j*(-94)
+-457 + j*(-530)
+-373 + j*(-168)
+-270 + j*(-178)
+-407 + j*(-224)
+3 + j*(-22)
+177 + j*(288)
+-476 + j*(31)
+-296 + j*(232)
+-331 + j*(-110)
+429 + j*(-240)
+385 + j*(-395)
+-89 + j*(326)
+369 + j*(243)
+-419 + j*(30)
+117 + j*(-298)
+-83 + j*(388)
+427 + j*(119)
+-233 + j*(-222)
+-437 + j*(509)
+-329 + j*(-51)
+184 + j*(238)
+383 + j*(-150)
+398 + j*(204)
+-277 + j*(-255)
+-166 + j*(105)
+409 + j*(-567)
+-312 + j*(-180)
+85 + j*(-119)
+-353 + j*(52)
+-416 + j*(-530)
+-59 + j*(-94)
+-454 + j*(-723)
+321 + j*(148)
+-545 + j*(-355)
+-286 + j*(-40)
+398 + j*(-600)
+144 + j*(-344)
+199 + j*(-606)
+-42 + j*(290)
+-328 + j*(-112)
+-199 + j*(-245)
+303 + j*(-335)
+-484 + j*(-413)
+-314 + j*(98)
+-100 + j*(-88)
+-328 + j*(383)
+-117 + j*(33)
+491 + j*(-299)
+320 + j*(426)
+124 + j*(320)
+-184 + j*(223)
+-165 + j*(-230)
+280 + j*(-183)
+67 + j*(-808)
+104 + j*(177)
+260 + j*(-230)
+454 + j*(-49)
+145 + j*(-433)
+-284 + j*(-306)
+336 + j*(-199)
+-338 + j*(-395)
+168 + j*(-86)
+-537 + j*(-232)
+-396 + j*(-558)
+587 + j*(-207)
+155 + j*(-412)
+-122 + j*(185)
+-648 + j*(-65)
+-167 + j*(-233)
+-371 + j*(308)
+-449 + j*(-25)
+156 + j*(233)
+-207 + j*(243)
+-474 + j*(313)
+325 + j*(6)
+-183 + j*(269)
+-344 + j*(-54)
+-98 + j*(325)
+382 + j*(197)
+-304 + j*(-89)
+100 + j*(-390)
+-471 + j*(-12)
+237 + j*(255)
+247 + j*(-138)
+-98 + j*(-78)
+63 + j*(199)
+-258 + j*(-231)
+-470 + j*(-422)
+-224 + j*(378)
+629 + j*(1)
+-255 + j*(-604)
+-100 + j*(478)
+-19 + j*(430)
+663 + j*(213)
+222 + j*(181)
+-127 + j*(270)
+351 + j*(-373)
+308 + j*(192)
+-149 + j*(240)
+80 + j*(-377)
+120 + j*(-112)
+-96 + j*(-182)
+-8 + j*(-73)
+477 + j*(-154)
+-419 + j*(274)
+-496 + j*(256)
+-240 + j*(410)
+150 + j*(-351)
+-243 + j*(-137)
+-11 + j*(-345)
+100 + j*(197)
+67 + j*(52)
+247 + j*(276)
+106 + j*(404)
+-426 + j*(-358)
+161 + j*(-528)
+211 + j*(233)
+-408 + j*(180)
+334 + j*(464)
+469 + j*(-114)
+278 + j*(178)
+86 + j*(-257)
+78 + j*(-322)
+457 + j*(-159)
+-275 + j*(328)
+-508 + j*(-10)
+209 + j*(89)
+-301 + j*(291)
+-247 + j*(-146)
+259 + j*(177)
+83 + j*(-61)
+-369 + j*(-315)
+-206 + j*(-272)
+-194 + j*(53)
+344 + j*(291)
+242 + j*(-343)
+433 + j*(-74)
+424 + j*(423)
+-332 + j*(160)
+-345 + j*(675)
+209 + j*(-36)
+-152 + j*(-247)
+-177 + j*(434)
+312 + j*(317)
+197 + j*(-103)
+-355 + j*(112)
+-69 + j*(-194)
+400 + j*(118)
+151 + j*(506)
+386 + j*(-337)
+451 + j*(228)
+40 + j*(-25)
+48 + j*(-194)
+-218 + j*(-320)
+207 + j*(-124)
+-117 + j*(-141)
+343 + j*(-224)
+308 + j*(291)
+-247 + j*(-361)
+511 + j*(32)
+228 + j*(91)
+380 + j*(302)
+324 + j*(-119)
+-413 + j*(463)
+292 + j*(281)
+-201 + j*(-165)
+-303 + j*(-211)
+-471 + j*(418)
+-69 + j*(-121)
+-607 + j*(274)
+141 + j*(342)
+-339 + j*(-220)
+-51 + j*(-165)
+229 + j*(-407)
+-151 + j*(263)
+-238 + j*(-291)
+316 + j*(-284)
+279 + j*(-5)
+530 + j*(231)
+362 + j*(-301)
+-351 + j*(88)
+-110 + j*(-561)
+112 + j*(460)
+-511 + j*(-83)
+465 + j*(-271)
+302 + j*(-204)
+164 + j*(355)
+-293 + j*(-134)
+190 + j*(-144)
+306 + j*(343)
+368 + j*(298)
+53 + j*(-6)
+-45 + j*(180)
+-273 + j*(359)
+-361 + j*(58)
+-361 + j*(-168)
+-212 + j*(-321)
+-178 + j*(13)
+186 + j*(-363)
+-138 + j*(276)
+149 + j*(-330)
+-303 + j*(291)
+427 + j*(-233)
+410 + j*(147)
+-484 + j*(243)
+57 + j*(-330)
+357 + j*(-601)
+107 + j*(86)
+402 + j*(-378)
+-295 + j*(-273)
+-211 + j*(-189)
+264 + j*(360)
+525 + j*(78)
+414 + j*(161)
+-354 + j*(-292)
+457 + j*(262)
+-247 + j*(284)
+316 + j*(-690)
+285 + j*(-289)
+109 + j*(-199)
+-414 + j*(-325)
+-316 + j*(151)
+-11 + j*(278)
+296 + j*(57)
+403 + j*(187)
+196 + j*(129)
+-380 + j*(-382)
+-358 + j*(432)
+311 + j*(-158)
+-141 + j*(-752)
+-210 + j*(223)
+181 + j*(-170)
+-144 + j*(479)
+42 + j*(337)
+-118 + j*(-448)
+222 + j*(-74)
+631 + j*(-293)
+339 + j*(-683)
+-165 + j*(141)
+388 + j*(-554)
+-211 + j*(358)
+-309 + j*(110)
+-313 + j*(130)
+223 + j*(560)
+415 + j*(496)
+11 + j*(344)
+634 + j*(-202)
+226 + j*(-28)
+-185 + j*(363)
+-289 + j*(107)
+43 + j*(301)
+91 + j*(-283)
+76 + j*(-579)
+-298 + j*(95)
+31 + j*(84)
+-288 + j*(252)
+194 + j*(413)
+264 + j*(-355)
+165 + j*(-302)
+-120 + j*(101)
+344 + j*(-684)
+-288 + j*(52)
+-290 + j*(-463)
+-135 + j*(286)
+-445 + j*(-125)
+-263 + j*(97)
+-277 + j*(-421)
+302 + j*(-375)
+455 + j*(412)
+-128 + j*(63)
+118 + j*(107)
+-360 + j*(407)
+54 + j*(366)
+-74 + j*(-502)
+234 + j*(242)
+572 + j*(-114)
+197 + j*(-351)
+518 + j*(128)
+477 + j*(462)
+-64 + j*(393)
+-113 + j*(-435)
+303 + j*(-301)
+-221 + j*(146)
+-116 + j*(-151)
+-352 + j*(-286)
+-298 + j*(-105)
+153 + j*(-247)
+539 + j*(7)
+360 + j*(144)
+110 + j*(74)
+328 + j*(28)
+-337 + j*(424)
+129 + j*(-260)
+549 + j*(41)
+-368 + j*(378)
+-253 + j*(-668)
+263 + j*(180)
+253 + j*(-273)
+-412 + j*(212)
+-180 + j*(207)
+-329 + j*(-180)
+154 + j*(-82)
+-102 + j*(197)
+-356 + j*(107)
+-89 + j*(-513)
+-393 + j*(41)
+344 + j*(403)
+245 + j*(286)
+-390 + j*(146)
+184 + j*(-487)
+132 + j*(-408)
+-330 + j*(441)
+-28 + j*(579)
+197 + j*(-210)
+-52 + j*(-171)
+317 + j*(201)
+-162 + j*(-148)
+111 + j*(-285)
+-148 + j*(177)
+-291 + j*(210)
+-358 + j*(-169)
+421 + j*(-378)
+-173 + j*(52)
+19 + j*(-194)
+211 + j*(62)
+-416 + j*(202)
+-296 + j*(194)
+-357 + j*(72)
+-214 + j*(49)
+289 + j*(400)
+-182 + j*(349)
+-583 + j*(-578)
+-322 + j*(232)
+-136 + j*(179)
+276 + j*(397)
+-436 + j*(24)
+-224 + j*(-35)
+74 + j*(110)
+-414 + j*(-103)
+-369 + j*(513)
+-141 + j*(-160)
+309 + j*(346)
+276 + j*(763)
+-186 + j*(401)
+137 + j*(202)
+179 + j*(272)
+-358 + j*(217)
+109 + j*(330)
+-497 + j*(70)
+-352 + j*(288)
+957 + j*(428)
+136 + j*(149)
+-426 + j*(-522)
+91 + j*(52)
+-378 + j*(150)
+-367 + j*(416)
+130 + j*(123)
+-260 + j*(361)
+-31 + j*(-247)
+346 + j*(-375)
+166 + j*(-52)
+158 + j*(-178)
+-497 + j*(201)
+376 + j*(-266)
+-416 + j*(258)
+-198 + j*(175)
+-107 + j*(-139)
+-255 + j*(77)
+-380 + j*(267)
+-342 + j*(277)
+-279 + j*(-194)
+217 + j*(9)
+65 + j*(-134)
+-23 + j*(-395)
+195 + j*(262)
+86 + j*(-10)
+-37 + j*(278)
+-40 + j*(-135)
+6 + j*(-1)
+144 + j*(163)
+-16 + j*(-21)
+-5 + j*(147)
+-47 + j*(-260)
+-321 + j*(172)
+238 + j*(-30)
+216 + j*(81)
+11 + j*(-53)
+-47 + j*(-23)
+93 + j*(-51)
+-1 + j*(-8)
+-76 + j*(-121)
+-240 + j*(0)
+-38 + j*(-183)
+0 + j*(163)
+234 + j*(-31)
+-15 + j*(244)
+76 + j*(-4)
+-153 + j*(257)
+173 + j*(26)
+-37 + j*(-276)
+-131 + j*(206)
+65 + j*(192)
+278 + j*(-243)
+-161 + j*(-1)
+44 + j*(-173)
+167 + j*(245)
+-102 + j*(122)
+-47 + j*(-253)
+-21 + j*(-165)
+-1 + j*(57)
+10 + j*(-13)
+48 + j*(188)
+-45 + j*(-52)
+-17 + j*(-233)
+32 + j*(-101)
+-295 + j*(-116)
+388 + j*(128)
+-134 + j*(-117)
+-81 + j*(-160)
+-45 + j*(-393)
+72 + j*(-60)
+-24 + j*(-247)
+208 + j*(-424)
+280 + j*(-19)
+-87 + j*(276)
+23 + j*(70)
+88 + j*(-285)
+1 + j*(-189)
+121 + j*(-41)
+-55 + j*(-153)
+-192 + j*(147)
+98 + j*(-22)
+0 + j*(218)
+-347 + j*(138)
+-95 + j*(-165)
+214 + j*(-88)
+-113 + j*(-315)
+-131 + j*(390)
+-264 + j*(144)
+114 + j*(-233)
+-54 + j*(-50)
+-342 + j*(124)
+-173 + j*(-27)
+140 + j*(-115)
+48 + j*(361)
+-327 + j*(187)
+-40 + j*(-163)
+-104 + j*(229)
+144 + j*(-105)
+-83 + j*(-214)
+183 + j*(117)
+-150 + j*(75)
+160 + j*(-52)
+-6 + j*(-65)
+209 + j*(132)
+-195 + j*(275)
+75 + j*(-323)
+-33 + j*(-221)
+92 + j*(-206)
+8 + j*(-38)
+-83 + j*(-167)
+68 + j*(198)
+31 + j*(13)
+-310 + j*(318)
+105 + j*(175)
+5 + j*(-67)
+42 + j*(-11)
+107 + j*(29)
+79 + j*(-83)
+-68 + j*(-226)
+366 + j*(92)
+-146 + j*(172)
+74 + j*(386)
+160 + j*(-37)
+327 + j*(-145)
+-189 + j*(208)
+-25 + j*(-168)
+93 + j*(-51)
+15 + j*(202)
+4 + j*(2)
+37 + j*(152)
+-97 + j*(-64)
+276 + j*(257)
+-67 + j*(-88)
+-58 + j*(-4)
+-297 + j*(242)
+-194 + j*(-285)
+-26 + j*(139)
+-220 + j*(271)
+27 + j*(-36)
+-277 + j*(98)
+182 + j*(-327)
+314 + j*(211)
+-52 + j*(-117)
+-92 + j*(64)
+-197 + j*(-198)
+-291 + j*(16)
+45 + j*(100)
+7 + j*(-226)
+-6 + j*(-90)
+-440 + j*(110)
+-20 + j*(144)
+296 + j*(-84)
+-49 + j*(29)
+-97 + j*(416)
+-202 + j*(-2)
+31 + j*(-51)
+-156 + j*(-209)
+-198 + j*(-40)
+66 + j*(82)
+-215 + j*(378)
+414 + j*(23)
+-291 + j*(122)
+221 + j*(-47)
+-374 + j*(33)
+348 + j*(-216)
+187 + j*(70)
+129 + j*(-145)
+-108 + j*(-35)
+-100 + j*(-327)
+228 + j*(-83)
+334 + j*(107)
+-380 + j*(-332)
+-64 + j*(93)
+177 + j*(-193)
+-50 + j*(-9)
+-325 + j*(152)
+-71 + j*(111)
+291 + j*(-116)
+-158 + j*(229)
+-150 + j*(-164)
+36 + j*(126)
+8 + j*(-73)
+190 + j*(-161)
+-25 + j*(-20)
+130 + j*(99)
+35 + j*(276)
+242 + j*(171)
+-145 + j*(-106)
+103 + j*(-179)
+127 + j*(-1)
+-112 + j*(-151)
+-141 + j*(308)
+199 + j*(-22)
+23 + j*(156)
+-23 + j*(-225)
+-168 + j*(37)
+-245 + j*(83)
+145 + j*(40)
+-308 + j*(-13)
+39 + j*(7)
+16 + j*(-214)
+87 + j*(-40)
+-126 + j*(-33)
+371 + j*(313)
+80 + j*(-34)
+8 + j*(175)
+-110 + j*(368)
+-66 + j*(130)
+124 + j*(-55)
+-166 + j*(-139)
+119 + j*(126)
+-124 + j*(245)
+-150 + j*(110)
+161 + j*(-21)
+52 + j*(-105)
+-98 + j*(27)
+-139 + j*(125)
+38 + j*(76)
+-90 + j*(259)
+-3 + j*(23)
+31 + j*(84)
+292 + j*(-22)
+-146 + j*(505)
+293 + j*(71)
+-9 + j*(198)
+9 + j*(15)
+-60 + j*(-96)
+-231 + j*(241)
+-232 + j*(-240)
+211 + j*(-120)
+-145 + j*(54)
+3 + j*(16)
+-204 + j*(-413)
+-373 + j*(-87)
+-5 + j*(128)
+-222 + j*(-5)
+-42 + j*(-223)
+-224 + j*(33)
+-10 + j*(-8)
+-134 + j*(25)
+-187 + j*(351)
+109 + j*(-105)
+114 + j*(-36)
+-226 + j*(84)
+-168 + j*(-105)
+-91 + j*(-60)
+55 + j*(-227)
+-25 + j*(-95)
+-35 + j*(325)
+59 + j*(-122)
+81 + j*(-134)
+-172 + j*(117)
+-4 + j*(141)
+30 + j*(-124)
+-381 + j*(-111)
+-119 + j*(-175)
+103 + j*(-36)
+-96 + j*(-64)
+197 + j*(-59)
+52 + j*(-100)
+-151 + j*(125)
+-132 + j*(-57)
+-35 + j*(-74)
+52 + j*(-267)
+139 + j*(4)
+-177 + j*(177)
+-141 + j*(-110)
+-64 + j*(372)
+-204 + j*(-33)
+113 + j*(187)
+-123 + j*(91)
+177 + j*(-75)
+56 + j*(-164)
+-342 + j*(178)
+-83 + j*(124)
+71 + j*(-26)
+-179 + j*(76)
+-7 + j*(-199)
+-92 + j*(94)
+67 + j*(-88)
+62 + j*(197)
+144 + j*(223)
+-164 + j*(25)
+148 + j*(-99)
+176 + j*(-33)
+96 + j*(-22)
+4 + j*(-28)
+8 + j*(-88)
+-38 + j*(69)
+20 + j*(27)
+-151 + j*(-105)
+46 + j*(279)
+-182 + j*(-129)
+187 + j*(-45)
+125 + j*(41)
+-105 + j*(260)
+139 + j*(-175)
+197 + j*(62)
+-47 + j*(-6)
+8 + j*(-264)
+145 + j*(-122)
+-71 + j*(-253)
+-63 + j*(233)
+121 + j*(-4)
+-58 + j*(111)
+358 + j*(151)
+-23 + j*(-28)
+11 + j*(-8)
+11 + j*(26)
+-92 + j*(-46)
+-100 + j*(336)
+-50 + j*(31)
+-165 + j*(-91)
+116 + j*(-206)
+65 + j*(272)
+-177 + j*(163)
+-134 + j*(44)
+194 + j*(84)
+214 + j*(-51)
+-225 + j*(210)
+88 + j*(158)
+120 + j*(-69)
+111 + j*(115)
+139 + j*(205)
+329 + j*(-174)
+47 + j*(82)
+-327 + j*(-317)
+37 + j*(154)
+84 + j*(14)
+84 + j*(-11)
+221 + j*(155)
+-364 + j*(194)
+113 + j*(43)
+4 + j*(21)
+-107 + j*(-91)
+-89 + j*(26)
+-249 + j*(-27)
+23 + j*(132)
+127 + j*(-84)
+-12 + j*(-115)
+-71 + j*(-11)
+-30 + j*(-1)
+-172 + j*(138)
+335 + j*(131)
+-389 + j*(-301)
+-227 + j*(-21)
+31 + j*(-216)
+-5 + j*(-132)
+-144 + j*(-299)
+-165 + j*(228)
+3 + j*(-140)
+-32 + j*(64)
+-133 + j*(62)
+-59 + j*(-167)
+-209 + j*(-176)
+313 + j*(-33)
+-28 + j*(137)
+184 + j*(219)
+-16 + j*(294)
+-196 + j*(-70)
+-86 + j*(38)
+-75 + j*(-91)
+356 + j*(226)
+-60 + j*(390)
+22 + j*(-121)
+90 + j*(76)
+-141 + j*(-10)
+87 + j*(57)
+-245 + j*(-4)
+88 + j*(-81)
+-40 + j*(148)
+-1 + j*(209)
+216 + j*(24)
+26 + j*(13)
+-249 + j*(45)
+251 + j*(-110)
+-366 + j*(-232)
+13 + j*(130)
+17 + j*(271)
+-126 + j*(-201)
+-52 + j*(-122)
+102 + j*(-264)
+74 + j*(206)
+317 + j*(-79)
+122 + j*(13)
+186 + j*(132)
+-86 + j*(-180)
+-253 + j*(-194)
+86 + j*(-68)
+-88 + j*(-161)
+159 + j*(-275)
+146 + j*(-74)
+-85 + j*(-33)
+-16 + j*(-133)
+-136 + j*(-61)
+-112 + j*(-103)
+-156 + j*(57)
+43 + j*(-80)
+58 + j*(193)
+-187 + j*(-203)
+197 + j*(191)
+277 + j*(26)
+4 + j*(-117)
+-81 + j*(182)
+-8 + j*(-11)
+54 + j*(-61)
+-351 + j*(64)
+-178 + j*(-216)
+-4 + j*(-388)
+-141 + j*(91)
+-140 + j*(-93)
+33 + j*(197)
+63 + j*(-147)
+17 + j*(132)
+10 + j*(127)
+-253 + j*(192)
+-36 + j*(107)
+125 + j*(-66)
+-131 + j*(-82)
+-250 + j*(-14)
+-285 + j*(5)
+119 + j*(-23)
+28 + j*(253)
+-49 + j*(330)
+73 + j*(24)
+82 + j*(40)
+4 + j*(179)
+44 + j*(-324)
+-77 + j*(64)
+-16 + j*(-161)
+181 + j*(-55)
+-248 + j*(-226)
+-185 + j*(130)
+108 + j*(110)
+-337 + j*(-95)
+117 + j*(-192)
+-18 + j*(104)
+185 + j*(204)
+-106 + j*(28)
+-400 + j*(57)
+-91 + j*(47)
+-243 + j*(-143)
+-141 + j*(37)
+216 + j*(79)
+-63 + j*(23)
+1 + j*(-54)
+-258 + j*(254)
+-26 + j*(-60)
+203 + j*(132)
+260 + j*(57)
+-13 + j*(209)
+46 + j*(-156)
+55 + j*(294)
+-322 + j*(-226)
+101 + j*(118)
+163 + j*(-56)
+189 + j*(-47)
+209 + j*(-12)
+140 + j*(146)
+-81 + j*(282)
+-238 + j*(20)
+-152 + j*(180)
+-140 + j*(-190)
+146 + j*(-109)
+-63 + j*(-105)
+49 + j*(6)
+-37 + j*(-4)
+25 + j*(-124)
+21 + j*(-45)
+214 + j*(209)
+6 + j*(-68)
+-174 + j*(189)
+79 + j*(-70)
+103 + j*(167)
+-227 + j*(171)
+-139 + j*(-351)
+245 + j*(-18)
+-17 + j*(325)
+-490 + j*(-99)
+301 + j*(81)
+218 + j*(-4)
+32 + j*(-16)
+274 + j*(-51)
+-122 + j*(21)
+95 + j*(7)
+295 + j*(-64)
+-18 + j*(245)
+-122 + j*(47)
+86 + j*(7)
+122 + j*(-269)
+35 + j*(-125)
+29 + j*(34)
+187 + j*(53)
+-205 + j*(-129)
+-29 + j*(264)
+93 + j*(-149)
+-36 + j*(-107)
+-225 + j*(255)
+371 + j*(-177)
+-142 + j*(11)
+-230 + j*(217)
+-100 + j*(-18)
+40 + j*(163)
+-57 + j*(-83)
+-293 + j*(316)
+-86 + j*(-52)
+111 + j*(21)
+-91 + j*(-33)
+-121 + j*(-47)
+-133 + j*(-12)
+-7 + j*(124)
+-154 + j*(-30)
+-74 + j*(-225)
+14 + j*(-54)
+-176 + j*(252)
+-217 + j*(-202)
+65 + j*(-130)
+144 + j*(192)
+209 + j*(-108)
+11 + j*(264)
+-10 + j*(-170)
+-9 + j*(-129)
+-90 + j*(-147)
+108 + j*(44)
+-19 + j*(99)
+-256 + j*(53)
+301 + j*(-249)
+-164 + j*(124)
+-231 + j*(-234)
+-64 + j*(-274)
+-40 + j*(28)
+54 + j*(-162)
+99 + j*(72)
+78 + j*(135)
+-120 + j*(165)
+123 + j*(-209)
+-23 + j*(306)
+-133 + j*(-216)
+-35 + j*(121)
+260 + j*(264)
+134 + j*(25)
+-32 + j*(255)
+-245 + j*(-106)
+-35 + j*(-74)
+192 + j*(-317)
+-175 + j*(286)
+-25 + j*(-154)
+-146 + j*(29)
+40 + j*(181)
+-10 + j*(119)
+-47 + j*(-151)
+161 + j*(105)
+205 + j*(-194)
+-270 + j*(28)
+-18 + j*(1)
+-131 + j*(125)
+176 + j*(-149)
+21 + j*(80)
+13 + j*(-211)
+-273 + j*(123)
+-182 + j*(176)
+-247 + j*(87)
+72 + j*(141)
+-78 + j*(-149)
+-96 + j*(158)
+-235 + j*(-231)
+-2 + j*(194)
+44 + j*(192)
+-6 + j*(-80)
+37 + j*(-110)
+-148 + j*(-328)
+-267 + j*(251)
+168 + j*(175)
+97 + j*(30)
+-54 + j*(-40)
+-168 + j*(89)
+-72 + j*(-33)
+-68 + j*(-249)
+-100 + j*(48)
+64 + j*(-49)
+-161 + j*(150)
+31 + j*(137)
+27 + j*(-29)
+243 + j*(28)
+-22 + j*(-22)
+94 + j*(22)
+-238 + j*(-66)
+-6 + j*(-87)
+-109 + j*(99)
+184 + j*(204)
+-250 + j*(-3)
+263 + j*(-223)
+-428 + j*(-54)
+155 + j*(-169)
+43 + j*(-285)
+-182 + j*(-257)
+71 + j*(-199)
+37 + j*(-130)
+51 + j*(41)
+-75 + j*(-66)
+-95 + j*(105)
+33 + j*(-125)
+-195 + j*(-38)
+281 + j*(-226)
+-16 + j*(-185)
+85 + j*(64)
+-13 + j*(-259)
+25 + j*(-330)
+342 + j*(218)
+91 + j*(331)
+-245 + j*(-42)
+-240 + j*(224)
+-66 + j*(-228)
+-37 + j*(182)
+128 + j*(214)
+109 + j*(129)
+-244 + j*(135)
+237 + j*(178)
+-14 + j*(-62)
+-26 + j*(11)
+-275 + j*(-257)
+99 + j*(-284)
+97 + j*(501)
+-361 + j*(-166)
+-69 + j*(96)
+-25 + j*(-182)
+227 + j*(94)
+157 + j*(445)
+-29 + j*(-144)
+368 + j*(-150)
+40 + j*(-45)
+-46 + j*(143)
+56 + j*(-343)
+-4 + j*(62)
+272 + j*(-117)
+-291 + j*(83)
+-387 + j*(111)
+-93 + j*(-18)
+250 + j*(-13)
+-193 + j*(48)
+59 + j*(706)
+264 + j*(228)
+33 + j*(-315)
+404 + j*(-147)
+-79 + j*(1)
+-296 + j*(-135)
+-250 + j*(-423)
+36 + j*(27)
+64 + j*(-75)
+-195 + j*(-198)
+-51 + j*(-132)
+-103 + j*(204)
+261 + j*(-173)
+44 + j*(-41)
+-77 + j*(55)
+-18 + j*(-163)
+-241 + j*(106)
+76 + j*(-120)
+346 + j*(323)
+-168 + j*(-142)
+83 + j*(-60)
+30 + j*(262)
+250 + j*(-2)
+-146 + j*(-236)
+-66 + j*(-267)
+-28 + j*(-10)
+-58 + j*(-90)
+139 + j*(-92)
+143 + j*(105)
+-192 + j*(525)
+119 + j*(158)
+15 + j*(-111)
+25 + j*(-11)
+-103 + j*(144)
+-283 + j*(-173)
+356 + j*(-98)
+-53 + j*(274)
+-1 + j*(94)
+204 + j*(91)
+127 + j*(-239)
+-121 + j*(62)
+-2 + j*(145)
+134 + j*(-30)
+-77 + j*(320)
+148 + j*(27)
+-372 + j*(-130)
+274 + j*(8)
+71 + j*(-80)
+333 + j*(-121)
+-292 + j*(-135)
+205 + j*(479)
+-37 + j*(-227)
+62 + j*(61)
+83 + j*(-158)
+279 + j*(-41)
+31 + j*(132)
+-54 + j*(472)
+-214 + j*(261)
+148 + j*(-199)
+73 + j*(499)
+78 + j*(-23)
+108 + j*(-213)
+25 + j*(-210)
+12 + j*(315)
+-42 + j*(63)
+-86 + j*(119)
+76 + j*(246)
+211 + j*(-351)
+-42 + j*(-95)
+-47 + j*(156)
+37 + j*(144)
+-249 + j*(-69)
+-274 + j*(-139)
+110 + j*(-13)
+-269 + j*(21)
+173 + j*(-42)
+55 + j*(110)
+-130 + j*(-165)
+-187 + j*(-255)
+-53 + j*(-127)
+262 + j*(-6)
+16 + j*(28)
+-292 + j*(-63)
+-219 + j*(-310)
+-93 + j*(404)
+-34 + j*(60)
+78 + j*(-91)
+-74 + j*(146)
+-162 + j*(-143)
+-127 + j*(64)
+400 + j*(-46)
+-81 + j*(373)
+408 + j*(-136)
+-45 + j*(13)
+-161 + j*(-119)
+39 + j*(310)
+50 + j*(-281)
+-64 + j*(4)
+305 + j*(69)
+-59 + j*(45)
+-137 + j*(416)
+56 + j*(-198)
+273 + j*(-237)
+141 + j*(173)
+18 + j*(-60)
+-41 + j*(225)
+236 + j*(297)
+80 + j*(18)
+-388 + j*(277)
+180 + j*(-110)
+-67 + j*(-74)
+-215 + j*(-148)
+8 + j*(242)
+-293 + j*(-219)
+-88 + j*(81)
+117 + j*(-18)
+78 + j*(-66)
+-80 + j*(-532)
+141 + j*(21)
+-211 + j*(-342)
+-204 + j*(-96)
+-131 + j*(-108)
+124 + j*(-298)
+43 + j*(-57)
+13 + j*(220)
+206 + j*(33)
+43 + j*(-93)
+-8 + j*(-59)
+300 + j*(-127)
+-181 + j*(218)
+110 + j*(-66)
+148 + j*(372)
+-188 + j*(66)
+28 + j*(-363)
+-211 + j*(37)
+110 + j*(22)
+-132 + j*(110)
+-122 + j*(-109)
+-124 + j*(241)
+-132 + j*(8)
+-109 + j*(-1)
+-186 + j*(-119)
+-202 + j*(-288)
+-29 + j*(143)
+115 + j*(-307)
+-51 + j*(-297)
+-89 + j*(-169)
+26 + j*(299)
+66 + j*(76)
+-62 + j*(133)
+-110 + j*(-276)
+410 + j*(-174)
+-315 + j*(-66)
+-5 + j*(165)
+175 + j*(-115)
+-167 + j*(-226)
+-148 + j*(273)
+197 + j*(-184)
+-124 + j*(159)
+285 + j*(-25)
+221 + j*(13)
+102 + j*(-86)
+56 + j*(183)
+-1 + j*(-25)
+71 + j*(-21)
+-281 + j*(156)
+-62 + j*(40)
+-3 + j*(153)
+159 + j*(323)
+-15 + j*(173)
+-105 + j*(-136)
+1 + j*(25)
+7 + j*(154)
+-380 + j*(-333)
+-211 + j*(293)
+11 + j*(-76)
+-137 + j*(-161)
+44 + j*(-180)
+378 + j*(-2)
+322 + j*(-284)
+217 + j*(34)
+107 + j*(161)
+-20 + j*(156)
+36 + j*(-98)
+-142 + j*(11)
+117 + j*(105)
+51 + j*(-16)
+253 + j*(-144)
+-33 + j*(-183)
+-190 + j*(-316)
+-55 + j*(207)
+-121 + j*(440)
+-301 + j*(-78)
+-73 + j*(-63)
+95 + j*(-9)
+-110 + j*(196)
+329 + j*(-70)
+-90 + j*(34)
+-246 + j*(177)
+-52 + j*(-62)
+40 + j*(-156)
+13 + j*(67)
+-311 + j*(129)
+101 + j*(88)
+-107 + j*(107)
+-245 + j*(-196)
+-18 + j*(216)
+126 + j*(161)
+-21 + j*(194)
+-64 + j*(-221)
+40 + j*(-85)
+107 + j*(168)
+24 + j*(84)
+-122 + j*(15)
+-183 + j*(-73)
+133 + j*(-38)
+-105 + j*(37)
+-154 + j*(35)
+100 + j*(150)
+500 + j*(-12)
+115 + j*(4)
+290 + j*(41)
+243 + j*(-122)
+-17 + j*(-80)
+49 + j*(-163)
+-144 + j*(-378)
+-375 + j*(-136)
+35 + j*(-108)
+-19 + j*(-320)
+-138 + j*(-10)
+169 + j*(-57)
+-212 + j*(114)
+375 + j*(-63)
+-171 + j*(117)
+205 + j*(-184)
+-233 + j*(77)
+74 + j*(-168)
+-19 + j*(142)
+-77 + j*(124)
+-53 + j*(-18)
+51 + j*(-360)
+-148 + j*(-2)
+226 + j*(-23)
+61 + j*(-165)
+-67 + j*(-58)
+278 + j*(-44)
+412 + j*(-89)
+-74 + j*(-80)
+-32 + j*(151)
+-106 + j*(226)
+190 + j*(-121)
+-247 + j*(-198)
+36 + j*(-45)
+-82 + j*(311)
+115 + j*(1)
+-379 + j*(4)
+172 + j*(38)
+-187 + j*(134)
+-156 + j*(-50)
+-126 + j*(-186)
+-20 + j*(-57)
+312 + j*(-151)
+-218 + j*(180)
+-42 + j*(-283)
+-98 + j*(112)
+145 + j*(57)
+21 + j*(-140)
+223 + j*(119)
+71 + j*(-245)
+134 + j*(243)
+-80 + j*(252)
+-33 + j*(-303)
+-5 + j*(84)
+-161 + j*(-120)
+-268 + j*(-303)
+-62 + j*(-187)
+-151 + j*(-25)
+164 + j*(-359)
+-130 + j*(293)
+-35 + j*(-424)
+-359 + j*(368)
+79 + j*(235)
+344 + j*(-23)
+-98 + j*(-108)
+157 + j*(221)
+-342 + j*(-91)
+35 + j*(-46)
+-111 + j*(-6)
+119 + j*(-21)
+-146 + j*(144)
+167 + j*(36)
+-347 + j*(-155)
+238 + j*(4)
+37 + j*(249)
+-159 + j*(-104)
+-79 + j*(348)
+58 + j*(199)
+-2 + j*(-211)
+347 + j*(73)
+28 + j*(-163)
+-150 + j*(143)
+-34 + j*(-91)
+-53 + j*(390)
+-163 + j*(135)
+-274 + j*(-153)
+69 + j*(194)
+131 + j*(-263)
+-412 + j*(177)
+-86 + j*(-347)
+52 + j*(-134)
+264 + j*(84)
+91 + j*(161)
+-64 + j*(-158)
+-34 + j*(-561)
+-90 + j*(-67)
+-67 + j*(-100)
+117 + j*(-13)
+16 + j*(-20)
+144 + j*(128)
+378 + j*(86)
+96 + j*(-165)
+-218 + j*(-17)
+78 + j*(281)
+221 + j*(-293)
+161 + j*(257)
+170 + j*(98)
+-197 + j*(82)
+-374 + j*(211)
+331 + j*(-194)
+166 + j*(-191)
+233 + j*(-141)
+21 + j*(-85)
+-260 + j*(20)
+-378 + j*(212)
+54 + j*(337)
+217 + j*(342)
+85 + j*(87)
+-145 + j*(105)
+310 + j*(152)
+-69 + j*(137)
+138 + j*(-73)
+-54 + j*(-25)
+-87 + j*(-16)
+133 + j*(-134)
+137 + j*(-126)
+133 + j*(34)
+-137 + j*(7)
+325 + j*(0)
+-141 + j*(185)
+89 + j*(-3)
+-195 + j*(-91)
+137 + j*(121)
+-211 + j*(-122)
+-57 + j*(88)
+-246 + j*(-217)
+130 + j*(-260)
+-226 + j*(-54)
+-120 + j*(-135)
+332 + j*(-94)
+-28 + j*(-57)
+274 + j*(91)
+49 + j*(-37)
+173 + j*(119)
+141 + j*(46)
+-79 + j*(-44)
+95 + j*(-190)
+-48 + j*(-25)
+-94 + j*(-227)
+-261 + j*(-165)
+-60 + j*(87)
+-52 + j*(93)
+-146 + j*(-202)
+24 + j*(-27)
+110 + j*(-47)
+-88 + j*(-157)
+-37 + j*(305)
+-108 + j*(11)
+-304 + j*(-94)
+0 + j*(86)
+308 + j*(91)
+-243 + j*(121)
+156 + j*(-95)
+59 + j*(-81)
+-126 + j*(138)
+177 + j*(32)
+-28 + j*(-145)
+140 + j*(306)
+44 + j*(-207)
+4 + j*(-25)
+69 + j*(91)
+-279 + j*(-240)
+-209 + j*(-70)
+-236 + j*(-49)
+-266 + j*(119)
+-29 + j*(40)
+246 + j*(-281)
+-91 + j*(170)
+-66 + j*(-84)
+257 + j*(-77)
+169 + j*(205)
+-49 + j*(-64)
+129 + j*(235)
+153 + j*(-272)
+25 + j*(167)
+45 + j*(-199)
+160 + j*(-20)
+-114 + j*(139)
+-255 + j*(-46)
+276 + j*(-267)
+145 + j*(72)
+52 + j*(-160)
+-346 + j*(13)
+-107 + j*(203)
+-278 + j*(286)
+-279 + j*(300)
+-83 + j*(-110)
+40 + j*(69)
+77 + j*(-233)
+177 + j*(55)
+135 + j*(-241)
+25 + j*(30)
+100 + j*(81)
+293 + j*(-232)
+-99 + j*(206)
+-428 + j*(232)
+135 + j*(-12)
+227 + j*(-14)
+64 + j*(-328)
+45 + j*(-37)
+-197 + j*(-253)
+126 + j*(103)
+113 + j*(4)
+-6 + j*(-86)
+11 + j*(130)
+45 + j*(-115)
+3 + j*(141)
+-295 + j*(228)
+-132 + j*(-34)
+328 + j*(7)
+-10 + j*(-414)
+174 + j*(145)
+108 + j*(-86)
+-244 + j*(10)
+-16 + j*(-123)
+-77 + j*(-84)
+98 + j*(-405)
+131 + j*(-130)
+-358 + j*(276)
+-59 + j*(-46)
+-523 + j*(75)
+-109 + j*(-81)
+-3 + j*(47)
+197 + j*(207)
+180 + j*(-38)
+286 + j*(20)
+-299 + j*(-468)
+107 + j*(-59)
+-273 + j*(-121)
+-14 + j*(-8)
+-58 + j*(-18)
+123 + j*(266)
+82 + j*(91)
+-117 + j*(70)
+328 + j*(213)
+165 + j*(-51)
+234 + j*(-64)
+192 + j*(-102)
+25 + j*(81)
+-20 + j*(30)
+54 + j*(-132)
+-57 + j*(91)
+6 + j*(101)
+-6 + j*(66)
+101 + j*(-100)
+95 + j*(49)
+160 + j*(272)
+173 + j*(-262)
+134 + j*(106)
+-59 + j*(9)
+287 + j*(259)
+-105 + j*(-248)
+-156 + j*(-380)
+-287 + j*(141)
+-98 + j*(-66)
+16 + j*(52)
+63 + j*(103)
+35 + j*(128)
+-104 + j*(-173)
+86 + j*(226)
+33 + j*(92)
+149 + j*(49)
+77 + j*(-76)
+-126 + j*(23)
+-417 + j*(13)
+-241 + j*(152)
+-30 + j*(-218)
+-176 + j*(-159)
+93 + j*(105)
+150 + j*(79)
+163 + j*(66)
+209 + j*(27)
+21 + j*(-233)
+-144 + j*(16)
+130 + j*(16)
+322 + j*(192)
+-192 + j*(50)
+230 + j*(-177)
+98 + j*(-100)
+-127 + j*(-187)
+-153 + j*(33)
+246 + j*(-37)
+147 + j*(-141)
+-211 + j*(202)
+265 + j*(177)
+137 + j*(43)
+538 + j*(218)
+-583 + j*(125)
+52 + j*(42)
+165 + j*(-288)
+-336 + j*(368)
+175 + j*(-170)
+-441 + j*(240)
+149 + j*(129)
+-235 + j*(148)
+-38 + j*(-30)
+-76 + j*(-467)
+213 + j*(-158)
+16 + j*(-30)
+-51 + j*(-43)
+-37 + j*(202)
+16 + j*(-47)
+199 + j*(-107)
+-161 + j*(105)
+-114 + j*(175)
+-57 + j*(-124)
+13 + j*(-55)
+148 + j*(-185)
+-76 + j*(-110)
+-127 + j*(95)
+629 + j*(323)
+75 + j*(-234)
+-103 + j*(-122)
+88 + j*(-91)
+-88 + j*(-165)
+-19 + j*(47)
+-55 + j*(197)
+-31 + j*(-1)
+-206 + j*(52)
+-128 + j*(108)
+218 + j*(58)
+-254 + j*(-185)
+-171 + j*(-105)
+54 + j*(161)
+31 + j*(41)
+-173 + j*(210)
+-4 + j*(45)
+-276 + j*(33)
+-270 + j*(92)
+136 + j*(-105)
+71 + j*(-156)
+21 + j*(298)
+-134 + j*(284)
+138 + j*(8)
+-62 + j*(483)
+-495 + j*(62)
+-231 + j*(-243)
+-231 + j*(139)
+117 + j*(56)
+-121 + j*(-21)
+-205 + j*(-68)
+46 + j*(-148)
+272 + j*(-71)
+22 + j*(-134)
+-88 + j*(170)
+227 + j*(-7)
+194 + j*(-216)
+-105 + j*(-83)
+35 + j*(-38)
+-62 + j*(-11)
+-25 + j*(-57)
+-165 + j*(334)
+59 + j*(-33)
+-66 + j*(54)
+40 + j*(-2)
+-113 + j*(87)
+61 + j*(-245)
+47 + j*(-117)
+71 + j*(-265)
+177 + j*(298)
+28 + j*(-226)
+255 + j*(-117)
+91 + j*(-88)
+-136 + j*(-4)
+122 + j*(162)
+-66 + j*(156)
+-35 + j*(190)
+112 + j*(233)
+37 + j*(-218)
+-210 + j*(136)
+-117 + j*(199)
+-121 + j*(21)
+21 + j*(42)
+-133 + j*(-1)
+261 + j*(67)
+274 + j*(-211)
+117 + j*(109)
+-59 + j*(-67)
+-262 + j*(-350)
+49 + j*(29)
+-164 + j*(-71)
+-7 + j*(148)
+-145 + j*(-25)
+110 + j*(66)
+-63 + j*(-243)
+45 + j*(371)
+70 + j*(111)
+-69 + j*(-186)
+170 + j*(-42)
+7 + j*(18)
+-207 + j*(-57)
+52 + j*(-413)
+198 + j*(303)
+42 + j*(-6)
+162 + j*(131)
+-103 + j*(-41)
+-161 + j*(75)
+-18 + j*(137)
+63 + j*(192)
+317 + j*(201)
+-246 + j*(-300)
+81 + j*(194)
+410 + j*(-223)
+168 + j*(109)
+-35 + j*(-319)
+-192 + j*(-197)
+-59 + j*(293)
+-138 + j*(-165)
+-124 + j*(-127)
+161 + j*(-1)
+-225 + j*(252)
+1 + j*(6)
+66 + j*(-69)
+-95 + j*(33)
+33 + j*(-151)
+-37 + j*(332)
+38 + j*(-76)
+113 + j*(-186)
+-132 + j*(-240)
+-67 + j*(125)
+-87 + j*(-121)
+-51 + j*(11)
+436 + j*(-5)
+5 + j*(4)
+319 + j*(-137)
+26 + j*(-105)
+-58 + j*(251)
+49 + j*(-78)
+-159 + j*(-67)
+82 + j*(177)
+-57 + j*(-229)
+150 + j*(54)
+39 + j*(-21)
+23 + j*(-116)
+83 + j*(154)
+-116 + j*(-146)
+35 + j*(35)
+129 + j*(66)
+-139 + j*(-21)
+-247 + j*(-43)
+66 + j*(201)
+-48 + j*(-122)
+115 + j*(-10)
+59 + j*(-78)
+-135 + j*(325)
+186 + j*(94)
+321 + j*(64)
+-243 + j*(-163)
+-21 + j*(219)
+92 + j*(18)
+-138 + j*(-308)
+116 + j*(-98)
+-293 + j*(-9)
+-483 + j*(-84)
+-51 + j*(99)
+-34 + j*(-354)
+44 + j*(124)
+-294 + j*(-137)
+-216 + j*(-135)
+122 + j*(-151)
+-213 + j*(-472)
+-165 + j*(134)
+184 + j*(-23)
+-178 + j*(-216)
+71 + j*(-120)
+35 + j*(107)
+-88 + j*(115)
+394 + j*(-350)
+261 + j*(-11)
+18 + j*(69)
+94 + j*(-419)
+57 + j*(-196)
+-62 + j*(-337)
+-86 + j*(-111)
+-284 + j*(-116)
+-260 + j*(-87)
+-50 + j*(-44)
+266 + j*(117)
+37 + j*(-122)
+-249 + j*(80)
+59 + j*(108)
+151 + j*(-60)
+-13 + j*(60)
+44 + j*(18)
+233 + j*(108)
+305 + j*(-136)
+-246 + j*(-6)
+-122 + j*(-25)
+-132 + j*(-170)
+-2 + j*(34)
+93 + j*(-3)
+-87 + j*(93)
+190 + j*(16)
+192 + j*(314)
+122 + j*(184)
+185 + j*(272)
+-151 + j*(-226)
+58 + j*(181)
+-39 + j*(-141)
+-36 + j*(-188)
+-96 + j*(158)
+-15 + j*(-67)
+-89 + j*(-180)
+225 + j*(-103)
+233 + j*(-173)
+169 + j*(-23)
+-7 + j*(-106)
+165 + j*(-170)
+-112 + j*(-73)
+-428 + j*(-307)
+-46 + j*(458)
+235 + j*(-32)
+255 + j*(268)
+117 + j*(-291)
+45 + j*(99)
+-194 + j*(-226)
+103 + j*(-133)
+107 + j*(-172)
+-18 + j*(-30)
+-3 + j*(-140)
+-146 + j*(-248)
+127 + j*(12)
+-25 + j*(158)
+199 + j*(170)
+334 + j*(103)
+38 + j*(218)
+-57 + j*(270)
+-229 + j*(6)
+-359 + j*(288)
+100 + j*(107)
+168 + j*(-62)
+127 + j*(-205)
+-25 + j*(-194)
+60 + j*(-344)
+-257 + j*(-204)
+205 + j*(47)
+63 + j*(6)
+286 + j*(-307)
+190 + j*(46)
+-404 + j*(24)
+117 + j*(74)
+17 + j*(-186)
+-358 + j*(70)
+-447 + j*(50)
+317 + j*(-105)
+-300 + j*(-24)
+-170 + j*(-203)
+-18 + j*(-217)
+401 + j*(59)
+-368 + j*(74)
+227 + j*(-190)
+150 + j*(6)
+431 + j*(-158)
+251 + j*(-187)
+-59 + j*(-158)
+-281 + j*(-172)
+-202 + j*(-277)
+226 + j*(-39)
+-74 + j*(-202)
+32 + j*(257)
+-249 + j*(-104)
+-342 + j*(18)
+-42 + j*(276)
+20 + j*(-174)
+-58 + j*(55)
+107 + j*(13)
+62 + j*(110)
+-88 + j*(-8)
+-53 + j*(105)
+-98 + j*(-82)
+40 + j*(-269)
+-168 + j*(146)
+-91 + j*(-114)
+-34 + j*(-367)
+-131 + j*(29)
+-137 + j*(58)
+-79 + j*(-44)
+-255 + j*(-166)
+-56 + j*(-137)
+-202 + j*(-279)
+63 + j*(21)
+383 + j*(-27)
+19 + j*(252)
+28 + j*(-19)
+-69 + j*(16)
+-136 + j*(275)
+395 + j*(-137)
+107 + j*(351)
+-59 + j*(279)
+-196 + j*(-284)
+165 + j*(45)
+68 + j*(-99)
+404 + j*(303)
+-238 + j*(-18)
+245 + j*(-265)
+59 + j*(303)
+-35 + j*(-162)
+-453 + j*(-248)
+-334 + j*(163)
+-344 + j*(474)
+6 + j*(-3)
+-201 + j*(269)
+134 + j*(-625)
+441 + j*(165)
+89 + j*(-500)
+170 + j*(475)
+499 + j*(38)
+-637 + j*(-19)
+-191 + j*(444)
+-91 + j*(369)
+129 + j*(270)
+103 + j*(112)
+-11 + j*(255)
+452 + j*(323)
+-325 + j*(-290)
+485 + j*(-310)
+238 + j*(-470)
+-148 + j*(-462)
+-323 + j*(-13)
+175 + j*(-445)
+381 + j*(-290)
+-479 + j*(-116)
+-348 + j*(245)
+274 + j*(356)
+54 + j*(233)
+29 + j*(-153)
+556 + j*(420)
+88 + j*(27)
+-383 + j*(83)
+-45 + j*(606)
+44 + j*(245)
+-272 + j*(-347)
+-452 + j*(-182)
+35 + j*(165)
+179 + j*(-366)
+-275 + j*(280)
+294 + j*(-340)
+-371 + j*(200)
+-260 + j*(410)
+210 + j*(-378)
+-54 + j*(371)
+276 + j*(352)
+524 + j*(361)
+228 + j*(-63)
+-296 + j*(-247)
+590 + j*(-115)
+-23 + j*(234)
+71 + j*(255)
+-517 + j*(-235)
+75 + j*(450)
+89 + j*(-307)
+180 + j*(313)
+247 + j*(448)
+197 + j*(98)
+163 + j*(160)
+-272 + j*(182)
+177 + j*(35)
+-397 + j*(201)
+-122 + j*(-438)
+-453 + j*(-634)
+-269 + j*(-228)
+-167 + j*(-662)
+262 + j*(-260)
+95 + j*(225)
+477 + j*(356)
+-121 + j*(216)
+77 + j*(161)
+-372 + j*(-286)
+-375 + j*(-124)
+-553 + j*(269)
+-320 + j*(-297)
+158 + j*(-262)
+456 + j*(-231)
+-440 + j*(-190)
+-234 + j*(182)
+47 + j*(269)
+122 + j*(54)
+-106 + j*(409)
+-245 + j*(228)
+-1 + j*(196)
+-120 + j*(-257)
+-173 + j*(80)
+-477 + j*(-206)
+83 + j*(472)
+-611 + j*(176)
+47 + j*(239)
+-474 + j*(89)
+606 + j*(251)
+-338 + j*(451)
+176 + j*(-199)
+-354 + j*(-397)
+-89 + j*(-178)
+124 + j*(-152)
+172 + j*(199)
+-367 + j*(-373)
+461 + j*(-211)
+341 + j*(63)
+8 + j*(172)
+-398 + j*(109)
+6 + j*(132)
+422 + j*(139)
+-229 + j*(-193)
+-118 + j*(163)
+-74 + j*(105)
+-80 + j*(199)
+622 + j*(-87)
+206 + j*(-106)
+62 + j*(117)
+-354 + j*(235)
+-129 + j*(-91)
+413 + j*(430)
+-419 + j*(107)
+236 + j*(187)
+-494 + j*(-507)
+-118 + j*(340)
+-25 + j*(335)
+528 + j*(-308)
+-499 + j*(-47)
+-11 + j*(95)
+-275 + j*(259)
+-395 + j*(128)
+35 + j*(264)
+-16 + j*(-187)
+127 + j*(-355)
+358 + j*(323)
+517 + j*(13)
+-177 + j*(7)
+-335 + j*(-337)
+-570 + j*(210)
+290 + j*(183)
+-529 + j*(-514)
+-87 + j*(272)
+-121 + j*(298)
+-682 + j*(-194)
+-99 + j*(228)
+-216 + j*(-336)
+433 + j*(-46)
+-585 + j*(-307)
+-225 + j*(136)
+-92 + j*(-79)
+-38 + j*(413)
+-22 + j*(201)
+272 + j*(311)
+258 + j*(67)
+19 + j*(-434)
+417 + j*(343)
+-291 + j*(145)
+-197 + j*(173)
+539 + j*(430)
+-530 + j*(-280)
+-69 + j*(276)
+-442 + j*(71)
+-363 + j*(-136)
+-390 + j*(245)
+-186 + j*(326)
+426 + j*(217)
+83 + j*(467)
+-613 + j*(281)
+146 + j*(-255)
+37 + j*(-203)
+-504 + j*(49)
+-48 + j*(-541)
+165 + j*(33)
+-302 + j*(296)
+-528 + j*(73)
+-281 + j*(-112)
+455 + j*(547)
+245 + j*(-219)
+-552 + j*(-479)
+-163 + j*(-419)
+235 + j*(424)
+-527 + j*(240)
+25 + j*(-750)
+-203 + j*(-203)
+-205 + j*(-281)
+-88 + j*(88)
+353 + j*(597)
+362 + j*(287)
+-308 + j*(175)
+569 + j*(180)
+421 + j*(-441)
+-382 + j*(76)
+-40 + j*(180)
+-81 + j*(235)
+-308 + j*(169)
+364 + j*(-674)
+-218 + j*(49)
+437 + j*(369)
+251 + j*(-216)
+395 + j*(-381)
+-255 + j*(113)
+-411 + j*(300)
+-109 + j*(83)
+-132 + j*(512)
+194 + j*(336)
+-83 + j*(283)
+340 + j*(-88)
+47 + j*(156)
+-71 + j*(293)
+467 + j*(389)
+269 + j*(-11)
+-188 + j*(-217)
+-266 + j*(220)
+-368 + j*(402)
+-394 + j*(153)
+-148 + j*(-221)
+132 + j*(-19)
+284 + j*(-238)
+-255 + j*(-104)
+-399 + j*(-474)
+-693 + j*(211)
+-318 + j*(97)
+-568 + j*(-313)
+206 + j*(10)
+339 + j*(-526)
+-535 + j*(-288)
+-4 + j*(-254)
+537 + j*(140)
+-313 + j*(377)
+59 + j*(164)
+257 + j*(258)
+387 + j*(-396)
+252 + j*(650)
+144 + j*(-562)
+-56 + j*(-597)
+-163 + j*(377)
+-89 + j*(488)
+-245 + j*(-170)
+-94 + j*(-573)
+-248 + j*(374)
+327 + j*(-499)
+-438 + j*(89)
+228 + j*(-331)
+40 + j*(-243)
+205 + j*(320)
+-280 + j*(-1)
+380 + j*(-342)
+-539 + j*(176)
+37 + j*(-398)
+-567 + j*(474)
+-322 + j*(319)
+118 + j*(222)
+-317 + j*(-47)
+304 + j*(-267)
+355 + j*(-300)
+146 + j*(256)
+-330 + j*(-215)
+23 + j*(435)
+354 + j*(83)
+231 + j*(90)
+152 + j*(-227)
+-246 + j*(262)
+-451 + j*(341)
+-208 + j*(-239)
+256 + j*(-187)
+-474 + j*(-392)
+293 + j*(-143)
+397 + j*(273)
+349 + j*(150)
+211 + j*(62)
+-249 + j*(-354)
+76 + j*(213)
+-129 + j*(-209)
+-555 + j*(-134)
+264 + j*(-363)
+457 + j*(-358)
+-165 + j*(-33)
+149 + j*(-256)
+190 + j*(136)
+182 + j*(190)
+371 + j*(287)
+252 + j*(56)
+395 + j*(391)
+308 + j*(-521)
+45 + j*(-256)
+-9 + j*(-543)
+323 + j*(407)
+486 + j*(-177)
+-363 + j*(29)
+206 + j*(-639)
+-333 + j*(-112)
+71 + j*(-152)
+21 + j*(-375)
+154 + j*(39)
+-103 + j*(-450)
+-281 + j*(-57)
+-215 + j*(428)
+-332 + j*(-16)
+349 + j*(-7)
+-145 + j*(-528)
+226 + j*(295)
+472 + j*(-151)
+56 + j*(241)
+144 + j*(75)
+-641 + j*(-214)
+316 + j*(303)
+-523 + j*(-491)
+504 + j*(373)
+170 + j*(419)
+-469 + j*(-817)
+76 + j*(163)
+204 + j*(-40)
+-467 + j*(-346)
+-181 + j*(93)
+-25 + j*(-513)
+204 + j*(446)
+525 + j*(229)
+-499 + j*(383)
+-91 + j*(288)
+33 + j*(-115)
+8 + j*(-433)
+-238 + j*(-446)
+156 + j*(496)
+207 + j*(17)
+-271 + j*(-318)
+287 + j*(-330)
+-212 + j*(-262)
+-62 + j*(-20)
+617 + j*(157)
+-40 + j*(-72)
+-256 + j*(-126)
+313 + j*(-422)
+-209 + j*(23)
+433 + j*(-441)
+175 + j*(-378)
+-223 + j*(16)
+-1 + j*(-623)
+441 + j*(-211)
+-243 + j*(-511)
+-370 + j*(-292)
+-114 + j*(-321)
+-347 + j*(-197)
+-501 + j*(-327)
+57 + j*(-296)
+-231 + j*(241)
+148 + j*(68)
+-516 + j*(391)
+250 + j*(-153)
+-300 + j*(-183)
+-9 + j*(-402)
+332 + j*(197)
+209 + j*(280)
+115 + j*(-447)
+-167 + j*(66)
+455 + j*(105)
+307 + j*(98)
+409 + j*(-368)
+37 + j*(-124)
+137 + j*(238)
+-402 + j*(-307)
+-319 + j*(-198)
+37 + j*(-339)
+223 + j*(199)
+-354 + j*(-160)
+-3 + j*(401)
+-11 + j*(30)
+377 + j*(-197)
+-639 + j*(-83)
+-15 + j*(296)
+79 + j*(-421)
+-197 + j*(-234)
+-47 + j*(-387)
+629 + j*(30)
+293 + j*(170)
+595 + j*(486)
+-391 + j*(256)
+-44 + j*(25)
+-497 + j*(364)
+-74 + j*(198)
+127 + j*(322)
+-373 + j*(161)
+-200 + j*(67)
+503 + j*(301)
+319 + j*(209)
+276 + j*(-260)
+-539 + j*(-240)
+-53 + j*(356)
+340 + j*(-97)
+28 + j*(321)
+45 + j*(-135)
+1 + j*(-404)
+319 + j*(-499)
+457 + j*(-78)
+178 + j*(-281)
+-399 + j*(-112)
+124 + j*(-13)
+-195 + j*(-286)
+132 + j*(354)
+677 + j*(-21)
+-69 + j*(-286)
+571 + j*(197)
+141 + j*(17)
+126 + j*(282)
+176 + j*(611)
+419 + j*(-260)
+202 + j*(-305)
+196 + j*(-390)
+-696 + j*(547)
+226 + j*(-73)
+187 + j*(537)
+-245 + j*(276)
+-508 + j*(139)
+364 + j*(235)
+438 + j*(-310)
+284 + j*(-198)
+-246 + j*(616)
+346 + j*(-528)
+190 + j*(365)
+279 + j*(310)
+-286 + j*(287)
+-128 + j*(-385)
+-150 + j*(461)
+305 + j*(81)
+-167 + j*(305)
+177 + j*(310)
+-1 + j*(-93)
+-322 + j*(450)
+-278 + j*(-342)
+549 + j*(328)
+-168 + j*(540)
+351 + j*(-178)
+217 + j*(314)
+-275 + j*(300)
+163 + j*(-137)
+-153 + j*(-810)
+-314 + j*(457)
+279 + j*(-263)
+157 + j*(-163)
+622 + j*(-212)
+70 + j*(-303)
+275 + j*(-532)
+321 + j*(409)
+134 + j*(293)
+-91 + j*(-387)
+272 + j*(127)
+-312 + j*(-547)
+-226 + j*(-198)
+-518 + j*(583)
+117 + j*(218)
+658 + j*(19)
+317 + j*(691)
+-420 + j*(193)
+62 + j*(-383)
+-79 + j*(-174)
+74 + j*(348)
+354 + j*(-148)
+-478 + j*(-88)
+393 + j*(-581)
+282 + j*(16)
+214 + j*(416)
+-163 + j*(-387)
+226 + j*(-209)
+44 + j*(-400)
+345 + j*(-215)
+-203 + j*(-110)
+269 + j*(301)
+-269 + j*(75)
+199 + j*(471)
+-320 + j*(1)
+-648 + j*(-421)
+245 + j*(-436)
+-57 + j*(183)
+-571 + j*(21)
+-403 + j*(158)
+427 + j*(218)
+-327 + j*(-246)
+529 + j*(459)
+150 + j*(127)
+-418 + j*(-54)
+412 + j*(369)
+116 + j*(-91)
+395 + j*(296)
+301 + j*(276)
+566 + j*(285)
+15 + j*(-486)
+267 + j*(511)
+-98 + j*(-312)
+-190 + j*(-24)
+-30 + j*(-380)
+-484 + j*(-349)
+-109 + j*(85)
+-43 + j*(-262)
+320 + j*(355)
+-552 + j*(-317)
+-95 + j*(250)
+358 + j*(277)
+-62 + j*(-587)
+128 + j*(-55)
+-302 + j*(127)
+-338 + j*(-502)
+-90 + j*(-230)
+-271 + j*(-47)
+638 + j*(-255)
+330 + j*(-83)
+-233 + j*(421)
+-182 + j*(-139)
+-32 + j*(405)
+296 + j*(157)
+28 + j*(216)
+129 + j*(1)
+-267 + j*(-117)
+-310 + j*(-152)
+-390 + j*(-285)
+389 + j*(371)
+199 + j*(165)
+120 + j*(45)
+530 + j*(354)
+-42 + j*(-301)
+368 + j*(-213)
+-28 + j*(-317)
+-89 + j*(-516)
+-32 + j*(213)
+218 + j*(105)
+-168 + j*(293)
+-261 + j*(225)
+158 + j*(221)
+-180 + j*(-234)
+236 + j*(383)
+-63 + j*(-86)
+319 + j*(-243)
+265 + j*(60)
+-63 + j*(149)
+191 + j*(-45)
+-172 + j*(202)
+-212 + j*(616)
+-405 + j*(387)
+-325 + j*(19)
+-18 + j*(149)
+-594 + j*(-148)
+-387 + j*(460)
+-368 + j*(469)
+407 + j*(310)
+-475 + j*(6)
+-474 + j*(30)
+-553 + j*(331)
+-99 + j*(-116)
+265 + j*(-308)
+188 + j*(-201)
+64 + j*(-253)
+-30 + j*(-274)
+-364 + j*(322)
+309 + j*(-317)
+-293 + j*(223)
+197 + j*(-407)
+433 + j*(-237)
+-73 + j*(37)
+392 + j*(373)
+-235 + j*(-14)
+425 + j*(-168)
+-192 + j*(49)
+15 + j*(-447)
+61 + j*(202)
+374 + j*(-368)
+393 + j*(-243)
+383 + j*(-417)
+214 + j*(-48)
+-228 + j*(148)
+-298 + j*(-249)
+55 + j*(-243)
+269 + j*(-70)
+230 + j*(85)
+402 + j*(-211)
+-491 + j*(-202)
+-465 + j*(-66)
+556 + j*(352)
+105 + j*(473)
+358 + j*(-113)
+-377 + j*(244)
+-344 + j*(-247)
+-160 + j*(233)
+437 + j*(-361)
+288 + j*(184)
+94 + j*(-404)
+-11 + j*(205)
+-216 + j*(-250)
+-11 + j*(-221)
+-1 + j*(-287)
+269 + j*(-443)
+244 + j*(-533)
+-298 + j*(-8)
+-180 + j*(109)
+248 + j*(479)
+213 + j*(124)
+358 + j*(541)
+-181 + j*(-170)
+-250 + j*(187)
+117 + j*(-116)
+-319 + j*(226)
+206 + j*(124)
+-320 + j*(-134)
+241 + j*(518)
+-218 + j*(6)
+-407 + j*(-465)
+93 + j*(479)
+-550 + j*(275)
+112 + j*(623)
+-153 + j*(102)
+-38 + j*(-216)
+125 + j*(-53)
+243 + j*(-223)
+-298 + j*(-80)
+358 + j*(153)
+-172 + j*(99)
+-166 + j*(-334)
+-24 + j*(136)
+-269 + j*(83)
+-16 + j*(141)
+-81 + j*(-37)
+288 + j*(-160)
+76 + j*(-252)
+15 + j*(-38)
+52 + j*(-147)
+-139 + j*(-18)
+-134 + j*(163)
+-214 + j*(-61)
+-187 + j*(259)
+317 + j*(-68)
+-102 + j*(-43)
+-310 + j*(-237)
+28 + j*(-4)
+-106 + j*(21)
+106 + j*(-231)
+-339 + j*(50)
+30 + j*(-218)
+-42 + j*(-162)
+-235 + j*(-288)
+-110 + j*(-78)
+95 + j*(413)
+-305 + j*(67)
+238 + j*(279)
+124 + j*(196)
+-105 + j*(-66)
+-495 + j*(-67)
+190 + j*(62)
+-241 + j*(-206)
+99 + j*(3)
+-175 + j*(-147)
+78 + j*(-20)
+-103 + j*(-211)
+-167 + j*(-285)
+54 + j*(-207)
+88 + j*(11)
+21 + j*(35)
+-62 + j*(13)
+317 + j*(199)
+113 + j*(122)
+-373 + j*(252)
+94 + j*(-60)
+35 + j*(117)
+-180 + j*(194)
+-21 + j*(81)
+21 + j*(87)
+-96 + j*(-382)
+-185 + j*(100)
+-463 + j*(392)
+-78 + j*(-193)
+312 + j*(-53)
+-126 + j*(-49)
+217 + j*(52)
+-62 + j*(187)
+-66 + j*(76)
+-37 + j*(-108)
+82 + j*(-197)
+37 + j*(-62)
+45 + j*(-120)
+83 + j*(-103)
+-91 + j*(165)
+-77 + j*(90)
+-224 + j*(160)
+-145 + j*(67)
+230 + j*(-203)
+143 + j*(54)
+223 + j*(163)
+42 + j*(-2)
+39 + j*(-60)
+2 + j*(235)
+216 + j*(274)
+34 + j*(-177)
+138 + j*(-175)
+-220 + j*(-211)
+-15 + j*(36)
+-23 + j*(300)
+91 + j*(282)
+-3 + j*(166)
+-193 + j*(-123)
+-103 + j*(27)
+-5 + j*(28)
+-121 + j*(60)
+243 + j*(-2)
+145 + j*(-293)
+-127 + j*(415)
+-83 + j*(267)
+-95 + j*(47)
+35 + j*(96)
+-53 + j*(-190)
+18 + j*(-146)
+-76 + j*(165)
+131 + j*(-103)
+5 + j*(-44)
+57 + j*(-155)
+-339 + j*(-77)
+8 + j*(-175)
+157 + j*(16)
+119 + j*(149)
+-276 + j*(-163)
+23 + j*(107)
+69 + j*(-146)
+135 + j*(-267)
+94 + j*(103)
+27 + j*(57)
+29 + j*(164)
+24 + j*(-66)
+-98 + j*(-193)
+-9 + j*(51)
+-144 + j*(-103)
+346 + j*(59)
+377 + j*(262)
+82 + j*(-277)
+60 + j*(143)
+88 + j*(107)
+192 + j*(-120)
+-146 + j*(-35)
+-455 + j*(107)
+91 + j*(236)
+181 + j*(45)
+90 + j*(64)
+-56 + j*(-392)
+-73 + j*(-43)
+99 + j*(9)
+-270 + j*(-105)
+-62 + j*(-435)
+-349 + j*(-218)
+-298 + j*(-86)
+-137 + j*(-90)
+76 + j*(28)
+235 + j*(-12)
+-63 + j*(-119)
+-180 + j*(71)
+-165 + j*(218)
+-96 + j*(-2)
+1 + j*(-390)
+-1 + j*(5)
+59 + j*(-162)
+33 + j*(171)
+9 + j*(-5)
+387 + j*(-101)
+-89 + j*(94)
+-168 + j*(-165)
+-230 + j*(-2)
+446 + j*(198)
+209 + j*(161)
+172 + j*(153)
+34 + j*(153)
+80 + j*(3)
+-238 + j*(245)
+-28 + j*(-286)
+261 + j*(202)
+-277 + j*(139)
+76 + j*(148)
+321 + j*(-148)
+5 + j*(-124)
+175 + j*(286)
+-22 + j*(95)
+14 + j*(-212)
+-30 + j*(-224)
+-52 + j*(-112)
+240 + j*(-124)
+-21 + j*(292)
+-39 + j*(-235)
+81 + j*(262)
+3 + j*(-186)
+74 + j*(-12)
+178 + j*(84)
+86 + j*(-62)
+238 + j*(-4)
+4 + j*(13)
+265 + j*(-82)
+37 + j*(218)
+-187 + j*(71)
+-288 + j*(330)
+-112 + j*(340)
+71 + j*(-57)
+-62 + j*(81)
+18 + j*(96)
+-84 + j*(132)
+10 + j*(162)
+97 + j*(4)
+50 + j*(308)
+-25 + j*(442)
+-136 + j*(187)
+-161 + j*(109)
+-50 + j*(54)
+210 + j*(-192)
+59 + j*(174)
+-51 + j*(-252)
+139 + j*(-155)
+280 + j*(156)
+32 + j*(-54)
+211 + j*(24)
+-198 + j*(-298)
+165 + j*(206)
+122 + j*(-144)
+30 + j*(119)
+-21 + j*(281)
+74 + j*(-119)
+-54 + j*(-23)
+-25 + j*(332)
+78 + j*(-199)
+-125 + j*(-74)
+232 + j*(11)
+-199 + j*(154)
+311 + j*(31)
+76 + j*(307)
+39 + j*(-23)
+-165 + j*(397)
+310 + j*(42)
+255 + j*(-36)
+276 + j*(-68)
+-192 + j*(20)
+-98 + j*(166)
+3 + j*(-489)
+41 + j*(177)
+-72 + j*(305)
+-52 + j*(-67)
+66 + j*(-297)
+20 + j*(-185)
+-270 + j*(-66)
+15 + j*(-18)
+-71 + j*(-7)
+40 + j*(-203)
+199 + j*(-431)
+316 + j*(-88)
+46 + j*(90)
+-196 + j*(38)
+91 + j*(-21)
+-1 + j*(169)
+96 + j*(36)
+-76 + j*(-205)
+289 + j*(76)
+-132 + j*(-141)
+-145 + j*(-97)
+-1 + j*(171)
+-51 + j*(182)
+19 + j*(-129)
+40 + j*(50)
+-175 + j*(-300)
+21 + j*(74)
+51 + j*(142)
+-128 + j*(-64)
+-43 + j*(-92)
+247 + j*(109)
+-53 + j*(-28)
+-20 + j*(-168)
+47 + j*(331)
+8 + j*(-158)
+-7 + j*(-202)
+-51 + j*(-9)
+49 + j*(66)
+26 + j*(67)
+-157 + j*(-441)
+82 + j*(-47)
+-124 + j*(165)
+-134 + j*(201)
+-74 + j*(184)
+201 + j*(-29)
+85 + j*(-272)
+68 + j*(-132)
+138 + j*(-243)
+-44 + j*(170)
+-154 + j*(-1)
+-93 + j*(79)
+132 + j*(-134)
+-168 + j*(132)
+147 + j*(144)
+-113 + j*(-10)
+88 + j*(124)
+-267 + j*(25)
+63 + j*(-53)
+156 + j*(-330)
+75 + j*(167)
+238 + j*(0)
+189 + j*(29)
+-175 + j*(-159)
+110 + j*(-90)
+-68 + j*(-70)
+36 + j*(-15)
+6 + j*(-356)
+138 + j*(315)
+17 + j*(-114)
+-239 + j*(129)
+279 + j*(21)
+-151 + j*(-25)
+103 + j*(-17)
+213 + j*(8)
+-81 + j*(148)
+-171 + j*(24)
+-63 + j*(6)
+178 + j*(-13)
+115 + j*(115)
+187 + j*(148)
+-191 + j*(-442)
+-9 + j*(218)
+-60 + j*(101)
+-64 + j*(191)
+-21 + j*(-170)
+78 + j*(110)
+-395 + j*(216)
+122 + j*(186)
+-81 + j*(2)
+-324 + j*(237)
+26 + j*(-274)
+60 + j*(-154)
+-54 + j*(-83)
+9 + j*(240)
+-117 + j*(63)
+-10 + j*(3)
+109 + j*(124)
+55 + j*(-28)
+51 + j*(-1)
+293 + j*(-194)
+-88 + j*(-208)
+-58 + j*(-27)
+48 + j*(117)
+-287 + j*(97)
+-105 + j*(-250)
+-2 + j*(-269)
+-204 + j*(-248)
+-189 + j*(-123)
+-134 + j*(206)
+-114 + j*(-123)
+-180 + j*(-58)
+-320 + j*(-144)
+-265 + j*(-50)
+243 + j*(-311)
+48 + j*(25)
+-69 + j*(-78)
+-98 + j*(25)
+-3 + j*(-18)
+63 + j*(-254)
+-182 + j*(-132)
+122 + j*(-55)
+-43 + j*(161)
+-257 + j*(219)
+1 + j*(-32)
+417 + j*(64)
+-131 + j*(199)
+-215 + j*(-242)
+308 + j*(153)
+157 + j*(-10)
+-199 + j*(164)
+-77 + j*(-54)
+-68 + j*(76)
+-22 + j*(-71)
+101 + j*(95)
+-223 + j*(-192)
+-94 + j*(113)
+-256 + j*(-165)
+420 + j*(131)
+62 + j*(0)
+-168 + j*(95)
+-69 + j*(-202)
+137 + j*(1)
+226 + j*(439)
+153 + j*(-33)
+-76 + j*(81)
+-264 + j*(30)
+400 + j*(62)
+175 + j*(-37)
+343 + j*(-157)
+-302 + j*(59)
+246 + j*(114)
+148 + j*(-61)
+112 + j*(74)
+-134 + j*(-46)
+-243 + j*(41)
+255 + j*(-355)
+-85 + j*(-38)
+-110 + j*(183)
+132 + j*(95)
+-566 + j*(169)
+313 + j*(162)
+-31 + j*(-28)
+-245 + j*(442)
+-64 + j*(-252)
+334 + j*(-138)
+105 + j*(-85)
+-135 + j*(16)
+123 + j*(-224)
+62 + j*(-48)
+-78 + j*(-16)
+-272 + j*(74)
+66 + j*(222)
+49 + j*(269)
+-255 + j*(-76)
+-192 + j*(-3)
+11 + j*(-50)
+168 + j*(293)
+76 + j*(110)
+-43 + j*(99)
+187 + j*(61)
+-340 + j*(-91)
+-110 + j*(-132)
+-156 + j*(-99)
+149 + j*(103)
+203 + j*(-56)
+37 + j*(261)
+-232 + j*(78)
+44 + j*(13)
+139 + j*(-14)
+-58 + j*(-137)
+-52 + j*(-281)
+-231 + j*(35)
+211 + j*(-35)
+42 + j*(65)
+-177 + j*(223)
+127 + j*(61)
+148 + j*(-34)
+101 + j*(224)
+-8 + j*(91)
+-49 + j*(157)
+-174 + j*(-173)
+-47 + j*(-56)
+-55 + j*(115)
+-108 + j*(-19)
+-147 + j*(-96)
+-132 + j*(-86)
+-23 + j*(23)
+183 + j*(-191)
+265 + j*(107)
+-83 + j*(306)
+50 + j*(239)
+137 + j*(-273)
+330 + j*(52)
+-153 + j*(45)
+-191 + j*(306)
+171 + j*(-64)
+-16 + j*(78)
+-298 + j*(-16)
+94 + j*(410)
+-125 + j*(65)
+-154 + j*(112)
+81 + j*(69)
+-151 + j*(-175)
+294 + j*(-264)
+-119 + j*(286)
+-35 + j*(-293)
+49 + j*(221)
+-77 + j*(-30)
+-170 + j*(407)
+-198 + j*(14)
+-5 + j*(6)
+315 + j*(-35)
+41 + j*(282)
+241 + j*(25)
+148 + j*(168)
+34 + j*(196)
+-248 + j*(161)
+129 + j*(-66)
+296 + j*(-42)
+-45 + j*(119)
+-87 + j*(141)
+86 + j*(90)
+66 + j*(-45)
+-13 + j*(-129)
+273 + j*(-148)
+-6 + j*(-82)
+227 + j*(-168)
+32 + j*(-130)
+59 + j*(-64)
+11 + j*(99)
+-91 + j*(-40)
+208 + j*(-91)
+218 + j*(69)
+48 + j*(-325)
+6 + j*(47)
+6 + j*(-215)
+-250 + j*(-271)
+-98 + j*(36)
+-180 + j*(-23)
+-371 + j*(-30)
+-242 + j*(-11)
+191 + j*(6)
+70 + j*(-28)
+-90 + j*(171)
+208 + j*(-58)
+3 + j*(101)
+122 + j*(-214)
+13 + j*(99)
+-80 + j*(217)
+-315 + j*(182)
+124 + j*(-228)
+192 + j*(177)
+330 + j*(61)
+-270 + j*(-122)
+-5 + j*(-162)
+182 + j*(31)
+-197 + j*(-168)
+11 + j*(123)
+86 + j*(277)
+-37 + j*(-84)
+164 + j*(-81)
+148 + j*(24)
+355 + j*(-25)
+149 + j*(54)
+-36 + j*(158)
+189 + j*(-11)
+127 + j*(141)
+76 + j*(130)
+-32 + j*(33)
+-189 + j*(-19)
+-35 + j*(-350)
+-133 + j*(252)
+-139 + j*(-38)
+71 + j*(-33)
+-42 + j*(-138)
+-252 + j*(121)
+283 + j*(140)
+-50 + j*(135)
+-124 + j*(-32)
+124 + j*(289)
+-84 + j*(153)
+197 + j*(134)
+-80 + j*(434)
+-41 + j*(71)
+159 + j*(-46)
+30 + j*(321)
+165 + j*(-438)
+-47 + j*(98)
+180 + j*(125)
+-144 + j*(-28)
+292 + j*(-85)
+-129 + j*(168)
+-117 + j*(54)
+100 + j*(-224)
+25 + j*(-146)
+397 + j*(-4)
+81 + j*(37)
+-47 + j*(8)
+20 + j*(-333)
+110 + j*(-108)
+-198 + j*(236)
+-209 + j*(-77)
+35 + j*(-111)
+-82 + j*(78)
+-46 + j*(-170)
+150 + j*(153)
+210 + j*(37)
+-378 + j*(-346)
+122 + j*(105)
+-48 + j*(128)
+4 + j*(250)
+-42 + j*(233)
+-59 + j*(46)
+132 + j*(-116)
+-69 + j*(51)
+-296 + j*(228)
+-81 + j*(40)
+121 + j*(-190)
+111 + j*(60)
+-33 + j*(-152)
+-71 + j*(145)
+-310 + j*(-11)
+-144 + j*(-107)
+91 + j*(134)
+-54 + j*(134)
+15 + j*(154)
+110 + j*(191)
+-214 + j*(-2)
+504 + j*(-209)
+-42 + j*(-76)
+284 + j*(75)
+-138 + j*(-303)
+-53 + j*(110)
+120 + j*(74)
+240 + j*(131)
+272 + j*(-115)
+3 + j*(69)
+-32 + j*(18)
+259 + j*(-187)
+127 + j*(179)
+-197 + j*(187)
+337 + j*(-229)
+-2 + j*(-35)
+188 + j*(25)
+-348 + j*(177)
+138 + j*(-299)
+-150 + j*(169)
+140 + j*(231)
+-232 + j*(92)
+-8 + j*(131)
+-88 + j*(144)
+54 + j*(-169)
+-54 + j*(95)
+46 + j*(-153)
+74 + j*(112)
+-187 + j*(-75)
+-163 + j*(-105)
+-109 + j*(95)
+-149 + j*(-81)
+-320 + j*(128)
+245 + j*(117)
+-284 + j*(93)
+-26 + j*(-222)
+-240 + j*(144)
+30 + j*(-30)
+-11 + j*(327)
+148 + j*(68)
+149 + j*(37)
+-110 + j*(-209)
+348 + j*(7)
+-69 + j*(-78)
+207 + j*(13)
+-160 + j*(-16)
+-59 + j*(-75)
+70 + j*(7)
+203 + j*(220)
+301 + j*(210)
+-206 + j*(-198)
+24 + j*(115)
+-163 + j*(-298)
+115 + j*(104)
+222 + j*(290)
+-147 + j*(-90)
+-254 + j*(-416)
+123 + j*(-111)
+11 + j*(-310)
+-179 + j*(-358)
+334 + j*(-325)
+-4 + j*(-132)
+35 + j*(134)
+5 + j*(-226)
+243 + j*(-151)
+28 + j*(15)
+-40 + j*(62)
+37 + j*(179)
+308 + j*(-266)
+-185 + j*(-283)
+116 + j*(107)
+374 + j*(-155)
+270 + j*(137)
+-241 + j*(292)
+170 + j*(-226)
+55 + j*(-2)
+40 + j*(-28)
+-175 + j*(8)
+-221 + j*(-73)
+-51 + j*(-106)
+-148 + j*(-103)
+109 + j*(143)
+6 + j*(203)
+149 + j*(239)
+-368 + j*(-54)
+95 + j*(249)
+210 + j*(64)
+13 + j*(-30)
+302 + j*(80)
+409 + j*(-78)
+76 + j*(-308)
+-71 + j*(-169)
+-23 + j*(-222)
+33 + j*(80)
+-338 + j*(-320)
+45 + j*(-105)
+-66 + j*(-274)
+70 + j*(-21)
+48 + j*(27)
+189 + j*(257)
+-64 + j*(7)
+-117 + j*(-42)
+-28 + j*(-128)
+-148 + j*(-406)
+-174 + j*(-208)
+198 + j*(-69)
+147 + j*(-133)
+257 + j*(-138)
+-231 + j*(17)
+127 + j*(-88)
+88 + j*(42)
+-126 + j*(36)
+-63 + j*(-175)
+123 + j*(-173)
+-252 + j*(-136)
+-198 + j*(122)
+-290 + j*(237)
+22 + j*(-23)
+171 + j*(89)
+239 + j*(-141)
+11 + j*(-109)
+301 + j*(-88)
+-216 + j*(1)
+14 + j*(-177)
+47 + j*(6)
+-161 + j*(20)
+-186 + j*(-78)
+173 + j*(-47)
+-289 + j*(-68)
+-81 + j*(83)
+-77 + j*(164)
+220 + j*(-20)
+-106 + j*(177)
+-292 + j*(-216)
+74 + j*(-34)
+245 + j*(1)
+4 + j*(383)
+-30 + j*(-119)
+221 + j*(180)
+139 + j*(-260)
+-160 + j*(95)
+58 + j*(361)
+-223 + j*(57)
+-59 + j*(-59)
+-82 + j*(-51)
+105 + j*(35)
+59 + j*(146)
+-158 + j*(-41)
+-64 + j*(197)
+-202 + j*(-83)
+191 + j*(-335)
+129 + j*(-421)
+-30 + j*(-118)
+69 + j*(129)
+-116 + j*(-67)
+-366 + j*(-18)
+279 + j*(235)
+-279 + j*(1)
+45 + j*(-96)
+-13 + j*(-238)
+382 + j*(-21)
+207 + j*(351)
+192 + j*(-107)
+-103 + j*(-137)
+-90 + j*(110)
+-262 + j*(-211)
+-127 + j*(162)
+109 + j*(40)
+-238 + j*(127)
+81 + j*(5)
+-30 + j*(109)
+118 + j*(71)
+-12 + j*(26)
+40 + j*(-161)
+23 + j*(124)
+-23 + j*(25)
+-374 + j*(-62)
+154 + j*(448)
+-66 + j*(-63)
+152 + j*(-354)
+409 + j*(-129)
+-469 + j*(96)
+-4 + j*(-141)
+-13 + j*(142)
+276 + j*(12)
+-135 + j*(-289)
+-50 + j*(181)
+-205 + j*(-146)
+196 + j*(255)
+-200 + j*(23)
+279 + j*(52)
+-76 + j*(196)
+40 + j*(98)
+-62 + j*(211)
+74 + j*(73)
+-161 + j*(-179)
+-134 + j*(-2)
+-18 + j*(-132)
+444 + j*(21)
+-194 + j*(69)
+-92 + j*(25)
+-119 + j*(-431)
+121 + j*(136)
+-100 + j*(63)
+14 + j*(-67)
+66 + j*(234)
+-35 + j*(288)
+356 + j*(-111)
+-74 + j*(-60)
+215 + j*(206)
+-46 + j*(8)
+-4 + j*(-153)
+-135 + j*(-165)
+274 + j*(-99)
+-218 + j*(-60)
+-7 + j*(145)
+-282 + j*(-132)
+-21 + j*(-270)
+35 + j*(-186)
+59 + j*(161)
+-148 + j*(-212)
+-452 + j*(-222)
+203 + j*(-168)
+16 + j*(142)
+177 + j*(448)
+56 + j*(-74)
+-37 + j*(119)
+-47 + j*(48)
+192 + j*(30)
+-243 + j*(67)
+-199 + j*(78)
+197 + j*(103)
+164 + j*(-210)
+-33 + j*(185)
+-55 + j*(35)
+-388 + j*(21)
+-49 + j*(-101)
+-27 + j*(-276)
+-197 + j*(-151)
+-236 + j*(-178)
+-32 + j*(-162)
+-78 + j*(257)
+-75 + j*(85)
+157 + j*(-10)
+-147 + j*(-3)
+21 + j*(-8)
+120 + j*(120)
+132 + j*(98)
+-140 + j*(-98)
+194 + j*(-322)
+113 + j*(-51)
+177 + j*(-63)
+41 + j*(204)
+146 + j*(45)
+-145 + j*(62)
+17 + j*(74)
+257 + j*(-247)
+-16 + j*(-193)
+-33 + j*(-364)
+-297 + j*(100)
+18 + j*(-268)
+-79 + j*(-70)
+49 + j*(17)
+-61 + j*(-52)
+296 + j*(-32)
+37 + j*(168)
+-117 + j*(-164)
+-74 + j*(-211)
+-87 + j*(66)
+-165 + j*(-38)
+18 + j*(136)
+14 + j*(74)
+187 + j*(172)
+99 + j*(22)
+95 + j*(-151)
+88 + j*(-236)
+-201 + j*(92)
+91 + j*(214)
+280 + j*(200)
+254 + j*(-28)
+82 + j*(199)
+-333 + j*(294)
+-64 + j*(-255)
+228 + j*(375)
+-1 + j*(94)
+211 + j*(-207)
+299 + j*(-447)
+-104 + j*(-17)
+-30 + j*(-28)
+-164 + j*(-211)
+-87 + j*(-76)
+-124 + j*(264)
+176 + j*(-222)
+221 + j*(-322)
+158 + j*(148)
+-307 + j*(-128)
+86 + j*(9)
+-10 + j*(-23)
+131 + j*(25)
+-108 + j*(186)
+-144 + j*(132)
+67 + j*(121)
+11 + j*(-222)
+1 + j*(93)
+182 + j*(93)
+-114 + j*(200)
+87 + j*(163)
+88 + j*(86)
+-73 + j*(-90)
+123 + j*(-30)
+-16 + j*(-27)
+214 + j*(-188)
+-36 + j*(25)
+-286 + j*(310)
+-202 + j*(-54)
+-223 + j*(238)
+-161 + j*(54)
+-62 + j*(170)
+-214 + j*(-35)
+110 + j*(264)
+262 + j*(265)
+100 + j*(37)
+-488 + j*(305)
+-148 + j*(254)
+-253 + j*(123)
+146 + j*(182)
+-332 + j*(-199)
+55 + j*(-65)
+204 + j*(83)
+-1 + j*(-51)
+32 + j*(-314)
+43 + j*(23)
+68 + j*(-412)
+78 + j*(-180)
+-197 + j*(146)
+-76 + j*(-66)
+136 + j*(-226)
+40 + j*(241)
+27 + j*(-177)
+-144 + j*(66)
+112 + j*(-258)
+163 + j*(-74)
+-1 + j*(-81)
+52 + j*(469)
+3 + j*(-276)
+148 + j*(107)
+-93 + j*(-173)
+64 + j*(37)
+-231 + j*(124)
+61 + j*(-131)
+-88 + j*(114)
+107 + j*(-32)
+-170 + j*(240)
+226 + j*(-173)
+58 + j*(-247)
+22 + j*(47)
+168 + j*(181)
+16 + j*(158)
+-120 + j*(-66)
+-81 + j*(296)
+-209 + j*(-192)
+-75 + j*(-115)
+95 + j*(86)
+32 + j*(125)
+57 + j*(64)
+6 + j*(-11)
+-367 + j*(-47)
+180 + j*(-28)
+-443 + j*(-35)
+-174 + j*(67)
+-83 + j*(-21)
+64 + j*(-84)
+206 + j*(-67)
+25 + j*(-205)
+-205 + j*(139)
+16 + j*(-135)
+-233 + j*(-43)
+158 + j*(-4)
+-18 + j*(-106)
+-87 + j*(129)
+-112 + j*(-28)
+159 + j*(144)
+98 + j*(-110)
+-11 + j*(28)
+-41 + j*(192)
+21 + j*(-199)
+-26 + j*(233)
+6 + j*(-337)
+412 + j*(7)
+-136 + j*(-25)
+83 + j*(103)
+-45 + j*(62)
+79 + j*(20)
+86 + j*(20)
+142 + j*(284)
+-45 + j*(-91)
+100 + j*(67)
+-142 + j*(100)
+-223 + j*(248)
+-3 + j*(120)
+311 + j*(-245)
+62 + j*(-47)
+91 + j*(-78)
+-141 + j*(-132)
+4 + j*(-133)
+81 + j*(-179)
+-13 + j*(166)
+20 + j*(180)
+182 + j*(-139)
+230 + j*(83)
+387 + j*(67)
+-6 + j*(-113)
+63 + j*(161)
+-198 + j*(104)
+-36 + j*(-129)
+-30 + j*(-63)
+112 + j*(-41)
+127 + j*(189)
+156 + j*(62)
+-110 + j*(-12)
+52 + j*(-182)
+-110 + j*(-298)
+-151 + j*(180)
+234 + j*(-178)
+14 + j*(69)
+75 + j*(-57)
+236 + j*(-168)
+-54 + j*(-212)
+-194 + j*(15)
+80 + j*(347)
+190 + j*(412)
+11 + j*(-153)
+59 + j*(28)
+-182 + j*(-11)
+54 + j*(145)
+69 + j*(78)
+166 + j*(-189)
+204 + j*(-157)
+83 + j*(-216)
+87 + j*(-35)
+-200 + j*(-156)
+455 + j*(141)
+7 + j*(-114)
+91 + j*(305)
+-95 + j*(62)
+-254 + j*(-61)
+-80 + j*(117)
+-30 + j*(-195)
+-146 + j*(105)
+21 + j*(-25)
+305 + j*(23)
+-81 + j*(-15)
+192 + j*(395)
+141 + j*(303)
+-52 + j*(-129)
+54 + j*(-149)
+63 + j*(64)
+98 + j*(-260)
+132 + j*(19)
+-59 + j*(-57)
+116 + j*(170)
+251 + j*(-284)
+42 + j*(208)
+51 + j*(-195)
+-98 + j*(-44)
+-57 + j*(55)
+106 + j*(-38)
+-243 + j*(16)
+153 + j*(-65)
+7 + j*(-110)
+88 + j*(-73)
+-279 + j*(77)
+-173 + j*(40)
+-112 + j*(0)
+-154 + j*(-228)
+2 + j*(-147)
+-166 + j*(126)
+119 + j*(148)
+-215 + j*(114)
+-155 + j*(23)
+-41 + j*(-34)
+40 + j*(-300)
+-328 + j*(202)
+-206 + j*(-212)
+59 + j*(-325)
+25 + j*(-100)
+-208 + j*(-235)
+-233 + j*(167)
+-243 + j*(20)
+-203 + j*(0)
+-168 + j*(-173)
+-310 + j*(-146)
+-148 + j*(398)
+-72 + j*(-93)
+62 + j*(-152)
+28 + j*(128)
+-217 + j*(-27)
+-222 + j*(-188)
+168 + j*(16)
+-100 + j*(140)
+99 + j*(8)
+76 + j*(-57)
+139 + j*(-150)
+-192 + j*(-49)
+-18 + j*(-206)
+-16 + j*(-327)
+78 + j*(35)
+11 + j*(42)
+-107 + j*(-82)
+-274 + j*(235)
+81 + j*(-11)
+281 + j*(-61)
+-148 + j*(78)
+-279 + j*(-51)
+-252 + j*(186)
+31 + j*(-99)
+292 + j*(-155)
+-188 + j*(192)
+258 + j*(-96)
+21 + j*(-92)
+-28 + j*(165)
+146 + j*(59)
+0 + j*(-21)
+30 + j*(-192)
+82 + j*(14)
+-294 + j*(-13)
+-150 + j*(137)
+-71 + j*(68)
+-233 + j*(45)
+12 + j*(-62)
+-177 + j*(44)
+-175 + j*(337)
+-41 + j*(1)
+363 + j*(-244)
+231 + j*(181)
+191 + j*(-130)
+287 + j*(115)
+-69 + j*(221)
+-236 + j*(-50)
+-393 + j*(-47)
+71 + j*(13)
+447 + j*(-110)
+-76 + j*(316)
+42 + j*(71)
+-20 + j*(-75)
+-17 + j*(82)
+-231 + j*(-258)
+156 + j*(-174)
+-85 + j*(-142)
+-165 + j*(-173)
+-185 + j*(-25)
+173 + j*(137)
+303 + j*(-119)
+-86 + j*(-105)
+-253 + j*(-318)
+-68 + j*(142)
+-213 + j*(259)
+179 + j*(-58)
+-93 + j*(122)
+135 + j*(-185)
+-1 + j*(-180)
+261 + j*(-385)
+-207 + j*(-315)
+6 + j*(-70)
+216 + j*(339)
+-137 + j*(-129)
+35 + j*(15)
+16 + j*(127)
+71 + j*(-29)
+-254 + j*(-211)
+-325 + j*(103)
+-222 + j*(6)
+159 + j*(91)
+25 + j*(106)
+-139 + j*(101)
+-133 + j*(-289)
+-124 + j*(-40)
+-238 + j*(-183)
+-144 + j*(-1)
+111 + j*(-64)
+63 + j*(-308)
+-78 + j*(-153)
+324 + j*(-243)
+209 + j*(11)
+64 + j*(232)
+71 + j*(62)
+203 + j*(-52)
+-161 + j*(129)
+-339 + j*(144)
+78 + j*(86)
+66 + j*(-263)
+-78 + j*(-190)
+247 + j*(293)
+-25 + j*(19)
+-267 + j*(-15)
+89 + j*(-206)
+-64 + j*(120)
+83 + j*(165)
+-195 + j*(249)
+-55 + j*(-379)
+-194 + j*(19)
+-139 + j*(49)
+316 + j*(-139)
+-190 + j*(170)
+-33 + j*(34)
+14 + j*(-44)
+-363 + j*(50)
+39 + j*(77)
+296 + j*(-133)
+-183 + j*(289)
+-96 + j*(-81)
+-74 + j*(-333)
+92 + j*(-183)
+-99 + j*(167)
+-63 + j*(21)
+339 + j*(-39)
+-175 + j*(-257)
+72 + j*(117)
+-192 + j*(105)
+17 + j*(-17)
+-84 + j*(166)
+49 + j*(188)
+-156 + j*(153)
+74 + j*(-169)
+-35 + j*(280)
+-81 + j*(101)
+9 + j*(112)
+214 + j*(-38)
+254 + j*(-35)
+78 + j*(263)
+125 + j*(-71)
+100 + j*(68)
+339 + j*(111)
+-10 + j*(134)
+-4 + j*(-69)
+-98 + j*(74)
+-41 + j*(106)
+-28 + j*(330)
+325 + j*(88)
+-59 + j*(41)
+-110 + j*(-247)
+154 + j*(16)
+463 + j*(363)
+-112 + j*(-29)
+133 + j*(-1)
+315 + j*(208)
+-102 + j*(-248)
+135 + j*(23)
+328 + j*(11)
+201 + j*(46)
+163 + j*(134)
+224 + j*(-62)
+178 + j*(-89)
+136 + j*(107)
+69 + j*(-224)
+140 + j*(-87)
+-112 + j*(254)
+-65 + j*(120)
+-239 + j*(-35)
+80 + j*(30)
+-331 + j*(-125)
+-71 + j*(45)
+31 + j*(417)
+-17 + j*(-139)
+-54 + j*(49)
+246 + j*(-253)
+-6 + j*(101)
+110 + j*(-138)
+-88 + j*(56)
+66 + j*(264)
+-255 + j*(-18)
+-155 + j*(95)
+-332 + j*(88)
+-103 + j*(25)
+-618 + j*(214)
+213 + j*(-211)
+260 + j*(-49)
+-94 + j*(-75)
+-9 + j*(12)
+97 + j*(171)
+74 + j*(219)
+-18 + j*(-54)
+101 + j*(-135)
+-159 + j*(82)
+-48 + j*(-196)
+408 + j*(275)
+-194 + j*(-74)
+111 + j*(337)
+-13 + j*(409)
+-106 + j*(-51)
+-178 + j*(-203)
+-228 + j*(-69)
+-243 + j*(-10)
+1 + j*(-8)
+177 + j*(-189)
+85 + j*(16)
+131 + j*(270)
+-96 + j*(226)
+-4 + j*(336)
+-217 + j*(42)
+-99 + j*(-82)
+-206 + j*(-93)
+18 + j*(295)
+99 + j*(-189)
+-350 + j*(129)
+-8 + j*(91)
+59 + j*(-274)
+-83 + j*(173)
+48 + j*(29)
+207 + j*(-75)
+49 + j*(78)
+-65 + j*(-382)
+193 + j*(100)
+-70 + j*(42)
+33 + j*(-206)
+228 + j*(49)
+53 + j*(208)
+-76 + j*(-93)
+102 + j*(-103)
+-256 + j*(-43)
+86 + j*(-13)
+-111 + j*(40)
+186 + j*(-48)
+-2 + j*(498)
+-182 + j*(52)
+-127 + j*(81)
+74 + j*(-54)
+38 + j*(-88)
+35 + j*(-194)
+-173 + j*(112)
+-129 + j*(224)
+-54 + j*(-2)
+191 + j*(113)
+-88 + j*(72)
+-69 + j*(-259)
+84 + j*(240)
+-187 + j*(70)
+-79 + j*(-11)
+259 + j*(206)
+123 + j*(365)
+92 + j*(103)
+-187 + j*(76)
+54 + j*(232)
+40 + j*(-158)
+-212 + j*(-424)
+-91 + j*(215)
+-112 + j*(138)
+-110 + j*(243)
+-110 + j*(145)
+72 + j*(80)
+30 + j*(-110)
+180 + j*(26)
+63 + j*(5)
+232 + j*(238)
+199 + j*(-119)
+438 + j*(64)
+-40 + j*(-139)
+-146 + j*(-31)
+85 + j*(167)
+139 + j*(-206)
+45 + j*(66)
+98 + j*(-75)
+23 + j*(131)
+131 + j*(15)
+-84 + j*(126)
+-64 + j*(-182)
+28 + j*(141)
+17 + j*(37)
+194 + j*(6)
+-4 + j*(336)
+160 + j*(205)
+-259 + j*(113)
+-52 + j*(4)
+-104 + j*(-249)
+-11 + j*(-245)
+-66 + j*(86)
+30 + j*(-138)
+90 + j*(-182)
+47 + j*(122)
+281 + j*(166)
+-230 + j*(13)
+-165 + j*(380)
+222 + j*(-15)
+-247 + j*(113)
+-91 + j*(-12)
+-88 + j*(200)
+-69 + j*(240)
+-165 + j*(-6)
+-124 + j*(-184)
+-327 + j*(296)
+-209 + j*(37)
+-114 + j*(-329)
+238 + j*(-267)
+-122 + j*(-149)
+-104 + j*(-238)
+339 + j*(264)
+347 + j*(76)
+184 + j*(-87)
+272 + j*(-118)
+10 + j*(169)
+23 + j*(74)
+-53 + j*(377)
+-180 + j*(-162)
+-35 + j*(-269)
+73 + j*(280)
+-176 + j*(-9)
+69 + j*(172)
+-14 + j*(101)
+-124 + j*(-119)
+-54 + j*(-187)
+-47 + j*(158)
+352 + j*(147)
+167 + j*(312)
+-187 + j*(-197)
+101 + j*(202)
+-170 + j*(-168)
+140 + j*(39)
+132 + j*(40)
+29 + j*(-33)
+-226 + j*(204)
+-341 + j*(-25)
+-21 + j*(235)
+110 + j*(25)
+-176 + j*(40)
+-35 + j*(105)
+-175 + j*(13)
+-85 + j*(-78)
+-216 + j*(-102)
+147 + j*(43)
+370 + j*(-45)
+-330 + j*(-246)
+-337 + j*(179)
+-133 + j*(67)
+110 + j*(-80)
+92 + j*(-27)
+199 + j*(-197)
+150 + j*(98)
+-129 + j*(79)
+-209 + j*(-61)
+-128 + j*(406)
+472 + j*(301)
+-19 + j*(146)
+-18 + j*(-83)
+-54 + j*(-16)
+121 + j*(76)
+-417 + j*(77)
+-192 + j*(-91)
+35 + j*(232)
+240 + j*(161)
+-132 + j*(-16)
+-149 + j*(72)
+-26 + j*(-36)
+-112 + j*(-83)
+-86 + j*(-100)
+83 + j*(-132)
+-123 + j*(53)
+-269 + j*(-47)
+-93 + j*(180)
+129 + j*(200)
+-218 + j*(105)
+116 + j*(98)
+-157 + j*(-165)
+-252 + j*(-54)
+87 + j*(91)
+309 + j*(-156)
+72 + j*(-159)
+-16 + j*(-136)
+-54 + j*(16)
+-103 + j*(170)
+76 + j*(182)
+-231 + j*(-148)
+47 + j*(169)
+21 + j*(163)
+84 + j*(261)
+198 + j*(223)
+-277 + j*(100)
+-166 + j*(-125)
+125 + j*(-30)
+-276 + j*(266)
+159 + j*(26)
+311 + j*(171)
+-404 + j*(289)
+-104 + j*(-370)
+172 + j*(-347)
+59 + j*(-465)
+-428 + j*(43)
+26 + j*(-619)
+-139 + j*(192)
+213 + j*(469)
+395 + j*(104)
+146 + j*(-270)
+77 + j*(257)
+-204 + j*(245)
+61 + j*(264)
+317 + j*(351)
+395 + j*(379)
+-250 + j*(-278)
+547 + j*(-360)
+-296 + j*(-69)
+71 + j*(260)
+456 + j*(-113)
+316 + j*(214)
+107 + j*(-390)
+313 + j*(228)
+-105 + j*(486)
+120 + j*(275)
+541 + j*(-306)
+-351 + j*(-19)
+-144 + j*(-456)
+103 + j*(-197)
+-262 + j*(-299)
+305 + j*(62)
+-245 + j*(-17)
+-219 + j*(472)
+200 + j*(-195)
+-155 + j*(-257)
+-211 + j*(341)
+146 + j*(262)
+-86 + j*(229)
+-245 + j*(-318)
+368 + j*(-296)
+-375 + j*(305)
+-582 + j*(149)
+412 + j*(-397)
+421 + j*(-441)
+434 + j*(-191)
+141 + j*(325)
+-331 + j*(88)
+610 + j*(43)
+-328 + j*(305)
+351 + j*(-415)
+161 + j*(428)
+530 + j*(142)
+-705 + j*(-324)
+-76 + j*(132)
+-316 + j*(-183)
+-307 + j*(187)
+148 + j*(361)
+183 + j*(94)
+-168 + j*(360)
+-266 + j*(129)
+-301 + j*(-244)
+-252 + j*(232)
+-546 + j*(216)
+-227 + j*(121)
+-35 + j*(-342)
+-190 + j*(-325)
+-59 + j*(523)
+-171 + j*(-315)
+297 + j*(183)
+194 + j*(148)
+-443 + j*(281)
+-512 + j*(-66)
+532 + j*(250)
+-276 + j*(306)
+-358 + j*(187)
+-477 + j*(518)
+-310 + j*(-158)
+167 + j*(-405)
+66 + j*(-134)
+96 + j*(379)
+-23 + j*(-460)
+-404 + j*(-227)
+-14 + j*(-501)
+-691 + j*(-200)
+-339 + j*(30)
+648 + j*(317)
+347 + j*(-322)
+-260 + j*(597)
+-610 + j*(216)
+443 + j*(205)
+249 + j*(-314)
+486 + j*(-170)
+-298 + j*(87)
+141 + j*(238)
+-60 + j*(-71)
+67 + j*(-124)
+-291 + j*(-540)
+174 + j*(-324)
+-161 + j*(-228)
+193 + j*(-37)
+-153 + j*(-331)
+235 + j*(293)
+-141 + j*(-504)
+339 + j*(49)
+373 + j*(21)
+473 + j*(355)
+-270 + j*(268)
+-26 + j*(-260)
+379 + j*(-419)
+178 + j*(-35)
+307 + j*(680)
+564 + j*(-397)
+-474 + j*(-527)
+482 + j*(207)
+374 + j*(51)
+3 + j*(123)
+5 + j*(586)
+267 + j*(491)
+185 + j*(225)
+312 + j*(556)
+4 + j*(-366)
+166 + j*(405)
+-346 + j*(422)
+-438 + j*(-416)
+390 + j*(-59)
+30 + j*(-288)
+274 + j*(-242)
+-114 + j*(-100)
+-177 + j*(-375)
+-455 + j*(-292)
+-272 + j*(301)
+-218 + j*(-479)
+447 + j*(-296)
+-335 + j*(-378)
+-427 + j*(-16)
+308 + j*(-300)
+479 + j*(322)
+-170 + j*(82)
+-366 + j*(-153)
+-701 + j*(-477)
+-350 + j*(282)
+-327 + j*(344)
+-389 + j*(-333)
+-450 + j*(-218)
+-3 + j*(682)
+260 + j*(-402)
+70 + j*(305)
+588 + j*(520)
+-1 + j*(-161)
+-292 + j*(-104)
+-267 + j*(434)
+-195 + j*(404)
+-435 + j*(542)
+-376 + j*(-235)
+-187 + j*(42)
+61 + j*(550)
+-125 + j*(93)
+-262 + j*(217)
+512 + j*(234)
+405 + j*(358)
+52 + j*(-291)
+1 + j*(395)
+450 + j*(-216)
+-172 + j*(432)
+-180 + j*(-247)
+15 + j*(-400)
+-78 + j*(363)
+227 + j*(123)
+403 + j*(-133)
+-124 + j*(258)
+-400 + j*(-366)
+72 + j*(-175)
+-140 + j*(-51)
+90 + j*(-166)
+-484 + j*(148)
+-404 + j*(-392)
+-197 + j*(133)
+241 + j*(-45)
+122 + j*(-306)
+-136 + j*(296)
+-194 + j*(264)
+516 + j*(-226)
+-168 + j*(-320)
+-14 + j*(-386)
+231 + j*(440)
+146 + j*(346)
+268 + j*(451)
+184 + j*(-27)
+310 + j*(214)
+409 + j*(-258)
+-361 + j*(-303)
+153 + j*(-127)
+-217 + j*(-438)
+107 + j*(476)
+-204 + j*(403)
+-313 + j*(315)
+-328 + j*(-307)
+-351 + j*(97)
+185 + j*(-211)
+122 + j*(233)
+-445 + j*(-503)
+-212 + j*(-397)
+-420 + j*(196)
+64 + j*(-252)
+407 + j*(-336)
+-265 + j*(280)
+281 + j*(-268)
+218 + j*(-292)
+-138 + j*(484)
+-16 + j*(192)
+474 + j*(362)
+-399 + j*(-2)
+73 + j*(-350)
+264 + j*(158)
+365 + j*(-137)
+71 + j*(-62)
+-389 + j*(-485)
+-74 + j*(-57)
+-281 + j*(252)
+299 + j*(258)
+1 + j*(200)
+252 + j*(44)
+95 + j*(-210)
+180 + j*(-445)
+-356 + j*(228)
+90 + j*(-321)
+-198 + j*(-281)
+441 + j*(-279)
+-417 + j*(428)
+-317 + j*(-210)
+156 + j*(-520)
+-59 + j*(-228)
+238 + j*(-274)
+-299 + j*(-308)
+-270 + j*(-294)
+-181 + j*(-165)
+180 + j*(-48)
+-172 + j*(-289)
+395 + j*(77)
+212 + j*(-88)
+361 + j*(378)
+-260 + j*(-753)
+205 + j*(-86)
+-151 + j*(127)
+416 + j*(-146)
+121 + j*(-566)
+65 + j*(-477)
+119 + j*(281)
+43 + j*(-42)
+-172 + j*(182)
+-340 + j*(396)
+51 + j*(286)
+235 + j*(-410)
+296 + j*(-146)
+-86 + j*(-184)
+-59 + j*(-322)
+-381 + j*(236)
+98 + j*(-173)
+-176 + j*(218)
+-682 + j*(-62)
+-41 + j*(-211)
+-525 + j*(-330)
+36 + j*(-36)
+-578 + j*(-367)
+-245 + j*(380)
+-305 + j*(301)
+333 + j*(-141)
+-127 + j*(-254)
+308 + j*(-378)
+-358 + j*(177)
+231 + j*(216)
+-112 + j*(459)
+-436 + j*(-497)
+296 + j*(231)
+-276 + j*(-409)
+299 + j*(144)
+310 + j*(-267)
+-309 + j*(-237)
+-204 + j*(104)
+158 + j*(194)
+325 + j*(-127)
+140 + j*(260)
+52 + j*(131)
+29 + j*(-135)
+-162 + j*(345)
+-5 + j*(132)
+69 + j*(-456)
+302 + j*(149)
+211 + j*(-262)
+-506 + j*(-175)
+292 + j*(182)
+52 + j*(-322)
+365 + j*(-232)
+312 + j*(-269)
+-319 + j*(21)
+-315 + j*(-581)
+-138 + j*(167)
+-43 + j*(197)
+-42 + j*(450)
+-296 + j*(155)
+-540 + j*(358)
+-307 + j*(87)
+-446 + j*(-250)
+97 + j*(116)
+140 + j*(-486)
+300 + j*(-278)
+-419 + j*(163)
+-211 + j*(-185)
+-194 + j*(367)
+291 + j*(250)
+312 + j*(-236)
+195 + j*(81)
+-465 + j*(-375)
+482 + j*(115)
+116 + j*(120)
+122 + j*(320)
+-55 + j*(-224)
+-280 + j*(177)
+542 + j*(-264)
+416 + j*(103)
+-152 + j*(-113)
+-116 + j*(-58)
+-139 + j*(-262)
+-165 + j*(-510)
+-57 + j*(-504)
+168 + j*(-228)
+474 + j*(-120)
+-119 + j*(10)
+313 + j*(-328)
+-291 + j*(209)
+271 + j*(-57)
+358 + j*(-245)
+419 + j*(-226)
+-45 + j*(-529)
+344 + j*(-443)
+147 + j*(-416)
+-105 + j*(-279)
+40 + j*(4)
+-409 + j*(212)
+-322 + j*(-257)
+-169 + j*(-639)
+-194 + j*(-323)
+311 + j*(-214)
+-356 + j*(559)
+318 + j*(-374)
+157 + j*(112)
+-339 + j*(76)
+-456 + j*(153)
+-328 + j*(-325)
+504 + j*(113)
+-447 + j*(219)
+173 + j*(284)
+194 + j*(-21)
+-136 + j*(-310)
+-91 + j*(351)
+-112 + j*(-317)
+474 + j*(227)
+-348 + j*(124)
+368 + j*(-102)
+395 + j*(-190)
+-172 + j*(202)
+-148 + j*(-287)
+393 + j*(-330)
+144 + j*(411)
+-259 + j*(238)
+371 + j*(-130)
+40 + j*(-457)
+129 + j*(-453)
+-451 + j*(-215)
+-333 + j*(242)
+353 + j*(334)
+-604 + j*(356)
+209 + j*(-318)
+-358 + j*(-76)
+-118 + j*(-313)
+439 + j*(-315)
+60 + j*(-572)
+-457 + j*(282)
+-834 + j*(-7)
+428 + j*(-140)
+325 + j*(215)
+42 + j*(263)
+301 + j*(151)
+140 + j*(-72)
+489 + j*(-438)
+323 + j*(-402)
+194 + j*(-13)
+257 + j*(-322)
+-334 + j*(267)
+231 + j*(409)
+-231 + j*(-271)
+-265 + j*(394)
+-324 + j*(-305)
+-588 + j*(-325)
+84 + j*(-489)
+366 + j*(43)
+-291 + j*(108)
+533 + j*(-455)
+-100 + j*(352)
+181 + j*(-187)
+287 + j*(-428)
+-322 + j*(17)
+90 + j*(-332)
+413 + j*(-171)
+-474 + j*(-153)
+-167 + j*(-209)
+76 + j*(-141)
+395 + j*(201)
+-330 + j*(212)
+127 + j*(-255)
+120 + j*(-15)
+-132 + j*(190)
+-436 + j*(-209)
+-281 + j*(425)
+300 + j*(-408)
+-162 + j*(-301)
+-316 + j*(-458)
+166 + j*(-491)
+-384 + j*(-423)
+568 + j*(-527)
+-212 + j*(296)
+-204 + j*(-298)
+-229 + j*(117)
+-159 + j*(-412)
+365 + j*(358)
+260 + j*(-245)
+247 + j*(33)
+162 + j*(139)
+-332 + j*(284)
+-489 + j*(-540)
+-221 + j*(-39)
+-55 + j*(-142)
+-129 + j*(360)
+235 + j*(-252)
+513 + j*(104)
+-58 + j*(-313)
+419 + j*(284)
+-267 + j*(316)
+588 + j*(-197)
+-193 + j*(-361)
+370 + j*(556)
+-269 + j*(106)
+153 + j*(-44)
+-167 + j*(-265)
+-21 + j*(240)
+324 + j*(-368)
+-233 + j*(-361)
+-260 + j*(-260)
+-504 + j*(245)
+-684 + j*(316)
+-13 + j*(-153)
+89 + j*(-546)
+268 + j*(-261)
+392 + j*(448)
+359 + j*(397)
+448 + j*(-398)
+-400 + j*(-225)
+-547 + j*(-383)
+399 + j*(429)
+-360 + j*(-187)
+36 + j*(-126)
+-384 + j*(291)
+158 + j*(-358)
+337 + j*(569)
+431 + j*(-49)
+581 + j*(30)
+158 + j*(-206)
+361 + j*(-217)
+-216 + j*(-233)
+309 + j*(-486)
+258 + j*(-265)
+363 + j*(199)
+-440 + j*(309)
+-134 + j*(-397)
+441 + j*(298)
+356 + j*(285)
+148 + j*(-550)
+207 + j*(86)
+537 + j*(395)
+-137 + j*(297)
+-80 + j*(409)
+696 + j*(23)
+25 + j*(-275)
+402 + j*(129)
+334 + j*(219)
+79 + j*(271)
+-461 + j*(-98)
+21 + j*(-23)
+-138 + j*(354)
+487 + j*(-36)
+373 + j*(-1)
+-540 + j*(-255)
+108 + j*(-153)
+232 + j*(249)
+262 + j*(136)
+-284 + j*(-388)
+254 + j*(-303)
+4 + j*(-573)
+-71 + j*(327)
+-25 + j*(-76)
+-33 + j*(-450)
+248 + j*(362)
+61 + j*(-260)
+288 + j*(272)
+245 + j*(-42)
+-204 + j*(277)
+-479 + j*(-407)
+-165 + j*(451)
+409 + j*(445)
+-143 + j*(566)
+-254 + j*(-428)
+-61 + j*(408)
+-203 + j*(-141)
+-38 + j*(893)
+-53 + j*(235)
+170 + j*(-614)
+217 + j*(180)
+499 + j*(-375)
+-339 + j*(232)
+-112 + j*(-235)
+290 + j*(233)
+-400 + j*(214)
+470 + j*(363)
+-634 + j*(-109)
+-344 + j*(45)
+308 + j*(-479)
+-330 + j*(-6)
+-141 + j*(-100)
+-275 + j*(195)
+474 + j*(139)
+23 + j*(482)
+-501 + j*(-599)
+-23 + j*(105)
+204 + j*(-323)
+220 + j*(119)
+471 + j*(-33)
+-176 + j*(-472)
+-64 + j*(-11)
+-98 + j*(158)
+94 + j*(-177)
+-395 + j*(-368)
+106 + j*(106)
+-556 + j*(-269)
+404 + j*(389)
+-13 + j*(-54)
+-25 + j*(455)
+2 + j*(366)
+418 + j*(-81)
+390 + j*(-341)
+-173 + j*(-397)
+364 + j*(-233)
+17 + j*(-495)
+-489 + j*(86)
+-287 + j*(419)
+93 + j*(431)
+-31 + j*(212)
+-218 + j*(-117)
+-233 + j*(244)
+1 + j*(130)
+-180 + j*(-312)
+-434 + j*(57)
+501 + j*(22)
+324 + j*(-359)
+-497 + j*(-63)
+453 + j*(-11)
+225 + j*(-460)
+-413 + j*(-100)
+-16 + j*(440)
+500 + j*(130)
+-414 + j*(161)
+469 + j*(326)
+211 + j*(175)
+332 + j*(-65)
+407 + j*(13)
+207 + j*(467)
+-366 + j*(372)
+200 + j*(-223)
+-301 + j*(-318)
+-198 + j*(-273)
+-209 + j*(221)
+-148 + j*(5)
+102 + j*(433)
+-107 + j*(-116)
+303 + j*(337)
+356 + j*(98)
+-203 + j*(369)
+452 + j*(281)
+-542 + j*(421)
+54 + j*(371)
+222 + j*(-46)
+559 + j*(544)
+100 + j*(-298)
+68 + j*(204)
+-264 + j*(-267)
+-97 + j*(-311)
+-738 + j*(203)
+282 + j*(342)
+-310 + j*(778)
+-209 + j*(102)
+154 + j*(-2)
+11 + j*(-8)
+153 + j*(222)
+4 + j*(-33)
+309 + j*(283)
+-8 + j*(117)
+-136 + j*(-322)
+35 + j*(33)
+-11 + j*(176)
+119 + j*(237)
+186 + j*(45)
+77 + j*(124)
+288 + j*(35)
+-57 + j*(216)
+101 + j*(-8)
+119 + j*(-40)
+102 + j*(-182)
+15 + j*(83)
+-88 + j*(74)
+187 + j*(388)
+-7 + j*(-26)
+284 + j*(-194)
+235 + j*(-341)
+-86 + j*(-122)
+-98 + j*(-227)
+-177 + j*(-59)
+-202 + j*(-35)
+-58 + j*(-23)
+-12 + j*(-45)
+83 + j*(33)
+-135 + j*(-110)
+-112 + j*(-204)
+-404 + j*(-49)
+-187 + j*(-67)
+-158 + j*(168)
+-105 + j*(-175)
+13 + j*(-358)
+4 + j*(-224)
+35 + j*(-62)
+120 + j*(-361)
+-274 + j*(-179)
+-63 + j*(23)
+-110 + j*(-18)
+-194 + j*(-4)
+-61 + j*(-28)
+138 + j*(-290)
+100 + j*(-38)
+-128 + j*(-204)
+-246 + j*(-176)
+397 + j*(33)
+180 + j*(80)
+-214 + j*(-113)
+-52 + j*(244)
+-95 + j*(-3)
+-87 + j*(-13)
+15 + j*(73)
+71 + j*(-78)
+110 + j*(-1)
+4 + j*(-154)
+65 + j*(-86)
+-14 + j*(100)
+-88 + j*(21)
+-117 + j*(120)
+-478 + j*(-64)
+-50 + j*(-23)
+217 + j*(10)
+-46 + j*(-238)
+60 + j*(-23)
+235 + j*(-35)
+-79 + j*(339)
+-192 + j*(-21)
+-89 + j*(135)
+-107 + j*(126)
+-221 + j*(42)
+211 + j*(184)
+66 + j*(-160)
+-168 + j*(-4)
+-105 + j*(85)
+132 + j*(-27)
+124 + j*(-130)
+174 + j*(-112)
+151 + j*(76)
+249 + j*(-163)
+72 + j*(233)
+-243 + j*(-77)
+-294 + j*(-25)
+-281 + j*(61)
+112 + j*(67)
+-37 + j*(13)
+74 + j*(-144)
+-168 + j*(-35)
+-13 + j*(-313)
+-386 + j*(10)
+-311 + j*(-79)
+-11 + j*(90)
+185 + j*(405)
+186 + j*(-17)
+-127 + j*(-137)
+10 + j*(136)
+-59 + j*(110)
+1 + j*(-83)
+-20 + j*(-180)
+214 + j*(361)
+231 + j*(62)
+-104 + j*(-86)
+-192 + j*(185)
+-108 + j*(170)
+-169 + j*(-192)
+-104 + j*(-171)
+-28 + j*(-57)
+-208 + j*(126)
+185 + j*(-78)
+105 + j*(159)
+-228 + j*(-110)
+340 + j*(82)
+235 + j*(214)
+-80 + j*(-14)
+234 + j*(-162)
+-131 + j*(63)
+-43 + j*(60)
+-157 + j*(68)
+-207 + j*(144)
+-77 + j*(53)
+214 + j*(147)
+-150 + j*(-83)
+-100 + j*(90)
+-43 + j*(90)
+97 + j*(129)
+-34 + j*(-44)
+14 + j*(86)
+-258 + j*(47)
+161 + j*(38)
+286 + j*(-1)
+113 + j*(178)
+-124 + j*(-255)
+-3 + j*(347)
+136 + j*(-137)
+62 + j*(-89)
+36 + j*(267)
+-74 + j*(-311)
+-1 + j*(109)
+96 + j*(-269)
+223 + j*(-111)
+298 + j*(-105)
+-149 + j*(9)
+-303 + j*(36)
+-265 + j*(276)
+-324 + j*(-81)
+-176 + j*(-8)
+243 + j*(311)
+-18 + j*(-35)
+-212 + j*(177)
+-35 + j*(158)
+20 + j*(121)
+70 + j*(64)
+-201 + j*(-1)
+-76 + j*(258)
+-252 + j*(101)
+2 + j*(225)
+92 + j*(-81)
+123 + j*(-123)
+-125 + j*(78)
+146 + j*(-37)
+184 + j*(375)
+62 + j*(102)
+-294 + j*(196)
+-3 + j*(217)
+-214 + j*(322)
+559 + j*(98)
+-136 + j*(173)
+47 + j*(-37)
+98 + j*(-22)
+234 + j*(-21)
+36 + j*(-142)
+239 + j*(-272)
+-58 + j*(198)
+390 + j*(37)
+-132 + j*(-216)
+-95 + j*(-52)
+27 + j*(-119)
+-8 + j*(143)
+122 + j*(110)
+145 + j*(-146)
+210 + j*(-166)
+-73 + j*(-25)
+136 + j*(45)
+150 + j*(-169)
+45 + j*(-17)
+122 + j*(-30)
+110 + j*(-110)
+63 + j*(-232)
+330 + j*(312)
+-204 + j*(-26)
+204 + j*(129)
+-87 + j*(88)
+240 + j*(73)
+129 + j*(-101)
+-68 + j*(92)
+115 + j*(122)
+273 + j*(103)
+-320 + j*(-144)
+79 + j*(93)
+-335 + j*(242)
+308 + j*(1)
+52 + j*(119)
+206 + j*(-37)
+106 + j*(-74)
+-288 + j*(-274)
+-131 + j*(194)
+-107 + j*(-123)
+-418 + j*(120)
+165 + j*(74)
+209 + j*(27)
+143 + j*(-276)
+12 + j*(-70)
+33 + j*(-74)
+-44 + j*(-145)
+1 + j*(-385)
+7 + j*(45)
+460 + j*(-204)
+53 + j*(266)
+-216 + j*(-86)
+28 + j*(92)
+118 + j*(61)
+168 + j*(-52)
+110 + j*(198)
+121 + j*(-107)
+98 + j*(75)
+-211 + j*(338)
+16 + j*(-6)
+-261 + j*(346)
+101 + j*(-113)
+-151 + j*(104)
+-111 + j*(-175)
+38 + j*(172)
+83 + j*(-206)
+173 + j*(199)
+-34 + j*(66)
+-12 + j*(-31)
+40 + j*(47)
+30 + j*(336)
+276 + j*(16)
+238 + j*(76)
+439 + j*(259)
+120 + j*(-16)
+125 + j*(37)
+139 + j*(104)
+-79 + j*(-187)
+-431 + j*(219)
+-304 + j*(-148)
+-4 + j*(-105)
+-141 + j*(-92)
+194 + j*(-172)
+-30 + j*(-248)
+-45 + j*(157)
+-4 + j*(109)
+170 + j*(193)
+153 + j*(-243)
+-304 + j*(-82)
+92 + j*(64)
+76 + j*(16)
+68 + j*(46)
+-146 + j*(144)
+219 + j*(222)
+-216 + j*(68)
+-88 + j*(-248)
+-170 + j*(42)
+79 + j*(-355)
+43 + j*(67)
+69 + j*(33)
+-137 + j*(-228)
+72 + j*(132)
+-40 + j*(-29)
+-1 + j*(107)
+-73 + j*(333)
+285 + j*(-302)
+252 + j*(-49)
+74 + j*(-91)
+-83 + j*(156)
+-304 + j*(321)
+100 + j*(-276)
+-182 + j*(-174)
+-49 + j*(-325)
+78 + j*(-262)
+-262 + j*(-26)
+134 + j*(83)
+-112 + j*(83)
+7 + j*(65)
+-11 + j*(110)
+115 + j*(47)
+-45 + j*(-115)
+1 + j*(-168)
+-112 + j*(-49)
+-293 + j*(28)
+-351 + j*(-62)
+-10 + j*(27)
+226 + j*(-30)
+-57 + j*(176)
+37 + j*(-181)
+172 + j*(143)
+187 + j*(248)
+-205 + j*(1)
+187 + j*(-23)
+-280 + j*(-25)
+200 + j*(-519)
+-30 + j*(218)
+-90 + j*(220)
+-58 + j*(22)
+110 + j*(-327)
+-165 + j*(30)
+-2 + j*(-261)
+222 + j*(-47)
+-115 + j*(-274)
+284 + j*(65)
+166 + j*(339)
+-2 + j*(192)
+-54 + j*(-168)
+139 + j*(-147)
+202 + j*(-148)
+-88 + j*(-42)
+-88 + j*(87)
+-16 + j*(-157)
+-116 + j*(-215)
+254 + j*(57)
+-135 + j*(-27)
+82 + j*(223)
+-165 + j*(206)
+29 + j*(-119)
+-112 + j*(-28)
+241 + j*(330)
+-164 + j*(-91)
+-162 + j*(-92)
+39 + j*(57)
+-105 + j*(240)
+-96 + j*(-112)
+266 + j*(274)
+272 + j*(-71)
+-81 + j*(79)
+100 + j*(-11)
+-52 + j*(-24)
+325 + j*(-252)
+-24 + j*(363)
+170 + j*(-103)
+-224 + j*(263)
+229 + j*(123)
+62 + j*(-281)
+-139 + j*(-92)
+-103 + j*(124)
+387 + j*(-151)
+103 + j*(252)
+-52 + j*(-88)
+150 + j*(-183)
+-508 + j*(47)
+16 + j*(-13)
+40 + j*(104)
+-18 + j*(-61)
+436 + j*(25)
+-60 + j*(-131)
+165 + j*(101)
+220 + j*(191)
+-254 + j*(-140)
+21 + j*(-212)
+-81 + j*(-122)
+-252 + j*(-175)
+11 + j*(124)
+-47 + j*(38)
+163 + j*(227)
+-525 + j*(30)
+117 + j*(453)
+-137 + j*(-71)
+136 + j*(34)
+127 + j*(26)
+-360 + j*(-185)
+247 + j*(-28)
+-350 + j*(317)
+-262 + j*(151)
+58 + j*(-221)
+-10 + j*(156)
+-387 + j*(64)
+-25 + j*(223)
+-42 + j*(110)
+33 + j*(378)
+35 + j*(90)
+-264 + j*(78)
+-112 + j*(109)
+123 + j*(68)
+276 + j*(-239)
+-11 + j*(-231)
+416 + j*(23)
+276 + j*(196)
+-52 + j*(-30)
+-125 + j*(6)
+297 + j*(47)
+186 + j*(-114)
+75 + j*(-99)
+379 + j*(1)
+-25 + j*(330)
+-81 + j*(-228)
+-118 + j*(-213)
+-45 + j*(-100)
+-372 + j*(84)
+-93 + j*(-155)
+-169 + j*(-9)
+245 + j*(-222)
+-134 + j*(-5)
+-188 + j*(303)
+-162 + j*(-185)
+132 + j*(-141)
+-325 + j*(301)
+-42 + j*(-164)
+256 + j*(151)
+52 + j*(69)
+-128 + j*(325)
+-165 + j*(134)
+-162 + j*(-32)
+-117 + j*(-190)
+17 + j*(-82)
+173 + j*(-173)
+298 + j*(-11)
+-151 + j*(141)
+-327 + j*(147)
+-62 + j*(72)
+-21 + j*(-19)
+-10 + j*(-189)
+-36 + j*(50)
+95 + j*(-60)
+122 + j*(141)
+125 + j*(23)
+18 + j*(218)
+-36 + j*(288)
+-127 + j*(81)
+21 + j*(-100)
+-216 + j*(-237)
+85 + j*(-117)
+4 + j*(-219)
+260 + j*(-119)
+154 + j*(132)
+-110 + j*(312)
+-231 + j*(91)
+269 + j*(65)
+-62 + j*(-256)
+-133 + j*(-183)
+84 + j*(-89)
+143 + j*(-9)
+-245 + j*(11)
+-196 + j*(-218)
+85 + j*(-211)
+-146 + j*(91)
+-179 + j*(-57)
+-122 + j*(-66)
+-112 + j*(45)
+-354 + j*(-65)
+101 + j*(-99)
+362 + j*(243)
+-141 + j*(-321)
+210 + j*(114)
+127 + j*(223)
+257 + j*(-35)
+-298 + j*(63)
+-88 + j*(397)
+-272 + j*(72)
+44 + j*(387)
+-170 + j*(-21)
+60 + j*(104)
+-310 + j*(-85)
+-327 + j*(213)
+326 + j*(-179)
+-96 + j*(-5)
+15 + j*(-286)
+-76 + j*(27)
+103 + j*(124)
+5 + j*(-456)
+-133 + j*(-173)
+-7 + j*(-293)
+-62 + j*(-57)
+93 + j*(-42)
+282 + j*(-146)
+133 + j*(252)
+-98 + j*(63)
+14 + j*(138)
+-192 + j*(108)
+100 + j*(216)
+-214 + j*(-267)
+287 + j*(-177)
+138 + j*(-223)
+-74 + j*(92)
+210 + j*(134)
+-143 + j*(40)
+119 + j*(-45)
+115 + j*(30)
+344 + j*(-255)
+175 + j*(116)
+-238 + j*(98)
+-122 + j*(-103)
+-223 + j*(378)
+213 + j*(103)
+23 + j*(163)
+-150 + j*(130)
+116 + j*(257)
+-257 + j*(-51)
+-151 + j*(-144)
+98 + j*(-243)
+-285 + j*(-140)
+171 + j*(347)
+66 + j*(-49)
+294 + j*(-273)
+-100 + j*(-174)
+-237 + j*(-134)
+-459 + j*(320)
+-73 + j*(2)
+162 + j*(180)
+64 + j*(-307)
+263 + j*(-46)
+-95 + j*(-274)
+-50 + j*(103)
+191 + j*(170)
+-107 + j*(60)
+42 + j*(-159)
+-35 + j*(-46)
+-72 + j*(91)
+341 + j*(-216)
+112 + j*(249)
+-114 + j*(-213)
+11 + j*(71)
+-42 + j*(-106)
+-70 + j*(-117)
+-204 + j*(-8)
+-30 + j*(59)
+-257 + j*(263)
+190 + j*(-417)
+-6 + j*(152)
+-127 + j*(97)
+-64 + j*(99)
+-428 + j*(144)
+-178 + j*(-112)
+539 + j*(-2)
+338 + j*(-120)
+108 + j*(-235)
+-324 + j*(-28)
+16 + j*(160)
+70 + j*(188)
+11 + j*(73)
+-49 + j*(-291)
+206 + j*(197)
+237 + j*(136)
+83 + j*(216)
+54 + j*(-149)
+-28 + j*(-105)
+-37 + j*(-55)
+132 + j*(-138)
+138 + j*(-161)
+55 + j*(-45)
+-99 + j*(168)
+173 + j*(175)
+7 + j*(49)
+-8 + j*(55)
+93 + j*(248)
+16 + j*(-199)
+-104 + j*(324)
+-163 + j*(122)
+66 + j*(112)
+134 + j*(-49)
+25 + j*(-253)
+-76 + j*(-95)
+42 + j*(245)
+151 + j*(-187)
+-153 + j*(-282)
+39 + j*(-135)
+4 + j*(-163)
+75 + j*(190)
+-126 + j*(-10)
+171 + j*(55)
+-3 + j*(-19)
+-59 + j*(76)
+-189 + j*(-52)
+125 + j*(-81)
+254 + j*(-258)
+25 + j*(-116)
+-359 + j*(333)
+-127 + j*(110)
+-243 + j*(156)
+184 + j*(33)
+-265 + j*(5)
+-120 + j*(4)
+-265 + j*(-8)
+168 + j*(-161)
+65 + j*(125)
+-62 + j*(-164)
+-208 + j*(-21)
+-142 + j*(-322)
+-378 + j*(19)
+-73 + j*(76)
+-61 + j*(151)
+-141 + j*(-202)
+132 + j*(133)
+228 + j*(-25)
+458 + j*(-65)
+-133 + j*(-45)
+-233 + j*(85)
+126 + j*(-35)
+81 + j*(-158)
+239 + j*(64)
+169 + j*(179)
+23 + j*(318)
+-153 + j*(-144)
+92 + j*(-21)
+3 + j*(197)
+31 + j*(52)
+74 + j*(-50)
+117 + j*(-38)
+-108 + j*(-49)
+129 + j*(-19)
+-218 + j*(-81)
+123 + j*(-25)
+326 + j*(-124)
+-146 + j*(-104)
+-19 + j*(-156)
+-30 + j*(-185)
+52 + j*(86)
+-529 + j*(6)
+194 + j*(-97)
+109 + j*(278)
+-315 + j*(-296)
+241 + j*(168)
+107 + j*(228)
+-103 + j*(219)
+79 + j*(238)
+91 + j*(-158)
+343 + j*(-144)
+-165 + j*(-165)
+-375 + j*(49)
+257 + j*(-81)
+223 + j*(160)
+-144 + j*(-144)
+-11 + j*(252)
+70 + j*(-40)
+40 + j*(79)
+400 + j*(191)
+8 + j*(-76)
+-98 + j*(-105)
+8 + j*(33)
+-69 + j*(-42)
+270 + j*(-35)
+23 + j*(22)
+-418 + j*(-221)
+-38 + j*(-53)
+28 + j*(64)
+114 + j*(291)
+421 + j*(272)
+-222 + j*(250)
+-34 + j*(83)
+119 + j*(-148)
+-141 + j*(136)
+-165 + j*(40)
+110 + j*(-94)
+-341 + j*(105)
+-62 + j*(25)
+-187 + j*(107)
+-132 + j*(221)
+-17 + j*(1)
+279 + j*(-247)
+81 + j*(148)
+46 + j*(116)
+-448 + j*(-277)
+-310 + j*(431)
+30 + j*(28)
+136 + j*(-87)
+8 + j*(24)
+257 + j*(-246)
+-8 + j*(165)
+-49 + j*(-32)
+-11 + j*(-11)
+34 + j*(-10)
+-53 + j*(21)
+361 + j*(103)
+-284 + j*(-36)
+-202 + j*(-190)
+62 + j*(88)
+-69 + j*(190)
+-66 + j*(-338)
+54 + j*(31)
+-71 + j*(105)
+-177 + j*(-55)
+235 + j*(-53)
+28 + j*(104)
+-363 + j*(80)
+144 + j*(2)
+250 + j*(192)
+-60 + j*(1)
+-206 + j*(-163)
+54 + j*(-66)
+-91 + j*(-169)
+-78 + j*(-36)
+91 + j*(-15)
+-30 + j*(107)
+85 + j*(14)
+-285 + j*(21)
+179 + j*(152)
+-197 + j*(-69)
+86 + j*(-214)
+200 + j*(158)
+29 + j*(153)
+-181 + j*(-278)
+-89 + j*(-222)
+-172 + j*(-129)
+-30 + j*(272)
+365 + j*(-10)
+-40 + j*(-85)
+-8 + j*(-57)
+-241 + j*(-301)
+-267 + j*(-530)
+38 + j*(-85)
+-91 + j*(478)
+-18 + j*(-260)
+-261 + j*(-103)
+41 + j*(69)
+376 + j*(74)
+59 + j*(342)
+-450 + j*(-386)
+-185 + j*(-6)
+399 + j*(284)
+69 + j*(128)
+-247 + j*(-365)
+88 + j*(-74)
+182 + j*(16)
+-257 + j*(209)
+-336 + j*(26)
+-260 + j*(-74)
+80 + j*(66)
+-257 + j*(-243)
+139 + j*(-35)
+-354 + j*(33)
+21 + j*(-107)
+-279 + j*(46)
+-124 + j*(192)
+-474 + j*(-165)
+61 + j*(-238)
+-114 + j*(182)
+-122 + j*(-105)
+-265 + j*(192)
+209 + j*(-58)
+134 + j*(-87)
+-124 + j*(-299)
+-112 + j*(196)
+132 + j*(38)
+-180 + j*(303)
+-203 + j*(82)
+-62 + j*(-222)
+37 + j*(371)
+128 + j*(148)
+194 + j*(198)
+11 + j*(-93)
+23 + j*(-392)
+-9 + j*(213)
+284 + j*(-231)
+108 + j*(-115)
+-86 + j*(-54)
+-78 + j*(25)
+-66 + j*(-118)
+139 + j*(-135)
+95 + j*(-66)
+-155 + j*(-134)
+-136 + j*(13)
+37 + j*(147)
+105 + j*(-52)
+124 + j*(180)
+93 + j*(129)
+85 + j*(233)
+139 + j*(-129)
+363 + j*(93)
+110 + j*(181)
+321 + j*(-131)
+-116 + j*(-50)
+292 + j*(52)
+130 + j*(-219)
+-76 + j*(155)
+170 + j*(8)
+-60 + j*(36)
+105 + j*(58)
+368 + j*(125)
+-136 + j*(-108)
+-142 + j*(69)
+21 + j*(-49)
+10 + j*(-94)
+-196 + j*(-4)
+488 + j*(313)
+86 + j*(-116)
+167 + j*(34)
+-52 + j*(267)
+-132 + j*(273)
+-107 + j*(-311)
+12 + j*(-185)
+148 + j*(-227)
+-175 + j*(-88)
+68 + j*(40)
+44 + j*(-27)
+158 + j*(-191)
+-6 + j*(122)
+315 + j*(-21)
+-213 + j*(59)
+421 + j*(-175)
+-81 + j*(275)
+-93 + j*(80)
+-29 + j*(-130)
+-58 + j*(153)
+-246 + j*(-158)
+71 + j*(-250)
+-354 + j*(120)
+37 + j*(195)
+460 + j*(-35)
+-176 + j*(-60)
+109 + j*(30)
+-274 + j*(46)
+163 + j*(-293)
+339 + j*(124)
+-288 + j*(103)
+256 + j*(-101)
+-62 + j*(173)
+-130 + j*(288)
+137 + j*(-49)
+169 + j*(-1)
+-69 + j*(-170)
+-231 + j*(207)
+165 + j*(62)
+-147 + j*(102)
+-28 + j*(158)
+-18 + j*(-250)
+58 + j*(-124)
+-211 + j*(-76)
+-277 + j*(-126)
+-288 + j*(281)
+-47 + j*(91)
+57 + j*(-258)
+158 + j*(31)
+173 + j*(-93)
+64 + j*(-301)
+-178 + j*(88)
+-129 + j*(518)
+144 + j*(-270)
+146 + j*(-278)
+239 + j*(122)
+274 + j*(8)
+77 + j*(-119)
+-47 + j*(-154)
+-2 + j*(219)
+-204 + j*(267)
+118 + j*(166)
+42 + j*(-456)
+-47 + j*(29)
+-187 + j*(180)
+-112 + j*(230)
+95 + j*(-22)
+120 + j*(381)
+244 + j*(-168)
+-9 + j*(103)
+143 + j*(97)
+-337 + j*(1)
+228 + j*(18)
+-43 + j*(92)
+-42 + j*(6)
+-16 + j*(483)
+35 + j*(257)
+100 + j*(-82)
+245 + j*(144)
+136 + j*(-35)
+167 + j*(31)
+-45 + j*(129)
+-165 + j*(130)
+431 + j*(227)
+-163 + j*(-289)
+157 + j*(-82)
+371 + j*(-184)
+8 + j*(117)
+-247 + j*(-31)
+57 + j*(120)
+-107 + j*(-310)
+-71 + j*(-28)
+-234 + j*(-110)
+-88 + j*(80)
+-275 + j*(75)
+-202 + j*(311)
+-124 + j*(-170)
+1 + j*(-284)
+-44 + j*(-331)
+-148 + j*(-53)
+-11 + j*(8)
+156 + j*(255)
+302 + j*(170)
+-139 + j*(47)
+50 + j*(146)
+-132 + j*(234)
+-40 + j*(0)
+31 + j*(-148)
+-151 + j*(64)
+202 + j*(-64)
+207 + j*(42)
+-194 + j*(48)
+100 + j*(-102)
+97 + j*(123)
+262 + j*(82)
+-321 + j*(-168)
+-282 + j*(19)
+-35 + j*(201)
+257 + j*(114)
+-47 + j*(-174)
+-59 + j*(-81)
+1 + j*(-50)
+-180 + j*(-216)
+-141 + j*(-33)
+-106 + j*(167)
+14 + j*(62)
+151 + j*(104)
+-206 + j*(-145)
+132 + j*(-35)
+-2 + j*(94)
+107 + j*(101)
+65 + j*(93)
+30 + j*(-250)
+175 + j*(159)
+16 + j*(202)
+-87 + j*(-223)
+7 + j*(-244)
+58 + j*(-51)
+103 + j*(-135)
+-168 + j*(-313)
+-325 + j*(132)
+-136 + j*(-111)
+-211 + j*(-162)
+35 + j*(-76)
+354 + j*(196)
+132 + j*(-28)
+-12 + j*(-352)
+140 + j*(-337)
+-144 + j*(-102)
+-115 + j*(-63)
+-36 + j*(65)
+-98 + j*(-89)
+-119 + j*(53)
+91 + j*(-206)
+51 + j*(-476)
+160 + j*(-76)
+-222 + j*(-345)
+-265 + j*(202)
+86 + j*(-40)
+142 + j*(170)
+115 + j*(237)
+187 + j*(-6)
+-32 + j*(-87)
+-379 + j*(175)
+-46 + j*(-578)
+-116 + j*(-57)
+30 + j*(19)
+-80 + j*(115)
+13 + j*(100)
+-116 + j*(121)
+30 + j*(237)
+-226 + j*(165)
+-220 + j*(-202)
+70 + j*(-153)
+-282 + j*(-106)
+-322 + j*(-4)
+-46 + j*(7)
+176 + j*(41)
+195 + j*(132)
+-103 + j*(23)
+-114 + j*(-115)
+153 + j*(317)
+-57 + j*(60)
+-160 + j*(-151)
+-236 + j*(167)
+203 + j*(-55)
+-18 + j*(7)
+-244 + j*(-16)
+250 + j*(159)
+3 + j*(-170)
+-54 + j*(33)
+-42 + j*(-67)
+334 + j*(149)
+-354 + j*(85)
+-4 + j*(-64)
+-63 + j*(92)
+223 + j*(-244)
+4 + j*(-47)
+125 + j*(-204)
+107 + j*(70)
+191 + j*(-337)
+-331 + j*(185)
+-441 + j*(74)
+-96 + j*(178)
+-70 + j*(83)
+152 + j*(100)
+-117 + j*(371)
+184 + j*(-202)
+-223 + j*(200)
+-42 + j*(-50)
+18 + j*(126)
+20 + j*(-46)
+-298 + j*(203)
+46 + j*(146)
+-153 + j*(-19)
+268 + j*(-62)
+103 + j*(-322)
+157 + j*(694)
+-23 + j*(105)
+-129 + j*(183)
+-28 + j*(132)
+21 + j*(37)
+30 + j*(173)
+-101 + j*(121)
+-100 + j*(189)
+-272 + j*(-186)
+211 + j*(-85)
+-222 + j*(-71)
+-218 + j*(-44)
+-98 + j*(38)
+88 + j*(113)
+249 + j*(-197)
+86 + j*(346)
+-49 + j*(-60)
+235 + j*(230)
+62 + j*(-8)
+-169 + j*(-186)
+304 + j*(-342)
+119 + j*(65)
+34 + j*(-357)
+125 + j*(-96)
+-258 + j*(103)
+71 + j*(-79)
+-179 + j*(193)
+-139 + j*(-187)
+-236 + j*(-131)
+408 + j*(340)
+139 + j*(-67)
+-29 + j*(21)
+-59 + j*(99)
+-19 + j*(-37)
+377 + j*(107)
+-272 + j*(164)
+81 + j*(-98)
+-44 + j*(-69)
+-203 + j*(-243)
+-63 + j*(116)
+-82 + j*(13)
+-4 + j*(-42)
+83 + j*(-158)
+-216 + j*(-180)
+-112 + j*(112)
+-232 + j*(-168)
+146 + j*(169)
+-199 + j*(55)
+74 + j*(-52)
+-69 + j*(-372)
+-64 + j*(-177)
+-92 + j*(-14)
+1 + j*(-285)
+-81 + j*(-277)
+57 + j*(-180)
+-185 + j*(-419)
+-235 + j*(-25)
+-298 + j*(117)
+-20 + j*(82)
+110 + j*(231)
+20 + j*(-115)
+223 + j*(71)
+-54 + j*(18)
+-82 + j*(-61)
+-54 + j*(88)
+112 + j*(-132)
+-216 + j*(-183)
+144 + j*(135)
+-95 + j*(361)
+126 + j*(194)
+4 + j*(-424)
+185 + j*(91)
+-4 + j*(-30)
+-112 + j*(-177)
+-479 + j*(195)
+-301 + j*(-36)
+-324 + j*(74)
+66 + j*(20)
+-174 + j*(-128)
+57 + j*(-160)
+1 + j*(-95)
+121 + j*(-1)
+78 + j*(-13)
+8 + j*(-64)
+-83 + j*(46)
+-59 + j*(-35)
+7 + j*(23)
+-100 + j*(168)
+-151 + j*(-72)
+-171 + j*(-166)
+124 + j*(396)
+-94 + j*(-126)
+136 + j*(-111)
+-80 + j*(-441)
+136 + j*(268)
+358 + j*(69)
+11 + j*(-5)
+-298 + j*(-37)
+-37 + j*(144)
+-185 + j*(4)
+-16 + j*(282)
+-12 + j*(-115)
+-4 + j*(-86)
+29 + j*(-469)
+-443 + j*(-96)
+-258 + j*(7)
+115 + j*(-133)
+-213 + j*(-262)
+279 + j*(-81)
+129 + j*(-107)
+-167 + j*(38)
+-91 + j*(-312)
+-202 + j*(335)
+262 + j*(37)
+1 + j*(-13)
+135 + j*(319)
+127 + j*(297)
+130 + j*(115)
+-280 + j*(151)
+-213 + j*(-125)
+-90 + j*(23)
+110 + j*(192)
+-148 + j*(-175)
+-91 + j*(-89)
+428 + j*(-33)
+122 + j*(-108)
+206 + j*(-93)
+-56 + j*(-170)
+330 + j*(-283)
+243 + j*(18)
+257 + j*(-235)
+95 + j*(-140)
+-50 + j*(-323)
+-146 + j*(214)
+167 + j*(229)
+-22 + j*(23)
+72 + j*(-136)
+265 + j*(-286)
+-305 + j*(-121)
+6 + j*(165)
+124 + j*(-304)
+184 + j*(78)
+360 + j*(8)
+-103 + j*(-96)
+99 + j*(-48)
+-266 + j*(145)
+206 + j*(-59)
+313 + j*(58)
+-79 + j*(-182)
+109 + j*(91)
+-360 + j*(-320)
+153 + j*(227)
+-165 + j*(87)
+34 + j*(-18)
+3 + j*(229)
+1 + j*(49)
+245 + j*(140)
+-162 + j*(89)
+-110 + j*(-125)
+-93 + j*(202)
+109 + j*(-93)
+90 + j*(-56)
+358 + j*(151)
+286 + j*(-158)
+182 + j*(-62)
+-204 + j*(49)
+20 + j*(279)
+-105 + j*(-283)
+-83 + j*(43)
+-13 + j*(-51)
+-68 + j*(176)
+-152 + j*(-12)
+-129 + j*(231)
+9 + j*(143)
+102 + j*(-153)
+-134 + j*(-113)
+34 + j*(174)
+-151 + j*(180)
+-45 + j*(-171)
+206 + j*(-89)
+154 + j*(144)
+-146 + j*(-276)
+216 + j*(57)
+495 + j*(30)
+-177 + j*(25)
+97 + j*(240)
+-84 + j*(-176)
+-194 + j*(-102)
+33 + j*(-204)
+181 + j*(-70)
+-52 + j*(280)
+47 + j*(64)
+-77 + j*(67)
+408 + j*(27)
+171 + j*(74)
+-318 + j*(177)
+98 + j*(136)
+-166 + j*(124)
+21 + j*(223)
+-105 + j*(143)
+-185 + j*(162)
+11 + j*(6)
+218 + j*(118)
+-149 + j*(190)
+42 + j*(121)
+-117 + j*(100)
+-86 + j*(32)
+13 + j*(-127)
+13 + j*(-260)
+102 + j*(49)
+173 + j*(210)
+110 + j*(-64)
+-13 + j*(329)
+145 + j*(-61)
+44 + j*(-65)
+-110 + j*(-280)
+226 + j*(-64)
+207 + j*(205)
+-9 + j*(-98)
+-291 + j*(-194)
+59 + j*(129)
+-104 + j*(-78)
+13 + j*(-115)
+2 + j*(-84)
+47 + j*(-117)
+-182 + j*(-156)
+371 + j*(66)
+-185 + j*(249)
+-360 + j*(-141)
+74 + j*(-243)
+150 + j*(412)
+293 + j*(13)
+161 + j*(-319)
+-52 + j*(250)
+-81 + j*(-110)
+35 + j*(25)
+62 + j*(146)
+-134 + j*(-8)
+-101 + j*(64)
+-213 + j*(206)
+49 + j*(27)
+-9 + j*(44)
+-30 + j*(57)
+-185 + j*(-103)
+-175 + j*(-29)
+-315 + j*(127)
+294 + j*(-68)
+-98 + j*(390)
+76 + j*(-11)
+216 + j*(272)
+-136 + j*(5)
+44 + j*(210)
+-3 + j*(-24)
+182 + j*(-110)
+-61 + j*(40)
+-28 + j*(52)
+-95 + j*(-206)
+-57 + j*(230)
+182 + j*(-40)
+128 + j*(-143)
+102 + j*(-54)
+-83 + j*(28)
+-37 + j*(-208)
+-220 + j*(183)
+158 + j*(-382)
+88 + j*(-19)
+-25 + j*(-37)
+75 + j*(60)
+-63 + j*(-173)
+-230 + j*(-128)
+112 + j*(-43)
+-158 + j*(-47)
+20 + j*(49)
+-145 + j*(71)
+-297 + j*(68)
+-329 + j*(-21)
+245 + j*(-95)
+-303 + j*(88)
+-72 + j*(151)
+-126 + j*(-173)
+11 + j*(199)
+127 + j*(423)
+213 + j*(-18)
+230 + j*(17)
+-110 + j*(-47)
+347 + j*(166)
+165 + j*(46)
+-402 + j*(100)
+-34 + j*(-164)
+18 + j*(187)
+-27 + j*(102)
+100 + j*(324)
+-43 + j*(-269)
+118 + j*(-268)
+-69 + j*(187)
+192 + j*(-211)
+99 + j*(-127)
+262 + j*(42)
+-93 + j*(-35)
+-245 + j*(-249)
+-39 + j*(-274)
+115 + j*(-197)
+179 + j*(8)
+395 + j*(33)
+324 + j*(-6)
+-129 + j*(105)
+72 + j*(-66)
+-239 + j*(-16)
+-112 + j*(189)
+-334 + j*(-83)
+91 + j*(235)
+-139 + j*(91)
+-136 + j*(122)
+47 + j*(-132)
+453 + j*(-16)
+-150 + j*(-126)
+-255 + j*(86)
+146 + j*(-169)
+-31 + j*(158)
+98 + j*(132)
+-260 + j*(86)
+-20 + j*(145)
+77 + j*(-175)
+-227 + j*(271)
+-25 + j*(115)
+76 + j*(267)
+-192 + j*(66)
+-274 + j*(-34)
+-163 + j*(-132)
+-155 + j*(-195)
+91 + j*(46)
+-137 + j*(-191)
+-151 + j*(260)
+-8 + j*(29)
+-83 + j*(25)
+17 + j*(-16)
+-430 + j*(494)
+212 + j*(55)
+134 + j*(86)
+188 + j*(-2)
+-11 + j*(151)
+209 + j*(27)
+-37 + j*(40)
+-202 + j*(90)
+-25 + j*(327)
+81 + j*(-401)
+-180 + j*(194)
+-146 + j*(262)
+221 + j*(87)
+280 + j*(-118)
+-30 + j*(15)
+164 + j*(91)
+45 + j*(-315)
+-325 + j*(43)
+-283 + j*(-286)
+-63 + j*(-174)
+-220 + j*(-100)
+190 + j*(-108)
+37 + j*(-11)
+148 + j*(-88)
+-103 + j*(-93)
+122 + j*(94)
+-124 + j*(-273)
+-59 + j*(-193)
+13 + j*(77)
+3 + j*(-186)
+36 + j*(-62)
+-219 + j*(232)
+103 + j*(71)
+54 + j*(47)
+13 + j*(52)
+-356 + j*(119)
+-124 + j*(152)
+77 + j*(33)
+-83 + j*(148)
+-40 + j*(-25)
+35 + j*(-64)
+-170 + j*(-244)
+-301 + j*(-208)
+-61 + j*(140)
+-197 + j*(-47)
+-134 + j*(-243)
+34 + j*(269)
+-169 + j*(-330)
+65 + j*(46)
+167 + j*(47)
+-118 + j*(-40)
+65 + j*(-15)
+-16 + j*(211)
+-63 + j*(107)
+50 + j*(120)
+-194 + j*(9)
+-97 + j*(90)
+-226 + j*(-82)
+59 + j*(-375)
+123 + j*(-107)
+112 + j*(63)
+-95 + j*(146)
+-209 + j*(91)
+278 + j*(-85)
+190 + j*(134)
+296 + j*(-10)
+-175 + j*(-175)
+136 + j*(-52)
+166 + j*(-25)
+129 + j*(107)
+-254 + j*(-54)
+132 + j*(6)
+137 + j*(95)
+-457 + j*(-166)
+-146 + j*(34)
+-46 + j*(-144)
+32 + j*(291)
+143 + j*(168)
+108 + j*(14)
+25 + j*(-109)
+-262 + j*(148)
+-111 + j*(-62)
+170 + j*(-84)
+-148 + j*(217)
+-279 + j*(-161)
+-50 + j*(-172)
+261 + j*(-89)
+-186 + j*(31)
+-35 + j*(201)
+-392 + j*(-57)
+-43 + j*(291)
+-125 + j*(65)
+157 + j*(-12)
+-43 + j*(40)
+173 + j*(-97)
+231 + j*(-39)
+40 + j*(-25)
+-184 + j*(-57)
+31 + j*(-173)
+-262 + j*(74)
+6 + j*(214)
+37 + j*(-114)
+-296 + j*(-238)
+115 + j*(-8)
+17 + j*(-50)
+-165 + j*(134)
+-115 + j*(127)
+-419 + j*(-182)
+-29 + j*(-102)
+49 + j*(348)
+-173 + j*(-4)
+-431 + j*(31)
+-60 + j*(21)
+-130 + j*(-76)
+-278 + j*(-74)
+-156 + j*(-45)
+383 + j*(187)
+241 + j*(-255)
+105 + j*(-116)
+-6 + j*(-184)
+327 + j*(-173)
+-32 + j*(39)
+23 + j*(78)
+35 + j*(0)
+116 + j*(-264)
+-10 + j*(-5)
+-44 + j*(110)
+-103 + j*(-112)
+-506 + j*(227)
+144 + j*(-71)
+150 + j*(43)
+45 + j*(344)
+-286 + j*(-126)
+24 + j*(-301)
+-136 + j*(-288)
+23 + j*(-66)
+-247 + j*(-122)
+2 + j*(-254)
+-434 + j*(-101)
+-262 + j*(86)
+-265 + j*(-110)
+-293 + j*(115)
+-11 + j*(361)
+249 + j*(-121)
+-88 + j*(35)
+-232 + j*(-86)
+296 + j*(8)
+-125 + j*(4)
+-14 + j*(-228)
+-212 + j*(259)
+30 + j*(207)
+165 + j*(-69)
+454 + j*(0)
+-282 + j*(71)
+41 + j*(-194)
+264 + j*(-13)
+-313 + j*(129)
+82 + j*(106)
+76 + j*(-2)
+245 + j*(-102)
+-92 + j*(245)
+242 + j*(-47)
+-132 + j*(-83)
+231 + j*(-56)
+-64 + j*(-59)
+-94 + j*(-115)
+241 + j*(154)
+-261 + j*(-173)
+-56 + j*(157)
+-54 + j*(-21)
+-180 + j*(28)
+144 + j*(104)
+64 + j*(23)
+-93 + j*(-354)
+189 + j*(185)
+-110 + j*(-22)
+209 + j*(-222)
+79 + j*(-39)
+217 + j*(-105)
+-21 + j*(-139)
+91 + j*(205)
+195 + j*(-93)
+-6 + j*(-144)
+-231 + j*(117)
+-18 + j*(-35)
+87 + j*(190)
+152 + j*(56)
+248 + j*(66)
+-3 + j*(-235)
+-81 + j*(132)
+-59 + j*(315)
+-289 + j*(142)
+100 + j*(-118)
+-191 + j*(355)
+52 + j*(-271)
+1 + j*(-161)
+-151 + j*(-81)
+198 + j*(357)
+-202 + j*(-13)
+19 + j*(-220)
+188 + j*(-258)
+90 + j*(105)
+-168 + j*(25)
+37 + j*(-505)
+281 + j*(-93)
+-241 + j*(-156)
+49 + j*(-28)
+16 + j*(-299)
+151 + j*(-229)
+-42 + j*(136)
+-228 + j*(43)
+-124 + j*(148)
+-7 + j*(19)
+250 + j*(-66)
+207 + j*(118)
+80 + j*(28)
+-22 + j*(61)
+190 + j*(-61)
+206 + j*(-161)
+27 + j*(-344)
+-176 + j*(-18)
+233 + j*(-76)
+64 + j*(-87)
+334 + j*(-81)
+216 + j*(-3)
+1 + j*(499)
+57 + j*(-66)
+-123 + j*(-246)
+-329 + j*(-81)
+-113 + j*(-94)
+41 + j*(204)
+-194 + j*(-10)
+-52 + j*(116)
+-80 + j*(33)
+-271 + j*(-388)
+-288 + j*(-45)
+-65 + j*(-40)
+118 + j*(-59)
+296 + j*(-220)
+-175 + j*(57)
+4 + j*(71)
+-124 + j*(62)
+153 + j*(95)
+209 + j*(209)
+132 + j*(293)
+-72 + j*(-90)
+378 + j*(3)
+57 + j*(266)
+-354 + j*(42)
+84 + j*(-270)
+-52 + j*(303)
+211 + j*(-53)
+132 + j*(-156)
+375 + j*(37)
+-21 + j*(87)
+381 + j*(-107)
+86 + j*(-33)
+98 + j*(21)
+-189 + j*(-212)
+-138 + j*(-247)
+330 + j*(-127)
+34 + j*(-63)
+181 + j*(139)
+-86 + j*(144)
+206 + j*(-378)
+165 + j*(29)
+-133 + j*(183)
+52 + j*(-56)
+-140 + j*(123)
+-123 + j*(68)
+-13 + j*(243)
+-144 + j*(-129)
+-265 + j*(-195)
+148 + j*(139)
+117 + j*(-42)
+-105 + j*(-67)
+-64 + j*(-123)
+20 + j*(-232)
+-250 + j*(85)
+-117 + j*(-41)
+-474 + j*(269)
+76 + j*(-93)
+23 + j*(-175)
+-138 + j*(191)
+13 + j*(-97)
+15 + j*(395)
+71 + j*(56)
+-91 + j*(74)
+-180 + j*(134)
+-23 + j*(90)
+110 + j*(313)
+-309 + j*(-167)
+13 + j*(44)
+146 + j*(276)
+105 + j*(-266)
+-9 + j*(-158)
+69 + j*(-4)
+-45 + j*(-214)
+148 + j*(69)
+95 + j*(98)
+322 + j*(-187)
+-102 + j*(-109)
+-287 + j*(66)
+-108 + j*(-247)
+62 + j*(112)
+86 + j*(-119)
+75 + j*(65)
+-5 + j*(192)
+-112 + j*(0)
+301 + j*(-56)
+-206 + j*(83)
+-30 + j*(192)
+-293 + j*(-1)
+167 + j*(98)
+144 + j*(-275)
+76 + j*(80)
+-81 + j*(314)
+-132 + j*(-187)
+-124 + j*(-295)
+-412 + j*(339)
+49 + j*(-5)
+-10 + j*(-172)
+-36 + j*(-47)
+-112 + j*(-105)
+171 + j*(441)
+-104 + j*(-93)
+128 + j*(211)
+-76 + j*(-84)
+84 + j*(350)
+47 + j*(-100)
+-137 + j*(-182)
+-22 + j*(-212)
+8 + j*(100)
+-58 + j*(252)
+55 + j*(40)
+-95 + j*(127)
+252 + j*(-148)
+-147 + j*(-35)
+202 + j*(-465)
+127 + j*(-109)
+-136 + j*(-75)
+122 + j*(67)
+34 + j*(-97)
+-622 + j*(-2)
+240 + j*(49)
+230 + j*(95)
+-16 + j*(33)
+129 + j*(178)
+-92 + j*(131)
+-146 + j*(-288)
+-11 + j*(-154)
+243 + j*(-119)
+-293 + j*(-419)
+12 + j*(146)
+11 + j*(258)
+-267 + j*(-30)
+378 + j*(180)
+-145 + j*(-53)
+-152 + j*(-247)
+-127 + j*(-30)
+244 + j*(-144)
+-57 + j*(107)
+324 + j*(203)
+158 + j*(-66)
+308 + j*(-268)
+119 + j*(-105)
+-98 + j*(127)
+-189 + j*(-178)
+-35 + j*(-40)
+142 + j*(378)
+-226 + j*(-28)
+273 + j*(-14)
+65 + j*(-8)
+-95 + j*(-134)
+-35 + j*(83)
+49 + j*(157)
+-52 + j*(-219)
+14 + j*(280)
+-33 + j*(-86)
+86 + j*(-61)
+-508 + j*(-100)
+161 + j*(-415)
+-86 + j*(-105)
+65 + j*(-98)
+233 + j*(69)
+-90 + j*(115)
+47 + j*(171)
+-141 + j*(-136)
+70 + j*(-102)
+-40 + j*(-204)
+-239 + j*(-93)
+192 + j*(155)
+-231 + j*(32)
+-45 + j*(-419)
+20 + j*(-41)
+7 + j*(42)
+258 + j*(-222)
+98 + j*(-2)
+-13 + j*(62)
+-309 + j*(-131)
+158 + j*(96)
+-309 + j*(-138)
+-322 + j*(-272)
+168 + j*(-258)
+-395 + j*(131)
+187 + j*(-576)
+-81 + j*(-438)
+-147 + j*(-62)
+-220 + j*(-71)
+-203 + j*(-38)
+184 + j*(113)
+0 + j*(-317)
+167 + j*(-6)
+-226 + j*(78)
+-146 + j*(-158)
+-223 + j*(21)
+-170 + j*(70)
+21 + j*(-109)
+-54 + j*(103)
+407 + j*(-218)
+-4 + j*(-20)
+207 + j*(-315)
+-80 + j*(-86)
+180 + j*(-165)
+-144 + j*(289)
+146 + j*(262)
+38 + j*(-47)
+352 + j*(281)
+290 + j*(-41)
+-28 + j*(-112)
+38 + j*(323)
+-56 + j*(-105)
+-68 + j*(74)
+249 + j*(117)
+13 + j*(223)
+-66 + j*(356)
+-146 + j*(-142)
+-55 + j*(216)
+181 + j*(215)
+252 + j*(74)
+143 + j*(-118)
+93 + j*(125)
+29 + j*(22)
+-83 + j*(-94)
+66 + j*(21)
+-62 + j*(146)
+264 + j*(-65)
+-211 + j*(389)
+-119 + j*(245)
+24 + j*(-66)
+71 + j*(22)
+-1 + j*(-225)
+80 + j*(-397)
+-206 + j*(-12)
+-6 + j*(158)
+87 + j*(251)
+-8 + j*(139)
+-56 + j*(126)
+-327 + j*(45)
+37 + j*(-74)
+-45 + j*(381)
+94 + j*(-11)
+-6 + j*(46)
+-115 + j*(-161)
+171 + j*(-400)
+-3 + j*(44)
+-228 + j*(208)
+-20 + j*(-47)
+-117 + j*(-197)
+-104 + j*(89)
+102 + j*(-254)
+76 + j*(-246)
+-368 + j*(-77)
+49 + j*(107)
+47 + j*(53)
+87 + j*(-298)
+199 + j*(-163)
+116 + j*(-85)
+25 + j*(-167)
+-1 + j*(74)
+-2 + j*(-13)
+54 + j*(-91)
+76 + j*(-262)
+72 + j*(-146)
+-135 + j*(-182)
+6 + j*(-18)
+-217 + j*(178)
+-46 + j*(69)
+-9 + j*(-42)
+-65 + j*(-80)
+-28 + j*(-10)
+-97 + j*(-62)
+158 + j*(-168)
+106 + j*(2)
+-184 + j*(-18)
+-233 + j*(16)
+158 + j*(294)
+-172 + j*(-383)
+-199 + j*(-178)
+125 + j*(-46)
+-41 + j*(17)
+-365 + j*(247)
+262 + j*(-253)
+-105 + j*(72)
+-32 + j*(141)
+-2 + j*(-19)
+143 + j*(-65)
+42 + j*(125)
+37 + j*(-173)
+123 + j*(47)
+45 + j*(-98)
+-40 + j*(143)
+28 + j*(-257)
+97 + j*(-254)
+170 + j*(-148)
+-200 + j*(-47)
+-126 + j*(158)
+-278 + j*(21)
+124 + j*(130)
+-147 + j*(-42)
+8 + j*(200)
+-85 + j*(-76)
+237 + j*(37)
+-167 + j*(184)
+175 + j*(235)
+-180 + j*(380)
+-506 + j*(-137)
+-172 + j*(148)
+-28 + j*(23)
+18 + j*(-223)
+-82 + j*(166)
+11 + j*(121)
+83 + j*(216)
+-210 + j*(-182)
+-269 + j*(99)
+333 + j*(-19)
+-129 + j*(-68)
+281 + j*(-123)
+-8 + j*(-74)
+-146 + j*(36)
+91 + j*(-126)
+-94 + j*(45)
+-42 + j*(-46)
+62 + j*(464)
+89 + j*(-21)
+-281 + j*(67)
+101 + j*(-325)
+40 + j*(270)
+-163 + j*(107)
+-337 + j*(-230)
+-49 + j*(-117)
+94 + j*(200)
+-100 + j*(119)
+-252 + j*(49)
+164 + j*(40)
+337 + j*(72)
+-47 + j*(-204)
+-224 + j*(-218)
+-180 + j*(218)
+1 + j*(221)
+221 + j*(-285)
+259 + j*(-113)
+-71 + j*(366)
+-113 + j*(-133)
+59 + j*(-132)
+82 + j*(-6)
+-69 + j*(21)
+-182 + j*(-43)
+-27 + j*(-281)
+80 + j*(-69)
+-54 + j*(-49)
+91 + j*(-78)
+214 + j*(-64)
+-216 + j*(246)
+-180 + j*(11)
+81 + j*(-48)
+-34 + j*(-7)
+-8 + j*(57)
+-26 + j*(45)
+-324 + j*(264)
+185 + j*(-170)
+-119 + j*(-197)
+28 + j*(132)
+16 + j*(67)
+403 + j*(142)
+152 + j*(152)
+-22 + j*(388)
+44 + j*(0)
+42 + j*(11)
+35 + j*(-54)
+182 + j*(-73)
+153 + j*(-13)
+159 + j*(-34)
+316 + j*(83)
+289 + j*(194)
+-134 + j*(-163)
+87 + j*(117)
+95 + j*(-318)
+108 + j*(-79)
+-322 + j*(431)
+-1 + j*(314)
+69 + j*(-359)
+117 + j*(-21)
+-343 + j*(198)
+-25 + j*(-99)
+-10 + j*(-103)
+-76 + j*(182)
+-164 + j*(-390)
+-95 + j*(40)
+-181 + j*(182)
+-129 + j*(-161)
+-130 + j*(111)
+-20 + j*(1)
+-223 + j*(49)
+-129 + j*(119)
+-90 + j*(-31)
+163 + j*(-215)
+-130 + j*(-217)
+111 + j*(30)
+40 + j*(63)
+-132 + j*(1)
+-240 + j*(-94)
+301 + j*(-80)
+-62 + j*(-7)
+85 + j*(-55)
+144 + j*(4)
+-60 + j*(11)
+-43 + j*(-144)
+-178 + j*(136)
+125 + j*(133)
+-44 + j*(124)
+41 + j*(190)
+75 + j*(223)
+-161 + j*(-218)
+131 + j*(7)
+21 + j*(102)
+-467 + j*(-260)
+250 + j*(-82)
+99 + j*(83)
+-223 + j*(349)
+-216 + j*(-151)
+129 + j*(-349)
+243 + j*(-324)
+178 + j*(52)
+194 + j*(-74)
+146 + j*(200)
+136 + j*(43)
+-378 + j*(-235)
+-290 + j*(151)
+407 + j*(159)
+-139 + j*(-40)
+130 + j*(-59)
+135 + j*(353)
+89 + j*(100)
+-30 + j*(-180)
+-50 + j*(-217)
+76 + j*(-12)
+-197 + j*(-5)
+-296 + j*(0)
+-256 + j*(119)
+233 + j*(-107)
+16 + j*(-327)
+-274 + j*(325)
+91 + j*(24)
+47 + j*(-30)
+211 + j*(-159)
+277 + j*(18)
+138 + j*(3)
+-142 + j*(-59)
+212 + j*(-37)
+97 + j*(382)
+381 + j*(126)
+221 + j*(-418)
+328 + j*(-99)
+-93 + j*(-224)
+-30 + j*(-151)
+-246 + j*(-29)
+230 + j*(13)
+97 + j*(242)
+8 + j*(-52)
+-58 + j*(141)
+33 + j*(-67)
+-415 + j*(-201)
+-23 + j*(-113)
+-18 + j*(-187)
+245 + j*(-151)
+69 + j*(-96)
+-143 + j*(117)
+179 + j*(47)
+87 + j*(-223)
+-263 + j*(-198)
+-29 + j*(-86)
+287 + j*(158)
+-59 + j*(113)
+184 + j*(95)
+264 + j*(42)
+-146 + j*(232)
+-67 + j*(-57)
+19 + j*(-152)
+187 + j*(182)
+-253 + j*(-218)
+134 + j*(207)
+91 + j*(-161)
+131 + j*(-104)
+132 + j*(-75)
+95 + j*(427)
+-11 + j*(-45)
+-13 + j*(-20)
+-47 + j*(227)
+86 + j*(66)
+94 + j*(-35)
+-11 + j*(-71)
+-160 + j*(56)
+36 + j*(255)
+276 + j*(-119)
+49 + j*(108)
+-98 + j*(-81)
+-76 + j*(-313)
+240 + j*(4)
+-160 + j*(21)
+8 + j*(-165)
+-163 + j*(261)
+-270 + j*(-73)
+187 + j*(110)
+-86 + j*(-165)
+214 + j*(134)
+-33 + j*(-112)
+-421 + j*(278)
+19 + j*(46)
+53 + j*(228)
+-442 + j*(-151)
+69 + j*(59)
+-86 + j*(55)
+50 + j*(-371)
+-199 + j*(113)
+-13 + j*(172)
+168 + j*(52)
+384 + j*(291)
+-89 + j*(-129)
+-343 + j*(-387)
+-37 + j*(300)
+-37 + j*(-66)
+-209 + j*(-116)
+112 + j*(2)
+87 + j*(-80)
+-272 + j*(-38)
+-51 + j*(40)
+-221 + j*(-138)
+-182 + j*(-378)
+-461 + j*(-30)
+-141 + j*(-149)
+269 + j*(-55)
+122 + j*(68)
+122 + j*(33)
+-153 + j*(-116)
+-47 + j*(-1)
+285 + j*(30)
+102 + j*(-137)
+50 + j*(-193)
+-409 + j*(-35)
+-162 + j*(171)
+354 + j*(41)
+-216 + j*(101)
+33 + j*(256)
+-114 + j*(203)
+-353 + j*(-30)
+42 + j*(-177)
+-2 + j*(95)
+-100 + j*(-156)
+-117 + j*(-155)
+-144 + j*(-4)
+-138 + j*(-194)
+33 + j*(-209)
+-113 + j*(6)
+-361 + j*(190)
+153 + j*(-317)
+-49 + j*(81)
+-70 + j*(-52)
+104 + j*(-284)
+131 + j*(113)
+28 + j*(6)
+18 + j*(71)
+47 + j*(100)
+126 + j*(-6)
+-138 + j*(199)
+18 + j*(-209)
+158 + j*(-37)
+237 + j*(-211)
+277 + j*(-17)
+87 + j*(151)
+-173 + j*(-153)
+147 + j*(-314)
+-79 + j*(247)
+128 + j*(-87)
+26 + j*(-173)
+236 + j*(-258)
+-177 + j*(25)
+-112 + j*(-148)
+-136 + j*(-163)
+-16 + j*(-223)
+-124 + j*(218)
+-49 + j*(-257)
+-156 + j*(-51)
+-25 + j*(-276)
+88 + j*(1)
+-191 + j*(-42)
+-81 + j*(-92)
+138 + j*(419)
+2 + j*(88)
+-1 + j*(84)
+119 + j*(194)
+-129 + j*(-187)
+-151 + j*(-66)
+-141 + j*(11)
+107 + j*(-457)
+256 + j*(140)
+1 + j*(218)
+130 + j*(134)
+122 + j*(62)
+96 + j*(-102)
+72 + j*(-88)
+59 + j*(-168)
+-111 + j*(-354)
+189 + j*(-89)
+224 + j*(-129)
+-127 + j*(88)
+1 + j*(357)
+139 + j*(163)
+147 + j*(244)
+100 + j*(94)
+269 + j*(6)
+13 + j*(-315)
+71 + j*(-104)
+-110 + j*(30)
+18 + j*(-172)
+-40 + j*(-19)
+-182 + j*(307)
+129 + j*(344)
+-29 + j*(-144)
+-138 + j*(-13)
+361 + j*(-96)
+-143 + j*(105)
+-92 + j*(-118)
+16 + j*(52)
+-119 + j*(187)
+296 + j*(-150)
+-188 + j*(-91)
+-7 + j*(-250)
+83 + j*(-74)
+-110 + j*(113)
+-170 + j*(331)
+-52 + j*(-16)
+97 + j*(-301)
+-269 + j*(-31)
+-89 + j*(69)
+84 + j*(-25)
+161 + j*(-239)
+-80 + j*(156)
+148 + j*(-129)
+191 + j*(196)
+-153 + j*(43)
+-117 + j*(-74)
+-46 + j*(-340)
+-41 + j*(-180)
+53 + j*(-113)
+182 + j*(195)
+208 + j*(221)
+6 + j*(14)
+144 + j*(73)
+-83 + j*(-97)
+30 + j*(223)
+-98 + j*(-148)
+-493 + j*(-247)
+-386 + j*(32)
+-112 + j*(326)
+41 + j*(-60)
+155 + j*(-324)
+42 + j*(-76)
+-39 + j*(-154)
+123 + j*(409)
+-132 + j*(-122)
+209 + j*(-33)
+-313 + j*(55)
+235 + j*(189)
+-382 + j*(339)
+87 + j*(-11)
+101 + j*(1)
+186 + j*(-173)
+23 + j*(-135)
+427 + j*(74)
+280 + j*(-122)
+-69 + j*(-35)
+247 + j*(-23)
+112 + j*(-204)
+110 + j*(-6)
+-303 + j*(14)
+245 + j*(250)
+-73 + j*(-16)
+35 + j*(123)
+49 + j*(49)
+-154 + j*(-42)
+-281 + j*(-35)
+-308 + j*(151)
+151 + j*(22)
+45 + j*(-136)
+-244 + j*(-184)
+-175 + j*(-62)
+38 + j*(231)
+6 + j*(98)
+-51 + j*(-29)
+-168 + j*(-286)
+60 + j*(-317)
+53 + j*(221)
+-120 + j*(98)
+-54 + j*(-115)
+93 + j*(-67)
+139 + j*(57)
+-66 + j*(108)
+-183 + j*(54)
+-59 + j*(-28)
+-165 + j*(35)
+-184 + j*(29)
+-275 + j*(165)
+377 + j*(17)
+-283 + j*(-351)
+42 + j*(141)
+90 + j*(-40)
+-74 + j*(-148)
+53 + j*(353)
+4 + j*(-133)
+440 + j*(-84)
+-33 + j*(113)
+83 + j*(76)
+-175 + j*(-44)
+69 + j*(-90)
+103 + j*(135)
+156 + j*(92)
+-122 + j*(-37)
+48 + j*(-104)
+250 + j*(-129)
+88 + j*(190)
+-170 + j*(335)
+-293 + j*(20)
+40 + j*(-365)
+140 + j*(-265)
+340 + j*(49)
+-47 + j*(135)
+330 + j*(-47)
+-25 + j*(-161)
+-59 + j*(112)
+185 + j*(186)
+125 + j*(-295)
+-45 + j*(554)
+100 + j*(13)
+52 + j*(40)
+-13 + j*(-54)
+-218 + j*(-153)
+11 + j*(-43)
+-39 + j*(3)
+10 + j*(-15)
+-298 + j*(9)
+123 + j*(-210)
+179 + j*(-168)
+211 + j*(-169)
+250 + j*(216)
+74 + j*(-95)
+-288 + j*(59)
+-35 + j*(135)
+23 + j*(127)
+-22 + j*(190)
+-76 + j*(-112)
+180 + j*(-251)
+226 + j*(-145)
+30 + j*(37)
+79 + j*(137)
+83 + j*(-292)
+209 + j*(-6)
+-307 + j*(-122)
+119 + j*(-90)
+26 + j*(-105)
+-28 + j*(-279)
+-95 + j*(-34)
+-57 + j*(-282)
+-361 + j*(-175)
+-83 + j*(-77)
+-74 + j*(16)
+370 + j*(52)
+-276 + j*(-269)
+285 + j*(-62)
+-129 + j*(-197)
+-21 + j*(-14)
+-3 + j*(45)
+371 + j*(43)
+-213 + j*(-98)
+196 + j*(23)
+187 + j*(62)
+-165 + j*(173)
+61 + j*(-60)
+194 + j*(-329)
+-269 + j*(-18)
+160 + j*(-72)
+62 + j*(284)
+47 + j*(-228)
+-74 + j*(294)
+64 + j*(78)
+37 + j*(-100)
+-81 + j*(50)
+18 + j*(-113)
+157 + j*(217)
+188 + j*(355)
+37 + j*(-31)
+176 + j*(-282)
+190 + j*(28)
+81 + j*(-1)
+-202 + j*(311)
+-52 + j*(120)
+-18 + j*(17)
+-330 + j*(-110)
+-84 + j*(472)
+51 + j*(234)
+-144 + j*(366)
+-25 + j*(12)
+-69 + j*(-14)
+540 + j*(-155)
+52 + j*(81)
+174 + j*(-171)
+117 + j*(-86)
+-15 + j*(-315)
+154 + j*(135)
+107 + j*(97)
+-119 + j*(-209)
+67 + j*(-233)
+14 + j*(58)
+-94 + j*(159)
+-81 + j*(1)
+107 + j*(-90)
+-29 + j*(38)
+-565 + j*(-190)
+-35 + j*(36)
+255 + j*(220)
+-25 + j*(18)
+-337 + j*(-27)
+89 + j*(-148)
+-89 + j*(-141)
+-12 + j*(20)
+69 + j*(-27)
+228 + j*(-64)
+112 + j*(-27)
+-181 + j*(81)
+-102 + j*(-2)
+61 + j*(257)
+-170 + j*(8)
+-4 + j*(-171)
+-119 + j*(-27)
+-156 + j*(10)
+315 + j*(-231)
+264 + j*(260)
+-37 + j*(129)
+69 + j*(-72)
+121 + j*(146)
+-37 + j*(221)
+-195 + j*(1)
+301 + j*(107)
+221 + j*(16)
+-313 + j*(-181)
+-51 + j*(-94)
+140 + j*(-295)
+6 + j*(-176)
+-135 + j*(4)
+-49 + j*(355)
+87 + j*(69)
+-40 + j*(-108)
+81 + j*(187)
+51 + j*(-194)
+-98 + j*(175)
+-280 + j*(127)
+194 + j*(-100)
+-287 + j*(185)
+-28 + j*(14)
+57 + j*(55)
+-313 + j*(-42)
+175 + j*(-13)
+-138 + j*(136)
+-7 + j*(27)
+16 + j*(214)
+-4 + j*(70)
+-28 + j*(-166)
+-91 + j*(214)
+-64 + j*(-305)
+293 + j*(-61)
+268 + j*(182)
+153 + j*(23)
+-50 + j*(-63)
+57 + j*(-17)
+-127 + j*(47)
+-107 + j*(-67)
+68 + j*(83)
+38 + j*(-78)
+-169 + j*(-76)
+132 + j*(134)
+202 + j*(197)
+-224 + j*(140)
+-37 + j*(643)
+-233 + j*(16)
+-227 + j*(-88)
+-168 + j*(-213)
+63 + j*(-224)
+88 + j*(28)
+8 + j*(165)
+-273 + j*(-146)
+-140 + j*(-8)
+-100 + j*(13)
+-232 + j*(1)
+-223 + j*(93)
+-132 + j*(-45)
+-20 + j*(248)
+156 + j*(-44)
+74 + j*(-89)
+88 + j*(26)
+161 + j*(-94)
+-11 + j*(-143)
+-145 + j*(124)
+-33 + j*(30)
+485 + j*(173)
+249 + j*(-310)
+-246 + j*(164)
+-104 + j*(134)
+-126 + j*(184)
+-135 + j*(259)
+18 + j*(79)
+-115 + j*(67)
+-190 + j*(-126)
+-159 + j*(183)
+184 + j*(-190)
+390 + j*(-129)
+-35 + j*(-129)
+342 + j*(363)
+110 + j*(-233)
+158 + j*(-269)
+15 + j*(-55)
+-204 + j*(-508)
+11 + j*(165)
+-346 + j*(-145)
+-168 + j*(75)
+-175 + j*(-120)
+-25 + j*(294)
+-119 + j*(337)
+-119 + j*(111)
+11 + j*(-257)
+-141 + j*(-127)
+116 + j*(57)
+-173 + j*(30)
+-138 + j*(68)
+-71 + j*(-35)
+14 + j*(250)
+-11 + j*(-57)
+57 + j*(-279)
+74 + j*(274)
+-81 + j*(64)
+-378 + j*(-80)
+-279 + j*(211)
+-79 + j*(194)
+-6 + j*(261)
+156 + j*(-58)
+-8 + j*(-139)
+239 + j*(-23)
+-117 + j*(-64)
+-107 + j*(41)
+-198 + j*(-283)
+-91 + j*(-135)
+-43 + j*(-13)
+99 + j*(30)
+4 + j*(105)
+-276 + j*(319)
+-298 + j*(-84)
+-7 + j*(-237)
+-286 + j*(9)
+74 + j*(122)
+10 + j*(344)
+-185 + j*(161)
+139 + j*(187)
+-332 + j*(-48)
+-35 + j*(-204)
+-7 + j*(-144)
+-6 + j*(266)
+78 + j*(25)
+37 + j*(78)
+96 + j*(183)
+-107 + j*(-141)
+66 + j*(-433)
+-127 + j*(-27)
+-96 + j*(138)
+-1 + j*(-129)
+-351 + j*(71)
+-324 + j*(202)
+-93 + j*(-97)
+73 + j*(153)
+115 + j*(-252)
+156 + j*(172)
+-312 + j*(-143)
+-336 + j*(-115)
+-119 + j*(-85)
+47 + j*(-141)
+300 + j*(174)
+-219 + j*(57)
+102 + j*(-172)
+45 + j*(390)
+17 + j*(-127)
+31 + j*(135)
+344 + j*(83)
+-76 + j*(140)
+53 + j*(57)
+199 + j*(192)
+-69 + j*(165)
+5 + j*(216)
+525 + j*(152)
+-233 + j*(-83)
+-221 + j*(283)
+50 + j*(12)
+214 + j*(-559)
+-118 + j*(-131)
+-77 + j*(-31)
+-30 + j*(-192)
+130 + j*(-141)
+215 + j*(296)
+-64 + j*(65)
+209 + j*(-41)
+81 + j*(219)
+-110 + j*(-412)
+119 + j*(130)
+199 + j*(-42)
+72 + j*(-13)
+-223 + j*(53)
+45 + j*(28)
+262 + j*(-16)
+11 + j*(78)
+182 + j*(-139)
+73 + j*(211)
+183 + j*(11)
+-7 + j*(171)
+65 + j*(-11)
+-12 + j*(-45)
+10 + j*(251)
+110 + j*(-240)
+187 + j*(-95)
+-42 + j*(-128)
+26 + j*(117)
+-77 + j*(128)
+-45 + j*(70)
+74 + j*(-117)
+-28 + j*(109)
+-175 + j*(-98)
+119 + j*(204)
+8 + j*(298)
+-43 + j*(-71)
+105 + j*(107)
+-46 + j*(31)
+-23 + j*(-230)
+-141 + j*(-225)
+-245 + j*(-98)
+-115 + j*(-24)
+52 + j*(330)
+-5 + j*(218)
+-179 + j*(37)
+50 + j*(52)
+40 + j*(127)
+-165 + j*(-45)
+199 + j*(-132)
+242 + j*(-7)
+-489 + j*(-55)
+-220 + j*(-413)
+80 + j*(-27)
+-104 + j*(103)
+-245 + j*(383)
+-40 + j*(-466)
+197 + j*(144)
+-98 + j*(13)
+-8 + j*(345)
+335 + j*(190)
+42 + j*(35)
+157 + j*(58)
+175 + j*(-229)
+284 + j*(-218)
+421 + j*(283)
+272 + j*(-241)
+-252 + j*(157)
+-209 + j*(22)
+-40 + j*(-61)
+-30 + j*(84)
+293 + j*(-244)
+-286 + j*(241)
+-197 + j*(-78)
+-107 + j*(-2)
+-329 + j*(-105)
+93 + j*(-472)
+187 + j*(-107)
+-279 + j*(150)
+-337 + j*(211)
+117 + j*(-244)
+-221 + j*(267)
+224 + j*(70)
+174 + j*(168)
+-124 + j*(-14)
+16 + j*(-190)
+-207 + j*(305)
+143 + j*(54)
+-124 + j*(30)
+43 + j*(-15)
+-67 + j*(-205)
+21 + j*(-163)
+157 + j*(-183)
+-59 + j*(-42)
+-53 + j*(-147)
+231 + j*(30)
+-61 + j*(-77)
+4 + j*(-422)
+-378 + j*(259)
+74 + j*(-154)
+36 + j*(153)
+-182 + j*(-66)
+189 + j*(-37)
+-129 + j*(-29)
+46 + j*(-117)
+-88 + j*(-76)
+-23 + j*(164)
+-111 + j*(-12)
+-228 + j*(-86)
+134 + j*(-25)
+-142 + j*(93)
+-182 + j*(25)
+215 + j*(-70)
+181 + j*(-52)
+212 + j*(156)
+421 + j*(-248)
+52 + j*(-489)
+36 + j*(86)
+105 + j*(-277)
+283 + j*(-57)
+250 + j*(73)
+86 + j*(-120)
+-230 + j*(-105)
+-86 + j*(-75)
+-118 + j*(88)
+59 + j*(-71)
+-106 + j*(-66)
+-314 + j*(-8)
+-16 + j*(270)
+-138 + j*(189)
+-151 + j*(-110)
+365 + j*(-158)
+-216 + j*(-23)
+4 + j*(181)
+-245 + j*(88)
+-132 + j*(202)
+-115 + j*(-160)
+69 + j*(310)
+47 + j*(45)
+104 + j*(72)
+260 + j*(204)
+-190 + j*(46)
+-192 + j*(312)
+8 + j*(-155)
+-162 + j*(90)
+-115 + j*(44)
+-37 + j*(-298)
+-72 + j*(238)
+170 + j*(310)
+72 + j*(248)
+-28 + j*(151)
+103 + j*(-130)
+78 + j*(-173)
+120 + j*(-121)
+435 + j*(-305)
+-20 + j*(45)
+-93 + j*(235)
+66 + j*(-35)
+204 + j*(4)
+-134 + j*(50)
+-397 + j*(-16)
+91 + j*(166)
+112 + j*(-139)
+-42 + j*(-366)
+25 + j*(223)
+79 + j*(-212)
+-67 + j*(-242)
+-235 + j*(-83)
+-160 + j*(62)
+124 + j*(347)
+110 + j*(-49)
+127 + j*(49)
+167 + j*(-341)
+-427 + j*(-66)
+-172 + j*(82)
+-130 + j*(-25)
+-9 + j*(-11)
+99 + j*(252)
+-225 + j*(-153)
+-220 + j*(175)
+141 + j*(122)
+110 + j*(288)
+-286 + j*(149)
+-47 + j*(218)
+322 + j*(127)
+159 + j*(101)
+-252 + j*(185)
+-443 + j*(-124)
+10 + j*(165)
+182 + j*(169)
+-32 + j*(-81)
+-44 + j*(-41)
+-229 + j*(50)
+157 + j*(421)
+-155 + j*(-18)
+-85 + j*(-13)
+148 + j*(-432)
+-298 + j*(-108)
+-260 + j*(219)
+272 + j*(-179)
+35 + j*(-123)
+137 + j*(8)
+29 + j*(-116)
+84 + j*(167)
+308 + j*(-47)
+204 + j*(64)
+339 + j*(-60)
+-224 + j*(-70)
+186 + j*(730)
+-59 + j*(86)
+66 + j*(-30)
+-16 + j*(-260)
+-309 + j*(200)
+-143 + j*(-127)
+33 + j*(-50)
+12 + j*(-74)
+-113 + j*(-52)
+-31 + j*(197)
+330 + j*(197)
+264 + j*(-106)
+214 + j*(-164)
+-8 + j*(431)
+-143 + j*(66)
+98 + j*(66)
+-65 + j*(92)
+233 + j*(145)
+-93 + j*(133)
+28 + j*(-104)
+-283 + j*(89)
+91 + j*(-319)
+53 + j*(111)
+57 + j*(139)
+90 + j*(88)
+45 + j*(66)
+-43 + j*(140)
+307 + j*(127)
+173 + j*(-86)
+115 + j*(-327)
+255 + j*(-238)
+212 + j*(-170)
+173 + j*(279)
+49 + j*(142)
+6 + j*(3)
+218 + j*(184)
+-39 + j*(-110)
+-10 + j*(-238)
+30 + j*(303)
+35 + j*(-55)
+6 + j*(-54)
+140 + j*(-167)
+62 + j*(52)
+204 + j*(-169)
+-64 + j*(163)
+-135 + j*(70)
+82 + j*(63)
+21 + j*(80)
+-81 + j*(-139)
+-84 + j*(76)
+-129 + j*(-13)
+-10 + j*(-159)
+27 + j*(192)
+-158 + j*(118)
+81 + j*(-167)
+64 + j*(-67)
+-82 + j*(48)
+-18 + j*(102)
+-343 + j*(83)
+161 + j*(-159)
+-10 + j*(460)
+-13 + j*(-252)
+148 + j*(-252)
+-69 + j*(61)
+-152 + j*(48)
+38 + j*(137)
+90 + j*(40)
+39 + j*(-65)
+85 + j*(244)
+-76 + j*(-138)
+-209 + j*(59)
+-16 + j*(-194)
+424 + j*(175)
+-57 + j*(-143)
+21 + j*(239)
+93 + j*(93)
+75 + j*(151)
+-66 + j*(-127)
+124 + j*(57)
+78 + j*(142)
+-124 + j*(107)
+-184 + j*(-105)
+-43 + j*(83)
+86 + j*(50)
+-46 + j*(1)
+108 + j*(-211)
+47 + j*(-100)
+-136 + j*(-327)
+45 + j*(124)
+471 + j*(-310)
+-72 + j*(52)
+-329 + j*(-104)
+34 + j*(260)
+433 + j*(-45)
+-202 + j*(-414)
+-115 + j*(-4)
+-67 + j*(143)
+-21 + j*(462)
+74 + j*(-28)
+-301 + j*(-155)
+107 + j*(-202)
+-85 + j*(26)
+-31 + j*(322)
+416 + j*(352)
+-236 + j*(-16)
+15 + j*(235)
+-250 + j*(120)
+-171 + j*(-234)
+380 + j*(-51)
+301 + j*(91)
+118 + j*(79)
+20 + j*(-35)
+106 + j*(175)
+-217 + j*(-156)
+146 + j*(156)
+-88 + j*(237)
+573 + j*(-96)
+68 + j*(90)
+31 + j*(-156)
+-256 + j*(41)
+119 + j*(249)
+40 + j*(115)
+82 + j*(131)
+71 + j*(67)
+-373 + j*(37)
+78 + j*(-76)
+-20 + j*(71)
+-38 + j*(-23)
+117 + j*(-29)
+-78 + j*(-358)
+-199 + j*(-98)
+228 + j*(165)
+51 + j*(-88)
+-136 + j*(300)
+76 + j*(46)
+-58 + j*(-200)
+82 + j*(-96)
+-204 + j*(-250)
+209 + j*(462)
+-178 + j*(20)
+-187 + j*(236)
+296 + j*(-223)
+-211 + j*(-119)
+-232 + j*(199)
+-223 + j*(-18)
+101 + j*(165)
+-349 + j*(-64)
+-121 + j*(-27)
+-192 + j*(513)
+35 + j*(-97)
+139 + j*(103)
+209 + j*(-49)
+97 + j*(73)
+105 + j*(3)
+54 + j*(-61)
+-60 + j*(257)
+112 + j*(57)
+193 + j*(-144)
+88 + j*(24)
+150 + j*(-133)
+42 + j*(90)
+409 + j*(-157)
+-37 + j*(-123)
+156 + j*(136)
+-146 + j*(61)
+153 + j*(-356)
+-45 + j*(-37)
+-69 + j*(198)
+-408 + j*(202)
+-18 + j*(102)
+259 + j*(-2)
+220 + j*(-238)
+-82 + j*(-42)
+68 + j*(65)
+-25 + j*(144)
+303 + j*(-100)
+6 + j*(81)
+-25 + j*(47)
+106 + j*(245)
+-204 + j*(-276)
+59 + j*(23)
+-472 + j*(161)
+-196 + j*(-26)
+266 + j*(-304)
+132 + j*(-221)
+-108 + j*(28)
+-82 + j*(-34)
+-107 + j*(-3)
+-110 + j*(91)
+-11 + j*(-317)
+106 + j*(76)
+28 + j*(-119)
+32 + j*(-52)
+-256 + j*(33)
+-46 + j*(-450)
+-10 + j*(-294)
+454 + j*(-266)
+89 + j*(-168)
+100 + j*(-173)
+240 + j*(71)
+69 + j*(-199)
+-110 + j*(71)
+-36 + j*(18)
+-145 + j*(103)
+-317 + j*(-51)
+11 + j*(62)
+184 + j*(78)
+182 + j*(-217)
+-168 + j*(-93)
+-58 + j*(75)
+-173 + j*(-167)
+-139 + j*(153)
+47 + j*(-235)
+128 + j*(-67)
+-226 + j*(143)
+-220 + j*(-101)
+240 + j*(-123)
+-86 + j*(-377)
+52 + j*(30)
+-39 + j*(-147)
+236 + j*(-35)
+150 + j*(-226)
+-52 + j*(-192)
+-37 + j*(187)
+-201 + j*(52)
+-146 + j*(116)
+-168 + j*(123)
+54 + j*(-331)
+-33 + j*(-58)
+-139 + j*(-2)
+23 + j*(-123)
+94 + j*(-83)
+127 + j*(158)
+-29 + j*(-93)
+148 + j*(269)
+-21 + j*(227)
+-178 + j*(-3)
+-72 + j*(-140)
+35 + j*(13)
+-14 + j*(122)
+-113 + j*(63)
+-177 + j*(6)
+-291 + j*(250)
+-184 + j*(260)
+-119 + j*(-229)
+-255 + j*(-19)
+-83 + j*(-202)
+14 + j*(-102)
+-83 + j*(91)
+100 + j*(-115)
+-289 + j*(83)
+-209 + j*(-58)
+-3 + j*(-247)
+164 + j*(-134)
+380 + j*(18)
+40 + j*(-62)
+-132 + j*(-80)
+-1 + j*(-203)
+-175 + j*(-139)
+50 + j*(92)
+-28 + j*(-29)
+181 + j*(40)
+-241 + j*(40)
+221 + j*(166)
+81 + j*(-112)
+4 + j*(-86)
+-7 + j*(-132)
+-78 + j*(-117)
+-152 + j*(92)
+-62 + j*(-200)
+-28 + j*(72)
+186 + j*(-240)
+-9 + j*(148)
+81 + j*(-139)
+-62 + j*(-86)
+-14 + j*(-98)
+125 + j*(-161)
+-198 + j*(306)
+-57 + j*(33)
+122 + j*(-140)
+-69 + j*(-103)
+-66 + j*(308)
+-9 + j*(206)
+-63 + j*(33)
+175 + j*(15)
+-42 + j*(-182)
+6 + j*(45)
+-218 + j*(15)
+-93 + j*(-39)
+30 + j*(81)
+66 + j*(405)
+-52 + j*(373)
+467 + j*(55)
+17 + j*(81)
+145 + j*(226)
+-86 + j*(-193)
+-112 + j*(-109)
+203 + j*(-74)
+-12 + j*(-225)
+52 + j*(-145)
+-61 + j*(330)
+98 + j*(-218)
+114 + j*(-56)
+31 + j*(-127)
+-337 + j*(-109)
+212 + j*(-71)
+-111 + j*(-33)
+113 + j*(250)
+195 + j*(-205)
+-23 + j*(88)
+151 + j*(-217)
+105 + j*(-339)
+139 + j*(275)
+-42 + j*(407)
+215 + j*(-210)
+-390 + j*(-214)
+-330 + j*(-141)
+-125 + j*(-173)
+164 + j*(-199)
+262 + j*(43)
+172 + j*(355)
+69 + j*(151)
+-35 + j*(-54)
+-218 + j*(-117)
+13 + j*(276)
+-42 + j*(-181)
+176 + j*(-191)
+-174 + j*(-44)
+-300 + j*(-130)
+29 + j*(-37)
+-274 + j*(-3)
+-23 + j*(57)
+122 + j*(-143)
+215 + j*(17)
+78 + j*(110)
+-305 + j*(83)
+-4 + j*(43)
+92 + j*(-425)
+-323 + j*(-36)
+-18 + j*(-63)
+63 + j*(8)
+50 + j*(170)
+105 + j*(79)
+-18 + j*(-273)
+-66 + j*(-273)
+86 + j*(-55)
+173 + j*(-37)
+-87 + j*(30)
+107 + j*(-247)
+57 + j*(134)
+-118 + j*(518)
+164 + j*(-260)
+155 + j*(-93)
+95 + j*(42)
+293 + j*(-62)
+-26 + j*(250)
+129 + j*(216)
+86 + j*(69)
+191 + j*(1)
+214 + j*(-134)
+-308 + j*(-433)
+-33 + j*(-70)
+-98 + j*(57)
+116 + j*(19)
+-248 + j*(185)
+74 + j*(-148)
+-2 + j*(-165)
+32 + j*(238)
+-4 + j*(170)
+-112 + j*(-122)
+343 + j*(62)
+145 + j*(72)
+-62 + j*(383)
+-105 + j*(-106)
+-480 + j*(200)
+184 + j*(346)
+83 + j*(-158)
+187 + j*(170)
+-105 + j*(-212)
+-326 + j*(140)
+240 + j*(-288)
+107 + j*(-84)
+-231 + j*(-215)
+-162 + j*(99)
+-205 + j*(202)
+-89 + j*(170)
+128 + j*(-134)
+31 + j*(-245)
+-21 + j*(45)
+-5 + j*(32)
+-71 + j*(138)
+-300 + j*(55)
+31 + j*(-25)
+-2 + j*(153)
+163 + j*(-122)
+-132 + j*(-221)
+192 + j*(62)
+-168 + j*(4)
+-10 + j*(-241)
+193 + j*(-8)
+31 + j*(-57)
+-58 + j*(-64)
+-134 + j*(-218)
+78 + j*(-81)
+-13 + j*(107)
+-163 + j*(-23)
+-287 + j*(189)
+-226 + j*(-65)
+54 + j*(-36)
+25 + j*(260)
+177 + j*(167)
+-83 + j*(245)
+-95 + j*(-302)
+97 + j*(-70)
+135 + j*(-128)
+15 + j*(-54)
+57 + j*(-5)
+33 + j*(9)
+196 + j*(297)
+-26 + j*(-111)
+-112 + j*(211)
+-215 + j*(54)
+-286 + j*(-7)
+157 + j*(81)
+626 + j*(96)
+157 + j*(170)
+-2 + j*(116)
+-131 + j*(10)
+443 + j*(48)
+-343 + j*(-14)
+-46 + j*(136)
+235 + j*(98)
+298 + j*(-99)
+27 + j*(-122)
+-303 + j*(269)
+-65 + j*(-224)
+86 + j*(119)
+363 + j*(-146)
+289 + j*(112)
+416 + j*(-343)
+23 + j*(62)
+359 + j*(-118)
+43 + j*(-156)
+3 + j*(-25)
+-28 + j*(112)
+100 + j*(211)
+-28 + j*(47)
+-169 + j*(18)
+107 + j*(-104)
+-50 + j*(-117)
+269 + j*(-52)
+13 + j*(-81)
+-108 + j*(12)
+-103 + j*(-257)
+-258 + j*(93)
+-202 + j*(211)
+-117 + j*(-83)
+5 + j*(-173)
+-289 + j*(281)
+-30 + j*(175)
+-20 + j*(-96)
+177 + j*(40)
+-42 + j*(-80)
+-156 + j*(-88)
+-87 + j*(56)
+112 + j*(42)
+-115 + j*(-334)
+121 + j*(123)
+-197 + j*(308)
+43 + j*(-219)
+-191 + j*(-131)
+19 + j*(-239)
+-103 + j*(-7)
+-67 + j*(-83)
+-372 + j*(-101)
+211 + j*(-40)
+-242 + j*(-88)
+-66 + j*(-199)
+-8 + j*(30)
+183 + j*(-58)
+59 + j*(220)
+288 + j*(62)
+233 + j*(109)
+23 + j*(127)
+-99 + j*(-173)
+-48 + j*(-95)
+182 + j*(167)
+146 + j*(-223)
+209 + j*(-64)
+23 + j*(243)
+65 + j*(78)
+-36 + j*(30)
+-384 + j*(-61)
+187 + j*(9)
+-46 + j*(-52)
+187 + j*(-119)
+26 + j*(199)
+-296 + j*(-226)
+224 + j*(-408)
+-184 + j*(221)
+-184 + j*(174)
+83 + j*(107)
+-125 + j*(-95)
+417 + j*(197)
+10 + j*(-238)
+32 + j*(-39)
+-59 + j*(161)
+74 + j*(272)
+291 + j*(139)
+-144 + j*(81)
+-321 + j*(0)
+125 + j*(-56)
+-44 + j*(32)
+57 + j*(-141)
+-115 + j*(32)
+91 + j*(103)
+-204 + j*(-151)
+-112 + j*(-84)
+-49 + j*(42)
+67 + j*(-351)
+-51 + j*(61)
+-269 + j*(54)
+-247 + j*(-315)
+38 + j*(-28)
+17 + j*(-354)
+157 + j*(-127)
+267 + j*(85)
+137 + j*(-86)
+-77 + j*(-158)
+344 + j*(-275)
+-101 + j*(136)
+-156 + j*(-459)
+-9 + j*(-119)
+344 + j*(33)
+16 + j*(-237)
+74 + j*(-71)
+-19 + j*(321)
+228 + j*(-115)
+-228 + j*(82)
+-291 + j*(49)
+-216 + j*(-457)
+-161 + j*(-90)
+-145 + j*(85)
+-417 + j*(130)
+-32 + j*(51)
+-341 + j*(-24)
+60 + j*(174)
+-70 + j*(220)
+-177 + j*(-25)
+-42 + j*(-177)
+141 + j*(-44)
+126 + j*(-156)
+180 + j*(-93)
+239 + j*(-163)
+-242 + j*(-108)
+74 + j*(133)
+24 + j*(-28)
+-310 + j*(242)
+134 + j*(201)
+-296 + j*(119)
+-98 + j*(-12)
+69 + j*(71)
+-313 + j*(-73)
+28 + j*(-25)
+62 + j*(-102)
+-325 + j*(136)
+322 + j*(-87)
+64 + j*(247)
+-152 + j*(86)
+95 + j*(-110)
+145 + j*(344)
+95 + j*(-163)
+-30 + j*(-364)
+276 + j*(-101)
+104 + j*(-206)
+119 + j*(-93)
+-153 + j*(324)
+-3 + j*(-38)
+70 + j*(83)
+-1 + j*(-329)
+-12 + j*(122)
+41 + j*(104)
+-51 + j*(-198)
+129 + j*(61)
+4 + j*(23)
+214 + j*(-16)
+-95 + j*(90)
+-84 + j*(-9)
+-159 + j*(78)
+-108 + j*(278)
+156 + j*(-250)
+106 + j*(172)
+184 + j*(155)
+159 + j*(47)
+-63 + j*(87)
+-8 + j*(115)
+-214 + j*(-180)
+-78 + j*(-164)
+63 + j*(-165)
+-56 + j*(290)
+-69 + j*(-195)
+-155 + j*(53)
+139 + j*(180)
+205 + j*(-108)
+30 + j*(342)
+-103 + j*(37)
+-204 + j*(-105)
+-125 + j*(-243)
+211 + j*(306)
+-264 + j*(-107)
+-119 + j*(-308)
+34 + j*(163)
+5 + j*(112)
+279 + j*(43)
+209 + j*(-43)
+15 + j*(157)
+262 + j*(-8)
+26 + j*(194)
+170 + j*(-77)
+-65 + j*(-503)
+18 + j*(-21)
+228 + j*(-116)
+-71 + j*(54)
+98 + j*(-200)
+273 + j*(0)
+-126 + j*(-49)
+118 + j*(-24)
+-1 + j*(21)
+-122 + j*(74)
+247 + j*(-27)
+-94 + j*(252)
+31 + j*(-20)
+153 + j*(44)
+38 + j*(-140)
+62 + j*(200)
+-21 + j*(-37)
+126 + j*(191)
+-3 + j*(-28)
+261 + j*(284)
+-329 + j*(-189)
+23 + j*(-105)
+200 + j*(-269)
+113 + j*(36)
+61 + j*(151)
+-50 + j*(49)
+-150 + j*(-70)
+-115 + j*(-88)
+-46 + j*(-153)
+100 + j*(92)
+-61 + j*(138)
+-35 + j*(-166)
+-185 + j*(189)
+254 + j*(-180)
+47 + j*(464)
+24 + j*(273)
+-240 + j*(-223)
+-3 + j*(-196)
+-204 + j*(189)
+-33 + j*(-244)
+-112 + j*(-252)
+-103 + j*(-173)
+-12 + j*(-321)
+-150 + j*(-90)
+-26 + j*(238)
+209 + j*(-52)
+217 + j*(262)
+-211 + j*(69)
+165 + j*(177)
+13 + j*(-94)
+-110 + j*(-168)
+167 + j*(-127)
+-100 + j*(64)
+98 + j*(164)
+138 + j*(-101)
+97 + j*(-344)
+-255 + j*(33)
+-40 + j*(-127)
+99 + j*(-166)
+-106 + j*(-271)
+240 + j*(18)
+-58 + j*(-147)
+-145 + j*(50)
+-203 + j*(-132)
+12 + j*(-170)
+-270 + j*(175)
+-47 + j*(-71)
+279 + j*(-226)
+181 + j*(202)
+24 + j*(13)
+65 + j*(148)
+-98 + j*(240)
+36 + j*(206)
+134 + j*(12)
+-144 + j*(-184)
+-402 + j*(83)
+-103 + j*(119)
+-62 + j*(-148)
+-113 + j*(202)
+-266 + j*(41)
+185 + j*(-2)
+-196 + j*(-76)
+-123 + j*(-203)
+-195 + j*(-21)
+-23 + j*(232)
+-156 + j*(225)
+219 + j*(152)
+155 + j*(-184)
+-100 + j*(-13)
+-29 + j*(-129)
+357 + j*(-53)
+192 + j*(-126)
+-6 + j*(-172)
+57 + j*(114)
+183 + j*(-358)
+47 + j*(-211)
+-42 + j*(131)
+-194 + j*(-122)
+-171 + j*(304)
+31 + j*(95)
+-160 + j*(281)
+37 + j*(-166)
+-142 + j*(37)
+6 + j*(342)
+-55 + j*(-177)
+-20 + j*(-42)
+-351 + j*(87)
+225 + j*(-8)
+92 + j*(258)
+71 + j*(83)
+103 + j*(-59)
+182 + j*(42)
+78 + j*(-264)
+-153 + j*(-325)
+-160 + j*(25)
+21 + j*(91)
+-123 + j*(-245)
+81 + j*(-151)
+277 + j*(63)
+-86 + j*(-250)
+-173 + j*(30)
+86 + j*(-86)
+11 + j*(95)
+61 + j*(-32)
+-122 + j*(25)
+-52 + j*(-103)
+-93 + j*(445)
+105 + j*(16)
+-68 + j*(-42)
+129 + j*(-107)
+-199 + j*(-258)
+-273 + j*(108)
+93 + j*(4)
+176 + j*(-44)
+98 + j*(-21)
+-145 + j*(-4)
+-192 + j*(22)
+-33 + j*(96)
+-176 + j*(-115)
+-29 + j*(47)
+-221 + j*(98)
+139 + j*(249)
+260 + j*(-54)
+-64 + j*(-2)
+252 + j*(-52)
+150 + j*(-151)
+6 + j*(145)
+-78 + j*(136)
+315 + j*(91)
+30 + j*(91)
+-70 + j*(2)
+105 + j*(-147)
+-159 + j*(380)
+475 + j*(-3)
+221 + j*(130)
+224 + j*(-352)
+23 + j*(180)
+57 + j*(19)
+-322 + j*(94)
+-28 + j*(-117)
+156 + j*(-285)
+68 + j*(109)
+-77 + j*(-47)
+87 + j*(-23)
+392 + j*(44)
+-187 + j*(-203)
+-108 + j*(-540)
+-227 + j*(45)
+2 + j*(-269)
+-64 + j*(204)
+-185 + j*(-205)
+-119 + j*(2)
+404 + j*(-132)
+-144 + j*(20)
+160 + j*(181)
+-283 + j*(86)
+33 + j*(-139)
+-195 + j*(69)
+117 + j*(-152)
+-308 + j*(-221)
+337 + j*(127)
+-18 + j*(-202)
+118 + j*(-132)
+13 + j*(-235)
+-29 + j*(-47)
+206 + j*(41)
+-243 + j*(306)
+5 + j*(137)
+-48 + j*(42)
+-547 + j*(-230)
+-20 + j*(53)
+-49 + j*(0)
+20 + j*(211)
+-115 + j*(359)
+22 + j*(158)
+-108 + j*(-13)
+169 + j*(-289)
+92 + j*(69)
+-124 + j*(95)
+113 + j*(-54)
+-382 + j*(-159)
+274 + j*(214)
+-21 + j*(224)
+29 + j*(59)
+496 + j*(233)
+-115 + j*(-141)
+246 + j*(-170)
+-75 + j*(-33)
+251 + j*(-71)
+7 + j*(144)
+119 + j*(-99)
+197 + j*(16)
+52 + j*(-139)
+17 + j*(-294)
+-66 + j*(177)
+-299 + j*(-142)
+139 + j*(142)
+34 + j*(126)
+16 + j*(260)
+90 + j*(44)
+-303 + j*(196)
+67 + j*(-71)
+74 + j*(179)
+211 + j*(-202)
+349 + j*(378)
+444 + j*(3)
+31 + j*(98)
+-217 + j*(-99)
+35 + j*(98)
+-111 + j*(211)
+253 + j*(69)
+312 + j*(-1)
+139 + j*(163)
+-30 + j*(5)
+-177 + j*(112)
+-195 + j*(211)
+-254 + j*(-32)
+-90 + j*(8)
+170 + j*(-214)
+254 + j*(257)
+-179 + j*(6)
+-69 + j*(202)
+98 + j*(128)
+-197 + j*(-299)
+-250 + j*(-177)
+156 + j*(-23)
+-64 + j*(-156)
+-35 + j*(-64)
+32 + j*(101)
+-92 + j*(-60)
+180 + j*(22)
+21 + j*(134)
+166 + j*(-83)
+423 + j*(7)
+12 + j*(219)
+37 + j*(168)
+1 + j*(118)
+42 + j*(-40)
+-148 + j*(-71)
+-93 + j*(-12)
+-103 + j*(-221)
+298 + j*(49)
+56 + j*(91)
+340 + j*(52)
+-117 + j*(132)
+10 + j*(24)
+-24 + j*(151)
+-82 + j*(-61)
+126 + j*(-199)
+-42 + j*(249)
+102 + j*(74)
+53 + j*(126)
+245 + j*(161)
+-50 + j*(285)
+106 + j*(136)
+235 + j*(-6)
+120 + j*(-202)
+165 + j*(-13)
+-181 + j*(81)
+318 + j*(-256)
+-25 + j*(137)
+153 + j*(128)
+123 + j*(-73)
+61 + j*(51)
+-190 + j*(268)
+-363 + j*(214)
+11 + j*(42)
+75 + j*(-95)
+-62 + j*(-16)
+-15 + j*(-403)
+-33 + j*(-66)
+95 + j*(64)
+-129 + j*(-220)
+-33 + j*(33)
+-38 + j*(-90)
+103 + j*(-49)
+252 + j*(227)
+25 + j*(-282)
+98 + j*(64)
+151 + j*(-88)
+-182 + j*(117)
+-89 + j*(-91)
+-313 + j*(-100)
+-117 + j*(-107)
+8 + j*(-174)
+-83 + j*(-45)
+-324 + j*(83)
+47 + j*(70)
+97 + j*(81)
+223 + j*(375)
+43 + j*(13)
+-156 + j*(103)
+-112 + j*(117)
+-36 + j*(65)
+-18 + j*(174)
+-209 + j*(-86)
+173 + j*(-186)
+130 + j*(-262)
+1 + j*(74)
+-180 + j*(31)
+-285 + j*(295)
+-158 + j*(-69)
+-165 + j*(86)
+-221 + j*(-175)
+-166 + j*(47)
+-202 + j*(162)
+263 + j*(47)
+187 + j*(-681)
+63 + j*(-173)
+74 + j*(119)
+23 + j*(-364)
+-226 + j*(-106)
+-11 + j*(293)
+32 + j*(243)
+63 + j*(-235)
+-28 + j*(42)
+-165 + j*(228)
+375 + j*(98)
+-142 + j*(115)
+131 + j*(85)
+41 + j*(-390)
+202 + j*(339)
+-311 + j*(91)
+194 + j*(-33)
+49 + j*(479)
+59 + j*(-524)
+310 + j*(266)
+131 + j*(-93)
+77 + j*(6)
+-170 + j*(180)
+45 + j*(165)
+-6 + j*(151)
+291 + j*(-45)
+-74 + j*(163)
+70 + j*(148)
+209 + j*(-54)
+-52 + j*(296)
+426 + j*(-81)
+6 + j*(100)
+305 + j*(14)
+37 + j*(95)
+11 + j*(294)
+-152 + j*(-21)
+-30 + j*(-151)
+47 + j*(-141)
+391 + j*(12)
+-60 + j*(-167)
+16 + j*(110)
+161 + j*(6)
+213 + j*(158)
+35 + j*(-8)
+231 + j*(-83)
+119 + j*(190)
+-35 + j*(191)
+35 + j*(339)
+-9 + j*(35)
+249 + j*(-193)
+-153 + j*(162)
+175 + j*(-298)
+-35 + j*(150)
+-11 + j*(-353)
+231 + j*(-64)
+-139 + j*(-264)
+-25 + j*(203)
+105 + j*(-223)
+94 + j*(125)
+150 + j*(-11)
+170 + j*(71)
+69 + j*(13)
+128 + j*(126)
+-145 + j*(44)
+-33 + j*(166)
+-4 + j*(153)
+-42 + j*(0)
+-281 + j*(40)
+-43 + j*(230)
+-202 + j*(-315)
+210 + j*(-83)
+193 + j*(-252)
+221 + j*(-6)
+-262 + j*(81)
+-247 + j*(58)
+66 + j*(122)
+73 + j*(-110)
+-47 + j*(-16)
+-62 + j*(54)
+153 + j*(-28)
+-28 + j*(-310)
+55 + j*(-151)
+92 + j*(27)
+-258 + j*(-75)
+206 + j*(-6)
+66 + j*(60)
+-139 + j*(-156)
+50 + j*(134)
+-24 + j*(103)
+165 + j*(155)
+30 + j*(206)
+67 + j*(74)
+5 + j*(-52)
+-168 + j*(-119)
+69 + j*(59)
+54 + j*(-223)
+-196 + j*(1)
+217 + j*(-269)
+88 + j*(282)
+-47 + j*(33)
+-124 + j*(-10)
+-184 + j*(-282)
+-325 + j*(94)
+40 + j*(331)
+-44 + j*(-128)
+56 + j*(163)
+-107 + j*(-361)
+278 + j*(120)
+62 + j*(84)
+206 + j*(219)
+-192 + j*(-233)
+170 + j*(-263)
+71 + j*(-114)
+260 + j*(293)
+-4 + j*(91)
+-110 + j*(-105)
+-269 + j*(-175)
+-282 + j*(210)
+213 + j*(-96)
+312 + j*(33)
+-138 + j*(-117)
+18 + j*(-124)
+75 + j*(-114)
+-409 + j*(21)
+-54 + j*(98)
+78 + j*(-160)
+42 + j*(-13)
+-27 + j*(-368)
+-54 + j*(191)
+87 + j*(95)
+-26 + j*(110)
+15 + j*(-362)
+325 + j*(-46)
+-42 + j*(-44)
+108 + j*(-125)
+-49 + j*(117)
+-66 + j*(71)
+-21 + j*(-75)
+-243 + j*(-115)
+-77 + j*(46)
+162 + j*(222)
+165 + j*(131)
+72 + j*(-66)
+-47 + j*(21)
+112 + j*(-103)
+130 + j*(-159)
+64 + j*(-24)
+124 + j*(-74)
+-255 + j*(204)
+144 + j*(221)
+28 + j*(-227)
+-13 + j*(278)
+328 + j*(190)
+253 + j*(482)
+187 + j*(-18)
+-191 + j*(-597)
+204 + j*(-31)
+-57 + j*(144)
+-252 + j*(-190)
+221 + j*(-197)
+35 + j*(139)
+43 + j*(-66)
+-35 + j*(-119)
+288 + j*(-279)
+195 + j*(100)
+215 + j*(312)
+-47 + j*(-114)
+-228 + j*(-92)
+49 + j*(216)
+-376 + j*(82)
+-26 + j*(-35)
+280 + j*(58)
+-412 + j*(-246)
+-158 + j*(-41)
+-95 + j*(316)
+124 + j*(-209)
+-127 + j*(105)
+69 + j*(89)
+-215 + j*(272)
+88 + j*(-143)
+112 + j*(-29)
+69 + j*(40)
+-50 + j*(-23)
+163 + j*(7)
+69 + j*(-132)
+60 + j*(115)
+25 + j*(-206)
+-172 + j*(176)
+-535 + j*(-53)
+141 + j*(52)
+179 + j*(69)
+65 + j*(29)
+12 + j*(-180)
+-205 + j*(64)
+82 + j*(136)
+62 + j*(-64)
+194 + j*(264)
+-332 + j*(177)
+-65 + j*(373)
+34 + j*(107)
+-112 + j*(208)
+140 + j*(-209)
+269 + j*(4)
+-247 + j*(-40)
+-70 + j*(68)
+-179 + j*(-117)
+102 + j*(-54)
+148 + j*(-216)
+446 + j*(35)
+281 + j*(-202)
+-71 + j*(-89)
+180 + j*(161)
+-77 + j*(-236)
+-33 + j*(-301)
+-11 + j*(-132)
+71 + j*(-301)
+-94 + j*(43)
+-209 + j*(-148)
+204 + j*(-35)
+137 + j*(-66)
+8 + j*(54)
+-186 + j*(-173)
+-82 + j*(-146)
+-218 + j*(-95)
+202 + j*(-250)
+212 + j*(-194)
+-2 + j*(-124)
+-425 + j*(190)
+-10 + j*(-141)
+-445 + j*(27)
+-66 + j*(-164)
+13 + j*(-260)
+-109 + j*(132)
+79 + j*(165)
+39 + j*(259)
+173 + j*(110)
+35 + j*(264)
+-13 + j*(197)
+-47 + j*(-209)
+-219 + j*(-66)
+93 + j*(142)
+-129 + j*(-158)
+49 + j*(213)
+270 + j*(57)
+-144 + j*(-371)
+-7 + j*(40)
+276 + j*(-67)
+-144 + j*(94)
+-177 + j*(-30)
+-61 + j*(-129)
+-596 + j*(331)
+-67 + j*(214)
+-144 + j*(59)
+-301 + j*(-268)
+-146 + j*(-204)
+-117 + j*(-105)
+90 + j*(24)
+-30 + j*(35)
+-166 + j*(-23)
+92 + j*(-79)
+106 + j*(-62)
+127 + j*(400)
+-154 + j*(68)
+31 + j*(354)
+144 + j*(-104)
+56 + j*(170)
+-74 + j*(25)
+-240 + j*(204)
+-111 + j*(-112)
+-57 + j*(69)
+17 + j*(-59)
+-76 + j*(86)
+-168 + j*(262)
+-66 + j*(97)
+-360 + j*(224)
+-159 + j*(42)
+-131 + j*(-4)
+-68 + j*(-267)
+110 + j*(151)
+-110 + j*(-136)
+-171 + j*(-18)
+-81 + j*(-235)
+-236 + j*(173)
+378 + j*(-101)
+-203 + j*(47)
+61 + j*(47)
+12 + j*(349)
+291 + j*(73)
+-470 + j*(73)
+339 + j*(48)
+-1 + j*(-18)
+-132 + j*(-96)
+86 + j*(63)
+-191 + j*(-190)
+-142 + j*(-22)
+-134 + j*(-180)
+-326 + j*(52)
+-198 + j*(-278)
+-88 + j*(146)
+-207 + j*(33)
+-192 + j*(-90)
+-55 + j*(-57)
+-156 + j*(64)
+-332 + j*(327)
+235 + j*(-50)
+65 + j*(373)
+107 + j*(-127)
+122 + j*(98)
+123 + j*(-29)
+-61 + j*(-6)
+-35 + j*(58)
+96 + j*(-22)
+35 + j*(63)
+123 + j*(-92)
+172 + j*(-159)
+240 + j*(57)
+-175 + j*(92)
+-87 + j*(-8)
+122 + j*(-253)
+-236 + j*(-38)
+-163 + j*(300)
+-310 + j*(40)
+87 + j*(-207)
+454 + j*(68)
+-103 + j*(-186)
+250 + j*(115)
+474 + j*(156)
+51 + j*(22)
+31 + j*(2)
+75 + j*(-193)
+-36 + j*(168)
+162 + j*(-11)
+86 + j*(187)
+-86 + j*(-121)
+77 + j*(-82)
+222 + j*(-158)
+-19 + j*(-135)
+188 + j*(279)
+-4 + j*(198)
+54 + j*(30)
+-199 + j*(173)
+37 + j*(206)
+-16 + j*(359)
+24 + j*(-164)
+211 + j*(-117)
+56 + j*(99)
+-17 + j*(32)
+100 + j*(-287)
+-289 + j*(9)
+122 + j*(158)
+318 + j*(13)
+59 + j*(-168)
+78 + j*(218)
+-42 + j*(191)
+-202 + j*(-32)
+74 + j*(99)
+-167 + j*(98)
+64 + j*(343)
+119 + j*(-105)
+-218 + j*(131)
+-116 + j*(-496)
+44 + j*(267)
+-109 + j*(222)
+42 + j*(40)
+-15 + j*(164)
+-74 + j*(308)
+-1 + j*(-144)
+-284 + j*(186)
+146 + j*(-49)
+-244 + j*(240)
+-19 + j*(-161)
+43 + j*(320)
+-136 + j*(20)
+247 + j*(0)
+69 + j*(-146)
+-141 + j*(400)
+-21 + j*(-227)
+139 + j*(-40)
+275 + j*(-26)
+-157 + j*(34)
+28 + j*(83)
+-578 + j*(-7)
+-135 + j*(73)
+76 + j*(148)
+-310 + j*(-154)
+210 + j*(123)
+52 + j*(-453)
+-257 + j*(14)
+23 + j*(20)
+130 + j*(202)
+45 + j*(223)
+299 + j*(-381)
+-103 + j*(-58)
+39 + j*(40)
+-42 + j*(86)
+161 + j*(-38)
+129 + j*(-187)
+-84 + j*(-164)
+8 + j*(-97)
+110 + j*(172)
+247 + j*(356)
+-310 + j*(-209)
+46 + j*(13)
+291 + j*(-132)
+44 + j*(228)
+-43 + j*(166)
+-258 + j*(121)
+-17 + j*(-28)
+327 + j*(-172)
+336 + j*(153)
+321 + j*(-74)
+83 + j*(-168)
+3 + j*(-115)
+28 + j*(276)
+124 + j*(-30)
+88 + j*(-173)
+341 + j*(-122)
+-32 + j*(288)
+143 + j*(150)
+-389 + j*(-63)
+-136 + j*(4)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+];
diff --git a/targets/ARCH/COMMON/common_lib.h b/targets/ARCH/COMMON/common_lib.h
index fecc4abb63fe56a17ba3fca0c2bf536b1be178bd..e094c9eb0076ea6401a91107ebd51d0ac20e2c66 100644
--- a/targets/ARCH/COMMON/common_lib.h
+++ b/targets/ARCH/COMMON/common_lib.h
@@ -192,6 +192,7 @@ typedef struct {
   //! \brief Center frequency in Hz for TX.
   //! index: [0..rx_num_channels[ !!! see lte-ue.c:427 FIXME iterates over rx_num_channels
   double tx_freq[4];
+  double tune_offset;
   //! \brief memory
   //! \brief Pointer to Calibration table for RX gains
   rx_gain_calib_table_t *rx_gain_calib_table;
@@ -383,7 +384,7 @@ struct openair0_device_t {
       @param buff Buffer which holds the samples (2 dimensional)
       @param nsamps number of samples to be sent
       @param number of antennas 
-      @param flags flags must be set to TRUE if timestamp parameter needs to be applied
+      @param flags flags must be set to true if timestamp parameter needs to be applied
   */
   int (*trx_write_func)(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps,int antenna_id, int flags);
 
@@ -393,7 +394,7 @@ struct openair0_device_t {
       @param buff Buffer which holds the samples (1 dimensional)
       @param nsamps number of samples to be sent
       @param antenna_id index of the antenna if the device has multiple anteannas
-      @param flags flags must be set to TRUE if timestamp parameter needs to be applied
+      @param flags flags must be set to true if timestamp parameter needs to be applied
   */
   int (*trx_write_func2)(openair0_device *device, openair0_timestamp timestamp, void *buff, int nsamps,int antenna_id, int flags);
 
diff --git a/targets/ARCH/IRIS/USERSPACE/LIB/iris_lib.cpp b/targets/ARCH/IRIS/USERSPACE/LIB/iris_lib.cpp
index 1273097f3b901468f6ffd56ff2737fcbf22114c0..47bbadfe2823544b094fe9ce916207b08a5ab869 100644
--- a/targets/ARCH/IRIS/USERSPACE/LIB/iris_lib.cpp
+++ b/targets/ARCH/IRIS/USERSPACE/LIB/iris_lib.cpp
@@ -134,7 +134,7 @@ static void trx_iris_end(openair0_device *device) {
       @param buff Buffer which holds the samples
       @param nsamps number of samples to be sent
       @param antenna_id index of the antenna if the device has multiple anteannas
-      @param flags flags must be set to TRUE if timestamp parameter needs to be applied
+      @param flags flags must be set to true if timestamp parameter needs to be applied
 */
 
 
diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
index ed17d7eefd34ddd32a564bedc136d63218c179aa..cc1062c6f2f96f6f2079d0be15dccfdfabdec134 100644
--- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
+++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
@@ -335,7 +335,7 @@ static void trx_usrp_end(openair0_device *device) {
       @param buff Buffer which holds the samples
       @param nsamps number of samples to be sent
       @param antenna_id index of the antenna if the device has multiple antennas
-      @param flags flags must be set to TRUE if timestamp parameter needs to be applied
+      @param flags flags must be set to true if timestamp parameter needs to be applied
 */
 static int trx_usrp_write(openair0_device *device,
 			  openair0_timestamp timestamp,
@@ -356,7 +356,7 @@ static int trx_usrp_write(openair0_device *device,
 
   AssertFatal( MAX_WRITE_THREAD_BUFFER_SIZE >= cc,"Do not support more than %d cc number\n", MAX_WRITE_THREAD_BUFFER_SIZE);
 
-    boolean_t first_packet_state=false,last_packet_state=false;
+  bool first_packet_state=false,last_packet_state=false;
 
     if (flags_lsb == 2) { // start of burst
       //      s->tx_md.start_of_burst = true;
@@ -492,7 +492,7 @@ VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_BEAM_SWITCHI
       @param buff Buffer which holds the samples
       @param nsamps number of samples to be sent
       @param antenna_id index of the antenna if the device has multiple antennas
-      @param flags flags must be set to TRUE if timestamp parameter needs to be applied
+      @param flags flags must be set to true if timestamp parameter needs to be applied
 */
 void *trx_usrp_write_thread(void * arg){
   int ret=0;
@@ -662,6 +662,7 @@ static int trx_usrp_read(openair0_device *device, openair0_timestamp *ptimestamp
         break;
      case USRP_X300_DEV:
      case USRP_N300_DEV:
+     case USRP_X400_DEV:
         rxshift=2;
         break;
      default:
@@ -692,7 +693,7 @@ static int trx_usrp_read(openair0_device *device, openair0_timestamp *ptimestamp
   }
   if (samples_received == nsamps) s->wait_for_first_pps=0;
 
-    // bring RX data into 12 LSBs for softmodem RX
+  // bring RX data into 12 LSBs for softmodem RX
   for (int i=0; i<cc; i++) {
     for (int j=0; j<nsamps2; j++) {
 #if defined(__x86_64__) || defined(__i386__)
@@ -770,8 +771,12 @@ static bool is_equal(double a, double b) {
 void *freq_thread(void *arg) {
   openair0_device *device=(openair0_device *)arg;
   usrp_state_t *s = (usrp_state_t *)device->priv;
-  s->usrp->set_tx_freq(device->openair0_cfg[0].tx_freq[0]);
-  s->usrp->set_rx_freq(device->openair0_cfg[0].rx_freq[0]);
+  uhd::tune_request_t tx_tune_req(device->openair0_cfg[0].tx_freq[0],
+                                  device->openair0_cfg[0].tune_offset);
+  uhd::tune_request_t rx_tune_req(device->openair0_cfg[0].rx_freq[0],
+                                  device->openair0_cfg[0].tune_offset);
+  s->usrp->set_tx_freq(tx_tune_req);
+  s->usrp->set_rx_freq(rx_tune_req);
   return NULL;
 }
 /*! \brief Set frequencies (TX/RX). Spawns a thread to handle the frequency change to not block the calling thread
@@ -783,14 +788,18 @@ void *freq_thread(void *arg) {
 int trx_usrp_set_freq(openair0_device *device, openair0_config_t *openair0_cfg, int dont_block) {
   usrp_state_t *s = (usrp_state_t *)device->priv;
   pthread_t f_thread;
-  printf("Setting USRP TX Freq %f, RX Freq %f\n",openair0_cfg[0].tx_freq[0],openair0_cfg[0].rx_freq[0]);
+  printf("Setting USRP TX Freq %f, RX Freq %f, tune_offset: %f, dont_block: %d\n",
+         openair0_cfg[0].tx_freq[0],openair0_cfg[0].rx_freq[0],
+         openair0_cfg[0].tune_offset, dont_block);
 
   // spawn a thread to handle the frequency change to not block the calling thread
   if (dont_block == 1)
     pthread_create(&f_thread,NULL,freq_thread,(void *)device);
   else {
-    s->usrp->set_tx_freq(device->openair0_cfg[0].tx_freq[0]);
-    s->usrp->set_rx_freq(device->openair0_cfg[0].rx_freq[0]);
+    uhd::tune_request_t tx_tune_req(openair0_cfg[0].tx_freq[0], openair0_cfg[0].tune_offset);
+    uhd::tune_request_t rx_tune_req(openair0_cfg[0].rx_freq[0], openair0_cfg[0].tune_offset);
+    s->usrp->set_tx_freq(tx_tune_req);
+    s->usrp->set_rx_freq(rx_tune_req);
   }
 
   return(0);
@@ -803,9 +812,11 @@ int trx_usrp_set_freq(openair0_device *device, openair0_config_t *openair0_cfg,
  */
 int openair0_set_rx_frequencies(openair0_device *device, openair0_config_t *openair0_cfg) {
   usrp_state_t *s = (usrp_state_t *)device->priv;
-  uhd::tune_request_t rx_tune_req(openair0_cfg[0].rx_freq[0]);
-  rx_tune_req.rf_freq_policy = uhd::tune_request_t::POLICY_MANUAL;
-  rx_tune_req.rf_freq = openair0_cfg[0].rx_freq[0];
+  uhd::tune_request_t rx_tune_req(openair0_cfg[0].rx_freq[0], openair0_cfg[0].tune_offset);
+  printf("In openair0_set_rx_frequencies, freq: %f, tune offset: %f\n",
+         openair0_cfg[0].rx_freq[0],  openair0_cfg[0].tune_offset);
+  //rx_tune_req.rf_freq_policy = uhd::tune_request_t::POLICY_MANUAL;
+  //rx_tune_req.rf_freq = openair0_cfg[0].rx_freq[0];
   s->usrp->set_rx_freq(rx_tune_req);
   return(0);
 }
@@ -1043,9 +1054,13 @@ extern "C" {
     }
 
     if (device_adds[0].get("type") == "n3xx") {
-      printf("Found USRP n300\n");
+      const std::string product = device_adds[0].get("product");
+      printf("Found USRP %s\n", product.c_str());
       device->type=USRP_N300_DEV;
-      usrp_master_clock = 122.88e6;
+      if (product == "n320")
+        usrp_master_clock = 245.76e6; // N320 does not support 122.88e6 master clock rate
+      else
+        usrp_master_clock = 122.88e6;
       args += boost::str(boost::format(",master_clock_rate=%f") % usrp_master_clock);
 
       if ( 0 != system("sysctl -w net.core.rmem_max=62500000 net.core.wmem_max=62500000") )
@@ -1329,7 +1344,9 @@ extern "C" {
   for(int i=0; i<((int) s->usrp->get_rx_num_channels()); i++) {
     if (i<openair0_cfg[0].rx_num_channels) {
       s->usrp->set_rx_rate(openair0_cfg[0].sample_rate,i+choffset);
-      s->usrp->set_rx_freq(openair0_cfg[0].rx_freq[i],i+choffset);
+      uhd::tune_request_t rx_tune_req(openair0_cfg[0].rx_freq[i],
+                                      openair0_cfg[0].tune_offset);
+      s->usrp->set_rx_freq(rx_tune_req, i+choffset);
       set_rx_gain_offset(&openair0_cfg[0],i,bw_gain_adjust);
       ::uhd::gain_range_t gain_range = s->usrp->get_rx_gain_range(i+choffset);
       // limit to maximum gain
@@ -1355,7 +1372,9 @@ extern "C" {
 
     if (i<openair0_cfg[0].tx_num_channels) {
       s->usrp->set_tx_rate(openair0_cfg[0].sample_rate,i+choffset);
-      s->usrp->set_tx_freq(openair0_cfg[0].tx_freq[i],i+choffset);
+      uhd::tune_request_t tx_tune_req(openair0_cfg[0].tx_freq[i],
+                                      openair0_cfg[0].tune_offset);
+      s->usrp->set_tx_freq(tx_tune_req, i+choffset);
       s->usrp->set_tx_gain(gain_range_tx.stop()-openair0_cfg[0].tx_gain[i],i+choffset);
       LOG_I(HW,"USRP TX_GAIN:%3.2lf gain_range:%3.2lf tx_gain:%3.2lf\n", gain_range_tx.stop()-openair0_cfg[0].tx_gain[i], gain_range_tx.stop(), openair0_cfg[0].tx_gain[i]);
     }
diff --git a/targets/ARCH/iqplayer/iqplayer_lib.c b/targets/ARCH/iqplayer/iqplayer_lib.c
index b62c1935d36967c88da984536846a60b9a9f7ca0..f6578d6e9a31707b3b0220465bb47bf7048b1615 100644
--- a/targets/ARCH/iqplayer/iqplayer_lib.c
+++ b/targets/ARCH/iqplayer/iqplayer_lib.c
@@ -158,7 +158,7 @@ static void trx_iqplayer_end(openair0_device *device) {
       @param buff Buffer which holds the samples
       @param nsamps number of samples to be sent
       @param antenna_id index of the antenna if the device has multiple antennas
-      @param flags flags must be set to TRUE if timestamp parameter needs to be applied
+      @param flags flags must be set to true if timestamp parameter needs to be applied
 */
 static int trx_iqplayer_write(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps, int cc, int flags) {
   struct timespec req;
diff --git a/targets/ARCH/rfsimulator/README.md b/targets/ARCH/rfsimulator/README.md
index 4a8d5ff79acb1092a590d0b0ca2bc49af105e3f2..feb7f015b96683857b4245a9ea2029ff5557a636 100644
--- a/targets/ARCH/rfsimulator/README.md
+++ b/targets/ARCH/rfsimulator/README.md
@@ -61,6 +61,8 @@ Setting the env variable RFSIMULATOR can be used instead of using the serveraddr
 
 ## How to use the RF simulator options
 
+To define and use a channel model, the configuration file needs to include a channel configuration file. To do this, add `@include "channelmod_rfsimu.conf"` to the end of the configuration file, and place the channel configuration file in the same directory. An example channel configuration file `channelmod_rfsimu.conf` is in `ci-scripts/conf_files`.
+
 Add the following options to the command line to enable the channel model and the IQ samples saving for future replay:
 ```bash
 --rfsimulator.options chanmod,saviq
@@ -82,6 +84,8 @@ Example run:
 sudo RFSIMULATOR=server ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf --parallel-config PARALLEL_SINGLE_THREAD --rfsim --phy-test --rfsimulator.options chanmod --rfsimulator.modelname AWGN 
 ```
 
+where `@include "channelmod_rfsimu.conf"` has been added at the end of the file, and `ci-scripts/conf_files/channelmod_rfsimu.conf` copied to `targets/PROJECTS/GENERIC-LTE-EPC/CONF/`.
+
 ## 4G case
 
 For the UE, it should be set to the IP address of the eNB. For example:
@@ -102,9 +106,7 @@ $OPENAIR_DIR/targets/bin/conf2uedata -c $OPENAIR_DIR/openair3/NAS/TOOLS/ue_eurec
 
 ## 5G case
 
-The 5G RF simulator will be aligned with the 4G as the efforts for merging the 5G specific branches into the develop make progresses.
-
-After regular build, add the simulation driver (do not use ./build_oai -w SIMU until 4G and 5G branches are merged).
+If `build_oai` has not been run with `-w SIMU`, you need to build the `rfsimulator` manually. To do so:
 ```bash
 cd ran_build/build
 make rfsimulator
@@ -113,7 +115,7 @@ make rfsimulator
 ### Launch gNB in one window
 
 ```bash
-sudo RFSIMULATOR=server ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf --parallel-config PARALLEL_SINGLE_THREAD --rfsim --phy-test
+sudo RFSIMULATOR=server ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf --parallel-config PARALLEL_SINGLE_THREAD --rfsim --phy-test --nokrnmod 1
 ```
 
 ### Launch UE in another window
@@ -124,15 +126,17 @@ sudo RFSIMULATOR=<TARGET_GNB_INTERFACE_ADDRESS> ./nr-uesoftmodem --rfsim --phy-t
 
 Notes:
 
-1. <TARGET_GNB_INTERFACE_ADDRESS> can be 127.0.0.1 if both gNB and nrUE executables run on the same host, OR the IP interface address of the remote host running the gNB executable, if the gNB and nrUE run on separate hosts
-2. the --rrc_config_path parameter SHALL specify where the 2 RAW files are located (`rbconfig.raw` and `reconfig.raw`).
+1. This starts the gNB and UE in the `phy-test` UP-only mode where the gNB is started as if a UE had already connected, and a configurable scheduler is used instead of the default one. The options `-m`, `-l`, `-t`, `-M`, `-T`, `-D`, and `-U` can be used to configure this scheduler.
+2. <TARGET_GNB_INTERFACE_ADDRESS> can be 127.0.0.1 if both gNB and nrUE executables run on the same host, OR the IP interface address of the remote host running the gNB executable, if the gNB and nrUE run on separate hosts.
+3. The --rrc_config_path parameter SHALL specify where the 2 RAW files are located (`rbconfig.raw` and `reconfig.raw`).
    - If you are running on the same machine and launched the 2 executables (`nr-softmodem` and `nr-uesoftmodem`) from the same directory, nothing has to be done.
    - If you launched the 2 executables from 2 different folders, just point to the location where you launched the `nr-softmodem`:
      * `sudo RFSIMULATOR=<TARGET_GNB_INTERFACE_ADDRESS> ./nr-uesoftmodem --rfsim --phy-test --rrc_config_path /the/path/where/you/launched/nr-softmodem`
    - If you are not running on the same machine or launched the 2 executables from 2 different folders, you need to **COPY** the 2 raw files
      * `scp usera@machineA:/the/path/where/you/launched/nr-softmodem/r*config.raw userb@machineB:/the/path/where/you/will/launch/nr-uesoftmodem/`
      * Obviously this operation SHALL be done before launching the `nr-uesoftmodem` executable.
-3. to enable the noS1 mode --noS1 and --nokrnmod 1 options should be added to the command line
+4. To enable the noS1 mode, `--noS1` option should be added to the command line.
+5. To operate the gNB/UE with a 5GC, start them using the `--sa` option. More information can be found [here](../../../doc/TESTING_5GSA_setup.md#2-sa-setup-with-oai-nr-ue-softmodem).
 
 
 In the UE, you can add `-d` option to get the softscope.
diff --git a/targets/ARCH/rfsimulator/simulator.c b/targets/ARCH/rfsimulator/simulator.c
index bc9882b4bd2342ffecb3e47dcd89888ea208f1e7..127b2975d588cdd2816aba3a9566b9cbbe653bd4 100644
--- a/targets/ARCH/rfsimulator/simulator.c
+++ b/targets/ARCH/rfsimulator/simulator.c
@@ -429,6 +429,8 @@ static int rfsimulator_write_internal(rfsimulator_state_t *t, openair0_timestamp
   if (!alreadyLocked)
     pthread_mutex_lock(&Sockmutex);
 
+  LOG_D(HW,"sending %d samples at time: %ld, nbAnt %d\n", nsamps, timestamp, nbAnt);
+
   for (int i=0; i<FD_SETSIZE; i++) {
     buffer_t *b=&t->buf[i];
 
@@ -621,7 +623,7 @@ static int rfsimulator_read(openair0_device *device, openair0_timestamp *ptimest
   }
 
   rfsimulator_state_t *t = device->priv;
-  LOG_D(HW, "Enter rfsimulator_read, expect %d samples, will release at TS: %ld\n", nsamps, t->nextRxTstamp+nsamps);
+  LOG_D(HW, "Enter rfsimulator_read, expect %d samples, will release at TS: %ld, nbAnt %d\n", nsamps, t->nextRxTstamp+nsamps, nbAnt);
   // deliver data from received data
   // check if a UE is connected
   int first_sock;
@@ -693,15 +695,16 @@ static int rfsimulator_read(openair0_device *device, openair0_timestamp *ptimest
         t->poll_telnetcmdq(t->telnetcmd_qid,t);
 
       for (int a=0; a<nbAnt; a++) {//loop over number of Rx antennas
-        if ( ptr->channel_model != NULL ) // apply a channel model
-          rxAddInput( ptr->circularBuf, (c16_t *) samplesVoid[a],
-                      a,
-                      ptr->channel_model,
-                      nsamps,
-                      t->nextRxTstamp,
-                      CirSize
-                    );
+        if ( ptr->channel_model != NULL ) { // apply a channel model
+          rxAddInput(ptr->circularBuf, (c16_t *) samplesVoid[a],
+                     a,
+                     ptr->channel_model,
+                     nsamps,
+                     t->nextRxTstamp,
+                     CirSize);
+        }
         else { // no channel modeling
+          
           double H_awgn_mimo[4][4] ={{1.0, 0.2, 0.1, 0.05}, //rx 0
                                       {0.2, 1.0, 0.2, 0.1}, //rx 1
                                      {0.1, 0.2, 1.0, 0.2}, //rx 2
diff --git a/targets/ARCH/rfsimulator/stored_node.c b/targets/ARCH/rfsimulator/stored_node.c
index cf025680cd76d3665135a2002a9c5e5ad35158f4..17ab3cb734391e417dda4793993f1fddfac353c4 100644
--- a/targets/ARCH/rfsimulator/stored_node.c
+++ b/targets/ARCH/rfsimulator/stored_node.c
@@ -187,7 +187,7 @@ int main(int argc, char *argv[]) {
   }
 
   uint64_t typeStamp=ENB_MAGICDL;
-  boolean_t raw=false;
+  bool raw = false;
 
   if ( argc == 5 ) {
     raw=true;
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/benetel-5g.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/benetel-5g.conf
index d14267dcd84f89441248b2655789c433c8a7f268..c8e109d30230f435ee788e4d49a1893ae3dc8b33 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/benetel-5g.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/benetel-5g.conf
@@ -22,7 +22,6 @@ gNBs =
 
     ////////// Physical parameters:
 
-    ssb_SubcarrierOffset                                      = 31; //0;
 	
     servingCellConfigCommon = (
     {
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpn300.conf
index 4682dd39344d788c817114cf241fa02f55d84606..358c2fc2eed1027e8a6e78e5b6f9f07a336d918b 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpn300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpn300.conf
@@ -21,7 +21,6 @@ gNBs =
 
     ////////// Physical parameters:
 
-    ssb_SubcarrierOffset                                      = 0;
 	
     servingCellConfigCommon = (
     {
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpx300.conf
index ab435c9686684d4b97a7b58d017dbd300eea48ee..e5478983cff20909524743e70280d66148b8ac8c 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpx300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpx300.conf
@@ -21,7 +21,6 @@ gNBs =
 
     ////////// Physical parameters:
 
-    ssb_SubcarrierOffset                                      = 0;
 	
     servingCellConfigCommon = (
     {
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.66PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.66PRB.usrpn300.conf
index 912a9f328b3416adccf9d162cfbe505f02acc638..14040dfe4fb7172249a2a1145f19a922f68683fb 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.66PRB.usrpn300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.66PRB.usrpn300.conf
@@ -21,8 +21,6 @@ gNBs =
 
     ////////// Physical parameters:
 
-    ssb_SubcarrierOffset                                      = 0;
-
     servingCellConfigCommon = (
     {
  #spCellConfigCommon
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band261.tm1.32PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band261.tm1.32PRB.usrpn300.conf
index 426f9e782b1a0cc3196af816495c936646b0828e..8a2ce9f63ecc361c7de47e3508384c64e6eaf1f1 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band261.tm1.32PRB.usrpn300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band261.tm1.32PRB.usrpn300.conf
@@ -21,7 +21,6 @@ gNBs =
 
     ////////// Physical parameters:
 
-    ssb_SubcarrierOffset                                      = 0;
 	
     servingCellConfigCommon = (
     {
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpn300.conf
index 216728577a775fb8db3a4375894753ba49c3435f..616f86a1cd6a5fbb9d8ce94337895c16e1f851af 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpn300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpn300.conf
@@ -21,7 +21,6 @@ gNBs =
 
     ////////// Physical parameters:
 
-    ssb_SubcarrierOffset                                      = 0;
 
     servingCellConfigCommon = (
     {
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpx300.conf
index 59d466656c66319d08cec18df5c3d9619b20c907..0818fe11d7c8f926711b7c34fd42f16876065d58 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpx300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpx300.conf
@@ -21,8 +21,6 @@ gNBs =
 
     ////////// Physical parameters:
 
-    ssb_SubcarrierOffset                                      = 0;
-
     servingCellConfigCommon = (
     {
  #spCellConfigCommon
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.25PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.25PRB.usrpn300.conf
new file mode 100644
index 0000000000000000000000000000000000000000..022f17e490e140b335f1443b9470bca5bfb0f4d5
--- /dev/null
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.25PRB.usrpn300.conf
@@ -0,0 +1,263 @@
+Active_gNBs = ( "gNB-Eurecom-5GNRBox");
+# Asn1_verbosity, choice in: none, info, annoying
+Asn1_verbosity = "none";
+
+gNBs =
+(
+ {
+    ////////// Identification parameters:
+    gNB_ID    =  0xe00;
+
+    cell_type =  "CELL_MACRO_GNB";
+
+    gNB_name  =  "gNB-Eurecom-5GNRBox";
+
+    // Tracking area code, 0x0000 and 0xfffe are reserved values
+    tracking_area_code  =  1;
+
+    plmn_list = ({mcc = 208; mnc = 93; mnc_length = 2;});
+
+    tr_s_preference     = "local_mac";
+
+    ////////// Physical parameters:
+
+    min_rxtxtime                                              = 6;
+
+    servingCellConfigCommon = (
+    {
+ #spCellConfigCommon
+
+      physCellId                                                    = 0;
+
+#  downlinkConfigCommon
+    #frequencyInfoDL
+      # this is 2150 MHz + 12 PRBs@15kHz SCS (same as initial BWP), points to Subcarrier 0 of RB#10 of SSB block
+      absoluteFrequencySSB                                          = 430432;
+      dl_frequencyBand                                              = 66;
+      # this is 2150 MHz
+      dl_absoluteFrequencyPointA                                    = 430000;
+      #scs-SpecificCarrierList
+        dl_offstToCarrier                                           = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120  
+        dl_subcarrierSpacing                                        = 0;
+        dl_carrierBandwidth                                         = 25;
+     #initialDownlinkBWP
+      #genericParameters
+        # this is RBstart=0,L=25 (275*(L-1))+RBstart
+        initialDLBWPlocationAndBandwidth                            = 6600;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        initialDLBWPsubcarrierSpacing                               = 0;
+      #pdcch-ConfigCommon
+        initialDLBWPcontrolResourceSetZero                          = 0;
+        initialDLBWPsearchSpaceZero                                 = 0;
+
+  #uplinkConfigCommon
+     #frequencyInfoUL
+      ul_frequencyBand                                              = 66;
+      ul_absoluteFrequencyPointA                                    = 350000;
+      #scs-SpecificCarrierList
+      ul_offstToCarrier                                             = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      ul_subcarrierSpacing                                          = 0;
+      ul_carrierBandwidth                                           = 25;
+      pMax                                                          = 20;
+     #initialUplinkBWP
+      #genericParameters
+        initialULBWPlocationAndBandwidth                            = 6600;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        initialULBWPsubcarrierSpacing                               = 0;
+      #rach-ConfigCommon
+        #rach-ConfigGeneric
+          prach_ConfigurationIndex                                  = 98;
+#prach_msg1_FDM
+#0 = one, 1=two, 2=four, 3=eight
+          prach_msg1_FDM                                            = 0;
+          prach_msg1_FrequencyStart                                 = 0;
+          zeroCorrelationZoneConfig                                 = 13;
+          preambleReceivedTargetPower                               = -118;
+#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
+          preambleTransMax                                          = 6;
+#powerRampingStep
+# 0=dB0,1=dB2,2=dB4,3=dB6
+        powerRampingStep                                            = 1;
+#ra_ReponseWindow
+#1,2,4,8,10,20,40,80
+        ra_ResponseWindow                                           = 4;
+#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
+#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
+        ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR                = 4;
+#oneHalf (0..15) 4,8,12,16,...60,64
+        ssb_perRACH_OccasionAndCB_PreamblesPerSSB                   = 15;
+#ra_ContentionResolutionTimer
+#(0..7) 8,16,24,32,40,48,56,64
+        ra_ContentionResolutionTimer                                = 7;
+        rsrp_ThresholdSSB                                           = 19;
+#prach-RootSequenceIndex_PR
+#1 = 839, 2 = 139
+        prach_RootSequenceIndex_PR                                  = 2;
+        prach_RootSequenceIndex                                     = 1;
+        # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
+        msg1_SubcarrierSpacing                                      = 0;
+# restrictedSetConfig
+# 0=unrestricted, 1=restricted type A, 2=restricted type B
+        restrictedSetConfig                                         = 0;
+
+        msg3_DeltaPreamble                                          = 1;
+        p0_NominalWithGrant                                         =-90;
+
+# pucch-ConfigCommon setup :
+# pucchGroupHopping
+# 0 = neither, 1= group hopping, 2=sequence hopping
+        pucchGroupHopping                                           = 0;
+        hoppingId                                                   = 40;
+        p0_nominal                                                  = -90;
+# ssb_PositionsInBurs_BitmapPR
+# 1=short, 2=medium, 3=long
+      ssb_PositionsInBurst_PR                                       = 2;
+      ssb_PositionsInBurst_Bitmap                                   = 0x1;
+
+# ssb_periodicityServingCell
+# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
+      ssb_periodicityServingCell                                    = 2;
+
+# dmrs_TypeA_position
+# 0 = pos2, 1 = pos3
+      dmrs_TypeA_Position                                           = 0;
+
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      subcarrierSpacing                                             = 0;
+
+
+  #tdd-UL-DL-ConfigurationCommon
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      referenceSubcarrierSpacing                                    = 0;
+      # pattern1
+      # dl_UL_TransmissionPeriodicity
+      # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
+      dl_UL_TransmissionPeriodicity                                 = 6;
+      nrofDownlinkSlots                                             = 7;
+      nrofDownlinkSymbols                                           = 6;
+      nrofUplinkSlots                                               = 2;
+      nrofUplinkSymbols                                             = 4;
+
+      ssPBCH_BlockPower                                             = -25;
+  }
+
+  );
+
+
+    # ------- SCTP definitions
+    SCTP :
+    {
+        # Number of streams to use in input/output
+        SCTP_INSTREAMS  = 2;
+        SCTP_OUTSTREAMS = 2;
+    };
+
+
+    ////////// MME parameters:
+    mme_ip_address      = ( { ipv4       = "192.168.12.26";
+                              ipv6       = "192:168:30::17";
+                              active     = "yes";
+                              preference = "ipv4";
+                            }
+                          );
+
+    NETWORK_INTERFACES :
+    {
+
+        GNB_INTERFACE_NAME_FOR_S1_MME            = "eth0";
+        GNB_IPV4_ADDRESS_FOR_S1_MME              = "192.168.12.111/24";
+        GNB_INTERFACE_NAME_FOR_S1U               = "eth0";
+        GNB_IPV4_ADDRESS_FOR_S1U                 = "192.168.12.111/24";
+        GNB_PORT_FOR_S1U                         = 2152; # Spec 2152
+    };
+  }
+);
+
+MACRLCs = (
+	{
+	num_cc = 1;
+	tr_s_preference = "local_L1";
+	tr_n_preference = "local_RRC";
+	}
+);
+
+L1s = (
+	{
+	num_cc = 1;
+	tr_n_preference = "local_mac";
+	thread_pool_size = 8;
+	ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
+	}
+);
+
+RUs = (
+    {
+         local_rf       = "yes";
+         nb_tx          = 1;
+         nb_rx          = 1;
+         att_tx         = 0;
+         att_rx         = 0;
+         bands          = [7];
+         max_pdschReferenceSignalPower = -27;
+         max_rxgain                    = 50;
+         eNB_instances  = [0];
+         ## beamforming 1x2 matrix: 1 layer x 2 antennas
+         bf_weights = [0x00007fff, 0x0000];
+         ## beamforming 1x4 matrix: 1 layer x 4 antennas
+         #bf_weights = [0x00007fff, 0x0000,0x0000, 0x0000];
+         ## beamforming 2x2 matrix:
+         #bf_weights = [0x00007fff, 0x00000000, 0x00000000, 0x00007fff];
+         ## beamforming 4x4 matrix:
+         #bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff];
+         sdr_addrs = "addr=192.168.10.2,mgmt_addr=192.168.10.2,second_addr=192.168.20.2";
+         clock_src = "external";
+         # if_freq = 3700000000L;
+         # if_offset = 1000000;
+    }
+);
+
+THREAD_STRUCT = (
+  {
+    #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+    parallel_config    = "PARALLEL_RU_L1_TRX_SPLIT";
+    #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+    worker_config      = "WORKER_DISABLE";
+  }
+);
+
+security = {
+  # preferred ciphering algorithms
+  # the first one of the list that an UE supports in chosen
+  # valid values: nea0, nea1, nea2, nea3
+  ciphering_algorithms = ( "nea0" );
+
+  # preferred integrity algorithms
+  # the first one of the list that an UE supports in chosen
+  # valid values: nia0, nia1, nia2, nia3
+  integrity_algorithms = ( "nia2", "nia0" );
+
+  # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
+  # what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
+  drb_ciphering = "yes";
+  drb_integrity = "no";
+};
+
+     log_config :
+     {
+       global_log_level                      ="info";
+       hw_log_level                          ="info";
+       phy_log_level                         ="info";
+       mac_log_level                         ="info";
+       rlc_log_level                         ="info";
+       pdcp_log_level                        ="info";
+       rrc_log_level                         ="info";
+    };
+
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.106PRB.30kHz,usrpb2x0.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.106PRB.30kHz,usrpb2x0.conf
index 2ae4df07d9c80b3bc2dff2ee4414799279cbcef1..5c636af06c001cd9e128623d6c136a041b151e91 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.106PRB.30kHz,usrpb2x0.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.106PRB.30kHz,usrpb2x0.conf
@@ -21,7 +21,6 @@ gNBs =
 
     ////////// Physical parameters:
 
-    ssb_SubcarrierOffset                                      = 31;
 	
     servingCellConfigCommon = (
     {
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.106PRB.slave.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.106PRB.slave.conf
index 21267870bd5e8b468c41afe7fcdd2b2cab91290e..812ac8dafbcb3924ea8cd496fcd3d0ad224f584b 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.106PRB.slave.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.106PRB.slave.conf
@@ -21,7 +21,6 @@ gNBs =
 
     ////////// Physical parameters:
 
-    ssb_SubcarrierOffset                                      = 0;
 
     servingCellConfigCommon = (
     {
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.slave.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.slave.conf
index a0fd0bda9f0221dc5c36419a17e9add1fa8f26bf..781384a78915352dfa064611a73a34f3511a530f 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.slave.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.slave.conf
@@ -20,8 +20,6 @@ gNBs =
     tr_s_preference     = "local_mac"
 
     ////////// Physical parameters:
-
-    ssb_SubcarrierOffset                                      = 0;
 	
     servingCellConfigCommon = (
     {
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.PTRS.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.PTRS.usrpx300.conf
index 5c8f90d9b5555a1ce02aa3ee8c3743c3d9c20b6f..1450c45eee0830a579a4b481375a3246346ec4ae 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.PTRS.usrpx300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.PTRS.usrpx300.conf
@@ -21,8 +21,6 @@ gNBs =
 
    ////////// Physical parameters:
 
-   ssb_SubcarrierOffset                                           = 0;
-
    servingCellConfigCommon = (
    {
      #spCellConfigCommon
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpb210.conf
index 7bf3626870a6604c8a6c576347ceb7425ce6c386..562e2b16ab0e66c4d02e342892943f9a76fd1576 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpb210.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpb210.conf
@@ -21,8 +21,6 @@ gNBs =
 
     ////////// Physical parameters:
 
-    ssb_SubcarrierOffset                                      = 0;
-
     servingCellConfigCommon = (
     {
  #spCellConfigCommon
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf
index 1773e1fb7921be8a563c70001243c37e547b2e44..a8ecb8c4b6783ba5c29cfc9c16e88a85eb969918 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf
@@ -21,8 +21,6 @@ gNBs =
 
     ////////// Physical parameters:
 
-    ssb_SubcarrierOffset                                      = 0;
-
     servingCellConfigCommon = (
     {
  #spCellConfigCommon
@@ -182,11 +180,11 @@ gNBs =
 );
 
 MACRLCs = (
-	{
-	num_cc = 1;
-	tr_s_preference = "local_L1";
-	tr_n_preference = "local_RRC";
-	}
+  {
+  num_cc = 1;
+  tr_s_preference = "local_L1";
+  tr_n_preference = "local_RRC";
+  }
 );
 
 L1s = (
@@ -194,6 +192,7 @@ L1s = (
   num_cc = 1;
   tr_n_preference = "local_mac";
   thread_pool_size = 8;
+  max_ldpc_iterations = 5;
   ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
 }
 );
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpx300.conf
index d0f394be16a648c0efba3d26bd474647f435e674..10122b9eb2c7a9927e0aad416d0a07281735938c 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpx300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpx300.conf
@@ -21,8 +21,6 @@ gNBs =
 
     ////////// Physical parameters:
 
-    ssb_SubcarrierOffset                                      = 0;
-
     servingCellConfigCommon = (
     {
  #spCellConfigCommon
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpn300.conf
index 0438e61337210d1e37ec783d253b983f41d40e26..20d01c2a00d9663cdf4cbfaa3adc9068a2e8f532 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpn300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpn300.conf
@@ -20,8 +20,6 @@ gNBs =
     tr_s_preference     = "local_mac"
 
     ////////// Physical parameters:
-
-    ssb_SubcarrierOffset                                      = 0;
 	
     servingCellConfigCommon = (
     {
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpx300.conf
index 66c2151eb83997cabe07d0016c269a01b71c9a10..44f3889eece0e356be101ae7b6bba7e55c386741 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpx300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpx300.conf
@@ -21,7 +21,6 @@ gNBs =
 
     ////////// Physical parameters:
 
-    ssb_SubcarrierOffset                                      = 0;
 
     servingCellConfigCommon = (
     {
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpb210.conf
index c6ea066fc48aa0c9dae1d446f9f4d6962d438373..fbafef81b412d1fd5637f60d689effc07ebbdcc5 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpb210.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpb210.conf
@@ -21,7 +21,6 @@ gNBs =
 
     ////////// Physical parameters:
 
-    ssb_SubcarrierOffset                                      = 0;
 
     servingCellConfigCommon = (
     {
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpn300.conf
index fcfe58a3c024e059e0417d927962531f6c16e4c6..38d6ed3c610193880649eb047f283b0265cfd2c6 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpn300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpn300.conf
@@ -21,7 +21,6 @@ gNBs =
 
     ////////// Physical parameters:
 
-    ssb_SubcarrierOffset                                      = 0;
 
     servingCellConfigCommon = (
     {
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpx300.conf
index 2ad9757cb132fa517500d2d746d4c09572ec08c3..b7da7b17f4bd80d52c93652ea07e71b2bb4501bb 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpx300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpx300.conf
@@ -21,7 +21,6 @@ gNBs =
 
     ////////// Physical parameters:
 
-    ssb_SubcarrierOffset                                      = 0;
 
     servingCellConfigCommon = (
     {
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.273PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.273PRB.usrpn300.conf
index 44074f3fd91e18a00bfe60080484594be6014ecf..9f78716bcc20c4e802d6bb5c1a9bb3855035303a 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.273PRB.usrpn300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.273PRB.usrpn300.conf
@@ -21,7 +21,6 @@ gNBs =
 
     ////////// Physical parameters:
 
-    ssb_SubcarrierOffset                                      = 0;
 	
     servingCellConfigCommon = (
     {
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band78.tm1.106PRB.nfapi.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band78.tm1.106PRB.nfapi.conf
index 7ce150506f0da42c6f2f5c67763e1ce347004dd3..1dcef89736833fcad566bdde7fc6bbb62a06d0e5 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band78.tm1.106PRB.nfapi.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band78.tm1.106PRB.nfapi.conf
@@ -21,7 +21,6 @@ gNBs =
 
     ////////// Physical parameters:
 
-    ssb_SubcarrierOffset                                      = 0;
 	
     servingCellConfigCommon = (
     {
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb.conf
index 306e652eaa9b5d1e763b3d0e97867173d03565e1..9a3fe358a54a80e534f5941432c46766aeb4312d 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb.conf
@@ -21,8 +21,6 @@ gNBs =
 
     ////////// Physical parameters:
 
-    ssb_SubcarrierOffset                                      = 31; //0;
-
     servingCellConfigCommon = (
     {
  #spCellConfigCommon
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_24PRB.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_24PRB.conf
index d08c0f14a08ad55c3b0c30daf6388c416ab59cc4..9e1ae24d673fbf59d3dfae94235f22b32b42c029 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_24PRB.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_24PRB.conf
@@ -21,8 +21,6 @@ gNBs =
 
     ////////// Physical parameters:
 
-    ssb_SubcarrierOffset                                      = 31; //0;
-
     servingCellConfigCommon = (
     {
  #spCellConfigCommon
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_n310.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_n310.conf
index e3204db8faeb657aca5ea06d1da289c947266351..9ec28b93e700ece3cbbeca0b722bfdeee0295d48 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_n310.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_n310.conf
@@ -20,8 +20,6 @@ gNBs =
     tr_s_preference     = "local_mac"
 
     ////////// Physical parameters:
-
-    ssb_SubcarrierOffset                                      = 31; //0;
 	
     servingCellConfigCommon = (
     {
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_nsa_n310.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_nsa_n310.conf
index 030dc102267bafc37ce9a97b16d57cad20ae0737..35778ef7059023e9d9e8a0d909453b71c44005a2 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_nsa_n310.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_nsa_n310.conf
@@ -21,7 +21,6 @@ gNBs =
 
     ////////// Physical parameters:
 
-    ssb_SubcarrierOffset                                      = 31; //0;
     pusch_TargetSNRx10                                        = 200;
     pucch_TargetSNRx10                                        = 200;
 
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/cu_gnb.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/cu_gnb.conf
index 6aacd98c7f041c1fd1f853fbf5115350938df4b3..a64a4c6022e76595cd461342895c584890dbcfb9 100644
--- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/cu_gnb.conf
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/cu_gnb.conf
@@ -44,7 +44,6 @@ gNBs =
     local_s_portd   = 2152;
     remote_s_portc  = 500;
     remote_s_portd  = 2152;
-    ssb_SubcarrierOffset                                      = 0;
     min_rxtxtime                                              = 6;
 
      pdcch_ConfigSIB1 = (
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/du_gnb.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/du_gnb.conf
index f95bdf91aee97e2c4c02f8b89db251622bacaf0c..4309c13dd395a172e589e66b4efc469e585fbf04 100644
--- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/du_gnb.conf
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/du_gnb.conf
@@ -36,7 +36,6 @@ gNBs =
 
     ////////// Physical parameters:
 
-    ssb_SubcarrierOffset                                      = 0;
     min_rxtxtime                                              = 6;
 
     pdcch_ConfigSIB1 = (
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.band78.tm1.106PRB.usrpn300.gtp-itti.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.band78.tm1.106PRB.usrpn300.gtp-itti.conf
index f91683897f75619a36907f455703a185ec6f985c..cb90889b52fc48fc07be9543fccc43251e6a443e 100644
--- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.band78.tm1.106PRB.usrpn300.gtp-itti.conf
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.band78.tm1.106PRB.usrpn300.gtp-itti.conf
@@ -36,7 +36,6 @@ gNBs =
 
     ////////// Physical parameters:
 
-    ssb_SubcarrierOffset                                      = 0;
 
     servingCellConfigCommon = (
     {
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf
index e645094e8be9ea2e1db4628a83bc916b550e4f4d..42aa555771283bbf5a12c70ca41273c95efce993 100644
--- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf
@@ -28,8 +28,6 @@ gNBs =
 
     ////////// Physical parameters:
 
-    ssb_SubcarrierOffset                                      = 0;
-    min_rxtxtime                                              = 2;
     do_SRS                                                    = 1;
 
      pdcch_ConfigSIB1 = (
@@ -167,6 +165,64 @@ gNBs =
 
   );
 
+# Dedicated Serving Cell Configuration
+servingCellConfigDedicated = ({
+  # BWP-Downlink
+    # BWP 1 Configuration
+      dl_bwp-Id_1 = 1;
+      dl_bwp1_locationAndBandwidth = 28875; // RBstart=0, L=106 (40 MHz BW)
+      # subcarrierSpacing
+      # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      dl_bwp1_subcarrierSpacing = 1;
+
+    # BWP 2 Configuration
+      dl_bwp-Id_2 = 2;
+      dl_bwp2_locationAndBandwidth = 13750; // RBstart=0, L=51 (20 MHz BW)
+      # subcarrierSpacing
+      # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      dl_bwp2_subcarrierSpacing = 1;
+
+    # BWP 3 Configuration
+      dl_bwp-Id_3 = 3;
+      dl_bwp3_locationAndBandwidth = 6325; // RBstart=0, L=24 (10 MHz BW)
+      # subcarrierSpacing
+      # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      dl_bwp3_subcarrierSpacing = 1;
+
+    firstActiveDownlinkBWP-Id = 1;  #BWP-Id
+    defaultDownlinkBWP-Id     = 1;  #BWP-Id
+
+    # bwp-InactivityTimer                 ENUMERATED {ms2, ms3, ms4, ms5, ms6, ms8, ms10, ms20, ms30,
+    #                                                ms40,ms50, ms60, ms80,ms100, ms200,ms300, ms500,
+    #                                                ms750, ms1280, ms1920, ms2560, spare10, spare9, spare8,
+    #                                                spare7, spare6, spare5, spare4, spare3, spare2, spare1 }
+
+  # UplinkConfig
+    # BWP-Uplink
+      # BWP 1 Configuration
+        ul_bwp-Id_1 = 1;
+        ul_bwp1_locationAndBandwidth = 28875; // RBstart=0, L=106 (40 MHz BW)
+        # subcarrierSpacing
+        # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        ul_bwp1_subcarrierSpacing = 1;
+
+      # BWP 2 Configuration
+        ul_bwp-Id_2 = 2;
+        ul_bwp2_locationAndBandwidth = 13750; // RBstart=0, L=51 (20 MHz BW)
+        # subcarrierSpacing
+        # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        ul_bwp2_subcarrierSpacing = 1;
+
+      # BWP 3 Configuration
+        ul_bwp-Id_3 = 3;
+        ul_bwp3_locationAndBandwidth = 6325; // RBstart=0, L=24 (10 MHz BW)
+        # subcarrierSpacing
+        # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        ul_bwp3_subcarrierSpacing = 1;
+
+      firstActiveUplinkBWP-Id = 1;  #BWP-Id
+  }
+);
 
     # ------- SCTP definitions
     SCTP :
@@ -283,4 +339,7 @@ log_config :
   ngap_log_level                        ="debug";
   f1ap_log_level                        ="debug";
 };
+<<<<<<< HEAD
+=======
 
+>>>>>>> origin/develop
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band66.fr1.106PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band66.fr1.106PRB.usrpn300.conf
index ff64fe718af859c0320bb3d6cbba4124be26f906..6abf2c19cc66459be3751be772079e746202eef8 100644
--- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band66.fr1.106PRB.usrpn300.conf
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band66.fr1.106PRB.usrpn300.conf
@@ -32,9 +32,6 @@ gNBs =
 
     ////////// Physical parameters:
 
-    ssb_SubcarrierOffset                                      = 0;
-    pdsch_AntennaPorts                                        = 1;
-    pusch_AntennaPorts                                        = 1;
     min_rxtxtime                                              = 6;
 
      pdcch_ConfigSIB1 = (
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.2x2.usrpn300.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.2x2.usrpn300.conf
index 2881a77d48f158db98a2cdc710ef415d11829f7c..30be59725586db3ac6df179a5e862de4bcb30021 100644
--- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.2x2.usrpn300.conf
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.2x2.usrpn300.conf
@@ -28,9 +28,9 @@ gNBs =
 
     ////////// Physical parameters:
 
-    ssb_SubcarrierOffset                                      = 0;
     pdsch_AntennaPorts_N1                                     = 2;
     pusch_AntennaPorts                                        = 2;
+    do_CSIRS                                                  = 1;
     do_SRS                                                    = 1;
     ul_prbblacklist                                           = "51,52,53,54"
 
@@ -68,7 +68,7 @@ gNBs =
 # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
         initialDLBWPsubcarrierSpacing                                  = 1;
       #pdcch-ConfigCommon
-        initialDLBWPcontrolResourceSetZero                             = 11;
+        initialDLBWPcontrolResourceSetZero                             = 12;
         initialDLBWPsearchSpaceZero                                    = 0;
 
   #uplinkConfigCommon
@@ -169,6 +169,64 @@ gNBs =
 
   );
 
+# Dedicated Serving Cell Configuration
+servingCellConfigDedicated = ({
+  # BWP-Downlink
+    # BWP 1 Configuration
+      dl_bwp-Id_1 = 1;
+      dl_bwp1_locationAndBandwidth = 28875; // RBstart=0, L=106 (40 MHz BW)
+      # subcarrierSpacing
+      # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      dl_bwp1_subcarrierSpacing = 1;
+
+    # BWP 2 Configuration
+      dl_bwp-Id_2 = 2;
+      dl_bwp2_locationAndBandwidth = 13750; // RBstart=0, L=51 (20 MHz BW)
+      # subcarrierSpacing
+      # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      dl_bwp2_subcarrierSpacing = 1;
+
+    # BWP 3 Configuration
+      dl_bwp-Id_3 = 3;
+      dl_bwp3_locationAndBandwidth = 6325; // RBstart=0, L=24 (10 MHz BW)
+      # subcarrierSpacing
+      # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      dl_bwp3_subcarrierSpacing = 1;
+
+    firstActiveDownlinkBWP-Id = 1;  #BWP-Id
+    defaultDownlinkBWP-Id     = 1;  #BWP-Id
+
+    # bwp-InactivityTimer                 ENUMERATED {ms2, ms3, ms4, ms5, ms6, ms8, ms10, ms20, ms30,
+    #                                                ms40,ms50, ms60, ms80,ms100, ms200,ms300, ms500,
+    #                                                ms750, ms1280, ms1920, ms2560, spare10, spare9, spare8,
+    #                                                spare7, spare6, spare5, spare4, spare3, spare2, spare1 }
+
+  # UplinkConfig
+    # BWP-Uplink
+      # BWP 1 Configuration
+        ul_bwp-Id_1 = 1;
+        ul_bwp1_locationAndBandwidth = 28875; // RBstart=0, L=106 (40 MHz BW)
+        # subcarrierSpacing
+        # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        ul_bwp1_subcarrierSpacing = 1;
+
+      # BWP 2 Configuration
+        ul_bwp-Id_2 = 2;
+        ul_bwp2_locationAndBandwidth = 13750; // RBstart=0, L=51 (20 MHz BW)
+        # subcarrierSpacing
+        # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        ul_bwp2_subcarrierSpacing = 1;
+
+      # BWP 3 Configuration
+        ul_bwp-Id_3 = 3;
+        ul_bwp3_locationAndBandwidth = 6325; // RBstart=0, L=24 (10 MHz BW)
+        # subcarrierSpacing
+        # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        ul_bwp3_subcarrierSpacing = 1;
+
+      firstActiveUplinkBWP-Id = 1;  #BWP-Id
+  }
+);
 
     # ------- SCTP definitions
     SCTP :
@@ -207,6 +265,7 @@ MACRLCs = (
   tr_n_preference             = "local_RRC";
   #pusch_TargetSNRx10         = 150;
   #pucch_TargetSNRx10         = 200;
+  ul_prbblack_SNR_threshold   = 10;
   ulsch_max_frame_inactivity  = 0;
 }
 );
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.4layer.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.4layer.conf
new file mode 100644
index 0000000000000000000000000000000000000000..8ff83b5d023abaf757517e48c1c2c28ab62db92e
--- /dev/null
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.4layer.conf
@@ -0,0 +1,297 @@
+Active_gNBs = ( "gNB-Eurecom-5GNRBox");
+# Asn1_verbosity, choice in: none, info, annoying
+Asn1_verbosity = "none";
+
+gNBs =
+(
+ {
+    ////////// Identification parameters:
+    gNB_ID    =  0xe00;
+    gNB_name  =  "gNB-Eurecom-5GNRBox";
+
+    // Tracking area code, 0x0000 and 0xfffe are reserved values
+    tracking_area_code  =  1;
+    plmn_list = ({
+                  mcc = 208;
+                  mnc = 99;
+                  mnc_length = 2;
+                  snssaiList = (
+                    {
+                      sst = 1;
+                      sd  = 0x1; // 0 false, else true
+                    },
+                    {
+                      sst = 1;
+                      sd  = 0x112233; // 0 false, else true
+                    }
+                  );
+
+                  });
+
+    nr_cellid = 12345678L;
+
+    ////////// Physical parameters:
+
+    pdsch_AntennaPorts_XP = 2;
+    pdsch_AntennaPorts_N1 = 2;
+    pusch_AntennaPorts                                        = 4;
+
+     pdcch_ConfigSIB1 = (
+      {
+        controlResourceSetZero = 12;
+        searchSpaceZero = 0;
+      }
+      );
+
+    servingCellConfigCommon = (
+    {
+ #spCellConfigCommon
+
+      physCellId                                                    = 0;
+
+#  downlinkConfigCommon
+    #frequencyInfoDL
+      # this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP)
+      absoluteFrequencySSB                                             = 641280;
+      dl_frequencyBand                                                 = 78;
+      # this is 3600 MHz
+      dl_absoluteFrequencyPointA                                       = 640008;
+      #scs-SpecificCarrierList
+        dl_offstToCarrier                                              = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        dl_subcarrierSpacing                                           = 1;
+        dl_carrierBandwidth                                            = 106;
+     #initialDownlinkBWP
+      #genericParameters
+        # this is RBstart=27,L=48 (275*(L-1))+RBstart
+        initialDLBWPlocationAndBandwidth                               = 28875; # 6366 12925 12956 28875 12952
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        initialDLBWPsubcarrierSpacing                                   = 1;
+      #pdcch-ConfigCommon
+        initialDLBWPcontrolResourceSetZero                              = 12;
+        initialDLBWPsearchSpaceZero                                     = 0;
+
+  #uplinkConfigCommon
+     #frequencyInfoUL
+      ul_frequencyBand                                              = 78;
+      #scs-SpecificCarrierList
+      ul_offstToCarrier                                             = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      ul_subcarrierSpacing                                          = 1;
+      ul_carrierBandwidth                                           = 106;
+      pMax                                                          = 20;
+     #initialUplinkBWP
+      #genericParameters
+        initialULBWPlocationAndBandwidth                            = 28875;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        initialULBWPsubcarrierSpacing                               = 1;
+      #rach-ConfigCommon
+        #rach-ConfigGeneric
+          prach_ConfigurationIndex                                  = 98;
+#prach_msg1_FDM
+#0 = one, 1=two, 2=four, 3=eight
+          prach_msg1_FDM                                            = 0;
+          prach_msg1_FrequencyStart                                 = 0;
+          zeroCorrelationZoneConfig                                 = 13;
+          preambleReceivedTargetPower                               = -96;
+#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
+          preambleTransMax                                          = 6;
+#powerRampingStep
+# 0=dB0,1=dB2,2=dB4,3=dB6
+        powerRampingStep                                            = 1;
+#ra_ReponseWindow
+#1,2,4,8,10,20,40,80
+        ra_ResponseWindow                                           = 4;
+#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
+#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
+        ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR                = 4;
+#oneHalf (0..15) 4,8,12,16,...60,64
+        ssb_perRACH_OccasionAndCB_PreamblesPerSSB                   = 14;
+#ra_ContentionResolutionTimer
+#(0..7) 8,16,24,32,40,48,56,64
+        ra_ContentionResolutionTimer                                = 7;
+        rsrp_ThresholdSSB                                           = 19;
+#prach-RootSequenceIndex_PR
+#1 = 839, 2 = 139
+        prach_RootSequenceIndex_PR                                  = 2;
+        prach_RootSequenceIndex                                     = 1;
+        # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
+        #
+        msg1_SubcarrierSpacing                                      = 1,
+# restrictedSetConfig
+# 0=unrestricted, 1=restricted type A, 2=restricted type B
+        restrictedSetConfig                                         = 0,
+
+        msg3_DeltaPreamble                                          = 1;
+        p0_NominalWithGrant                                         =-90;
+
+# pucch-ConfigCommon setup :
+# pucchGroupHopping
+# 0 = neither, 1= group hopping, 2=sequence hopping
+        pucchGroupHopping                                           = 0;
+        hoppingId                                                   = 40;
+        p0_nominal                                                  = -90;
+# ssb_PositionsInBurs_BitmapPR
+# 1=short, 2=medium, 3=long
+      ssb_PositionsInBurst_PR                                       = 2;
+      ssb_PositionsInBurst_Bitmap                                   = 1;
+
+# ssb_periodicityServingCell
+# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
+      ssb_periodicityServingCell                                    = 2;
+
+# dmrs_TypeA_position
+# 0 = pos2, 1 = pos3
+      dmrs_TypeA_Position                                           = 0;
+
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      subcarrierSpacing                                             = 1;
+
+
+  #tdd-UL-DL-ConfigurationCommon
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      referenceSubcarrierSpacing                                    = 1;
+      # pattern1
+      # dl_UL_TransmissionPeriodicity
+      # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
+      dl_UL_TransmissionPeriodicity                                 = 6;
+      nrofDownlinkSlots                                             = 7;
+      nrofDownlinkSymbols                                           = 6;
+      nrofUplinkSlots                                               = 2;
+      nrofUplinkSymbols                                             = 4;
+
+      ssPBCH_BlockPower                                             = -25;
+  }
+
+  );
+
+
+    # ------- SCTP definitions
+    SCTP :
+    {
+        # Number of streams to use in input/output
+        SCTP_INSTREAMS  = 2;
+        SCTP_OUTSTREAMS = 2;
+    };
+
+
+    ////////// MME parameters:
+    amf_ip_address      = ( { ipv4       = "192.168.70.132";
+                              ipv6       = "192:168:30::17";
+                              active     = "yes";
+                              preference = "ipv4";
+                            }
+                          );
+
+
+    NETWORK_INTERFACES :
+    {
+        GNB_INTERFACE_NAME_FOR_NG_AMF            = "demo-oai";
+        GNB_IPV4_ADDRESS_FOR_NG_AMF              = "192.168.70.129/24";
+        GNB_INTERFACE_NAME_FOR_NGU               = "demo-oai";
+        GNB_IPV4_ADDRESS_FOR_NGU                 = "192.168.70.129/24";
+        GNB_PORT_FOR_S1U                         = 2152; # Spec 2152
+    };
+
+  }
+);
+
+MACRLCs = (
+    {
+        num_cc                      = 1;
+        tr_s_preference             = "local_L1";
+        tr_n_preference             = "local_RRC";
+        pusch_TargetSNRx10          = 150;
+        pucch_TargetSNRx10          = 200;
+    }
+);
+
+L1s = (
+    {
+	num_cc = 1;
+	tr_n_preference = "local_mac";
+	pusch_proc_threads = 8;
+	prach_dtx_threshold = 120;
+    pucch0_dtx_threshold = 150;
+    ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
+    }
+);
+
+RUs = (
+    {
+       local_rf       = "yes"
+         nb_tx          = 4
+         nb_rx          = 4
+         att_tx         = 0
+         att_rx         = 0;
+         bands          = [78];
+         max_pdschReferenceSignalPower = -27;
+         max_rxgain                    = 114;
+         eNB_instances  = [0];
+         #beamforming 1x4 matrix:
+         bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff];
+         clock_src = "internal";
+    }
+);
+
+THREAD_STRUCT = (
+  {
+    #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+    parallel_config    = "PARALLEL_SINGLE_THREAD";
+    #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+    worker_config      = "WORKER_ENABLE";
+  }
+);
+
+rfsimulator :
+{
+    serveraddr = "server";
+    serverport = "4043";
+    options = (); #("saviq"); or/and "chanmod"
+    modelname = "AWGN";
+    IQfile = "/tmp/rfsimulator.iqs";
+};
+
+security = {
+  # preferred ciphering algorithms
+  # the first one of the list that an UE supports in chosen
+  # valid values: nea0, nea1, nea2, nea3
+  ciphering_algorithms = ( "nea0" );
+
+  # preferred integrity algorithms
+  # the first one of the list that an UE supports in chosen
+  # valid values: nia0, nia1, nia2, nia3
+  integrity_algorithms = ( "nia2", "nia0" );
+
+  # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
+  # what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
+  drb_ciphering = "yes";
+  drb_integrity = "no";
+};
+
+     log_config :
+     {
+       global_log_level                      ="info";
+       global_log_verbosity                  ="medium";
+       hw_log_level                          ="info";
+       hw_log_verbosity                      ="medium";
+       phy_log_level                         ="info";
+       phy_log_verbosity                     ="medium";
+       mac_log_level                         ="info";
+       mac_log_verbosity                     ="high";
+       rlc_log_level                         ="info";
+       rlc_log_verbosity                     ="medium";
+       pdcp_log_level                        ="info";
+       pdcp_log_verbosity                    ="medium";
+       rrc_log_level                         ="info";
+       rrc_log_verbosity                     ="medium";
+       ngap_log_level                         ="info";
+       ngap_log_verbosity                     ="medium";
+    };
+
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf
index 451079edf1833467252b99f7a109cbbc984bf399..c11c6952fa2fc6b3655629fd4210daab7224035c 100644
--- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf
@@ -28,8 +28,9 @@ gNBs =
 
     ////////// Physical parameters:
 
-    ssb_SubcarrierOffset                                      = 0;
     min_rxtxtime                                              = 2;
+    do_CSIRS                                                  = 1;
+    do_SRS                                                    = 1;
 
      pdcch_ConfigSIB1 = (
       {
@@ -167,6 +168,64 @@ gNBs =
 
   );
 
+# Dedicated Serving Cell Configuration
+servingCellConfigDedicated = ({
+  # BWP-Downlink
+    # BWP 1 Configuration
+      dl_bwp-Id_1 = 1;
+      dl_bwp1_locationAndBandwidth = 28875; // RBstart=0, L=106 (40 MHz BW)
+      # subcarrierSpacing
+      # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      dl_bwp1_subcarrierSpacing = 1;
+
+    # BWP 2 Configuration
+      dl_bwp-Id_2 = 2;
+      dl_bwp2_locationAndBandwidth = 13750; // RBstart=0, L=51 (20 MHz BW)
+      # subcarrierSpacing
+      # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      dl_bwp2_subcarrierSpacing = 1;
+
+    # BWP 3 Configuration
+      dl_bwp-Id_3 = 3;
+      dl_bwp3_locationAndBandwidth = 6325; // RBstart=0, L=24 (10 MHz BW)
+      # subcarrierSpacing
+      # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      dl_bwp3_subcarrierSpacing = 1;
+
+    firstActiveDownlinkBWP-Id = 1;  #BWP-Id
+    defaultDownlinkBWP-Id     = 1;  #BWP-Id
+
+    # bwp-InactivityTimer                 ENUMERATED {ms2, ms3, ms4, ms5, ms6, ms8, ms10, ms20, ms30,
+    #                                                ms40,ms50, ms60, ms80,ms100, ms200,ms300, ms500,
+    #                                                ms750, ms1280, ms1920, ms2560, spare10, spare9, spare8,
+    #                                                spare7, spare6, spare5, spare4, spare3, spare2, spare1 }
+
+  # UplinkConfig
+    # BWP-Uplink
+      # BWP 1 Configuration
+        ul_bwp-Id_1 = 1;
+        ul_bwp1_locationAndBandwidth = 28875; // RBstart=0, L=106 (40 MHz BW)
+        # subcarrierSpacing
+        # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        ul_bwp1_subcarrierSpacing = 1;
+
+      # BWP 2 Configuration
+        ul_bwp-Id_2 = 2;
+        ul_bwp2_locationAndBandwidth = 13750; // RBstart=0, L=51 (20 MHz BW)
+        # subcarrierSpacing
+        # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        ul_bwp2_subcarrierSpacing = 1;
+
+      # BWP 3 Configuration
+        ul_bwp-Id_3 = 3;
+        ul_bwp3_locationAndBandwidth = 6325; // RBstart=0, L=24 (10 MHz BW)
+        # subcarrierSpacing
+        # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        ul_bwp3_subcarrierSpacing = 1;
+
+      firstActiveUplinkBWP-Id = 1;  #BWP-Id
+  }
+);
 
     # ------- SCTP definitions
     SCTP :
@@ -205,13 +264,14 @@ MACRLCs = (
   tr_n_preference             = "local_RRC";
   pusch_TargetSNRx10          = 150;
   pucch_TargetSNRx10          = 200;
+  ul_prbblack_SNR_threshold   = 10;
   ulsch_max_frame_inactivity  = 0;
 }
 );
 
 prs_config = (
 {
-   NumPRSResources = 2;
+   NumPRSResources = 1;
    PRSResourceSetPeriod = [20, 2];
    SymbolStart = [7, 7];
    NumPRSSymbols = [6, 6];
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.sabox.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.sabox.conf
index 8ca0c0887692f7c0a0747556334c245cfc1e4cab..6719a5534d43e8a522760c81119d954343418362 100644
--- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.sabox.conf
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.sabox.conf
@@ -30,7 +30,6 @@ gNBs =
 
     ////////// Physical parameters:
 
-    ssb_SubcarrierOffset                                      = 0;
 
      pdcch_ConfigSIB1 = (
       {
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.162PRB.2x2.usrpn300.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.162PRB.2x2.usrpn300.conf
index b8d71015c178345a54b5a684828fcace5bd29627..5f8bf4523217874bad01d9c49610af90a0aa3748 100644
--- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.162PRB.2x2.usrpn300.conf
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.162PRB.2x2.usrpn300.conf
@@ -21,17 +21,17 @@ gNBs =
                       sd  = 0x1; // 0 false, else true
                     }
                   );
-
                   });
 
     nr_cellid = 12345678L;
 
     ////////// Physical parameters:
 
-    ssb_SubcarrierOffset                                      = 0;
-    pdsch_AntennaPorts_N1                                     = 1;
-    pusch_AntennaPorts                                        = 2;
-    ul_prbblacklist                                           = "79,80,81,82"
+    pdsch_AntennaPorts_XP = 1;
+    pusch_AntennaPorts    = 2;
+    do_CSIRS              = 0;
+    ul_prbblacklist       = "79,80,81,82"
+
     pdcch_ConfigSIB1 = (
       {
         controlResourceSetZero = 12;
@@ -66,21 +66,8 @@ gNBs =
 # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
         initialDLBWPsubcarrierSpacing                                           = 1;
       #pdcch-ConfigCommon
-        initialDLBWPcontrolResourceSetZero                                      = 11;
+        initialDLBWPcontrolResourceSetZero                                      = 12;
         initialDLBWPsearchSpaceZero                                             = 10;
-      #pdsch-ConfigCommon
-        #pdschTimeDomainAllocationList (up to 16 entries)
-             initialDLBWPk0_0                    = 0;
-             #initialULBWPmappingType
-	          #0=typeA,1=typeB
-             initialDLBWPmappingType_0           = 0;
-             #this is SS=1,L=13
-             initialDLBWPstartSymbolAndLength_0  = 40;
-
-             initialDLBWPk0_1                    = 0;
-             initialDLBWPmappingType_1           = 0;
-             #this is SS=1,L=5
-             initialDLBWPstartSymbolAndLength_1  = 57;
 
   #uplinkConfigCommon
      #frequencyInfoUL
@@ -135,22 +122,6 @@ gNBs =
 # 0=unrestricted, 1=restricted type A, 2=restricted type B
         restrictedSetConfig                                         = 0,
 
-      # pusch-ConfigCommon (up to 16 elements)
-        initialULBWPk2_0                      = 2;
-        initialULBWPmappingType_0             = 1
-        # this is SS=2 L=13
-        initialULBWPstartSymbolAndLength_0    = 41;
-
-        initialULBWPk2_1                      = 2;
-        initialULBWPmappingType_1             = 1;
-        # this is SS=0 L=4
-        initialULBWPstartSymbolAndLength_1    = 52;
-
-        initialULBWPk2_2                      = 7;
-        initialULBWPmappingType_2             = 1;
-        # this is SS=10 L=4
-        initialULBWPstartSymbolAndLength_2    = 52;
-
         msg3_DeltaPreamble                                          = 1;
         p0_NominalWithGrant                                         =-90;
 
@@ -243,16 +214,16 @@ L1s = (
   num_cc = 1;
   tr_n_preference = "local_mac";
   prach_dtx_threshold = 120;
-  pucch0_dtx_threshold = 100;
+  pucch0_dtx_threshold = 80;
 }
 );
 
 RUs = (
 {
   local_rf       = "yes"
-  nb_tx          = 2
-  nb_rx          = 2
-  att_tx         = 0
+  nb_tx          = 2;
+  nb_rx          = 2;
+  att_tx         = 0;
   att_rx         = 0;
   bands          = [78];
   max_pdschReferenceSignalPower = -27;
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.217PRB.2x2.usrpn300.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.217PRB.2x2.usrpn300.conf
new file mode 100644
index 0000000000000000000000000000000000000000..1f1f64ce3ffde83f7515b3bb247949108ca3c3f5
--- /dev/null
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.217PRB.2x2.usrpn300.conf
@@ -0,0 +1,320 @@
+Active_gNBs = ( "gNB-OAI");
+# Asn1_verbosity, choice in: none, info, annoying
+Asn1_verbosity = "none";
+
+gNBs =
+(
+ {
+    ////////// Identification parameters:
+    gNB_ID    =  0xe00;
+    gNB_name  =  "gNB-OAI";
+
+    // Tracking area code, 0x0000 and 0xfffe are reserved values
+    tracking_area_code  =  1;
+    plmn_list = ({
+                  mcc = 208;
+                  mnc = 99;
+                  mnc_length = 2;
+                  snssaiList = (
+                    {
+                      sst = 1;
+                      sd  = 0x1; // 0 false, else true
+                    }
+                  );
+                  });
+
+    nr_cellid = 12345678L;
+
+    ////////// Physical parameters:
+
+    pdsch_AntennaPorts_XP = 1;
+    pusch_AntennaPorts    = 2;
+    do_CSIRS              = 0;
+    ul_prbblacklist       = "107,108,109,110"
+
+    pdcch_ConfigSIB1 = (
+      {
+        controlResourceSetZero = 12;
+        searchSpaceZero = 10;
+      }
+    );
+
+    servingCellConfigCommon = (
+    {
+ #spCellConfigCommon
+
+      physCellId                                                    = 0;
+
+#  downlinkConfigCommon
+    #frequencyInfoDL
+      # this is 3300.24 + 106*12*30e3 = 3338.40 MHz (5G NR GSCN: 7734)
+      absoluteFrequencySSB                                          = 622560;
+      dl_frequencyBand                                              = 78;
+      # this is 3300.24 MHz
+      dl_absoluteFrequencyPointA                                    = 620016;
+      #scs-SpecificCarrierList
+        dl_offstToCarrier                                           = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        dl_subcarrierSpacing                                        = 1;
+        dl_carrierBandwidth                                         = 217;
+     #initialDownlinkBWP
+      #genericParameters
+       # this is RBstart=0,L=162 (275*(275-L+1))+(274-RBstart))
+       initialDLBWPlocationAndBandwidth                             = 31624;
+       #
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        initialDLBWPsubcarrierSpacing                               = 1;
+      #pdcch-ConfigCommon
+        initialDLBWPcontrolResourceSetZero                          = 12;
+        initialDLBWPsearchSpaceZero                                 = 10;
+
+  #uplinkConfigCommon
+     #frequencyInfoUL
+      ul_frequencyBand                                              = 78;
+      #scs-SpecificCarrierList
+      ul_offstToCarrier                                             = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      ul_subcarrierSpacing                                          = 1;
+      ul_carrierBandwidth                                           = 217;
+      pMax                                                          = 20;
+     #initialUplinkBWP
+      #genericParameters
+        initialULBWPlocationAndBandwidth                            = 31624;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        initialULBWPsubcarrierSpacing                               = 1;
+      #rach-ConfigCommon
+        #rach-ConfigGeneric
+          prach_ConfigurationIndex                                  = 98;
+#prach_msg1_FDM
+#0 = one, 1=two, 2=four, 3=eight
+          prach_msg1_FDM                                            = 0;
+          prach_msg1_FrequencyStart                                 = 0;
+          zeroCorrelationZoneConfig                                 = 12;
+          preambleReceivedTargetPower                               = -96;
+#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
+          preambleTransMax                                          = 6;
+#powerRampingStep
+# 0=dB0,1=dB2,2=dB4,3=dB6
+        powerRampingStep                                            = 1;
+#ra_ReponseWindow
+#1,2,4,8,10,20,40,80
+        ra_ResponseWindow                                           = 4;
+#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
+#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
+        ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR                = 3;
+#oneHalf (0..15) 4,8,12,16,...60,64
+        ssb_perRACH_OccasionAndCB_PreamblesPerSSB                   = 15;
+#ra_ContentionResolutionTimer
+#(0..7) 8,16,24,32,40,48,56,64
+        ra_ContentionResolutionTimer                                = 7;
+        rsrp_ThresholdSSB                                           = 19;
+#prach-RootSequenceIndex_PR
+#1 = 839, 2 = 139
+        prach_RootSequenceIndex_PR                                  = 2;
+        prach_RootSequenceIndex                                     = 1;
+        # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
+        #
+        msg1_SubcarrierSpacing                                      = 1,
+# restrictedSetConfig
+# 0=unrestricted, 1=restricted type A, 2=restricted type B
+        restrictedSetConfig                                         = 0,
+
+        msg3_DeltaPreamble                                          = 1;
+        p0_NominalWithGrant                                         =-90;
+
+# pucch-ConfigCommon setup :
+# pucchGroupHopping
+# 0 = neither, 1= group hopping, 2=sequence hopping
+        pucchGroupHopping                                           = 0;
+        hoppingId                                                   = 40;
+        p0_nominal                                                  = -70;
+# ssb_PositionsInBurs_BitmapPR
+# 1=short, 2=medium, 3=long
+      ssb_PositionsInBurst_PR                                       = 2;
+      ssb_PositionsInBurst_Bitmap                                   = 1;
+
+# ssb_periodicityServingCell
+# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
+      ssb_periodicityServingCell                                    = 2;
+
+# dmrs_TypeA_position
+# 0 = pos2, 1 = pos3
+      dmrs_TypeA_Position                                           = 0;
+
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      subcarrierSpacing                                             = 1;
+
+
+  #tdd-UL-DL-ConfigurationCommon
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      referenceSubcarrierSpacing                                    = 1;
+      # pattern1
+      # dl_UL_TransmissionPeriodicity
+      # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
+      dl_UL_TransmissionPeriodicity                                 = 6;
+      nrofDownlinkSlots                                             = 7;
+      nrofDownlinkSymbols                                           = 6;
+      nrofUplinkSlots                                               = 2;
+      nrofUplinkSymbols                                             = 4;
+
+  ssPBCH_BlockPower                                                 = -25;
+  }
+
+  );
+
+
+# Dedicated Serving Cell Configuration
+servingCellConfigDedicated = ({
+  # BWP-Downlink
+    # BWP 1 Configuration
+      dl_bwp-Id_1 = 1;
+      dl_bwp1_locationAndBandwidth = 16499; // RBstart=0, L=217 (80 MHz BW)
+      # subcarrierSpacing
+      # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      dl_bwp1_subcarrierSpacing = 1;
+
+    firstActiveDownlinkBWP-Id = 1;  #BWP-Id
+    defaultDownlinkBWP-Id     = 1;  #BWP-Id
+
+    # bwp-InactivityTimer                 ENUMERATED {ms2, ms3, ms4, ms5, ms6, ms8, ms10, ms20, ms30,
+    #                                                ms40,ms50, ms60, ms80,ms100, ms200,ms300, ms500,
+    #                                                ms750, ms1280, ms1920, ms2560, spare10, spare9, spare8,
+    #                                                spare7, spare6, spare5, spare4, spare3, spare2, spare1 }
+
+  # UplinkConfig
+    # BWP-Uplink
+      # BWP 1 Configuration
+        ul_bwp-Id_1 = 1;
+        ul_bwp1_locationAndBandwidth = 16499; // RBstart=0, L=217 (80 MHz BW)
+        # subcarrierSpacing
+        # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        ul_bwp1_subcarrierSpacing = 1;
+
+      firstActiveUplinkBWP-Id = 1;  #BWP-Id
+  }
+);
+
+
+
+    # ------- SCTP definitions
+    SCTP :
+    {
+        # Number of streams to use in input/output
+        SCTP_INSTREAMS  = 2;
+        SCTP_OUTSTREAMS = 2;
+    };
+
+
+    ////////// AMF parameters:
+    amf_ip_address      = ( { ipv4       = "192.168.70.132";
+                              ipv6       = "192:168:30::17";
+                              active     = "yes";
+                              preference = "ipv4";
+                            }
+                          );
+
+
+    NETWORK_INTERFACES :
+    {
+        GNB_INTERFACE_NAME_FOR_NG_AMF            = "demo-oai";
+        GNB_IPV4_ADDRESS_FOR_NG_AMF              = "192.168.70.129/24";
+        GNB_INTERFACE_NAME_FOR_NGU               = "demo-oai";
+        GNB_IPV4_ADDRESS_FOR_NGU                 = "192.168.70.129/24";
+        GNB_PORT_FOR_S1U                         = 2152; # Spec 2152
+    };
+
+  }
+);
+
+MACRLCs = (
+{
+  num_cc                      = 1;
+  tr_s_preference             = "local_L1";
+  tr_n_preference             = "local_RRC";
+  pusch_TargetSNRx10          = 150;
+  pucch_TargetSNRx10          = 200;
+  pusch_FailureThres          = 1000;
+  ulsch_max_frame_inactivity  = 0;
+}
+);
+
+L1s = (
+{
+  num_cc = 1;
+  tr_n_preference = "local_mac";
+  prach_dtx_threshold = 120;
+  pucch0_dtx_threshold = 80;
+}
+);
+
+RUs = (
+{
+  local_rf       = "yes"
+  nb_tx          = 2;
+  nb_rx          = 2;
+  att_tx         = 0;
+  att_rx         = 0;
+  bands          = [78];
+  max_pdschReferenceSignalPower = -27;
+  max_rxgain                    = 75;
+  eNB_instances  = [0];
+  ##beamforming 1x2 matrix: 1 layer x 2 antennas
+  bf_weights = [0x00007fff, 0x0000];
+  #clock_src = "internal";
+  sdr_addrs = "mgmt_addr=192.168.10.2,addr=192.168.10.2,clock_source=internal,time_source=internal"
+}
+);
+
+THREAD_STRUCT = (
+{
+  #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+  parallel_config    = "PARALLEL_SINGLE_THREAD";
+  #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+  worker_config      = "WORKER_ENABLE";
+}
+);
+
+rfsimulator :
+{
+  serveraddr = "server";
+  serverport = "4043";
+  options = (); #("saviq"); or/and "chanmod"
+  modelname = "AWGN";
+  IQfile = "/tmp/rfsimulator.iqs";
+};
+
+security = {
+  # preferred ciphering algorithms
+  # the first one of the list that an UE supports in chosen
+  # valid values: nea0, nea1, nea2, nea3
+  ciphering_algorithms = ( "nea0" );
+
+  # preferred integrity algorithms
+  # the first one of the list that an UE supports in chosen
+  # valid values: nia0, nia1, nia2, nia3
+  integrity_algorithms = ( "nia2", "nia0" );
+
+  # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
+  # what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
+  drb_ciphering = "yes";
+  drb_integrity = "no";
+};
+
+log_config :
+{
+  global_log_level                      ="info";
+  hw_log_level                          ="info";
+  phy_log_level                         ="info";
+  mac_log_level                         ="info";
+  rlc_log_level                         ="info";
+  pdcp_log_level                        ="info";
+  rrc_log_level                         ="info";
+  ngap_log_level                        ="debug";
+  f1ap_log_level                        ="debug";
+};
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.24PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.24PRB.usrpb210.conf
index bd3076a014cc9d75098288ca4c0cca05cb8b0d29..ad1471339a249a39b5308b122f7b864a7b4db5c3 100644
--- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.24PRB.usrpb210.conf
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.24PRB.usrpb210.conf
@@ -32,9 +32,6 @@ gNBs =
 
     ////////// Physical parameters:
 
-    ssb_SubcarrierOffset                                      = 0;
-    pdsch_AntennaPorts                                        = 1;
-    pusch_AntennaPorts                                        = 1;
     sib1_tda                                                  = 15;
     min_rxtxtime = 6;
 
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.2x2.usrpn300.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.2x2.usrpn300.conf
new file mode 100644
index 0000000000000000000000000000000000000000..24090bef85b1fcb305d3ebedbfac4c18276792b4
--- /dev/null
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.2x2.usrpn300.conf
@@ -0,0 +1,320 @@
+Active_gNBs = ( "gNB-OAI");
+# Asn1_verbosity, choice in: none, info, annoying
+Asn1_verbosity = "none";
+
+gNBs =
+(
+ {
+    ////////// Identification parameters:
+    gNB_ID    =  0xe00;
+    gNB_name  =  "gNB-OAI";
+
+    // Tracking area code, 0x0000 and 0xfffe are reserved values
+    tracking_area_code  =  1;
+    plmn_list = ({
+                  mcc = 208;
+                  mnc = 99;
+                  mnc_length = 2;
+                  snssaiList = (
+                    {
+                      sst = 1;
+                      sd  = 0x1; // 0 false, else true
+                    }
+                  );
+                  });
+
+    nr_cellid = 12345678L;
+
+    ////////// Physical parameters:
+
+    pdsch_AntennaPorts_XP = 1;
+    pusch_AntennaPorts    = 2;
+    do_CSIRS              = 0;
+    ul_prbblacklist       = "135,136,137,138"
+
+    pdcch_ConfigSIB1 = (
+      {
+        controlResourceSetZero = 12;
+        searchSpaceZero = 10;
+      }
+    );
+
+    servingCellConfigCommon = (
+    {
+ #spCellConfigCommon
+
+      physCellId                                                    = 0;
+
+#  downlinkConfigCommon
+    #frequencyInfoDL
+      # this is 3300.24 + 134*12*30e3 = 3348.48 MHz (5G NR GSCN: 7741)
+      absoluteFrequencySSB                                          = 623232;
+      dl_frequencyBand                                              = 78;
+      # this is 3300.24 MHz
+      dl_absoluteFrequencyPointA                                    = 620016;
+      #scs-SpecificCarrierList
+        dl_offstToCarrier                                           = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        dl_subcarrierSpacing                                        = 1;
+        dl_carrierBandwidth                                         = 273;
+     #initialDownlinkBWP
+      #genericParameters
+       # this is RBstart=0,L=162 (275*(275-L+1))+(274-RBstart))
+       initialDLBWPlocationAndBandwidth                             = 31624;
+       #
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        initialDLBWPsubcarrierSpacing                               = 1;
+      #pdcch-ConfigCommon
+        initialDLBWPcontrolResourceSetZero                          = 12;
+        initialDLBWPsearchSpaceZero                                 = 10;
+
+  #uplinkConfigCommon
+     #frequencyInfoUL
+      ul_frequencyBand                                              = 78;
+      #scs-SpecificCarrierList
+      ul_offstToCarrier                                             = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      ul_subcarrierSpacing                                          = 1;
+      ul_carrierBandwidth                                           = 273;
+      pMax                                                          = 20;
+     #initialUplinkBWP
+      #genericParameters
+        initialULBWPlocationAndBandwidth                            = 31624;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        initialULBWPsubcarrierSpacing                               = 1;
+      #rach-ConfigCommon
+        #rach-ConfigGeneric
+          prach_ConfigurationIndex                                  = 98;
+#prach_msg1_FDM
+#0 = one, 1=two, 2=four, 3=eight
+          prach_msg1_FDM                                            = 0;
+          prach_msg1_FrequencyStart                                 = 0;
+          zeroCorrelationZoneConfig                                 = 12;
+          preambleReceivedTargetPower                               = -90;
+#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
+          preambleTransMax                                          = 6;
+#powerRampingStep
+# 0=dB0,1=dB2,2=dB4,3=dB6
+        powerRampingStep                                            = 1;
+#ra_ReponseWindow
+#1,2,4,8,10,20,40,80
+        ra_ResponseWindow                                           = 4;
+#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
+#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
+        ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR                = 3;
+#oneHalf (0..15) 4,8,12,16,...60,64
+        ssb_perRACH_OccasionAndCB_PreamblesPerSSB                   = 15;
+#ra_ContentionResolutionTimer
+#(0..7) 8,16,24,32,40,48,56,64
+        ra_ContentionResolutionTimer                                = 7;
+        rsrp_ThresholdSSB                                           = 19;
+#prach-RootSequenceIndex_PR
+#1 = 839, 2 = 139
+        prach_RootSequenceIndex_PR                                  = 2;
+        prach_RootSequenceIndex                                     = 1;
+        # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
+        #
+        msg1_SubcarrierSpacing                                      = 1,
+# restrictedSetConfig
+# 0=unrestricted, 1=restricted type A, 2=restricted type B
+        restrictedSetConfig                                         = 0,
+
+        msg3_DeltaPreamble                                          = 1;
+        p0_NominalWithGrant                                         =-90;
+
+# pucch-ConfigCommon setup :
+# pucchGroupHopping
+# 0 = neither, 1= group hopping, 2=sequence hopping
+        pucchGroupHopping                                           = 0;
+        hoppingId                                                   = 40;
+        p0_nominal                                                  = -70;
+# ssb_PositionsInBurs_BitmapPR
+# 1=short, 2=medium, 3=long
+      ssb_PositionsInBurst_PR                                       = 2;
+      ssb_PositionsInBurst_Bitmap                                   = 1;
+
+# ssb_periodicityServingCell
+# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
+      ssb_periodicityServingCell                                    = 2;
+
+# dmrs_TypeA_position
+# 0 = pos2, 1 = pos3
+      dmrs_TypeA_Position                                           = 0;
+
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      subcarrierSpacing                                             = 1;
+
+
+  #tdd-UL-DL-ConfigurationCommon
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      referenceSubcarrierSpacing                                    = 1;
+      # pattern1
+      # dl_UL_TransmissionPeriodicity
+      # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
+      dl_UL_TransmissionPeriodicity                                 = 6;
+      nrofDownlinkSlots                                             = 7;
+      nrofDownlinkSymbols                                           = 6;
+      nrofUplinkSlots                                               = 2;
+      nrofUplinkSymbols                                             = 4;
+
+  ssPBCH_BlockPower                                                 = -25;
+  }
+
+  );
+
+
+# Dedicated Serving Cell Configuration
+servingCellConfigDedicated = ({
+  # BWP-Downlink
+    # BWP 1 Configuration
+      dl_bwp-Id_1 = 1;
+      dl_bwp1_locationAndBandwidth = 1099; // RBstart=0, L=273 (100 MHz BW)
+      # subcarrierSpacing
+      # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      dl_bwp1_subcarrierSpacing = 1;
+
+    firstActiveDownlinkBWP-Id = 1;  #BWP-Id
+    defaultDownlinkBWP-Id     = 1;  #BWP-Id
+
+    # bwp-InactivityTimer                 ENUMERATED {ms2, ms3, ms4, ms5, ms6, ms8, ms10, ms20, ms30,
+    #                                                ms40,ms50, ms60, ms80,ms100, ms200,ms300, ms500,
+    #                                                ms750, ms1280, ms1920, ms2560, spare10, spare9, spare8,
+    #                                                spare7, spare6, spare5, spare4, spare3, spare2, spare1 }
+
+  # UplinkConfig
+    # BWP-Uplink
+      # BWP 1 Configuration
+        ul_bwp-Id_1 = 1;
+        ul_bwp1_locationAndBandwidth = 1099; // RBstart=0, L=273 (100 MHz BW)
+        # subcarrierSpacing
+        # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        ul_bwp1_subcarrierSpacing = 1;
+
+      firstActiveUplinkBWP-Id = 1;  #BWP-Id
+  }
+);
+
+
+
+    # ------- SCTP definitions
+    SCTP :
+    {
+        # Number of streams to use in input/output
+        SCTP_INSTREAMS  = 2;
+        SCTP_OUTSTREAMS = 2;
+    };
+
+
+    ////////// AMF parameters:
+    amf_ip_address      = ( { ipv4       = "192.168.70.132";
+                              ipv6       = "192:168:30::17";
+                              active     = "yes";
+                              preference = "ipv4";
+                            }
+                          );
+
+
+    NETWORK_INTERFACES :
+    {
+        GNB_INTERFACE_NAME_FOR_NG_AMF            = "demo-oai";
+        GNB_IPV4_ADDRESS_FOR_NG_AMF              = "192.168.70.129/24";
+        GNB_INTERFACE_NAME_FOR_NGU               = "demo-oai";
+        GNB_IPV4_ADDRESS_FOR_NGU                 = "192.168.70.129/24";
+        GNB_PORT_FOR_S1U                         = 2152; # Spec 2152
+    };
+
+  }
+);
+
+MACRLCs = (
+{
+  num_cc                      = 1;
+  tr_s_preference             = "local_L1";
+  tr_n_preference             = "local_RRC";
+  pusch_TargetSNRx10          = 150;
+  pucch_TargetSNRx10          = 200;
+  pusch_FailureThres          = 1000;
+  ulsch_max_frame_inactivity  = 0;
+}
+);
+
+L1s = (
+{
+  num_cc = 1;
+  tr_n_preference = "local_mac";
+  prach_dtx_threshold = 120;
+  pucch0_dtx_threshold = 80;
+}
+);
+
+RUs = (
+{
+  local_rf       = "yes"
+  nb_tx          = 2;
+  nb_rx          = 2;
+  att_tx         = 0;
+  att_rx         = 0;
+  bands          = [78];
+  max_pdschReferenceSignalPower = -27;
+  max_rxgain                    = 75;
+  eNB_instances  = [0];
+  ##beamforming 1x2 matrix: 1 layer x 2 antennas
+  bf_weights = [0x00007fff, 0x0000];
+  #clock_src = "internal";
+  sdr_addrs = "mgmt_addr=192.168.10.2,addr=192.168.10.2,clock_source=internal,time_source=internal"
+}
+);
+
+THREAD_STRUCT = (
+{
+  #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+  parallel_config    = "PARALLEL_SINGLE_THREAD";
+  #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+  worker_config      = "WORKER_ENABLE";
+}
+);
+
+rfsimulator :
+{
+  serveraddr = "server";
+  serverport = "4043";
+  options = (); #("saviq"); or/and "chanmod"
+  modelname = "AWGN";
+  IQfile = "/tmp/rfsimulator.iqs";
+};
+
+security = {
+  # preferred ciphering algorithms
+  # the first one of the list that an UE supports in chosen
+  # valid values: nea0, nea1, nea2, nea3
+  ciphering_algorithms = ( "nea0" );
+
+  # preferred integrity algorithms
+  # the first one of the list that an UE supports in chosen
+  # valid values: nia0, nia1, nia2, nia3
+  integrity_algorithms = ( "nia2", "nia0" );
+
+  # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
+  # what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
+  drb_ciphering = "yes";
+  drb_integrity = "no";
+};
+
+log_config :
+{
+  global_log_level                      ="info";
+  hw_log_level                          ="info";
+  phy_log_level                         ="info";
+  mac_log_level                         ="info";
+  rlc_log_level                         ="info";
+  pdcp_log_level                        ="info";
+  rrc_log_level                         ="info";
+  ngap_log_level                        ="debug";
+  f1ap_log_level                        ="debug";
+};
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue_nr_prs.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue_nr_prs.conf
index 044f5c6feb3eca108898209f81bbdebb066a314a..c94bb292a2d1af29439b0444b950ba4777341ab1 100644
--- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue_nr_prs.conf
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue_nr_prs.conf
@@ -5,18 +5,18 @@ PRSs =
     prs_config0 = (
     {
       gNB_id = 0;
-      NumPRSResources = 2;
-      PRSResourceSetPeriod = [20, 5];
-      SymbolStart = [7, 8];
-      NumPRSSymbols = [5, 5];
+      NumPRSResources = 1;
+      PRSResourceSetPeriod = [20, 2];
+      SymbolStart = [7, 7];
+      NumPRSSymbols = [6, 6];
       NumRB = 106;
       RBOffset = 0;
       CombSize = 4;
       REOffset = [0, 1];
-      PRSResourceOffset = [0, 1];
-      PRSResourceRepetition = 1;
+      PRSResourceOffset = [0, 0];
+      PRSResourceRepetition = 2;
       PRSResourceTimeGap = 1;
-      NPRS_ID = [0, 5];
+      NPRS_ID = [10, 5];
       MutingPattern1 = [];
       MutingPattern2 = [];
       MutingBitRepetition = 1;
diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c
index 49f7db2867334cfb0d6c26d053e93a789958fc5f..3d62d5c19ad5928afcee0719f71c23c77486bb98 100644
--- a/targets/RT/USER/lte-enb.c
+++ b/targets/RT/USER/lte-enb.c
@@ -231,9 +231,9 @@ static inline int rxtx(PHY_VARS_eNB *eNB,
     dlsch_ue_select_tbl_in_use = !dlsch_ue_select_tbl_in_use;
     // L2-emulator can work only one eNB.
     //      memcpy(&pre_scd_eNB_UE_stats,&RC.mac[ru->eNB_list[0]->Mod_id]->UE_info.eNB_UE_stats, sizeof(eNB_UE_STATS)*MAX_NUM_CCs*NUMBER_OF_UE_MAX);
-    //      memcpy(&pre_scd_activeUE, &RC.mac[ru->eNB_list[0]->Mod_id]->UE_info.active, sizeof(boolean_t)*NUMBER_OF_UE_MAX);
+    //      memcpy(&pre_scd_activeUE, &RC.mac[ru->eNB_list[0]->Mod_id]->UE_info.active, sizeof(bool)*NUMBER_OF_UE_MAX);
     memcpy(&pre_scd_eNB_UE_stats,&RC.mac[0]->UE_info.eNB_UE_stats, sizeof(eNB_UE_STATS)*MAX_NUM_CCs*NUMBER_OF_UE_MAX);
-    memcpy(&pre_scd_activeUE, &RC.mac[0]->UE_info.active, sizeof(boolean_t)*NUMBER_OF_UE_MAX);
+    memcpy(&pre_scd_activeUE, &RC.mac[0]->UE_info.active, sizeof(bool)*NUMBER_OF_UE_MAX);
     AssertFatal((ret= pthread_mutex_lock(&ru->proc.mutex_pre_scd))==0,"[eNB] error locking proc mutex for eNB pre scd, return %d\n",ret);
     ru->proc.instance_pre_scd++;
 
@@ -1135,7 +1135,7 @@ void init_transport(PHY_VARS_eNB *eNB) {
     }
     for (int i=0;i<NUMBER_OF_ULSCH_MAX; i++) {
 
-      LOG_I(PHY,"Allocating Transport Channel Buffer for ULSCH %d/%d\n",i,NUMBER_OF_ULSCH_MAX);
+      LOG_I(PHY,"Allocating Transport Channel Buffers for ULSCH %d/%d\n",i,NUMBER_OF_ULSCH_MAX);
       eNB->ulsch[i] = new_eNB_ulsch(MAX_TURBO_ITERATIONS,fp->N_RB_UL, 0);
 
       if (!eNB->ulsch[i]) {
diff --git a/targets/RT/USER/lte-ru.c b/targets/RT/USER/lte-ru.c
index 571551cee9a61bf1fd8cf88f4977e937c6a61d00..1d464cb90c4b66433bb9ee48fce9dd4e438c5a3b 100644
--- a/targets/RT/USER/lte-ru.c
+++ b/targets/RT/USER/lte-ru.c
@@ -89,7 +89,7 @@ void prach_procedures(PHY_VARS_eNB *eNB,int br_flag);
 
 void stop_RU(RU_t **rup,int nb_ru);
 
-void do_ru_synch(RU_t *ru);
+static void do_ru_synch(RU_t *ru);
 
 void configure_ru(int idx,
                   void *arg);
@@ -1059,7 +1059,7 @@ int wakeup_synch(RU_t *ru) {
 }
 
 
-void do_ru_synch(RU_t *ru) {
+static void do_ru_synch(RU_t *ru) {
   LTE_DL_FRAME_PARMS *fp  = ru->frame_parms;
   RU_proc_t *proc         = &ru->proc;
   int rxs, ic, ret, i;
@@ -1371,11 +1371,12 @@ void fill_rf_config(RU_t *ru,
     cfg->tx_gain[i] = (double)ru->att_tx;
     cfg->rx_gain[i] = ru->max_rxgain-(double)ru->att_rx;
     cfg->configFilename = rf_config_file;
-    LOG_I(PHY,"channel %d, Setting tx_gain offset %f, rx_gain offset %f, tx_freq %f, rx_freq %f\n",
+    LOG_I(PHY,"channel %d, Setting tx_gain offset %.0f, rx_gain offset %.0f, tx_freq %.0f, rx_freq %.0f, tune_offset %.0f Hz\n",
            i, cfg->tx_gain[i],
            cfg->rx_gain[i],
            cfg->tx_freq[i],
-           cfg->rx_freq[i]);
+           cfg->rx_freq[i],
+           cfg->tune_offset);
   }
 }
 
@@ -1833,7 +1834,7 @@ static void *ru_thread( void *param ) {
         new_dlsch_ue_select_tbl_in_use = dlsch_ue_select_tbl_in_use;
         dlsch_ue_select_tbl_in_use = !dlsch_ue_select_tbl_in_use;
         memcpy(&pre_scd_eNB_UE_stats,&RC.mac[ru->eNB_list[0]->Mod_id]->UE_info.eNB_UE_stats, sizeof(eNB_UE_STATS)*MAX_NUM_CCs*NUMBER_OF_UE_MAX);
-        memcpy(&pre_scd_activeUE, &RC.mac[ru->eNB_list[0]->Mod_id]->UE_info.active, sizeof(boolean_t)*NUMBER_OF_UE_MAX);
+        memcpy(&pre_scd_activeUE, &RC.mac[ru->eNB_list[0]->Mod_id]->UE_info.active, sizeof(bool)*NUMBER_OF_UE_MAX);
         AssertFatal((ret=pthread_mutex_lock(&ru->proc.mutex_pre_scd))==0,"[eNB] error locking proc mutex for eNB pre scd\n");
         ru->proc.instance_pre_scd++;
 
@@ -1923,7 +1924,7 @@ static void *ru_thread( void *param ) {
 
 
 // This thread run the initial synchronization like a UE
-void *ru_thread_synch(void *arg) {
+static void *ru_thread_synch(void *arg) {
   RU_t *ru = (RU_t *)arg;
   __attribute__((unused))
   LTE_DL_FRAME_PARMS *fp = ru->frame_parms;
@@ -2972,6 +2973,8 @@ RU_t **RCconfig_RU(int nb_RU,int nb_L1_inst,PHY_VARS_eNB ***eNB,uint64_t *ru_mas
 	ru[j]->openair0_cfg.time_source = unset;
       }      
 
+      ru[j]->openair0_cfg.tune_offset = get_softmodem_params()->tune_offset;
+
       LOG_I(PHY,"RU %d is_slave=%s\n",j,*(RUParamList.paramarray[j][RU_IS_SLAVE_IDX].strptr));
 
       if (strcmp(*(RUParamList.paramarray[j][RU_IS_SLAVE_IDX].strptr), "yes") == 0) ru[j]->is_slave=1;
diff --git a/targets/RT/USER/lte-softmodem.h b/targets/RT/USER/lte-softmodem.h
index 1c887dd3c8ee4652fa9ac7d7335ce2557bf67e7f..38b71238b828929a990e30bdca7d5bae58ae945b 100644
--- a/targets/RT/USER/lte-softmodem.h
+++ b/targets/RT/USER/lte-softmodem.h
@@ -29,6 +29,7 @@
 #include "flexran_agent.h"
 #include "s1ap_eNB.h"
 #include "SIMULATION/ETH_TRANSPORT/proto.h"
+#include "targets/ARCH/COMMON/common_lib.h"
 #include "executables/softmodem-common.h"
 
 
@@ -213,5 +214,19 @@ extern void init_UE_standalone_thread(int ue_idx);
 extern PHY_VARS_UE *init_ue_vars(LTE_DL_FRAME_PARMS *frame_parms, uint8_t UE_id, uint8_t abstraction_flag);
 
 extern void init_bler_table(void);
-
+void feptx_ofdm_2thread(RU_t *ru,
+                        int frame,
+                        int subframe);
+void* ru_thread_control( void* param );
+void wait_eNBs(void);
+void kill_feptx_thread(RU_t *ru);
+void init_fep_thread(RU_t *ru, pthread_attr_t *attr_fep);
+void init_feptx_thread(RU_t *ru, pthread_attr_t *attr_feptx);
+void fep_full(RU_t *ru, int subframe);
+void configure_ru(int, void *arg);
+void configure_rru(int, void *arg);
+void ru_fep_full_2thread(RU_t *ru,int subframe);
+void feptx_ofdm(RU_t*ru, int frame_tx, int tti_tx);
+void feptx_prec(struct RU_t_s *ru, int frame_tx, int tti_tx);
+void fill_rf_config(RU_t *ru, char *rf_config_file);
 #endif
diff --git a/targets/RT/USER/lte-uesoftmodem.c b/targets/RT/USER/lte-uesoftmodem.c
index 089941c7dfc0de799960b9206bf2f771e5564e11..05602b63da6ce068a4a02397b429a35d87d192d7 100644
--- a/targets/RT/USER/lte-uesoftmodem.c
+++ b/targets/RT/USER/lte-uesoftmodem.c
@@ -176,7 +176,6 @@ extern char uecap_xer[1024];
 char uecap_xer_in=0;
 
 int oaisim_flag=0;
-//threads_t threads= {-1,-1,-1,-1,-1,-1,-1,-1};
 
 /* see file openair2/LAYER2/MAC/main.c for why abstraction_flag is needed
  * this is very hackish - find a proper solution
@@ -446,6 +445,7 @@ void init_openair0(LTE_DL_FRAME_PARMS *frame_parms,int rxgain) {
     openair0_cfg[card].num_rb_dl=frame_parms->N_RB_DL;
     openair0_cfg[card].clock_source = get_softmodem_params()->clock_source;
     openair0_cfg[card].time_source = get_softmodem_params()->timing_source;
+    openair0_cfg[card].tune_offset = get_softmodem_params()->tune_offset;
     openair0_cfg[card].tx_num_channels=min(2,frame_parms->nb_antennas_tx);
     openair0_cfg[card].rx_num_channels=min(2,frame_parms->nb_antennas_rx);
 
@@ -464,11 +464,12 @@ void init_openair0(LTE_DL_FRAME_PARMS *frame_parms,int rxgain) {
       openair0_cfg[card].tx_gain[i] = tx_gain[0][i];
       openair0_cfg[card].rx_gain[i] = rxgain - rx_gain_off;
       openair0_cfg[card].configFilename = get_softmodem_params()->rf_config_file;
-      printf("Card %d, channel %d, Setting tx_gain %f, rx_gain %f, tx_freq %f, rx_freq %f\n",
+      printf("Card %d, channel %d, Setting tx_gain %.0f, rx_gain %.0f, tx_freq %.0f, rx_freq %.0f, tune_offset %.0f\n",
              card,i, openair0_cfg[card].tx_gain[i],
              openair0_cfg[card].rx_gain[i],
              openair0_cfg[card].tx_freq[i],
-             openair0_cfg[card].rx_freq[i]);
+             openair0_cfg[card].rx_freq[i],
+             openair0_cfg[card].tune_offset);
     }
 
     if (usrp_args) openair0_cfg[card].sdr_addrs = usrp_args;
diff --git a/targets/TEST/PDCP/test_pdcp.c b/targets/TEST/PDCP/test_pdcp.c
index b62edf1215410921f3c9e27fbe7d4c55b9400fd3..d6becf87c1499167d1399a0ea8c6defa7cd1a8ac 100644
--- a/targets/TEST/PDCP/test_pdcp.c
+++ b/targets/TEST/PDCP/test_pdcp.c
@@ -100,7 +100,7 @@ int main(int argc, char **argv)
   list_init(&test_pdu_rx_list, NULL);
   logInit();
 
-  if (init_pdcp_entity(&pdcp_array[0]) == TRUE && init_pdcp_entity(&pdcp_array[1]) == TRUE)
+  if (init_pdcp_entity(&pdcp_array[0]) == true && init_pdcp_entity(&pdcp_array[1]) == true)
     msg("[TEST] PDCP entity initialization OK\n");
   else {
     msg("[TEST] Cannot initialize PDCP entities!\n");
@@ -109,7 +109,7 @@ int main(int argc, char **argv)
 
   /* Initialize PDCP state variables */
   for (index = 0; index < 2; ++index) {
-    if (pdcp_init_seq_numbers(&pdcp_array[index]) == FALSE) {
+    if (pdcp_init_seq_numbers(&pdcp_array[index]) == false) {
       msg("[TEST] Cannot initialize sequence numbers of PDCP entity %d!\n", index);
       exit(1);
     } else {
@@ -120,11 +120,11 @@ int main(int argc, char **argv)
 #if TEST_RX_AND_TX_WINDOW
 
   /* Test TX window */
-  if (test_tx_window() == FALSE)
+  if (test_tx_window() == false)
     test_result = 1;
 
   /* Test RX window */
-  if (test_rx_window() == FALSE)
+  if (test_rx_window() == false)
     test_result = 1;
 
 #endif
@@ -132,11 +132,11 @@ int main(int argc, char **argv)
 #if TEST_PDCP_DATA_REQUEST_AND_INDICATION
 
   /* Test pdcp_data_req() method in pdcp.c */
-  if (test_pdcp_data_req() == FALSE)
+  if (test_pdcp_data_req() == false)
     test_result = 1;
 
   /* Test pdcp_data_ind() method in pdcp.c */
-  if (test_pdcp_data_ind() == FALSE)
+  if (test_pdcp_data_ind() == false)
     test_result = 1;
 
 #endif
@@ -150,10 +150,10 @@ int main(int argc, char **argv)
   return test_result;
 }
 
-BOOL init_pdcp_entity(pdcp_t *pdcp_entity)
+bool init_pdcp_entity(pdcp_t *pdcp_entity)
 {
   if (pdcp_entity == NULL)
-    return FALSE;
+    return false;
 
   /*
    * Initialize sequence number state variables of relevant PDCP entity
@@ -171,10 +171,10 @@ BOOL init_pdcp_entity(pdcp_t *pdcp_entity)
       pdcp_entity->next_pdcp_rx_sn, pdcp_entity->tx_hfn, pdcp_entity->rx_hfn, \
       pdcp_entity->last_submitted_pdcp_rx_sn, pdcp_entity->seq_num_size);
 
-  return TRUE;
+  return true;
 }
 
-BOOL test_tx_window(void)
+bool test_tx_window(void)
 {
   unsigned long index = 0;
 
@@ -185,33 +185,33 @@ BOOL test_tx_window(void)
       msg("TX packet # %07lu seq # %04d hfn # %04d\n", index, pseudo_tx_sn, pdcp_array[0].tx_hfn);
     else {
       msg("TX packet is out-of-window!\n");
-      return FALSE;
+      return false;
     }
   }
 
-  return TRUE;
+  return true;
 }
 
-BOOL test_rx_window(void)
+bool test_rx_window(void)
 {
   unsigned long index = 0;
 
   for (index = 0; index < NUMBER_OF_TEST_PACKETS; ++index) {
     u16 pseudo_rx_sn = (index == 0) ? 0 : index % WINDOW_SIZE;
 
-    if (pdcp_is_rx_seq_number_valid(pseudo_rx_sn, &pdcp_array[1]) == TRUE) {
+    if (pdcp_is_rx_seq_number_valid(pseudo_rx_sn, &pdcp_array[1]) == true) {
       msg("RX packet # %07lu seq # %04d last-submitted # %04d hfn # %04d\n", \
           index, pdcp_array[1].next_pdcp_rx_sn, pdcp_array[1].last_submitted_pdcp_rx_sn, pdcp_array[1].rx_hfn);
     } else {
       msg("RX packet seq # %04lu is not valid!\n", index);
-      return FALSE;
+      return false;
     }
   }
 
-  return TRUE;
+  return true;
 }
 
-BOOL test_pdcp_data_req(void)
+bool test_pdcp_data_req(void)
 {
   unsigned char* pdcp_test_pdu_buffer = NULL;
   unsigned char pdcp_test_pdu_buffer_size = DUMMY_BUFFER_SIZE + PDCP_USER_PLANE_DATA_PDU_LONG_SN_HEADER_SIZE;
@@ -224,7 +224,7 @@ BOOL test_pdcp_data_req(void)
 
   if (pdcp_test_pdu_buffer == NULL) {
     msg("Cannot allocate a buffer for test!\n");
-    return FALSE;
+    return false;
   }
 
   /*
@@ -241,7 +241,7 @@ BOOL test_pdcp_data_req(void)
     /*
      * Ask PDCP to create a PDU with given buffer and enqueue it to `test_pdu_tx_list`
      */
-    if (pdcp_data_req(0, 0, 10, DUMMY_BUFFER, &pdcp_array[0], &test_pdu_tx_list) == TRUE) {
+    if (pdcp_data_req(0, 0, 10, DUMMY_BUFFER, &pdcp_array[0], &test_pdu_tx_list) == true) {
       msg("[TEST] Starting to dissect PDU created by PDCP...\n");
 
       /*
@@ -251,7 +251,7 @@ BOOL test_pdcp_data_req(void)
 
       if (pdcp_test_pdu_buffer_size == 0 ) {
         msg("[TEST] PDU created by pdcp_data_req() is invalid!\n");
-        return FALSE;
+        return false;
       }
 
       /*
@@ -269,7 +269,7 @@ BOOL test_pdcp_data_req(void)
        */
       if (pdcp_test_pdu_buffer[0] & 0x80) {
         msg("[TEST] First bit is not 0, which means this is not a Data PDU!\n");
-        return FALSE;
+        return false;
       } else {
         msg("[TEST] First bit is 0 so this is a Data PDU, OK\n");
       }
@@ -279,7 +279,7 @@ BOOL test_pdcp_data_req(void)
        */
       if ((pdcp_test_pdu_buffer[0] & 0x70) != 0) {
         msg("[TEST] Reserved bits are not 0!\n");
-        return FALSE;
+        return false;
       } else {
         msg("[TEST] Reserved bits are all 0, OK\n");
       }
@@ -292,21 +292,21 @@ BOOL test_pdcp_data_req(void)
 
       if (sequence_number != index % WINDOW_SIZE) {
         msg("[TEST] Sequence numbers are out-of-order!\n");
-        return FALSE;
+        return false;
       } else {
         msg("[TEST] Sequence number is correct\n");
       }
 
     } else {
       msg("[TEST] pdcp_data_req() returned FALSE!\n");
-      return FALSE;
+      return false;
     }
   }
 
-  return TRUE;
+  return true;
 }
 
-BOOL test_pdcp_data_ind(void)
+bool test_pdcp_data_ind(void)
 {
   /*
    * This is the list that pdcp_data_ind() takes to put pdcp_data_ind_header_t
@@ -341,9 +341,9 @@ BOOL test_pdcp_data_ind(void)
 
     test_sdu = list_remove_head(&test_pdu_rx_list);
 
-    if (pdcp_data_ind(0, 0, test_sdu_size, test_sdu, &pdcp_array[0], &test_pdu_indication_list) == FALSE) {
+    if (pdcp_data_ind(0, 0, test_sdu_size, test_sdu, &pdcp_array[0], &test_pdu_indication_list) == false) {
       msg("[TEST] pdcp_data_ind() failed to handle data indication!\n");
-      return FALSE;
+      return false;
     } else {
       msg("[TEST] pdcp_data_ind() succcessfuly handled data indication\n");
     }
@@ -359,7 +359,7 @@ BOOL test_pdcp_data_ind(void)
 
     if (test_data_ind_header == NULL) {
       msg("[TEST] Data indication header is not valid!\n");
-      return FALSE;
+      return false;
     } else {
       pdcp_data_ind_header_t* indication_header = (pdcp_data_ind_header_t*)test_data_ind_header->data;
 
@@ -370,7 +370,7 @@ BOOL test_pdcp_data_ind(void)
         msg("[TEST] Radio bearer ID is correct\n");
       } else {
         msg("[TEST] Radio bearer ID is not correct! (expected: 0, parsed: %d)\n", indication_header->rb_id);
-        return FALSE;
+        return false;
       }
 
       /*
@@ -380,7 +380,7 @@ BOOL test_pdcp_data_ind(void)
         msg("[TEST] SDU size is correct\n");
       } else {
         msg("[TEST] SDU size is not correct! (expected: %d, parsed: %d)\n", DUMMY_BUFFER_SIZE, indication_header->data_size);
-        return FALSE;
+        return false;
       }
 
       /*
@@ -412,11 +412,11 @@ BOOL test_pdcp_data_ind(void)
       print_byte_stream("[TEST] TXed data: ", DUMMY_BUFFER, DUMMY_BUFFER_SIZE);
       print_byte_stream("[TEST] RXed data: ", (unsigned char*)&(test_data_ind_header->data[data_index]), DUMMY_BUFFER_SIZE);
 
-      return FALSE;
+      return false;
     }
   }
 
-  return TRUE;
+  return true;
 }
 
 
diff --git a/targets/TEST/PDCP/test_pdcp.h b/targets/TEST/PDCP/test_pdcp.h
index 0da174cc8caad238452240d5bc70bcf435901a1d..629f6f253910bf5e69fe8767005e7a2328829782 100644
--- a/targets/TEST/PDCP/test_pdcp.h
+++ b/targets/TEST/PDCP/test_pdcp.h
@@ -42,17 +42,17 @@ int pdcp_fifo_flush_sdus (void) { return 0; }
 int pdcp_fifo_read_input_sdus_remaining_bytes (void) { return 0; }
 int pdcp_fifo_read_input_sdus (void) { return 0; }
 
-BOOL init_pdcp_entity(pdcp_t *pdcp_entity);
-BOOL test_tx_window(void);
-BOOL test_rx_window(void);
-BOOL test_pdcp_data_req(void);
-BOOL test_pdcp_data_ind(void);
+bool init_pdcp_entity(pdcp_t *pdcp_entity);
+bool test_tx_window(void);
+bool test_rx_window(void);
+bool test_pdcp_data_req(void);
+bool test_pdcp_data_ind(void);
 
 /*
  * PDCP methods that are going to be utilised throughout the test
  */
-extern BOOL pdcp_init_seq_numbers(pdcp_t* pdcp_entity);
+extern bool pdcp_init_seq_numbers(pdcp_t* pdcp_entity);
 extern u16 pdcp_get_next_tx_seq_number(pdcp_t* pdcp_entity);
-extern BOOL pdcp_is_rx_seq_number_valid(u16 seq_num, pdcp_t* pdcp_entity);
+extern bool pdcp_is_rx_seq_number_valid(u16 seq_num, pdcp_t* pdcp_entity);
 
 #endif
diff --git a/targets/TEST/PDCP/with_rlc/test_pdcp_rlc.c b/targets/TEST/PDCP/with_rlc/test_pdcp_rlc.c
index 378ee95c3bea10fbf8b4a019fb788dd4208184fa..7b8017172435300c4d3ef7a4044724263d90f1d3 100644
--- a/targets/TEST/PDCP/with_rlc/test_pdcp_rlc.c
+++ b/targets/TEST/PDCP/with_rlc/test_pdcp_rlc.c
@@ -109,7 +109,7 @@ int pdcp_fifo_flush_sdus () {}
 int pdcp_fifo_read_input_sdus_remaining_bytes () {}
 int pdcp_fifo_read_input_sdus () {}
 
-BOOL init_pdcp_entity(pdcp_t *pdcp_entity);
+bool init_pdcp_entity(pdcp_t *pdcp_entity);
 
 //-----------------------------------------------------------------------------
 void pdcp_rlc_test_mac_rlc_loop (struct mac_data_ind *data_indP,  struct mac_data_req *data_requestP, int* drop_countP, int *tx_packetsP, int* dropped_tx_packetsP) //-----------------------------------------------------------------------------
@@ -230,7 +230,7 @@ int main(int argc, char **argv)
   pdcp_module_init();
   logInit();
 
-  if (init_pdcp_entity(&pdcp_array[0][1]) == TRUE && init_pdcp_entity(&pdcp_array[1][1]) == TRUE)
+  if (init_pdcp_entity(&pdcp_array[0][1]) == true && init_pdcp_entity(&pdcp_array[1][1]) == true)
     msg("PDCP entity initialization OK\n");
   else {
     msg("Cannot initialize PDCP entities!\n");
@@ -239,7 +239,7 @@ int main(int argc, char **argv)
 
   /* Initialize PDCP state variables */
   for (index = 0; index < 2; ++index) {
-    if (pdcp_init_seq_numbers(&pdcp_array[index][1]) == FALSE) {
+    if (pdcp_init_seq_numbers(&pdcp_array[index][1]) == false) {
       msg("Cannot initialize %s PDCP entity!\n", ((index == 0) ? "first" : "second"));
       exit(1);
     }
@@ -275,11 +275,11 @@ int main(int argc, char **argv)
 }
 
 //-----------------------------------------------------------------------------
-BOOL init_pdcp_entity(pdcp_t *pdcp_entity)
+bool init_pdcp_entity(pdcp_t *pdcp_entity)
 //-----------------------------------------------------------------------------
 {
   if (pdcp_entity == NULL)
-    return FALSE;
+    return false;
 
   /*
    * Initialize sequence number state variables of relevant PDCP entity
@@ -292,6 +292,6 @@ BOOL init_pdcp_entity(pdcp_t *pdcp_entity)
   pdcp_entity->last_submitted_pdcp_rx_sn = 4095;
   pdcp_entity->seq_num_size = 12;
 
-  return TRUE;
+  return true;
 }
 
diff --git a/txsig0.m b/txsig0.m
new file mode 100644
index 0000000000000000000000000000000000000000..e795208a15a299557be7280830ba630e20587996
--- /dev/null
+++ b/txsig0.m
@@ -0,0 +1,61441 @@
+txs0 = [-194 + j*(-202)
+-136 + j*(186)
+248 + j*(59)
+61 + j*(-331)
+-327 + j*(-134)
+-161 + j*(205)
+70 + j*(64)
+-84 + j*(-35)
+-82 + j*(168)
+170 + j*(116)
+105 + j*(-159)
+-163 + j*(-94)
+-102 + j*(147)
+100 + j*(89)
+31 + j*(-79)
+-114 + j*(4)
+-25 + j*(144)
+112 + j*(64)
+41 + j*(-65)
+-84 + j*(9)
+-18 + j*(151)
+137 + j*(129)
+190 + j*(9)
+163 + j*(-89)
+85 + j*(-173)
+-68 + j*(-154)
+-93 + j*(26)
+119 + j*(64)
+183 + j*(-209)
+-139 + j*(-343)
+-365 + j*(-29)
+-107 + j*(252)
+180 + j*(51)
+11 + j*(-232)
+-279 + j*(-96)
+-200 + j*(193)
+42 + j*(170)
+37 + j*(-5)
+-93 + j*(13)
+-81 + j*(137)
+21 + j*(187)
+158 + j*(174)
+303 + j*(-10)
+155 + j*(-324)
+-275 + j*(-277)
+-348 + j*(180)
+57 + j*(327)
+197 + j*(1)
+-89 + j*(-71)
+-107 + j*(244)
+254 + j*(283)
+382 + j*(-61)
+137 + j*(-263)
+-69 + j*(-141)
+-19 + j*(32)
+138 + j*(8)
+135 + j*(-159)
+-20 + j*(-175)
+-9 + j*(-51)
+126 + j*(-153)
+-52 + j*(-384)
+-409 + j*(-234)
+-389 + j*(165)
+-78 + j*(276)
+81 + j*(133)
+94 + j*(11)
+42 + j*(-99)
+-103 + j*(-112)
+-155 + j*(25)
+-57 + j*(74)
+-47 + j*(23)
+-64 + j*(69)
+36 + j*(51)
+-16 + j*(-105)
+-230 + j*(-46)
+-211 + j*(189)
+-51 + j*(221)
+-39 + j*(208)
+67 + j*(312)
+308 + j*(188)
+240 + j*(-112)
+-30 + j*(-91)
+-16 + j*(126)
+153 + j*(117)
+170 + j*(12)
+156 + j*(-11)
+173 + j*(-64)
+130 + j*(-112)
+123 + j*(-123)
+100 + j*(-220)
+-86 + j*(-247)
+-170 + j*(-43)
+21 + j*(40)
+64 + j*(-161)
+-175 + j*(-176)
+-196 + j*(100)
+91 + j*(138)
+151 + j*(-144)
+-111 + j*(-234)
+-230 + j*(-19)
+-85 + j*(96)
+-11 + j*(9)
+-78 + j*(-10)
+-66 + j*(57)
+-17 + j*(30)
+-70 + j*(21)
+-45 + j*(133)
+139 + j*(109)
+154 + j*(-121)
+-70 + j*(-189)
+-165 + j*(-28)
+-98 + j*(46)
+-93 + j*(60)
+-33 + j*(136)
+93 + j*(59)
+-5 + j*(-81)
+-144 + j*(55)
+36 + j*(194)
+176 + j*(-16)
+-49 + j*(-146)
+-166 + j*(75)
+32 + j*(179)
+109 + j*(33)
+25 + j*(9)
+74 + j*(42)
+80 + j*(-77)
+-93 + j*(-79)
+-105 + j*(128)
+111 + j*(162)
+170 + j*(-36)
+-4 + j*(-98)
+-60 + j*(74)
+142 + j*(148)
+281 + j*(-80)
+70 + j*(-296)
+-184 + j*(-135)
+-49 + j*(103)
+166 + j*(-62)
+-46 + j*(-301)
+-354 + j*(-80)
+-202 + j*(281)
+147 + j*(244)
+206 + j*(-15)
+78 + j*(-109)
+20 + j*(-95)
+-17 + j*(-116)
+-112 + j*(-98)
+-159 + j*(30)
+-44 + j*(146)
+110 + j*(66)
+59 + j*(-88)
+-69 + j*(-35)
+13 + j*(67)
+104 + j*(-51)
+-37 + j*(-129)
+-83 + j*(6)
+40 + j*(-13)
+-67 + j*(-129)
+-181 + j*(74)
+120 + j*(185)
+238 + j*(-213)
+-223 + j*(-363)
+-411 + j*(107)
+-2 + j*(288)
+109 + j*(-43)
+-169 + j*(-46)
+-73 + j*(214)
+182 + j*(56)
+-7 + j*(-186)
+-223 + j*(5)
+-57 + j*(177)
+38 + j*(27)
+-137 + j*(19)
+-122 + j*(259)
+152 + j*(303)
+272 + j*(86)
+172 + j*(-42)
+145 + j*(-28)
+195 + j*(-117)
+64 + j*(-272)
+-177 + j*(-182)
+-171 + j*(71)
+32 + j*(98)
+31 + j*(-51)
+-99 + j*(11)
+8 + j*(153)
+159 + j*(35)
+35 + j*(-93)
+-64 + j*(65)
+149 + j*(186)
+355 + j*(-29)
+238 + j*(-317)
+-43 + j*(-356)
+-204 + j*(-183)
+-149 + j*(-11)
+-34 + j*(-13)
+-62 + j*(-84)
+-139 + j*(-6)
+-34 + j*(103)
+103 + j*(-2)
+18 + j*(-142)
+-96 + j*(-79)
+-27 + j*(-25)
+-26 + j*(-159)
+-263 + j*(-175)
+-385 + j*(125)
+-127 + j*(377)
+177 + j*(252)
+168 + j*(13)
+60 + j*(5)
+144 + j*(21)
+160 + j*(-194)
+-136 + j*(-288)
+-318 + j*(5)
+-82 + j*(217)
+93 + j*(27)
+-91 + j*(-98)
+-199 + j*(90)
+-41 + j*(188)
+8 + j*(95)
+-67 + j*(132)
+27 + j*(257)
+204 + j*(201)
+247 + j*(55)
+214 + j*(-49)
+131 + j*(-134)
+-10 + j*(-97)
+16 + j*(65)
+221 + j*(31)
+221 + j*(-237)
+-64 + j*(-323)
+-230 + j*(-107)
+-126 + j*(61)
+-33 + j*(42)
+-40 + j*(42)
+20 + j*(91)
+120 + j*(29)
+89 + j*(-100)
+-38 + j*(-103)
+-58 + j*(13)
+58 + j*(46)
+122 + j*(-83)
+0 + j*(-199)
+-163 + j*(-120)
+-140 + j*(45)
+-11 + j*(53)
+-18 + j*(-31)
+-82 + j*(17)
+11 + j*(74)
+59 + j*(-59)
+-120 + j*(-101)
+-171 + j*(128)
+76 + j*(203)
+172 + j*(-20)
+10 + j*(-92)
+9 + j*(9)
+75 + j*(-86)
+-111 + j*(-147)
+-175 + j*(105)
+122 + j*(173)
+203 + j*(-151)
+-111 + j*(-262)
+-245 + j*(-17)
+-110 + j*(93)
+-74 + j*(53)
+-79 + j*(90)
+-29 + j*(81)
+-96 + j*(72)
+-87 + j*(255)
+197 + j*(303)
+325 + j*(8)
+103 + j*(-132)
+39 + j*(30)
+215 + j*(1)
+166 + j*(-223)
+-55 + j*(-224)
+-98 + j*(-93)
+-86 + j*(-68)
+-130 + j*(-1)
+-34 + j*(97)
+81 + j*(-18)
+-69 + j*(-147)
+-237 + j*(30)
+-83 + j*(245)
+132 + j*(166)
+120 + j*(25)
+91 + j*(37)
+170 + j*(-23)
+83 + j*(-180)
+-124 + j*(-100)
+-45 + j*(129)
+206 + j*(34)
+113 + j*(-245)
+-176 + j*(-175)
+-128 + j*(87)
+92 + j*(37)
+29 + j*(-153)
+-144 + j*(-103)
+-128 + j*(23)
+-92 + j*(30)
+-112 + j*(88)
+-8 + j*(170)
+122 + j*(83)
+81 + j*(-45)
+-4 + j*(-42)
+-18 + j*(-16)
+-43 + j*(-1)
+-42 + j*(64)
+40 + j*(78)
+47 + j*(6)
+-19 + j*(44)
+76 + j*(154)
+281 + j*(49)
+264 + j*(-238)
+-18 + j*(-369)
+-266 + j*(-198)
+-245 + j*(78)
+-7 + j*(177)
+168 + j*(-5)
+40 + j*(-248)
+-272 + j*(-207)
+-366 + j*(132)
+-85 + j*(356)
+208 + j*(202)
+177 + j*(-63)
+3 + j*(-96)
+-23 + j*(-18)
+-3 + j*(-49)
+-109 + j*(-69)
+-184 + j*(77)
+-69 + j*(223)
+105 + j*(208)
+198 + j*(93)
+202 + j*(-50)
+97 + j*(-165)
+-67 + j*(-153)
+-146 + j*(-14)
+-83 + j*(126)
+72 + j*(153)
+183 + j*(23)
+98 + j*(-141)
+-86 + j*(-95)
+-59 + j*(91)
+134 + j*(71)
+122 + j*(-134)
+-97 + j*(-146)
+-147 + j*(77)
+66 + j*(191)
+257 + j*(23)
+194 + j*(-226)
+-39 + j*(-298)
+-208 + j*(-178)
+-243 + j*(-25)
+-216 + j*(119)
+-76 + j*(247)
+144 + j*(186)
+151 + j*(-23)
+4 + j*(-19)
+91 + j*(98)
+249 + j*(-80)
+41 + j*(-301)
+-199 + j*(-124)
+-54 + j*(63)
+53 + j*(-95)
+-144 + j*(-161)
+-214 + j*(38)
+-77 + j*(104)
+-69 + j*(55)
+-69 + j*(140)
+83 + j*(153)
+127 + j*(-1)
+25 + j*(-45)
+27 + j*(0)
+44 + j*(-57)
+-45 + j*(-78)
+-70 + j*(5)
+-9 + j*(15)
+-13 + j*(-43)
+-80 + j*(-61)
+-170 + j*(-14)
+-212 + j*(145)
+-59 + j*(313)
+175 + j*(250)
+221 + j*(59)
+145 + j*(-12)
+130 + j*(-25)
+116 + j*(-76)
+69 + j*(-121)
+-23 + j*(-160)
+-188 + j*(-76)
+-166 + j*(193)
+141 + j*(249)
+243 + j*(-24)
+41 + j*(-97)
+64 + j*(44)
+183 + j*(-84)
+-27 + j*(-175)
+-50 + j*(114)
+363 + j*(58)
+303 + j*(-504)
+-333 + j*(-527)
+-450 + j*(41)
+-40 + j*(153)
+-25 + j*(-122)
+-240 + j*(-37)
+-124 + j*(148)
+-1 + j*(45)
+-100 + j*(14)
+-57 + j*(126)
+62 + j*(41)
+-56 + j*(-71)
+-175 + j*(71)
+-45 + j*(213)
+107 + j*(142)
+114 + j*(21)
+66 + j*(-37)
+-12 + j*(-71)
+-130 + j*(-15)
+-141 + j*(177)
+85 + j*(297)
+323 + j*(107)
+219 + j*(-204)
+-95 + j*(-180)
+-118 + j*(100)
+119 + j*(148)
+185 + j*(-22)
+117 + j*(-76)
+129 + j*(-119)
+34 + j*(-238)
+-174 + j*(-164)
+-153 + j*(57)
+23 + j*(79)
+60 + j*(-21)
+45 + j*(-59)
+23 + j*(-130)
+-110 + j*(-151)
+-168 + j*(-12)
+-75 + j*(34)
+-113 + j*(-22)
+-182 + j*(123)
+25 + j*(248)
+192 + j*(50)
+38 + j*(-102)
+-52 + j*(12)
+51 + j*(23)
+1 + j*(-83)
+-116 + j*(-6)
+-47 + j*(104)
+17 + j*(71)
+16 + j*(99)
+153 + j*(109)
+215 + j*(-111)
+-33 + j*(-237)
+-202 + j*(0)
+14 + j*(183)
+216 + j*(-10)
+61 + j*(-235)
+-169 + j*(-145)
+-139 + j*(46)
+-11 + j*(21)
+-91 + j*(-76)
+-228 + j*(60)
+-99 + j*(269)
+136 + j*(210)
+139 + j*(28)
+42 + j*(33)
+100 + j*(93)
+185 + j*(6)
+139 + j*(-114)
+26 + j*(-142)
+-59 + j*(-71)
+-20 + j*(39)
+111 + j*(11)
+86 + j*(-144)
+-77 + j*(-129)
+-51 + j*(8)
+54 + j*(-62)
+-78 + j*(-164)
+-202 + j*(-3)
+-66 + j*(136)
+41 + j*(61)
+23 + j*(25)
+78 + j*(16)
+68 + j*(-111)
+-93 + j*(-116)
+-100 + j*(38)
+25 + j*(27)
+-13 + j*(-73)
+-98 + j*(-31)
+-88 + j*(21)
+-105 + j*(69)
+-13 + j*(190)
+216 + j*(78)
+108 + j*(-244)
+-277 + j*(-153)
+-214 + j*(264)
+196 + j*(235)
+199 + j*(-131)
+-99 + j*(-150)
+-117 + j*(66)
+24 + j*(66)
+-5 + j*(-31)
+-98 + j*(15)
+-83 + j*(126)
+14 + j*(186)
+138 + j*(156)
+200 + j*(43)
+163 + j*(-57)
+107 + j*(-97)
+49 + j*(-122)
+-23 + j*(-93)
+-13 + j*(-21)
+56 + j*(-54)
+-11 + j*(-151)
+-169 + j*(-84)
+-148 + j*(123)
+69 + j*(170)
+175 + j*(-24)
+16 + j*(-158)
+-123 + j*(-22)
+7 + j*(114)
+156 + j*(-19)
+43 + j*(-183)
+-119 + j*(-129)
+-136 + j*(-23)
+-138 + j*(41)
+-78 + j*(157)
+117 + j*(136)
+134 + j*(-84)
+-78 + j*(-120)
+-107 + j*(64)
+33 + j*(69)
+-13 + j*(-21)
+-76 + j*(95)
+91 + j*(178)
+231 + j*(29)
+181 + j*(-138)
+58 + j*(-223)
+-117 + j*(-201)
+-183 + j*(-8)
+-10 + j*(71)
+25 + j*(-103)
+-186 + j*(-88)
+-157 + j*(153)
+59 + j*(127)
+13 + j*(-8)
+-35 + j*(103)
+158 + j*(102)
+157 + j*(-132)
+-30 + j*(-143)
+-12 + j*(-71)
+-68 + j*(-188)
+-312 + j*(-68)
+-202 + j*(255)
+106 + j*(181)
+32 + j*(-31)
+-72 + j*(78)
+74 + j*(97)
+14 + j*(-49)
+-103 + j*(99)
+141 + j*(182)
+200 + j*(-136)
+-147 + j*(-175)
+-165 + j*(148)
+81 + j*(121)
+-36 + j*(-28)
+-121 + j*(200)
+169 + j*(290)
+270 + j*(55)
+179 + j*(21)
+314 + j*(-1)
+285 + j*(-309)
+-81 + j*(-343)
+-148 + j*(-45)
+36 + j*(-34)
+-51 + j*(-122)
+-74 + j*(53)
+172 + j*(23)
+110 + j*(-277)
+-204 + j*(-220)
+-161 + j*(42)
+7 + j*(-23)
+-116 + j*(-115)
+-186 + j*(62)
+4 + j*(139)
+91 + j*(-23)
+-27 + j*(-114)
+-117 + j*(-51)
+-107 + j*(23)
+-71 + j*(40)
+-76 + j*(35)
+-93 + j*(89)
+-12 + j*(156)
+100 + j*(99)
+95 + j*(0)
+68 + j*(-22)
+71 + j*(-80)
+-33 + j*(-146)
+-141 + j*(-59)
+-110 + j*(25)
+-114 + j*(23)
+-142 + j*(128)
+8 + j*(211)
+113 + j*(82)
+28 + j*(33)
+90 + j*(103)
+182 + j*(-69)
+-69 + j*(-202)
+-224 + j*(82)
+57 + j*(229)
+154 + j*(-28)
+-82 + j*(-46)
+-26 + j*(180)
+177 + j*(80)
+50 + j*(-60)
+-1 + j*(112)
+234 + j*(100)
+214 + j*(-171)
+-30 + j*(-161)
+-8 + j*(3)
+81 + j*(-49)
+11 + j*(-83)
+39 + j*(-25)
+76 + j*(-131)
+-100 + j*(-167)
+-144 + j*(49)
+84 + j*(95)
+136 + j*(-136)
+-80 + j*(-215)
+-209 + j*(-57)
+-156 + j*(109)
+3 + j*(178)
+167 + j*(73)
+132 + j*(-123)
+-33 + j*(-134)
+-35 + j*(-33)
+21 + j*(-82)
+-76 + j*(-132)
+-132 + j*(-34)
+-72 + j*(-1)
+-93 + j*(-41)
+-139 + j*(23)
+-83 + j*(71)
+-75 + j*(44)
+-97 + j*(95)
+-10 + j*(140)
+38 + j*(66)
+-10 + j*(60)
+47 + j*(98)
+87 + j*(-15)
+-70 + j*(-41)
+-76 + j*(173)
+202 + j*(187)
+267 + j*(-129)
+-20 + j*(-264)
+-206 + j*(-71)
+-133 + j*(107)
+-13 + j*(140)
+75 + j*(89)
+69 + j*(-3)
+-16 + j*(7)
+30 + j*(97)
+139 + j*(17)
+36 + j*(-110)
+-91 + j*(18)
+63 + j*(139)
+184 + j*(-37)
+4 + j*(-156)
+-102 + j*(13)
+51 + j*(100)
+123 + j*(-25)
+40 + j*(-88)
+-7 + j*(-67)
+-64 + j*(-44)
+-83 + j*(100)
+135 + j*(192)
+322 + j*(-47)
+141 + j*(-305)
+-98 + j*(-221)
+-71 + j*(-95)
+-74 + j*(-156)
+-224 + j*(-89)
+-173 + j*(126)
+46 + j*(119)
+59 + j*(-66)
+-92 + j*(-74)
+-102 + j*(55)
+17 + j*(83)
+78 + j*(-22)
+-5 + j*(-134)
+-163 + j*(-98)
+-198 + j*(73)
+-69 + j*(168)
+25 + j*(117)
+40 + j*(82)
+81 + j*(57)
+89 + j*(-18)
+42 + j*(-52)
+33 + j*(-74)
+-54 + j*(-149)
+-226 + j*(-48)
+-151 + j*(182)
+61 + j*(127)
+-40 + j*(-22)
+-134 + j*(177)
+169 + j*(257)
+239 + j*(-114)
+-183 + j*(-148)
+-180 + j*(333)
+346 + j*(337)
+386 + j*(-156)
+13 + j*(-190)
+69 + j*(57)
+272 + j*(-112)
+67 + j*(-338)
+-147 + j*(-214)
+-138 + j*(-105)
+-197 + j*(-58)
+-168 + j*(129)
+66 + j*(134)
+58 + j*(-88)
+-147 + j*(-33)
+-42 + j*(170)
+154 + j*(37)
+13 + j*(-136)
+-124 + j*(11)
+17 + j*(112)
+87 + j*(-14)
+-11 + j*(-47)
+-3 + j*(23)
+49 + j*(-22)
+-16 + j*(-62)
+-42 + j*(8)
+30 + j*(13)
+21 + j*(-71)
+-76 + j*(-71)
+-110 + j*(18)
+-71 + j*(82)
+-9 + j*(115)
+81 + j*(99)
+123 + j*(-4)
+43 + j*(-77)
+-13 + j*(-18)
+59 + j*(-4)
+41 + j*(-132)
+-149 + j*(-117)
+-168 + j*(110)
+54 + j*(157)
+94 + j*(-24)
+-43 + j*(-18)
+30 + j*(95)
+135 + j*(-37)
+-33 + j*(-132)
+-107 + j*(57)
+92 + j*(104)
+111 + j*(-83)
+-29 + j*(-65)
+56 + j*(11)
+83 + j*(-171)
+-190 + j*(-189)
+-227 + j*(131)
+93 + j*(187)
+159 + j*(-101)
+-77 + j*(-175)
+-156 + j*(-15)
+-83 + j*(51)
+-49 + j*(43)
+-36 + j*(27)
+-81 + j*(19)
+-98 + j*(130)
+69 + j*(174)
+136 + j*(-19)
+-67 + j*(-74)
+-95 + j*(139)
+124 + j*(143)
+112 + j*(-52)
+-35 + j*(-11)
+42 + j*(84)
+90 + j*(-14)
+-3 + j*(-4)
+95 + j*(69)
+164 + j*(-132)
+-128 + j*(-231)
+-281 + j*(105)
+27 + j*(307)
+236 + j*(92)
+127 + j*(-53)
+91 + j*(-12)
+117 + j*(-66)
+21 + j*(-92)
+17 + j*(26)
+163 + j*(13)
+181 + j*(-146)
+79 + j*(-215)
+19 + j*(-230)
+-83 + j*(-263)
+-221 + j*(-168)
+-188 + j*(5)
+-35 + j*(-1)
+-52 + j*(-155)
+-252 + j*(-163)
+-347 + j*(56)
+-194 + j*(232)
+-23 + j*(169)
+-54 + j*(60)
+-143 + j*(129)
+-72 + j*(266)
+100 + j*(289)
+249 + j*(188)
+310 + j*(-8)
+184 + j*(-207)
+-50 + j*(-197)
+-107 + j*(-20)
+9 + j*(33)
+37 + j*(-66)
+-71 + j*(-104)
+-163 + j*(-24)
+-169 + j*(118)
+-42 + j*(227)
+118 + j*(168)
+116 + j*(40)
+59 + j*(55)
+148 + j*(66)
+160 + j*(-96)
+-42 + j*(-122)
+-75 + j*(100)
+170 + j*(142)
+241 + j*(-99)
+49 + j*(-201)
+-41 + j*(-86)
+25 + j*(-41)
+37 + j*(-102)
+-24 + j*(-126)
+-75 + j*(-99)
+-100 + j*(-59)
+-117 + j*(-15)
+-122 + j*(64)
+-17 + j*(167)
+188 + j*(89)
+176 + j*(-187)
+-116 + j*(-242)
+-204 + j*(13)
+1 + j*(68)
+-25 + j*(-117)
+-233 + j*(-18)
+-103 + j*(222)
+136 + j*(86)
+-18 + j*(-122)
+-207 + j*(60)
+-23 + j*(254)
+156 + j*(115)
+74 + j*(1)
+53 + j*(74)
+169 + j*(38)
+151 + j*(-116)
+9 + j*(-153)
+-66 + j*(-77)
+-56 + j*(-2)
+1 + j*(18)
+27 + j*(-35)
+-42 + j*(-64)
+-83 + j*(21)
+1 + j*(78)
+62 + j*(10)
+25 + j*(-33)
+25 + j*(-25)
+24 + j*(-86)
+-94 + j*(-115)
+-179 + j*(21)
+-87 + j*(153)
+40 + j*(136)
+84 + j*(81)
+120 + j*(39)
+149 + j*(-49)
+94 + j*(-165)
+-58 + j*(-222)
+-250 + j*(-126)
+-292 + j*(157)
+-4 + j*(361)
+327 + j*(146)
+220 + j*(-244)
+-158 + j*(-236)
+-211 + j*(86)
+41 + j*(154)
+88 + j*(-45)
+-88 + j*(-61)
+-89 + j*(115)
+85 + j*(123)
+98 + j*(-33)
+-39 + j*(-42)
+-38 + j*(100)
+124 + j*(104)
+147 + j*(-66)
+-16 + j*(-96)
+-28 + j*(74)
+194 + j*(75)
+242 + j*(-210)
+-58 + j*(-366)
+-318 + j*(-151)
+-255 + j*(142)
+-24 + j*(223)
+139 + j*(105)
+119 + j*(-82)
+-71 + j*(-118)
+-136 + j*(92)
+116 + j*(196)
+286 + j*(-92)
+3 + j*(-344)
+-312 + j*(-116)
+-159 + j*(211)
+137 + j*(116)
+62 + j*(-134)
+-164 + j*(-58)
+-81 + j*(167)
+156 + j*(90)
+97 + j*(-168)
+-182 + j*(-148)
+-221 + j*(134)
+23 + j*(240)
+168 + j*(72)
+91 + j*(-66)
+-8 + j*(-58)
+-41 + j*(-9)
+-33 + j*(50)
+40 + j*(79)
+105 + j*(7)
+54 + j*(-72)
+-13 + j*(-45)
+8 + j*(-11)
+19 + j*(-43)
+-23 + j*(-54)
+-45 + j*(-25)
+-45 + j*(-5)
+-40 + j*(20)
+-13 + j*(32)
+-4 + j*(18)
+0 + j*(25)
+30 + j*(4)
+-22 + j*(-54)
+-124 + j*(45)
+15 + j*(223)
+294 + j*(79)
+206 + j*(-286)
+-193 + j*(-308)
+-334 + j*(42)
+-115 + j*(271)
+130 + j*(213)
+218 + j*(28)
+136 + j*(-144)
+-40 + j*(-163)
+-117 + j*(-43)
+-76 + j*(32)
+-50 + j*(56)
+8 + j*(89)
+77 + j*(14)
+-23 + j*(-69)
+-119 + j*(71)
+39 + j*(196)
+177 + j*(67)
+111 + j*(-15)
+162 + j*(22)
+255 + j*(-180)
+-35 + j*(-395)
+-370 + j*(-116)
+-168 + j*(276)
+217 + j*(171)
+198 + j*(-155)
+-37 + j*(-199)
+-114 + j*(-66)
+-65 + j*(12)
+12 + j*(21)
+74 + j*(-71)
+-16 + j*(-208)
+-224 + j*(-183)
+-316 + j*(28)
+-198 + j*(214)
+-19 + j*(222)
+58 + j*(128)
+44 + j*(74)
+54 + j*(69)
+66 + j*(15)
+-12 + j*(-14)
+-53 + j*(98)
+100 + j*(182)
+267 + j*(35)
+209 + j*(-199)
+-7 + j*(-283)
+-209 + j*(-177)
+-248 + j*(46)
+-88 + j*(182)
+49 + j*(96)
+-12 + j*(27)
+-16 + j*(144)
+192 + j*(141)
+260 + j*(-132)
+6 + j*(-308)
+-255 + j*(-176)
+-310 + j*(85)
+-154 + j*(310)
+153 + j*(320)
+295 + j*(34)
+78 + j*(-156)
+-93 + j*(13)
+53 + j*(149)
+153 + j*(42)
+105 + j*(16)
+206 + j*(45)
+294 + j*(-177)
+48 + j*(-372)
+-206 + j*(-206)
+-146 + j*(11)
+-28 + j*(11)
+-23 + j*(-14)
+11 + j*(-11)
+11 + j*(-80)
+-82 + j*(-71)
+-68 + j*(40)
+57 + j*(23)
+50 + j*(-105)
+-58 + j*(-122)
+-83 + j*(-64)
+-75 + j*(-74)
+-138 + j*(-86)
+-218 + j*(-9)
+-206 + j*(144)
+-28 + j*(240)
+173 + j*(89)
+70 + j*(-199)
+-288 + j*(-182)
+-414 + j*(196)
+-140 + j*(471)
+180 + j*(421)
+344 + j*(233)
+393 + j*(-2)
+255 + j*(-228)
+6 + j*(-238)
+-80 + j*(-84)
+-32 + j*(-26)
+-45 + j*(-15)
+-14 + j*(54)
+83 + j*(-1)
+-13 + j*(-116)
+-156 + j*(29)
+28 + j*(211)
+238 + j*(10)
+42 + j*(-211)
+-158 + j*(-20)
+36 + j*(136)
+151 + j*(-74)
+-80 + j*(-159)
+-156 + j*(83)
+73 + j*(162)
+150 + j*(-23)
+24 + j*(-78)
+12 + j*(1)
+81 + j*(-30)
+38 + j*(-105)
+-42 + j*(-90)
+-61 + j*(-25)
+-17 + j*(21)
+47 + j*(-12)
+19 + j*(-93)
+-73 + j*(-64)
+-35 + j*(26)
+56 + j*(-37)
+-26 + j*(-142)
+-135 + j*(-66)
+-85 + j*(6)
+-86 + j*(-47)
+-186 + j*(16)
+-110 + j*(165)
+38 + j*(110)
+-9 + j*(1)
+-79 + j*(61)
+-27 + j*(107)
+-32 + j*(104)
+21 + j*(213)
+260 + j*(155)
+242 + j*(-181)
+-134 + j*(-202)
+-160 + j*(181)
+224 + j*(190)
+216 + j*(-189)
+-139 + j*(-156)
+-69 + j*(175)
+260 + j*(72)
+172 + j*(-259)
+-123 + j*(-233)
+-154 + j*(-45)
+-105 + j*(-16)
+-145 + j*(29)
+-96 + j*(141)
+24 + j*(151)
+79 + j*(110)
+144 + j*(78)
+197 + j*(-41)
+103 + j*(-162)
+-15 + j*(-137)
+-24 + j*(-78)
+-23 + j*(-83)
+-43 + j*(-78)
+-48 + j*(-87)
+-113 + j*(-107)
+-196 + j*(-16)
+-129 + j*(103)
+-30 + j*(62)
+-91 + j*(1)
+-163 + j*(100)
+-78 + j*(225)
+67 + j*(235)
+181 + j*(153)
+216 + j*(4)
+111 + j*(-110)
+-6 + j*(-66)
+16 + j*(-4)
+25 + j*(-49)
+-65 + j*(-36)
+-69 + j*(85)
+42 + j*(132)
+122 + j*(88)
+175 + j*(18)
+159 + j*(-100)
+31 + j*(-126)
+30 + j*(-3)
+199 + j*(-62)
+119 + j*(-332)
+-223 + j*(-313)
+-296 + j*(4)
+-91 + j*(117)
+-18 + j*(42)
+1 + j*(54)
+105 + j*(-19)
+12 + j*(-202)
+-216 + j*(-123)
+-162 + j*(92)
+-13 + j*(24)
+-153 + j*(-72)
+-262 + j*(153)
+-11 + j*(321)
+198 + j*(113)
+51 + j*(-77)
+-103 + j*(44)
+4 + j*(185)
+151 + j*(115)
+144 + j*(-12)
+74 + j*(-54)
+22 + j*(-39)
+2 + j*(20)
+88 + j*(78)
+228 + j*(-34)
+148 + j*(-286)
+-177 + j*(-305)
+-310 + j*(6)
+-71 + j*(195)
+112 + j*(17)
+-47 + j*(-148)
+-235 + j*(1)
+-142 + j*(242)
+117 + j*(265)
+272 + j*(52)
+167 + j*(-184)
+-72 + j*(-199)
+-171 + j*(-28)
+-112 + j*(79)
+-78 + j*(122)
+5 + j*(219)
+218 + j*(185)
+282 + j*(-69)
+71 + j*(-206)
+-76 + j*(-67)
+15 + j*(54)
+127 + j*(-10)
+110 + j*(-136)
+-12 + j*(-192)
+-136 + j*(-111)
+-108 + j*(28)
+11 + j*(23)
+-10 + j*(-81)
+-129 + j*(-52)
+-131 + j*(86)
+-10 + j*(163)
+151 + j*(122)
+234 + j*(-81)
+56 + j*(-294)
+-225 + j*(-198)
+-224 + j*(59)
+-66 + j*(95)
+-71 + j*(54)
+-40 + j*(144)
+126 + j*(98)
+96 + j*(-96)
+-75 + j*(-85)
+-69 + j*(23)
+-50 + j*(-3)
+-115 + j*(64)
+8 + j*(177)
+144 + j*(28)
+-23 + j*(-90)
+-106 + j*(107)
+122 + j*(170)
+179 + j*(-56)
+0 + j*(-101)
+4 + j*(23)
+95 + j*(-48)
+-16 + j*(-141)
+-111 + j*(-45)
+-58 + j*(23)
+-47 + j*(-2)
+-88 + j*(36)
+-48 + j*(116)
+69 + j*(120)
+136 + j*(-18)
+-23 + j*(-159)
+-256 + j*(24)
+-80 + j*(365)
+330 + j*(245)
+287 + j*(-135)
+37 + j*(-103)
+168 + j*(-3)
+186 + j*(-301)
+-249 + j*(-327)
+-316 + j*(146)
+108 + j*(220)
+131 + j*(-115)
+-116 + j*(-52)
+32 + j*(124)
+145 + j*(-91)
+-105 + j*(-140)
+-87 + j*(123)
+180 + j*(47)
+63 + j*(-209)
+-160 + j*(-81)
+-38 + j*(88)
+64 + j*(-7)
+20 + j*(-28)
+115 + j*(-38)
+99 + j*(-277)
+-234 + j*(-341)
+-409 + j*(-42)
+-264 + j*(163)
+-161 + j*(181)
+-78 + j*(243)
+97 + j*(187)
+78 + j*(-12)
+-109 + j*(10)
+-78 + j*(188)
+74 + j*(170)
+57 + j*(90)
+52 + j*(166)
+225 + j*(163)
+296 + j*(-59)
+115 + j*(-217)
+-72 + j*(-135)
+-82 + j*(17)
+-6 + j*(81)
+66 + j*(100)
+185 + j*(84)
+301 + j*(-90)
+166 + j*(-356)
+-186 + j*(-339)
+-274 + j*(-1)
+9 + j*(103)
+66 + j*(-180)
+-290 + j*(-209)
+-366 + j*(228)
+91 + j*(401)
+346 + j*(-5)
+26 + j*(-292)
+-251 + j*(-59)
+-98 + j*(175)
+66 + j*(78)
+-12 + j*(8)
+-7 + j*(115)
+160 + j*(83)
+155 + j*(-130)
+-54 + j*(-180)
+-153 + j*(-28)
+-89 + j*(84)
+-6 + j*(110)
+89 + j*(86)
+142 + j*(-53)
+-13 + j*(-197)
+-251 + j*(-72)
+-217 + j*(242)
+96 + j*(346)
+317 + j*(132)
+251 + j*(-104)
+109 + j*(-132)
+105 + j*(-97)
+118 + j*(-192)
+-37 + j*(-279)
+-204 + j*(-156)
+-153 + j*(13)
+-40 + j*(-14)
+-92 + j*(-90)
+-186 + j*(-26)
+-175 + j*(81)
+-127 + j*(153)
+-21 + j*(222)
+151 + j*(170)
+187 + j*(-21)
+50 + j*(-118)
+-42 + j*(-59)
+-39 + j*(-8)
+-21 + j*(18)
+40 + j*(1)
+13 + j*(-132)
+-224 + j*(-133)
+-315 + j*(181)
+-11 + j*(388)
+260 + j*(185)
+177 + j*(-47)
+52 + j*(-30)
+74 + j*(-1)
+69 + j*(-54)
+11 + j*(-70)
+-47 + j*(-48)
+-98 + j*(51)
+21 + j*(202)
+278 + j*(107)
+259 + j*(-214)
+-47 + j*(-292)
+-184 + j*(-76)
+-87 + j*(51)
+-16 + j*(53)
+48 + j*(52)
+106 + j*(-47)
+0 + j*(-146)
+-110 + j*(-61)
+-61 + j*(11)
+-78 + j*(-21)
+-138 + j*(102)
+61 + j*(233)
+269 + j*(23)
+98 + j*(-221)
+-117 + j*(-100)
+-11 + j*(49)
+83 + j*(-84)
+-86 + j*(-168)
+-194 + j*(12)
+-35 + j*(151)
+134 + j*(22)
+34 + j*(-185)
+-217 + j*(-127)
+-222 + j*(148)
+38 + j*(204)
+94 + j*(-13)
+-94 + j*(-19)
+-34 + j*(184)
+206 + j*(78)
+87 + j*(-186)
+-176 + j*(-74)
+-70 + j*(165)
+139 + j*(65)
+45 + j*(-117)
+-125 + j*(-42)
+-93 + j*(124)
+66 + j*(168)
+198 + j*(37)
+115 + j*(-163)
+-119 + j*(-122)
+-93 + j*(118)
+155 + j*(82)
+110 + j*(-169)
+-119 + j*(-132)
+-86 + j*(26)
+-31 + j*(-42)
+-178 + j*(-10)
+-111 + j*(211)
+130 + j*(144)
+46 + j*(-66)
+-131 + j*(70)
+38 + j*(249)
+221 + j*(107)
+157 + j*(-16)
+155 + j*(-5)
+179 + j*(-116)
+18 + j*(-182)
+-58 + j*(-21)
+92 + j*(47)
+168 + j*(-78)
+130 + j*(-164)
+100 + j*(-258)
+-71 + j*(-373)
+-326 + j*(-263)
+-372 + j*(6)
+-234 + j*(173)
+-55 + j*(218)
+138 + j*(98)
+81 + j*(-190)
+-284 + j*(-191)
+-366 + j*(220)
+19 + j*(387)
+223 + j*(95)
+37 + j*(-59)
+-33 + j*(66)
+74 + j*(77)
+67 + j*(-16)
+18 + j*(-8)
+35 + j*(-17)
+-20 + j*(-47)
+-59 + j*(38)
+51 + j*(74)
+84 + j*(-63)
+-71 + j*(-116)
+-163 + j*(29)
+-78 + j*(157)
+45 + j*(167)
+136 + j*(98)
+145 + j*(-29)
+32 + j*(-86)
+-31 + j*(0)
+45 + j*(35)
+37 + j*(-54)
+-79 + j*(-17)
+-37 + j*(136)
+124 + j*(117)
+135 + j*(4)
+116 + j*(9)
+202 + j*(-54)
+114 + j*(-238)
+-129 + j*(-163)
+-43 + j*(97)
+244 + j*(-28)
+110 + j*(-376)
+-279 + j*(-310)
+-317 + j*(26)
+-120 + j*(119)
+-50 + j*(67)
+-16 + j*(54)
+-6 + j*(-23)
+-122 + j*(-19)
+-99 + j*(146)
+88 + j*(121)
+55 + j*(-42)
+-49 + j*(33)
+95 + j*(83)
+111 + j*(-130)
+-130 + j*(-122)
+-85 + j*(98)
+86 + j*(-28)
+-152 + j*(-158)
+-274 + j*(185)
+112 + j*(320)
+233 + j*(-37)
+-53 + j*(-80)
+35 + j*(146)
+236 + j*(-71)
+-59 + j*(-267)
+-232 + j*(49)
+74 + j*(153)
+74 + j*(-140)
+-220 + j*(-44)
+-60 + j*(252)
+216 + j*(71)
+47 + j*(-149)
+-83 + j*(-3)
+47 + j*(13)
+-41 + j*(-135)
+-235 + j*(13)
+-110 + j*(233)
+67 + j*(183)
+64 + j*(119)
+117 + j*(146)
+194 + j*(61)
+143 + j*(-20)
+128 + j*(15)
+204 + j*(-31)
+170 + j*(-153)
+68 + j*(-177)
+22 + j*(-149)
+-2 + j*(-132)
+5 + j*(-116)
+-2 + j*(-176)
+-142 + j*(-200)
+-238 + j*(-6)
+-39 + j*(161)
+194 + j*(-13)
+81 + j*(-310)
+-246 + j*(-333)
+-436 + j*(-70)
+-335 + j*(222)
+-67 + j*(279)
+45 + j*(95)
+-96 + j*(21)
+-137 + j*(187)
+50 + j*(249)
+135 + j*(106)
+70 + j*(63)
+136 + j*(97)
+212 + j*(-73)
+5 + j*(-238)
+-239 + j*(-66)
+-150 + j*(211)
+103 + j*(215)
+163 + j*(35)
+57 + j*(-25)
+30 + j*(62)
+146 + j*(84)
+233 + j*(-52)
+152 + j*(-210)
+-9 + j*(-251)
+-136 + j*(-193)
+-221 + j*(-83)
+-220 + j*(81)
+-87 + j*(194)
+66 + j*(155)
+107 + j*(48)
+74 + j*(-18)
+21 + j*(-40)
+-28 + j*(-1)
+13 + j*(69)
+110 + j*(30)
+85 + j*(-83)
+-18 + j*(-68)
+13 + j*(9)
+90 + j*(-57)
+10 + j*(-161)
+-117 + j*(-118)
+-137 + j*(-20)
+-113 + j*(33)
+-80 + j*(78)
+-25 + j*(77)
+-42 + j*(56)
+-46 + j*(147)
+124 + j*(187)
+217 + j*(-13)
+31 + j*(-104)
+2 + j*(95)
+279 + j*(64)
+256 + j*(-303)
+-119 + j*(-344)
+-187 + j*(-61)
+-23 + j*(-69)
+-168 + j*(-178)
+-296 + j*(68)
+-33 + j*(220)
+90 + j*(-9)
+-116 + j*(-49)
+-62 + j*(161)
+171 + j*(33)
+8 + j*(-227)
+-273 + j*(-74)
+-165 + j*(191)
+39 + j*(132)
+1 + j*(-1)
+-91 + j*(30)
+-94 + j*(113)
+-35 + j*(174)
+59 + j*(161)
+62 + j*(87)
+10 + j*(141)
+151 + j*(231)
+321 + j*(64)
+194 + j*(-141)
+42 + j*(-47)
+175 + j*(44)
+270 + j*(-148)
+98 + j*(-295)
+-53 + j*(-226)
+-73 + j*(-174)
+-142 + j*(-168)
+-224 + j*(-60)
+-188 + j*(91)
+-53 + j*(160)
+82 + j*(100)
+92 + j*(-41)
+-30 + j*(-74)
+-54 + j*(42)
+82 + j*(57)
+119 + j*(-100)
+-28 + j*(-187)
+-156 + j*(-103)
+-156 + j*(23)
+-69 + j*(81)
+-1 + j*(32)
+-45 + j*(-26)
+-103 + j*(35)
+-39 + j*(94)
+-1 + j*(37)
+-69 + j*(52)
+-14 + j*(148)
+107 + j*(83)
+38 + j*(-28)
+-47 + j*(65)
+69 + j*(149)
+162 + j*(56)
+148 + j*(-6)
+187 + j*(-57)
+151 + j*(-212)
+-47 + j*(-245)
+-120 + j*(-114)
+-88 + j*(-104)
+-215 + j*(-94)
+-254 + j*(150)
+25 + j*(280)
+215 + j*(49)
+75 + j*(-141)
+-57 + j*(-86)
+-49 + j*(-52)
+-116 + j*(-78)
+-218 + j*(32)
+-154 + j*(216)
+44 + j*(256)
+159 + j*(120)
+93 + j*(11)
+29 + j*(79)
+168 + j*(136)
+289 + j*(-55)
+121 + j*(-248)
+-80 + j*(-144)
+-9 + j*(2)
+95 + j*(-88)
+-16 + j*(-204)
+-158 + j*(-133)
+-169 + j*(-13)
+-126 + j*(45)
+-87 + j*(78)
+-39 + j*(97)
+15 + j*(76)
+16 + j*(18)
+-62 + j*(27)
+-51 + j*(170)
+177 + j*(209)
+314 + j*(-57)
+86 + j*(-280)
+-158 + j*(-137)
+-91 + j*(60)
+25 + j*(33)
+6 + j*(-6)
+29 + j*(25)
+83 + j*(-34)
+33 + j*(-112)
+-38 + j*(-119)
+-115 + j*(-112)
+-223 + j*(7)
+-120 + j*(232)
+189 + j*(190)
+219 + j*(-157)
+-121 + j*(-256)
+-274 + j*(45)
+-37 + j*(234)
+153 + j*(59)
+25 + j*(-115)
+-133 + j*(-16)
+-61 + j*(133)
+59 + j*(97)
+47 + j*(34)
+62 + j*(63)
+148 + j*(-17)
+33 + j*(-173)
+-186 + j*(-53)
+-88 + j*(214)
+206 + j*(169)
+242 + j*(-101)
+56 + j*(-220)
+-110 + j*(-164)
+-190 + j*(8)
+-42 + j*(207)
+250 + j*(103)
+214 + j*(-243)
+-114 + j*(-279)
+-187 + j*(-39)
+-49 + j*(-1)
+-78 + j*(-83)
+-148 + j*(-26)
+-132 + j*(13)
+-185 + j*(52)
+-146 + j*(223)
+103 + j*(230)
+155 + j*(-30)
+-83 + j*(-110)
+-197 + j*(76)
+-116 + j*(229)
+21 + j*(315)
+247 + j*(280)
+337 + j*(28)
+148 + j*(-100)
+95 + j*(46)
+279 + j*(8)
+224 + j*(-229)
+4 + j*(-213)
+19 + j*(-83)
+58 + j*(-142)
+-37 + j*(-124)
+52 + j*(-28)
+164 + j*(-220)
+-91 + j*(-414)
+-366 + j*(-209)
+-298 + j*(42)
+-187 + j*(81)
+-144 + j*(138)
+12 + j*(137)
+37 + j*(-57)
+-192 + j*(-78)
+-225 + j*(185)
+33 + j*(250)
+116 + j*(46)
+-38 + j*(-6)
+-51 + j*(135)
+100 + j*(148)
+154 + j*(6)
+57 + j*(-79)
+-26 + j*(-34)
+-6 + j*(18)
+17 + j*(-15)
+-52 + j*(-29)
+-91 + j*(77)
+27 + j*(167)
+163 + j*(81)
+145 + j*(-67)
+37 + j*(-111)
+-34 + j*(-67)
+-49 + j*(-6)
+-13 + j*(38)
+33 + j*(25)
+28 + j*(-11)
+10 + j*(5)
+55 + j*(19)
+85 + j*(-62)
+-13 + j*(-122)
+-99 + j*(-35)
+-28 + j*(44)
+11 + j*(-31)
+-107 + j*(-26)
+-80 + j*(164)
+177 + j*(151)
+196 + j*(-140)
+-95 + j*(-177)
+-123 + j*(104)
+161 + j*(116)
+181 + j*(-173)
+-81 + j*(-233)
+-182 + j*(-49)
+-103 + j*(49)
+-45 + j*(55)
+-7 + j*(40)
+-18 + j*(9)
+-38 + j*(62)
+76 + j*(97)
+147 + j*(-59)
+1 + j*(-163)
+-95 + j*(-69)
+-64 + j*(-48)
+-163 + j*(-59)
+-209 + j*(148)
+40 + j*(250)
+170 + j*(28)
+2 + j*(-81)
+-56 + j*(37)
+15 + j*(49)
+-16 + j*(30)
+20 + j*(98)
+111 + j*(29)
+21 + j*(-49)
+-20 + j*(66)
+112 + j*(75)
+100 + j*(-32)
+85 + j*(42)
+291 + j*(-49)
+173 + j*(-420)
+-298 + j*(-370)
+-324 + j*(59)
+-48 + j*(74)
+-159 + j*(-41)
+-181 + j*(245)
+249 + j*(251)
+287 + j*(-256)
+-209 + j*(-344)
+-335 + j*(52)
+-99 + j*(153)
+-103 + j*(59)
+-148 + j*(183)
+20 + j*(267)
+143 + j*(168)
+164 + j*(77)
+154 + j*(-22)
+39 + j*(-74)
+-16 + j*(31)
+81 + j*(57)
+69 + j*(-30)
+8 + j*(27)
+122 + j*(63)
+148 + j*(-88)
+8 + j*(-102)
+31 + j*(-4)
+88 + j*(-91)
+-49 + j*(-115)
+-43 + j*(47)
+124 + j*(12)
+73 + j*(-129)
+17 + j*(-69)
+127 + j*(-136)
+-30 + j*(-349)
+-322 + j*(-190)
+-207 + j*(65)
+-92 + j*(-72)
+-361 + j*(-65)
+-357 + j*(356)
+94 + j*(453)
+255 + j*(125)
+100 + j*(25)
+146 + j*(93)
+240 + j*(-49)
+127 + j*(-201)
+-4 + j*(-204)
+-99 + j*(-184)
+-204 + j*(-93)
+-183 + j*(53)
+-101 + j*(95)
+-60 + j*(116)
+37 + j*(127)
+93 + j*(2)
+-21 + j*(-56)
+-40 + j*(37)
+48 + j*(-22)
+-98 + j*(-139)
+-279 + j*(56)
+-123 + j*(288)
+81 + j*(230)
+97 + j*(149)
+161 + j*(140)
+210 + j*(7)
+93 + j*(-68)
+64 + j*(6)
+116 + j*(-44)
+-8 + j*(-90)
+-49 + j*(92)
+177 + j*(143)
+261 + j*(-70)
+144 + j*(-159)
+139 + j*(-167)
+78 + j*(-310)
+-162 + j*(-307)
+-234 + j*(-112)
+-184 + j*(-62)
+-274 + j*(4)
+-209 + j*(250)
+97 + j*(261)
+163 + j*(23)
+49 + j*(-13)
+113 + j*(1)
+88 + j*(-163)
+-120 + j*(-135)
+-76 + j*(54)
+69 + j*(-40)
+-93 + j*(-144)
+-165 + j*(64)
+66 + j*(83)
+15 + j*(-163)
+-262 + j*(-41)
+-98 + j*(272)
+240 + j*(97)
+84 + j*(-248)
+-245 + j*(-141)
+-202 + j*(138)
+-9 + j*(141)
+-1 + j*(28)
+-83 + j*(39)
+-77 + j*(132)
+23 + j*(163)
+81 + j*(83)
+12 + j*(46)
+16 + j*(149)
+179 + j*(144)
+218 + j*(-46)
+69 + j*(-117)
+20 + j*(-46)
+28 + j*(-66)
+-68 + j*(-49)
+-46 + j*(98)
+112 + j*(77)
+72 + j*(-54)
+-12 + j*(48)
+187 + j*(113)
+289 + j*(-169)
+-6 + j*(-335)
+-197 + j*(-103)
+-42 + j*(43)
+20 + j*(-68)
+-81 + j*(-54)
+-11 + j*(52)
+110 + j*(-62)
+-29 + j*(-222)
+-240 + j*(-105)
+-187 + j*(134)
+35 + j*(152)
+90 + j*(-28)
+-54 + j*(-78)
+-71 + j*(60)
+93 + j*(36)
+40 + j*(-177)
+-226 + j*(-124)
+-188 + j*(163)
+86 + j*(129)
+23 + j*(-124)
+-231 + j*(-31)
+-148 + j*(234)
+86 + j*(197)
+88 + j*(45)
+25 + j*(46)
+52 + j*(56)
+45 + j*(24)
+30 + j*(45)
+59 + j*(49)
+66 + j*(45)
+127 + j*(57)
+200 + j*(-73)
+43 + j*(-219)
+-136 + j*(-70)
+16 + j*(93)
+148 + j*(-98)
+-89 + j*(-221)
+-221 + j*(32)
+6 + j*(159)
+101 + j*(-30)
+-57 + j*(-80)
+-86 + j*(57)
+13 + j*(91)
+62 + j*(70)
+149 + j*(31)
+168 + j*(-148)
+-50 + j*(-239)
+-175 + j*(-48)
+-16 + j*(45)
+9 + j*(-124)
+-214 + j*(-118)
+-241 + j*(146)
+-8 + j*(228)
+90 + j*(82)
+18 + j*(32)
+32 + j*(85)
+107 + j*(50)
+110 + j*(-39)
+56 + j*(-98)
+-40 + j*(-115)
+-132 + j*(-23)
+-74 + j*(122)
+91 + j*(100)
+89 + j*(-47)
+-24 + j*(-38)
+23 + j*(49)
+101 + j*(-47)
+-33 + j*(-129)
+-115 + j*(35)
+75 + j*(115)
+168 + j*(-95)
+-33 + j*(-216)
+-160 + j*(-74)
+-98 + j*(11)
+-95 + j*(-8)
+-118 + j*(54)
+-52 + j*(83)
+-64 + j*(42)
+-121 + j*(134)
+11 + j*(265)
+197 + j*(185)
+222 + j*(35)
+206 + j*(-37)
+188 + j*(-154)
+32 + j*(-243)
+-110 + j*(-148)
+-96 + j*(-51)
+-106 + j*(-40)
+-139 + j*(66)
+8 + j*(163)
+144 + j*(21)
+14 + j*(-112)
+-97 + j*(24)
+70 + j*(129)
+204 + j*(-57)
+37 + j*(-243)
+-178 + j*(-142)
+-157 + j*(46)
+-51 + j*(66)
+-57 + j*(59)
+1 + j*(157)
+222 + j*(100)
+239 + j*(-216)
+-88 + j*(-344)
+-288 + j*(-112)
+-199 + j*(47)
+-189 + j*(48)
+-208 + j*(198)
+13 + j*(298)
+150 + j*(100)
+-20 + j*(11)
+-41 + j*(216)
+219 + j*(242)
+327 + j*(5)
+231 + j*(-164)
+106 + j*(-264)
+-136 + j*(-272)
+-288 + j*(7)
+-48 + j*(240)
+183 + j*(67)
+69 + j*(-98)
+8 + j*(-6)
+122 + j*(-62)
+-15 + j*(-235)
+-255 + j*(-78)
+-135 + j*(192)
+119 + j*(133)
+104 + j*(-75)
+-58 + j*(-89)
+-105 + j*(45)
+6 + j*(143)
+162 + j*(75)
+156 + j*(-111)
+-13 + j*(-154)
+-62 + j*(-30)
+33 + j*(-12)
+28 + j*(-91)
+-11 + j*(-88)
+13 + j*(-136)
+-122 + j*(-258)
+-389 + j*(-124)
+-364 + j*(233)
+-42 + j*(342)
+110 + j*(139)
+2 + j*(38)
+-25 + j*(129)
+90 + j*(124)
+81 + j*(5)
+-28 + j*(35)
+36 + j*(149)
+177 + j*(70)
+100 + j*(-72)
+-10 + j*(13)
+117 + j*(105)
+227 + j*(-49)
+110 + j*(-186)
+2 + j*(-158)
+-42 + j*(-147)
+-136 + j*(-84)
+-80 + j*(61)
+59 + j*(-19)
+-93 + j*(-139)
+-214 + j*(105)
+108 + j*(238)
+248 + j*(-132)
+-146 + j*(-269)
+-270 + j*(115)
+57 + j*(209)
+85 + j*(-21)
+-40 + j*(62)
+174 + j*(110)
+185 + j*(-214)
+-194 + j*(-202)
+-136 + j*(186)
+248 + j*(59)
+61 + j*(-331)
+-327 + j*(-134)
+-161 + j*(205)
+70 + j*(64)
+-84 + j*(-35)
+-82 + j*(168)
+170 + j*(116)
+105 + j*(-159)
+-163 + j*(-94)
+-102 + j*(147)
+100 + j*(89)
+31 + j*(-79)
+-114 + j*(4)
+-25 + j*(144)
+112 + j*(64)
+41 + j*(-65)
+-84 + j*(9)
+-18 + j*(151)
+137 + j*(129)
+190 + j*(9)
+163 + j*(-89)
+85 + j*(-173)
+-68 + j*(-154)
+-93 + j*(26)
+119 + j*(64)
+183 + j*(-209)
+-139 + j*(-343)
+-365 + j*(-29)
+-107 + j*(252)
+180 + j*(51)
+11 + j*(-232)
+-279 + j*(-96)
+-200 + j*(193)
+42 + j*(170)
+37 + j*(-5)
+-93 + j*(13)
+-81 + j*(137)
+21 + j*(187)
+158 + j*(174)
+303 + j*(-10)
+155 + j*(-324)
+-275 + j*(-277)
+-348 + j*(180)
+57 + j*(327)
+197 + j*(1)
+-89 + j*(-71)
+-107 + j*(244)
+254 + j*(283)
+382 + j*(-61)
+137 + j*(-263)
+-69 + j*(-141)
+-19 + j*(32)
+138 + j*(8)
+135 + j*(-159)
+-20 + j*(-175)
+-9 + j*(-51)
+126 + j*(-153)
+-52 + j*(-384)
+-409 + j*(-234)
+-389 + j*(165)
+-78 + j*(276)
+81 + j*(133)
+94 + j*(11)
+42 + j*(-99)
+-103 + j*(-112)
+-155 + j*(25)
+-57 + j*(74)
+-47 + j*(23)
+-64 + j*(69)
+36 + j*(51)
+-16 + j*(-105)
+-230 + j*(-46)
+-211 + j*(189)
+-51 + j*(221)
+-39 + j*(208)
+67 + j*(312)
+308 + j*(188)
+240 + j*(-112)
+-30 + j*(-91)
+-16 + j*(126)
+153 + j*(117)
+170 + j*(12)
+156 + j*(-11)
+173 + j*(-64)
+130 + j*(-112)
+123 + j*(-123)
+100 + j*(-220)
+-86 + j*(-247)
+-170 + j*(-43)
+21 + j*(40)
+64 + j*(-161)
+-175 + j*(-176)
+-196 + j*(100)
+91 + j*(138)
+151 + j*(-144)
+-111 + j*(-234)
+-230 + j*(-19)
+-85 + j*(96)
+-11 + j*(9)
+-78 + j*(-10)
+-66 + j*(57)
+-17 + j*(30)
+-70 + j*(21)
+-45 + j*(133)
+139 + j*(109)
+154 + j*(-121)
+-70 + j*(-189)
+-165 + j*(-28)
+-98 + j*(46)
+-93 + j*(60)
+-33 + j*(136)
+93 + j*(59)
+-5 + j*(-81)
+-144 + j*(55)
+36 + j*(194)
+176 + j*(-16)
+-49 + j*(-146)
+-166 + j*(75)
+32 + j*(179)
+109 + j*(33)
+25 + j*(9)
+74 + j*(42)
+80 + j*(-77)
+-93 + j*(-79)
+-105 + j*(128)
+111 + j*(162)
+170 + j*(-36)
+-4 + j*(-98)
+-60 + j*(74)
+142 + j*(148)
+281 + j*(-80)
+70 + j*(-296)
+-184 + j*(-135)
+-49 + j*(103)
+166 + j*(-62)
+-46 + j*(-301)
+-354 + j*(-80)
+-202 + j*(281)
+147 + j*(244)
+206 + j*(-15)
+78 + j*(-109)
+20 + j*(-95)
+-17 + j*(-116)
+-112 + j*(-98)
+-159 + j*(30)
+-44 + j*(146)
+110 + j*(66)
+59 + j*(-88)
+-69 + j*(-35)
+13 + j*(67)
+104 + j*(-51)
+-37 + j*(-129)
+-83 + j*(6)
+40 + j*(-13)
+-67 + j*(-129)
+-181 + j*(74)
+120 + j*(185)
+238 + j*(-213)
+-223 + j*(-363)
+-411 + j*(107)
+-2 + j*(288)
+109 + j*(-43)
+-169 + j*(-46)
+-73 + j*(214)
+182 + j*(56)
+-7 + j*(-186)
+-223 + j*(5)
+-57 + j*(177)
+38 + j*(27)
+-137 + j*(19)
+-122 + j*(259)
+152 + j*(303)
+272 + j*(86)
+-58 + j*(-93)
+-100 + j*(0)
+-47 + j*(62)
+-12 + j*(48)
+-19 + j*(68)
+38 + j*(112)
+134 + j*(77)
+177 + j*(-38)
+98 + j*(-164)
+-70 + j*(-146)
+-91 + j*(26)
+86 + j*(44)
+100 + j*(-155)
+-105 + j*(-187)
+-153 + j*(-31)
+-88 + j*(-11)
+-148 + j*(4)
+-104 + j*(144)
+77 + j*(93)
+1 + j*(-83)
+-163 + j*(29)
+-42 + j*(179)
+59 + j*(88)
+6 + j*(103)
+173 + j*(161)
+295 + j*(-125)
+-27 + j*(-320)
+-240 + j*(-48)
+-51 + j*(89)
+-64 + j*(-56)
+-240 + j*(108)
+-5 + j*(366)
+302 + j*(178)
+229 + j*(-81)
+117 + j*(-100)
+71 + j*(-159)
+-107 + j*(-115)
+-44 + j*(127)
+263 + j*(4)
+87 + j*(-390)
+-380 + j*(-223)
+-282 + j*(247)
+94 + j*(209)
+51 + j*(-11)
+-28 + j*(110)
+204 + j*(122)
+228 + j*(-181)
+-72 + j*(-256)
+-180 + j*(-27)
+-45 + j*(78)
+35 + j*(24)
+47 + j*(-24)
+25 + j*(-95)
+-91 + j*(-107)
+-139 + j*(34)
+9 + j*(113)
+112 + j*(-32)
+-18 + j*(-163)
+-177 + j*(-57)
+-107 + j*(117)
+78 + j*(79)
+77 + j*(-130)
+-155 + j*(-194)
+-317 + j*(21)
+-192 + j*(254)
+25 + j*(245)
+75 + j*(124)
+42 + j*(116)
+113 + j*(134)
+172 + j*(31)
+92 + j*(-42)
+69 + j*(21)
+177 + j*(-21)
+120 + j*(-209)
+-117 + j*(-191)
+-136 + j*(36)
+48 + j*(42)
+5 + j*(-117)
+-158 + j*(-22)
+-24 + j*(159)
+185 + j*(-5)
+11 + j*(-269)
+-325 + j*(-140)
+-317 + j*(235)
+-3 + j*(373)
+219 + j*(210)
+212 + j*(26)
+151 + j*(-43)
+105 + j*(-101)
+-23 + j*(-127)
+-122 + j*(30)
+38 + j*(196)
+255 + j*(71)
+202 + j*(-150)
+57 + j*(-155)
+62 + j*(-115)
+39 + j*(-182)
+-60 + j*(-165)
+-47 + j*(-109)
+-64 + j*(-175)
+-222 + j*(-132)
+-204 + j*(82)
+8 + j*(83)
+1 + j*(-105)
+-180 + j*(-86)
+-175 + j*(76)
+-64 + j*(91)
+-54 + j*(36)
+-90 + j*(42)
+-106 + j*(91)
+-60 + j*(166)
+63 + j*(159)
+100 + j*(40)
+21 + j*(1)
+16 + j*(33)
+9 + j*(-4)
+-69 + j*(47)
+34 + j*(168)
+188 + j*(21)
+13 + j*(-138)
+-121 + j*(76)
+148 + j*(175)
+223 + j*(-135)
+-93 + j*(-193)
+-115 + j*(88)
+107 + j*(58)
+14 + j*(-93)
+-54 + j*(69)
+182 + j*(64)
+148 + j*(-245)
+-184 + j*(-229)
+-210 + j*(34)
+-93 + j*(59)
+-148 + j*(106)
+-1 + j*(295)
+303 + j*(149)
+215 + j*(-178)
+-49 + j*(-133)
+8 + j*(54)
+163 + j*(-39)
+81 + j*(-192)
+-59 + j*(-179)
+-118 + j*(-100)
+-118 + j*(-17)
+-53 + j*(13)
+-23 + j*(-49)
+-103 + j*(-74)
+-150 + j*(24)
+-73 + j*(118)
+40 + j*(91)
+52 + j*(-34)
+-111 + j*(-65)
+-180 + j*(177)
+151 + j*(338)
+451 + j*(-25)
+139 + j*(-444)
+-315 + j*(-242)
+-226 + j*(152)
+42 + j*(132)
+35 + j*(14)
+57 + j*(62)
+177 + j*(-66)
+-3 + j*(-282)
+-297 + j*(-113)
+-188 + j*(219)
+132 + j*(180)
+148 + j*(-101)
+-95 + j*(-163)
+-209 + j*(33)
+-90 + j*(197)
+86 + j*(182)
+173 + j*(62)
+156 + j*(-76)
+34 + j*(-168)
+-134 + j*(-119)
+-182 + j*(73)
+-31 + j*(220)
+190 + j*(178)
+297 + j*(-51)
+141 + j*(-304)
+-197 + j*(-269)
+-278 + j*(76)
+25 + j*(207)
+144 + j*(-59)
+-113 + j*(-132)
+-148 + j*(136)
+122 + j*(145)
+107 + j*(-110)
+-127 + j*(-78)
+-93 + j*(135)
+77 + j*(127)
+96 + j*(30)
+80 + j*(14)
+95 + j*(-9)
+99 + j*(-38)
+117 + j*(-107)
+3 + j*(-215)
+-190 + j*(-97)
+-77 + j*(134)
+146 + j*(0)
+-30 + j*(-206)
+-221 + j*(6)
+1 + j*(166)
+99 + j*(-44)
+-90 + j*(-54)
+-4 + j*(112)
+129 + j*(-68)
+-141 + j*(-153)
+-177 + j*(202)
+255 + j*(204)
+247 + j*(-276)
+-231 + j*(-282)
+-257 + j*(129)
+39 + j*(151)
+18 + j*(-12)
+-31 + j*(76)
+124 + j*(52)
+65 + j*(-145)
+-137 + j*(-75)
+-69 + j*(94)
+24 + j*(14)
+-105 + j*(13)
+-45 + j*(247)
+314 + j*(206)
+386 + j*(-235)
+-34 + j*(-457)
+-368 + j*(-156)
+-218 + j*(197)
+83 + j*(174)
+133 + j*(-45)
+3 + j*(-134)
+-103 + j*(-102)
+-164 + j*(-21)
+-149 + j*(93)
+-49 + j*(140)
+1 + j*(98)
+-2 + j*(107)
+66 + j*(122)
+112 + j*(45)
+75 + j*(13)
+108 + j*(7)
+89 + j*(-122)
+-135 + j*(-112)
+-146 + j*(194)
+220 + j*(252)
+347 + j*(-121)
+47 + j*(-301)
+-122 + j*(-133)
+-78 + j*(-59)
+-132 + j*(-39)
+-121 + j*(107)
+43 + j*(123)
+65 + j*(3)
+0 + j*(6)
+28 + j*(19)
+-25 + j*(-3)
+-30 + j*(155)
+253 + j*(176)
+336 + j*(-194)
+-51 + j*(-327)
+-173 + j*(32)
+180 + j*(102)
+216 + j*(-272)
+-151 + j*(-323)
+-221 + j*(-20)
+2 + j*(30)
+21 + j*(-152)
+-139 + j*(-194)
+-252 + j*(-92)
+-257 + j*(56)
+-141 + j*(144)
+-59 + j*(66)
+-171 + j*(40)
+-189 + j*(245)
+78 + j*(329)
+228 + j*(83)
+52 + j*(-64)
+-35 + j*(65)
+88 + j*(93)
+81 + j*(-29)
+-19 + j*(4)
+51 + j*(73)
+91 + j*(-49)
+-89 + j*(-61)
+-86 + j*(194)
+256 + j*(208)
+338 + j*(-194)
+-61 + j*(-372)
+-310 + j*(-57)
+-134 + j*(196)
+39 + j*(155)
+78 + j*(124)
+184 + j*(71)
+158 + j*(-110)
+-35 + j*(-86)
+41 + j*(105)
+264 + j*(-45)
+71 + j*(-322)
+-231 + j*(-133)
+-52 + j*(143)
+177 + j*(-59)
+-62 + j*(-261)
+-265 + j*(-12)
+-57 + j*(189)
+100 + j*(47)
+11 + j*(-28)
+30 + j*(59)
+171 + j*(-17)
+115 + j*(-232)
+-136 + j*(-275)
+-298 + j*(-68)
+-198 + j*(163)
+26 + j*(162)
+63 + j*(-18)
+-88 + j*(-41)
+-87 + j*(114)
+82 + j*(100)
+62 + j*(-83)
+-148 + j*(-65)
+-165 + j*(178)
+78 + j*(281)
+283 + j*(105)
+230 + j*(-146)
+14 + j*(-204)
+-83 + j*(-59)
+19 + j*(8)
+47 + j*(-107)
+-103 + j*(-122)
+-119 + j*(39)
+34 + j*(43)
+8 + j*(-108)
+-144 + j*(-64)
+-92 + j*(64)
+-23 + j*(-25)
+-202 + j*(-58)
+-268 + j*(207)
+-1 + j*(356)
+174 + j*(184)
+100 + j*(89)
+133 + j*(158)
+271 + j*(72)
+241 + j*(-103)
+148 + j*(-155)
+100 + j*(-218)
+-76 + j*(-274)
+-255 + j*(-100)
+-162 + j*(118)
+-14 + j*(100)
+-36 + j*(74)
+29 + j*(173)
+219 + j*(96)
+190 + j*(-135)
+-16 + j*(-155)
+-52 + j*(0)
+69 + j*(35)
+124 + j*(-68)
+57 + j*(-160)
+-52 + j*(-144)
+-59 + j*(-53)
+17 + j*(-84)
+-78 + j*(-204)
+-276 + j*(-84)
+-190 + j*(167)
+47 + j*(124)
+13 + j*(-64)
+-138 + j*(-23)
+-124 + j*(95)
+-76 + j*(151)
+35 + j*(229)
+257 + j*(121)
+202 + j*(-192)
+-126 + j*(-186)
+-129 + j*(104)
+112 + j*(78)
+50 + j*(-122)
+-115 + j*(-42)
+-47 + j*(78)
+13 + j*(50)
+39 + j*(70)
+154 + j*(0)
+69 + j*(-195)
+-146 + j*(-127)
+-76 + j*(21)
+-59 + j*(-121)
+-358 + j*(-37)
+-269 + j*(436)
+284 + j*(436)
+382 + j*(-49)
+68 + j*(-164)
+28 + j*(-40)
+11 + j*(-114)
+-161 + j*(-1)
+25 + j*(226)
+277 + j*(-13)
+2 + j*(-267)
+-229 + j*(18)
+38 + j*(206)
+164 + j*(-23)
+-12 + j*(-69)
+23 + j*(59)
+113 + j*(-27)
+19 + j*(-70)
+52 + j*(20)
+153 + j*(-98)
+1 + j*(-229)
+-131 + j*(-111)
+-78 + j*(-48)
+-129 + j*(-68)
+-166 + j*(77)
+5 + j*(139)
+53 + j*(0)
+-34 + j*(21)
+91 + j*(74)
+140 + j*(-159)
+-173 + j*(-236)
+-292 + j*(107)
+22 + j*(258)
+171 + j*(2)
+-24 + j*(-113)
+-100 + j*(34)
+14 + j*(82)
+34 + j*(-3)
+-37 + j*(-2)
+-23 + j*(80)
+86 + j*(86)
+136 + j*(-40)
+23 + j*(-136)
+-95 + j*(-59)
+-56 + j*(43)
+0 + j*(30)
+-11 + j*(40)
+77 + j*(76)
+170 + j*(-75)
+3 + j*(-244)
+-219 + j*(-118)
+-163 + j*(91)
+-27 + j*(72)
+-74 + j*(15)
+-110 + j*(128)
+45 + j*(200)
+165 + j*(61)
+72 + j*(-80)
+-64 + j*(-24)
+-37 + j*(105)
+81 + j*(119)
+138 + j*(49)
+156 + j*(-16)
+142 + j*(-117)
+9 + j*(-184)
+-108 + j*(-65)
+-1 + j*(55)
+105 + j*(-69)
+-52 + j*(-182)
+-187 + j*(-1)
+-2 + j*(153)
+178 + j*(-25)
+27 + j*(-255)
+-250 + j*(-187)
+-313 + j*(76)
+-156 + j*(240)
+-13 + j*(222)
+21 + j*(215)
+143 + j*(276)
+366 + j*(147)
+343 + j*(-151)
+117 + j*(-214)
+105 + j*(-119)
+141 + j*(-264)
+-132 + j*(-344)
+-269 + j*(-49)
+-8 + j*(69)
+23 + j*(-182)
+-247 + j*(-142)
+-164 + j*(129)
+55 + j*(-15)
+-192 + j*(-189)
+-375 + j*(148)
+-27 + j*(369)
+183 + j*(85)
+-32 + j*(-37)
+-41 + j*(161)
+185 + j*(100)
+115 + j*(-148)
+-120 + j*(-119)
+-140 + j*(70)
+-25 + j*(124)
+41 + j*(73)
+18 + j*(6)
+-73 + j*(35)
+-45 + j*(182)
+153 + j*(185)
+195 + j*(-16)
+21 + j*(-59)
+9 + j*(117)
+218 + j*(127)
+294 + j*(-98)
+137 + j*(-260)
+-60 + j*(-227)
+-136 + j*(-63)
+-22 + j*(70)
+148 + j*(-11)
+111 + j*(-217)
+-107 + j*(-260)
+-231 + j*(-105)
+-192 + j*(38)
+-115 + j*(89)
+-54 + j*(93)
+-22 + j*(81)
+1 + j*(84)
+52 + j*(76)
+77 + j*(13)
+37 + j*(-25)
+25 + j*(8)
+88 + j*(-7)
+87 + j*(-119)
+-45 + j*(-185)
+-189 + j*(-96)
+-198 + j*(83)
+-51 + j*(183)
+87 + j*(113)
+77 + j*(4)
+25 + j*(16)
+90 + j*(40)
+155 + j*(-81)
+42 + j*(-221)
+-137 + j*(-199)
+-225 + j*(-76)
+-243 + j*(45)
+-204 + j*(182)
+-61 + j*(288)
+133 + j*(248)
+224 + j*(81)
+153 + j*(-76)
+4 + j*(-97)
+-74 + j*(21)
+14 + j*(138)
+168 + j*(95)
+193 + j*(-69)
+64 + j*(-153)
+-27 + j*(-81)
+20 + j*(-16)
+66 + j*(-81)
+-18 + j*(-142)
+-101 + j*(-75)
+-67 + j*(-4)
+-41 + j*(-32)
+-103 + j*(-24)
+-98 + j*(81)
+29 + j*(103)
+74 + j*(-22)
+-47 + j*(-78)
+-127 + j*(41)
+-26 + j*(160)
+125 + j*(113)
+160 + j*(-31)
+75 + j*(-139)
+-60 + j*(-154)
+-174 + j*(-51)
+-153 + j*(119)
+6 + j*(189)
+113 + j*(96)
+94 + j*(30)
+121 + j*(30)
+172 + j*(-88)
+10 + j*(-219)
+-187 + j*(-54)
+-39 + j*(184)
+237 + j*(52)
+151 + j*(-251)
+-156 + j*(-244)
+-231 + j*(13)
+-58 + j*(145)
+87 + j*(50)
+42 + j*(-88)
+-91 + j*(-62)
+-61 + j*(79)
+98 + j*(30)
+33 + j*(-157)
+-182 + j*(-86)
+-115 + j*(130)
+73 + j*(50)
+-46 + j*(-101)
+-185 + j*(64)
+5 + j*(214)
+159 + j*(35)
+18 + j*(-108)
+-103 + j*(-11)
+-60 + j*(83)
+-4 + j*(95)
+47 + j*(91)
+85 + j*(33)
+40 + j*(-16)
+4 + j*(17)
+15 + j*(41)
+26 + j*(81)
+150 + j*(123)
+303 + j*(-62)
+138 + j*(-344)
+-212 + j*(-277)
+-256 + j*(30)
+-73 + j*(128)
+-6 + j*(70)
+5 + j*(75)
+61 + j*(65)
+85 + j*(18)
+101 + j*(-24)
+77 + j*(-115)
+-62 + j*(-132)
+-110 + j*(13)
+10 + j*(68)
+47 + j*(-10)
+30 + j*(-11)
+99 + j*(-71)
+-31 + j*(-247)
+-332 + j*(-99)
+-231 + j*(294)
+177 + j*(280)
+240 + j*(-62)
+8 + j*(-164)
+-102 + j*(-46)
+-88 + j*(66)
+23 + j*(156)
+206 + j*(66)
+171 + j*(-167)
+-32 + j*(-187)
+-60 + j*(-83)
+-61 + j*(-118)
+-185 + j*(-63)
+-129 + j*(107)
+15 + j*(49)
+-84 + j*(-28)
+-100 + j*(136)
+112 + j*(112)
+54 + j*(-110)
+-141 + j*(-11)
+1 + j*(137)
+76 + j*(-54)
+-173 + j*(-47)
+-104 + j*(264)
+245 + j*(156)
+110 + j*(-190)
+-223 + j*(-24)
+-37 + j*(310)
+304 + j*(158)
+242 + j*(-159)
+-3 + j*(-188)
+-87 + j*(-29)
+23 + j*(78)
+160 + j*(-24)
+63 + j*(-215)
+-173 + j*(-147)
+-156 + j*(84)
+15 + j*(103)
+30 + j*(21)
+25 + j*(35)
+62 + j*(-1)
+10 + j*(-11)
+81 + j*(68)
+237 + j*(-103)
+16 + j*(-366)
+-320 + j*(-170)
+-194 + j*(140)
+1 + j*(51)
+-114 + j*(-6)
+-73 + j*(151)
+81 + j*(52)
+-91 + j*(-49)
+-141 + j*(226)
+212 + j*(274)
+280 + j*(-65)
+42 + j*(-98)
+131 + j*(21)
+194 + j*(-222)
+-152 + j*(-291)
+-223 + j*(76)
+125 + j*(115)
+122 + j*(-217)
+-176 + j*(-213)
+-190 + j*(-3)
+-119 + j*(-14)
+-219 + j*(14)
+-203 + j*(210)
+-6 + j*(287)
+149 + j*(202)
+209 + j*(55)
+133 + j*(-83)
+2 + j*(-46)
+74 + j*(49)
+179 + j*(-95)
+3 + j*(-258)
+-199 + j*(-132)
+-170 + j*(35)
+-119 + j*(71)
+-83 + j*(136)
+38 + j*(141)
+54 + j*(34)
+-25 + j*(61)
+61 + j*(153)
+182 + j*(53)
+131 + j*(-63)
+85 + j*(-67)
+73 + j*(-127)
+-61 + j*(-151)
+-122 + j*(-9)
+-18 + j*(52)
+4 + j*(-5)
+-14 + j*(23)
+58 + j*(1)
+-18 + j*(-116)
+-194 + j*(16)
+-37 + j*(268)
+283 + j*(143)
+243 + j*(-203)
+-57 + j*(-267)
+-205 + j*(-64)
+-112 + j*(121)
+74 + j*(116)
+119 + j*(-62)
+-58 + j*(-122)
+-123 + j*(66)
+80 + j*(141)
+176 + j*(-57)
+19 + j*(-171)
+-87 + j*(-83)
+-71 + j*(-20)
+-68 + j*(3)
+-41 + j*(40)
+-4 + j*(32)
+-2 + j*(34)
+58 + j*(47)
+114 + j*(-51)
+21 + j*(-151)
+-78 + j*(-112)
+-97 + j*(-73)
+-161 + j*(-37)
+-148 + j*(109)
+38 + j*(129)
+73 + j*(-78)
+-150 + j*(-136)
+-269 + j*(67)
+-170 + j*(247)
+-1 + j*(320)
+208 + j*(259)
+281 + j*(28)
+121 + j*(-89)
+81 + j*(-4)
+174 + j*(-98)
+-25 + j*(-274)
+-297 + j*(-57)
+-144 + j*(271)
+159 + j*(225)
+216 + j*(40)
+196 + j*(-65)
+116 + j*(-190)
+-76 + j*(-161)
+-54 + j*(21)
+95 + j*(-53)
+-59 + j*(-198)
+-228 + j*(7)
+-27 + j*(187)
+124 + j*(35)
+44 + j*(-49)
+60 + j*(-37)
+15 + j*(-174)
+-230 + j*(-104)
+-174 + j*(205)
+130 + j*(169)
+79 + j*(-66)
+-72 + j*(47)
+117 + j*(155)
+221 + j*(-62)
+61 + j*(-147)
+62 + j*(-91)
+47 + j*(-239)
+-243 + j*(-231)
+-281 + j*(124)
+54 + j*(195)
+121 + j*(-86)
+-101 + j*(-129)
+-133 + j*(22)
+-74 + j*(42)
+-87 + j*(78)
+10 + j*(142)
+106 + j*(36)
+32 + j*(-50)
+4 + j*(-21)
+-4 + j*(-89)
+-188 + j*(-73)
+-204 + j*(218)
+144 + j*(295)
+277 + j*(-48)
+-11 + j*(-194)
+-123 + j*(30)
+61 + j*(74)
+34 + j*(-107)
+-177 + j*(-31)
+-98 + j*(231)
+204 + j*(197)
+244 + j*(-111)
+-33 + j*(-225)
+-197 + j*(-1)
+-30 + j*(187)
+153 + j*(67)
+63 + j*(-95)
+-81 + j*(-9)
+12 + j*(141)
+190 + j*(67)
+177 + j*(-129)
+13 + j*(-197)
+-107 + j*(-113)
+-117 + j*(-1)
+-60 + j*(71)
+23 + j*(88)
+100 + j*(35)
+88 + j*(-69)
+-11 + j*(-82)
+-11 + j*(6)
+96 + j*(-40)
+5 + j*(-206)
+-248 + j*(-99)
+-163 + j*(227)
+199 + j*(185)
+191 + j*(-167)
+-119 + j*(-162)
+-76 + j*(105)
+180 + j*(8)
+55 + j*(-266)
+-228 + j*(-161)
+-160 + j*(80)
+11 + j*(8)
+-114 + j*(-124)
+-274 + j*(42)
+-139 + j*(257)
+96 + j*(208)
+119 + j*(18)
+-11 + j*(-27)
+-40 + j*(74)
+57 + j*(83)
+52 + j*(-25)
+-79 + j*(-2)
+-48 + j*(165)
+156 + j*(155)
+175 + j*(-50)
+-1 + j*(-70)
+21 + j*(83)
+192 + j*(18)
+117 + j*(-190)
+-97 + j*(-135)
+-58 + j*(47)
+81 + j*(-12)
+-18 + j*(-130)
+-134 + j*(4)
+12 + j*(124)
+128 + j*(-17)
+5 + j*(-112)
+-49 + j*(-5)
+57 + j*(1)
+31 + j*(-127)
+-113 + j*(-108)
+-129 + j*(9)
+-81 + j*(48)
+-56 + j*(81)
+28 + j*(83)
+38 + j*(-24)
+-100 + j*(-11)
+-66 + j*(181)
+176 + j*(162)
+204 + j*(-91)
+9 + j*(-158)
+-65 + j*(-59)
+-69 + j*(-22)
+-90 + j*(67)
+57 + j*(156)
+198 + j*(-14)
+37 + j*(-180)
+-115 + j*(-44)
+4 + j*(60)
+52 + j*(-54)
+-56 + j*(-61)
+-39 + j*(26)
+-1 + j*(-2)
+-39 + j*(29)
+76 + j*(92)
+187 + j*(-96)
+-28 + j*(-264)
+-224 + j*(-92)
+-122 + j*(61)
+-80 + j*(-1)
+-158 + j*(60)
+-59 + j*(183)
+66 + j*(103)
+13 + j*(32)
+11 + j*(85)
+72 + j*(45)
+11 + j*(-5)
+-17 + j*(65)
+42 + j*(86)
+44 + j*(95)
+161 + j*(163)
+363 + j*(-30)
+178 + j*(-357)
+-187 + j*(-235)
+-96 + j*(74)
+130 + j*(-52)
+-52 + j*(-229)
+-209 + j*(-28)
+-30 + j*(89)
+23 + j*(-59)
+-107 + j*(-59)
+-92 + j*(40)
+-68 + j*(20)
+-115 + j*(91)
+22 + j*(194)
+168 + j*(57)
+70 + j*(-71)
+26 + j*(-2)
+120 + j*(-66)
+-8 + j*(-235)
+-249 + j*(-124)
+-223 + j*(129)
+-40 + j*(185)
+47 + j*(116)
+68 + j*(49)
+35 + j*(-7)
+-30 + j*(8)
+-28 + j*(79)
+33 + j*(113)
+123 + j*(102)
+204 + j*(-24)
+76 + j*(-203)
+-170 + j*(-90)
+-69 + j*(195)
+245 + j*(95)
+158 + j*(-240)
+-174 + j*(-190)
+-177 + j*(107)
+42 + j*(163)
+142 + j*(49)
+151 + j*(-68)
+50 + j*(-195)
+-172 + j*(-136)
+-173 + j*(142)
+119 + j*(221)
+278 + j*(-36)
+114 + j*(-250)
+-102 + j*(-200)
+-130 + j*(-32)
+-1 + j*(11)
+24 + j*(-122)
+-148 + j*(-151)
+-196 + j*(33)
+-47 + j*(76)
+-72 + j*(-30)
+-170 + j*(101)
+50 + j*(231)
+221 + j*(-35)
+-45 + j*(-224)
+-215 + j*(4)
+-42 + j*(105)
+-57 + j*(-28)
+-194 + j*(96)
+-16 + j*(271)
+156 + j*(112)
+44 + j*(19)
+76 + j*(128)
+238 + j*(-6)
+78 + j*(-228)
+-148 + j*(-119)
+-98 + j*(23)
+-104 + j*(-27)
+-246 + j*(102)
+-106 + j*(381)
+239 + j*(347)
+337 + j*(71)
+212 + j*(-62)
+150 + j*(-42)
+183 + j*(-61)
+163 + j*(-170)
+12 + j*(-219)
+-98 + j*(-71)
+46 + j*(55)
+183 + j*(-117)
+-18 + j*(-289)
+-238 + j*(-91)
+-73 + j*(152)
+176 + j*(39)
+127 + j*(-198)
+-57 + j*(-233)
+-146 + j*(-152)
+-180 + j*(-85)
+-200 + j*(1)
+-144 + j*(107)
+1 + j*(119)
+73 + j*(-41)
+-114 + j*(-161)
+-310 + j*(48)
+-119 + j*(334)
+217 + j*(216)
+178 + j*(-86)
+-22 + j*(-79)
+32 + j*(16)
+74 + j*(-133)
+-153 + j*(-197)
+-279 + j*(30)
+-129 + j*(180)
+-37 + j*(119)
+-78 + j*(130)
+-8 + j*(230)
+156 + j*(186)
+185 + j*(20)
+64 + j*(-52)
+2 + j*(38)
+104 + j*(86)
+163 + j*(-53)
+3 + j*(-146)
+-120 + j*(19)
+37 + j*(163)
+194 + j*(24)
+87 + j*(-128)
+-36 + j*(-46)
+44 + j*(45)
+132 + j*(-40)
+68 + j*(-155)
+-65 + j*(-154)
+-138 + j*(-47)
+-95 + j*(70)
+10 + j*(97)
+74 + j*(43)
+95 + j*(-16)
+81 + j*(-103)
+-44 + j*(-167)
+-199 + j*(-45)
+-132 + j*(197)
+158 + j*(233)
+322 + j*(-40)
+137 + j*(-305)
+-164 + j*(-239)
+-192 + j*(28)
+18 + j*(87)
+59 + j*(-82)
+-100 + j*(-79)
+-55 + j*(91)
+147 + j*(14)
+74 + j*(-220)
+-156 + j*(-181)
+-140 + j*(-11)
+-47 + j*(-61)
+-153 + j*(-135)
+-257 + j*(-30)
+-238 + j*(66)
+-244 + j*(126)
+-209 + j*(260)
+-46 + j*(312)
+22 + j*(236)
+9 + j*(281)
+201 + j*(363)
+430 + j*(145)
+317 + j*(-176)
+32 + j*(-187)
+-30 + j*(-4)
+60 + j*(49)
+90 + j*(29)
+136 + j*(47)
+245 + j*(-40)
+196 + j*(-244)
+-38 + j*(-298)
+-174 + j*(-123)
+-88 + j*(11)
+-17 + j*(-28)
+-68 + j*(-49)
+-83 + j*(29)
+-5 + j*(65)
+43 + j*(22)
+53 + j*(-15)
+59 + j*(-69)
+-15 + j*(-142)
+-151 + j*(-98)
+-187 + j*(67)
+-66 + j*(193)
+110 + j*(187)
+238 + j*(45)
+207 + j*(-169)
+2 + j*(-263)
+-160 + j*(-136)
+-109 + j*(12)
+-6 + j*(-22)
+-65 + j*(-117)
+-212 + j*(-54)
+-209 + j*(144)
+-12 + j*(242)
+166 + j*(105)
+113 + j*(-104)
+-93 + j*(-127)
+-184 + j*(53)
+-57 + j*(207)
+129 + j*(167)
+175 + j*(4)
+84 + j*(-77)
+45 + j*(-45)
+97 + j*(-89)
+6 + j*(-246)
+-279 + j*(-209)
+-381 + j*(130)
+-100 + j*(376)
+206 + j*(229)
+187 + j*(-40)
+-4 + j*(-87)
+-64 + j*(35)
+8 + j*(90)
+42 + j*(54)
+29 + j*(59)
+69 + j*(88)
+132 + j*(49)
+135 + j*(-20)
+111 + j*(-54)
+91 + j*(-91)
+34 + j*(-111)
+-1 + j*(-77)
+13 + j*(-76)
+-38 + j*(-104)
+-95 + j*(-18)
+4 + j*(59)
+75 + j*(-46)
+-35 + j*(-94)
+-40 + j*(23)
+91 + j*(-29)
+-1 + j*(-185)
+-167 + j*(-86)
+-81 + j*(33)
+-61 + j*(-68)
+-223 + j*(7)
+-105 + j*(243)
+148 + j*(127)
+32 + j*(-69)
+-72 + j*(95)
+171 + j*(127)
+173 + j*(-175)
+-131 + j*(-167)
+-89 + j*(83)
+95 + j*(-29)
+-90 + j*(-171)
+-210 + j*(43)
+-22 + j*(119)
+-40 + j*(-27)
+-184 + j*(100)
+2 + j*(282)
+200 + j*(127)
+130 + j*(-17)
+111 + j*(-9)
+117 + j*(-129)
+-94 + j*(-177)
+-190 + j*(54)
+12 + j*(165)
+109 + j*(14)
+8 + j*(-57)
+-64 + j*(-12)
+-117 + j*(70)
+-55 + j*(274)
+291 + j*(320)
+506 + j*(-68)
+216 + j*(-407)
+-111 + j*(-269)
+-52 + j*(-72)
+22 + j*(-175)
+-177 + j*(-229)
+-292 + j*(14)
+-74 + j*(188)
+116 + j*(2)
+-67 + j*(-202)
+-332 + j*(-25)
+-221 + j*(295)
+78 + j*(299)
+143 + j*(116)
+87 + j*(101)
+180 + j*(128)
+279 + j*(-5)
+235 + j*(-170)
+111 + j*(-284)
+-101 + j*(-310)
+-286 + j*(-110)
+-165 + j*(149)
+86 + j*(95)
+54 + j*(-112)
+-113 + j*(-77)
+-71 + j*(54)
+33 + j*(-2)
+-43 + j*(-102)
+-169 + j*(-28)
+-141 + j*(131)
+21 + j*(176)
+119 + j*(57)
+62 + j*(-42)
+23 + j*(-21)
+62 + j*(-74)
+-66 + j*(-185)
+-256 + j*(-33)
+-129 + j*(194)
+70 + j*(87)
+-54 + j*(-48)
+-144 + j*(112)
+21 + j*(165)
+12 + j*(29)
+-115 + j*(135)
+61 + j*(291)
+226 + j*(127)
+120 + j*(44)
+197 + j*(144)
+371 + j*(-76)
+93 + j*(-339)
+-199 + j*(-67)
+62 + j*(204)
+298 + j*(-40)
+105 + j*(-233)
+-4 + j*(-117)
+64 + j*(-120)
+-18 + j*(-175)
+-41 + j*(-80)
+53 + j*(-147)
+-121 + j*(-286)
+-337 + j*(-67)
+-146 + j*(177)
+47 + j*(35)
+-89 + j*(-62)
+-99 + j*(100)
+95 + j*(51)
+17 + j*(-166)
+-212 + j*(-88)
+-161 + j*(119)
+-18 + j*(93)
+-62 + j*(25)
+-94 + j*(119)
+40 + j*(178)
+163 + j*(55)
+100 + j*(-137)
+-139 + j*(-170)
+-284 + j*(79)
+-76 + j*(322)
+199 + j*(191)
+124 + j*(-40)
+-28 + j*(47)
+128 + j*(159)
+260 + j*(-51)
+57 + j*(-220)
+-107 + j*(-76)
+-18 + j*(35)
+21 + j*(-42)
+-72 + j*(-40)
+-78 + j*(76)
+26 + j*(135)
+158 + j*(83)
+202 + j*(-102)
+0 + j*(-253)
+-227 + j*(-74)
+-90 + j*(181)
+142 + j*(74)
+46 + j*(-95)
+-36 + j*(17)
+120 + j*(2)
+25 + j*(-218)
+-256 + j*(-74)
+-93 + j*(234)
+197 + j*(65)
+5 + j*(-176)
+-179 + j*(49)
+68 + j*(189)
+176 + j*(-54)
+-35 + j*(-127)
+-68 + j*(35)
+38 + j*(34)
+17 + j*(-4)
+62 + j*(30)
+120 + j*(-97)
+-59 + j*(-191)
+-181 + j*(-20)
+-69 + j*(86)
+-48 + j*(62)
+-11 + j*(187)
+285 + j*(157)
+341 + j*(-256)
+-76 + j*(-428)
+-305 + j*(-126)
+-152 + j*(51)
+-106 + j*(-14)
+-175 + j*(42)
+-112 + j*(139)
+-47 + j*(139)
+-3 + j*(173)
+124 + j*(151)
+150 + j*(21)
+98 + j*(-5)
+159 + j*(-37)
+103 + j*(-225)
+-169 + j*(-203)
+-190 + j*(72)
+42 + j*(92)
+26 + j*(-97)
+-136 + j*(-57)
+-112 + j*(64)
+-71 + j*(72)
+-46 + j*(134)
+115 + j*(112)
+98 + j*(-119)
+-182 + j*(-112)
+-197 + j*(175)
+30 + j*(197)
+-2 + j*(75)
+-61 + j*(226)
+189 + j*(305)
+315 + j*(74)
+192 + j*(-13)
+255 + j*(34)
+334 + j*(-185)
+63 + j*(-341)
+-110 + j*(-105)
+100 + j*(14)
+175 + j*(-221)
+-57 + j*(-315)
+-185 + j*(-172)
+-187 + j*(-81)
+-210 + j*(38)
+-52 + j*(190)
+195 + j*(50)
+103 + j*(-244)
+-187 + j*(-214)
+-216 + j*(17)
+-74 + j*(57)
+-68 + j*(-6)
+-95 + j*(25)
+-50 + j*(40)
+-60 + j*(-6)
+-115 + j*(25)
+-94 + j*(90)
+-54 + j*(87)
+-71 + j*(102)
+-31 + j*(175)
+88 + j*(174)
+153 + j*(68)
+116 + j*(-25)
+47 + j*(-53)
+-10 + j*(-28)
+-8 + j*(33)
+66 + j*(31)
+66 + j*(-81)
+-95 + j*(-101)
+-158 + j*(102)
+57 + j*(216)
+211 + j*(13)
+25 + j*(-153)
+-134 + j*(28)
+48 + j*(187)
+210 + j*(25)
+92 + j*(-111)
+34 + j*(-24)
+149 + j*(-68)
+56 + j*(-260)
+-198 + j*(-196)
+-202 + j*(29)
+-91 + j*(60)
+-122 + j*(81)
+-25 + j*(231)
+221 + j*(131)
+146 + j*(-146)
+-112 + j*(-62)
+26 + j*(181)
+291 + j*(2)
+134 + j*(-296)
+-140 + j*(-214)
+-124 + j*(-47)
+-105 + j*(-64)
+-187 + j*(31)
+-49 + j*(195)
+172 + j*(66)
+89 + j*(-181)
+-160 + j*(-173)
+-251 + j*(30)
+-158 + j*(216)
+66 + j*(269)
+252 + j*(84)
+152 + j*(-173)
+-115 + j*(-153)
+-155 + j*(78)
+22 + j*(159)
+121 + j*(59)
+110 + j*(-18)
+107 + j*(-64)
+78 + j*(-160)
+-71 + j*(-231)
+-272 + j*(-127)
+-298 + j*(153)
+-40 + j*(322)
+209 + j*(154)
+129 + j*(-89)
+-78 + j*(-45)
+-30 + j*(139)
+154 + j*(100)
+146 + j*(-78)
+5 + j*(-105)
+-30 + j*(-6)
+42 + j*(25)
+78 + j*(-33)
+49 + j*(-81)
+10 + j*(-93)
+-25 + j*(-88)
+-45 + j*(-66)
+-37 + j*(-63)
+-71 + j*(-98)
+-168 + j*(-62)
+-174 + j*(75)
+-57 + j*(114)
+-51 + j*(44)
+-114 + j*(128)
+53 + j*(245)
+244 + j*(46)
+56 + j*(-189)
+-183 + j*(-27)
+-54 + j*(180)
+86 + j*(95)
+33 + j*(69)
+147 + j*(130)
+258 + j*(-103)
+-43 + j*(-267)
+-233 + j*(59)
+105 + j*(238)
+250 + j*(-105)
+-94 + j*(-200)
+-133 + j*(144)
+221 + j*(134)
+185 + j*(-224)
+-156 + j*(-179)
+-106 + j*(123)
+157 + j*(67)
+100 + j*(-156)
+-79 + j*(-107)
+-30 + j*(28)
+83 + j*(-28)
+36 + j*(-136)
+-61 + j*(-124)
+-77 + j*(-66)
+-62 + j*(-59)
+-79 + j*(-62)
+-92 + j*(-49)
+-110 + j*(-57)
+-182 + j*(-35)
+-214 + j*(95)
+-91 + j*(204)
+60 + j*(141)
+56 + j*(3)
+-45 + j*(-40)
+-129 + j*(17)
+-141 + j*(137)
+-25 + j*(233)
+122 + j*(161)
+86 + j*(21)
+-23 + j*(67)
+54 + j*(190)
+211 + j*(124)
+212 + j*(-29)
+135 + j*(-88)
+77 + j*(-112)
+-6 + j*(-95)
+-18 + j*(2)
+88 + j*(3)
+71 + j*(-130)
+-93 + j*(-113)
+-89 + j*(60)
+63 + j*(59)
+40 + j*(-63)
+-64 + j*(4)
+46 + j*(124)
+199 + j*(3)
+110 + j*(-165)
+-14 + j*(-121)
+27 + j*(-78)
+-1 + j*(-172)
+-158 + j*(-121)
+-114 + j*(62)
+56 + j*(11)
+-25 + j*(-129)
+-136 + j*(-5)
+47 + j*(67)
+91 + j*(-194)
+-243 + j*(-243)
+-317 + j*(116)
+11 + j*(177)
+3 + j*(-127)
+-325 + j*(-47)
+-234 + j*(315)
+100 + j*(265)
+64 + j*(33)
+-65 + j*(122)
+97 + j*(205)
+181 + j*(7)
+-6 + j*(-79)
+-92 + j*(75)
+12 + j*(163)
+88 + j*(139)
+138 + j*(116)
+185 + j*(54)
+168 + j*(-6)
+181 + j*(-8)
+240 + j*(-107)
+139 + j*(-284)
+-102 + j*(-268)
+-188 + j*(-57)
+-70 + j*(79)
+58 + j*(59)
+124 + j*(-29)
+103 + j*(-166)
+-71 + j*(-239)
+-239 + j*(-76)
+-129 + j*(154)
+112 + j*(103)
+102 + j*(-105)
+-44 + j*(-100)
+5 + j*(-24)
+39 + j*(-165)
+-192 + j*(-214)
+-280 + j*(54)
+-28 + j*(146)
+11 + j*(-100)
+-272 + j*(-77)
+-240 + j*(257)
+103 + j*(257)
+129 + j*(-45)
+-126 + j*(-84)
+-192 + j*(124)
+-57 + j*(243)
+98 + j*(217)
+176 + j*(70)
+47 + j*(-66)
+-117 + j*(63)
+3 + j*(264)
+213 + j*(202)
+236 + j*(78)
+286 + j*(42)
+349 + j*(-157)
+115 + j*(-352)
+-127 + j*(-173)
+20 + j*(19)
+157 + j*(-155)
+-40 + j*(-293)
+-196 + j*(-150)
+-152 + j*(-35)
+-146 + j*(-13)
+-134 + j*(73)
+-30 + j*(105)
+13 + j*(47)
+10 + j*(41)
+62 + j*(22)
+60 + j*(-71)
+-35 + j*(-108)
+-110 + j*(-59)
+-139 + j*(27)
+-74 + j*(130)
+66 + j*(100)
+47 + j*(-45)
+-98 + j*(-1)
+-24 + j*(165)
+166 + j*(89)
+119 + j*(-95)
+-11 + j*(-73)
+14 + j*(-10)
+33 + j*(-52)
+-2 + j*(-54)
+25 + j*(-62)
+-21 + j*(-153)
+-182 + j*(-127)
+-233 + j*(45)
+-139 + j*(170)
+1 + j*(206)
+148 + j*(111)
+108 + j*(-99)
+-129 + j*(-91)
+-134 + j*(153)
+90 + j*(165)
+76 + j*(2)
+-10 + j*(93)
+205 + j*(142)
+282 + j*(-177)
+-66 + j*(-310)
+-218 + j*(-15)
+1 + j*(78)
+-14 + j*(-107)
+-235 + j*(-4)
+-125 + j*(271)
+153 + j*(228)
+177 + j*(35)
+113 + j*(18)
+173 + j*(6)
+194 + j*(-136)
+57 + j*(-248)
+-127 + j*(-214)
+-227 + j*(-45)
+-142 + j*(150)
+74 + j*(161)
+149 + j*(-24)
+10 + j*(-123)
+-74 + j*(-17)
+27 + j*(42)
+69 + j*(-86)
+-99 + j*(-143)
+-210 + j*(53)
+-30 + j*(233)
+194 + j*(115)
+153 + j*(-89)
+27 + j*(-88)
+62 + j*(-47)
+72 + j*(-163)
+-100 + j*(-204)
+-189 + j*(-44)
+-81 + j*(39)
+-68 + j*(-37)
+-172 + j*(21)
+-89 + j*(191)
+129 + j*(135)
+123 + j*(-83)
+-49 + j*(-111)
+-71 + j*(-8)
+-25 + j*(-44)
+-149 + j*(-86)
+-254 + j*(98)
+-92 + j*(288)
+134 + j*(214)
+148 + j*(37)
+54 + j*(-8)
+28 + j*(28)
+52 + j*(37)
+73 + j*(12)
+54 + j*(-32)
+0 + j*(-33)
+-11 + j*(12)
+13 + j*(13)
+-25 + j*(10)
+-30 + j*(112)
+132 + j*(161)
+252 + j*(-8)
+144 + j*(-168)
+29 + j*(-141)
+30 + j*(-132)
+-53 + j*(-196)
+-215 + j*(-105)
+-197 + j*(113)
+-7 + j*(194)
+131 + j*(92)
+123 + j*(-40)
+34 + j*(-86)
+-18 + j*(-30)
+45 + j*(15)
+116 + j*(-76)
+27 + j*(-212)
+-169 + j*(-191)
+-255 + j*(8)
+-118 + j*(182)
+92 + j*(132)
+102 + j*(-62)
+-54 + j*(-100)
+-85 + j*(8)
+-28 + j*(4)
+-95 + j*(-16)
+-102 + j*(118)
+75 + j*(128)
+71 + j*(-64)
+-132 + j*(-17)
+-40 + j*(214)
+228 + j*(106)
+140 + j*(-165)
+-86 + j*(-104)
+-25 + j*(43)
+59 + j*(-49)
+-69 + j*(-115)
+-153 + j*(-3)
+-126 + j*(90)
+-95 + j*(182)
+64 + j*(298)
+332 + j*(189)
+383 + j*(-132)
+158 + j*(-334)
+-75 + j*(-292)
+-163 + j*(-157)
+-159 + j*(-76)
+-169 + j*(-34)
+-181 + j*(57)
+-85 + j*(127)
+-28 + j*(52)
+-142 + j*(67)
+-79 + j*(303)
+290 + j*(274)
+351 + j*(-153)
+-33 + j*(-279)
+-140 + j*(3)
+62 + j*(5)
+-73 + j*(-185)
+-316 + j*(36)
+-100 + j*(343)
+207 + j*(205)
+150 + j*(-18)
+44 + j*(9)
+76 + j*(36)
+62 + j*(19)
+93 + j*(89)
+264 + j*(37)
+279 + j*(-225)
+16 + j*(-364)
+-221 + j*(-199)
+-173 + j*(59)
+66 + j*(86)
+129 + j*(-153)
+-130 + j*(-253)
+-272 + j*(4)
+-43 + j*(154)
+59 + j*(-58)
+-181 + j*(-96)
+-188 + j*(203)
+158 + j*(231)
+231 + j*(-121)
+-78 + j*(-242)
+-231 + j*(-1)
+-73 + j*(164)
+84 + j*(79)
+61 + j*(-66)
+-76 + j*(-97)
+-165 + j*(21)
+-100 + j*(154)
+40 + j*(170)
+131 + j*(82)
+130 + j*(-43)
+13 + j*(-129)
+-132 + j*(-51)
+-111 + j*(118)
+43 + j*(163)
+134 + j*(69)
+128 + j*(-24)
+84 + j*(-93)
+-4 + j*(-115)
+-61 + j*(-58)
+-43 + j*(-29)
+-78 + j*(-49)
+-159 + j*(25)
+-115 + j*(165)
+18 + j*(211)
+129 + j*(172)
+212 + j*(86)
+221 + j*(-52)
+125 + j*(-137)
+45 + j*(-125)
+16 + j*(-107)
+-10 + j*(-80)
+27 + j*(-62)
+37 + j*(-163)
+-149 + j*(-210)
+-275 + j*(22)
+-55 + j*(215)
+170 + j*(40)
+67 + j*(-195)
+-156 + j*(-200)
+-302 + j*(-58)
+-322 + j*(194)
+-71 + j*(402)
+238 + j*(243)
+168 + j*(-30)
+2 + j*(40)
+160 + j*(127)
+233 + j*(-122)
+-49 + j*(-212)
+-134 + j*(47)
+83 + j*(91)
+67 + j*(-90)
+-89 + j*(-14)
+31 + j*(129)
+164 + j*(5)
+69 + j*(-88)
+65 + j*(-21)
+152 + j*(-116)
+13 + j*(-266)
+-174 + j*(-155)
+-125 + j*(-5)
+-59 + j*(-30)
+-108 + j*(-16)
+-58 + j*(72)
+64 + j*(13)
+32 + j*(-130)
+-104 + j*(-166)
+-220 + j*(-107)
+-293 + j*(26)
+-243 + j*(204)
+-74 + j*(280)
+58 + j*(226)
+134 + j*(148)
+170 + j*(0)
+11 + j*(-155)
+-245 + j*(-18)
+-176 + j*(311)
+156 + j*(342)
+262 + j*(116)
+193 + j*(44)
+262 + j*(13)
+243 + j*(-202)
+-38 + j*(-252)
+-123 + j*(7)
+99 + j*(65)
+106 + j*(-138)
+-89 + j*(-102)
+-18 + j*(80)
+149 + j*(-20)
+48 + j*(-172)
+-64 + j*(-101)
+-25 + j*(-78)
+-115 + j*(-115)
+-180 + j*(65)
+54 + j*(159)
+156 + j*(-105)
+-135 + j*(-199)
+-218 + j*(101)
+74 + j*(163)
+98 + j*(-118)
+-190 + j*(-112)
+-197 + j*(192)
+77 + j*(262)
+214 + j*(89)
+193 + j*(-59)
+103 + j*(-161)
+-49 + j*(-148)
+-66 + j*(-4)
+71 + j*(-13)
+25 + j*(-175)
+-161 + j*(-125)
+-121 + j*(42)
+-14 + j*(-19)
+-148 + j*(-78)
+-216 + j*(136)
+24 + j*(252)
+177 + j*(52)
+52 + j*(-83)
+-16 + j*(-22)
+18 + j*(-40)
+-71 + j*(-76)
+-123 + j*(59)
+44 + j*(127)
+129 + j*(-62)
+-69 + j*(-186)
+-238 + j*(-18)
+-142 + j*(175)
+23 + j*(151)
+30 + j*(36)
+-66 + j*(38)
+-69 + j*(160)
+87 + j*(211)
+202 + j*(57)
+70 + j*(-105)
+-125 + j*(11)
+-36 + j*(258)
+256 + j*(247)
+360 + j*(-23)
+197 + j*(-205)
+21 + j*(-161)
+-1 + j*(-37)
+98 + j*(21)
+211 + j*(-69)
+178 + j*(-262)
+-44 + j*(-342)
+-214 + j*(-179)
+-140 + j*(-1)
+-15 + j*(-43)
+-81 + j*(-137)
+-187 + j*(-45)
+-99 + j*(74)
+3 + j*(-13)
+-115 + j*(-96)
+-217 + j*(71)
+-26 + j*(221)
+170 + j*(42)
+25 + j*(-180)
+-197 + j*(-85)
+-160 + j*(109)
+-40 + j*(117)
+-26 + j*(94)
+37 + j*(112)
+98 + j*(-15)
+-82 + j*(-117)
+-240 + j*(110)
+-1 + j*(338)
+275 + j*(139)
+134 + j*(-122)
+-68 + j*(-4)
+70 + j*(153)
+226 + j*(2)
+109 + j*(-165)
+-36 + j*(-118)
+-52 + j*(-29)
+-26 + j*(29)
+66 + j*(57)
+154 + j*(-70)
+16 + j*(-228)
+-197 + j*(-118)
+-143 + j*(106)
+51 + j*(93)
+57 + j*(-57)
+-50 + j*(-73)
+-76 + j*(-7)
+-59 + j*(15)
+-70 + j*(35)
+-49 + j*(91)
+35 + j*(104)
+85 + j*(16)
+-7 + j*(-52)
+-91 + j*(71)
+88 + j*(199)
+296 + j*(-21)
+82 + j*(-317)
+-267 + j*(-149)
+-164 + j*(194)
+119 + j*(135)
+63 + j*(-51)
+-30 + j*(45)
+124 + j*(87)
+167 + j*(-99)
+21 + j*(-161)
+-25 + j*(-115)
+-90 + j*(-147)
+-234 + j*(-19)
+-102 + j*(209)
+148 + j*(103)
+43 + j*(-117)
+-130 + j*(21)
+50 + j*(173)
+204 + j*(-17)
+57 + j*(-162)
+-29 + j*(-80)
+25 + j*(-93)
+-62 + j*(-186)
+-221 + j*(-114)
+-245 + j*(52)
+-156 + j*(170)
+-15 + j*(185)
+43 + j*(71)
+-71 + j*(38)
+-92 + j*(211)
+127 + j*(278)
+246 + j*(107)
+192 + j*(24)
+250 + j*(10)
+283 + j*(-182)
+70 + j*(-308)
+-66 + j*(-182)
+-13 + j*(-148)
+-116 + j*(-216)
+-252 + j*(-37)
+-62 + j*(138)
+112 + j*(-57)
+-100 + j*(-228)
+-281 + j*(-28)
+-136 + j*(136)
+-43 + j*(33)
+-157 + j*(18)
+-152 + j*(171)
+-5 + j*(194)
+13 + j*(103)
+-39 + j*(147)
+66 + j*(231)
+209 + j*(132)
+166 + j*(-13)
+83 + j*(9)
+156 + j*(37)
+194 + j*(-104)
+38 + j*(-194)
+-76 + j*(-85)
+-24 + j*(-7)
+-20 + j*(-30)
+-55 + j*(39)
+60 + j*(112)
+179 + j*(-3)
+111 + j*(-139)
+19 + j*(-146)
+-33 + j*(-150)
+-140 + j*(-105)
+-130 + j*(66)
+59 + j*(73)
+48 + j*(-127)
+-174 + j*(-85)
+-111 + j*(163)
+148 + j*(89)
+57 + j*(-166)
+-199 + j*(-43)
+-42 + j*(231)
+268 + j*(74)
+163 + j*(-266)
+-154 + j*(-243)
+-196 + j*(-18)
+-93 + j*(25)
+-111 + j*(3)
+-117 + j*(85)
+-22 + j*(112)
+-1 + j*(53)
+-16 + j*(87)
+100 + j*(93)
+138 + j*(-99)
+-95 + j*(-192)
+-242 + j*(38)
+-50 + j*(209)
+101 + j*(59)
+-30 + j*(-54)
+-123 + j*(69)
+-38 + j*(158)
+14 + j*(148)
+58 + j*(201)
+231 + j*(191)
+325 + j*(-23)
+185 + j*(-195)
+45 + j*(-173)
+7 + j*(-163)
+-122 + j*(-169)
+-247 + j*(42)
+-34 + j*(297)
+319 + j*(155)
+280 + j*(-231)
+-61 + j*(-281)
+-139 + j*(-29)
+41 + j*(18)
+45 + j*(-135)
+-93 + j*(-124)
+-81 + j*(-28)
+-38 + j*(-63)
+-110 + j*(-82)
+-141 + j*(-9)
+-116 + j*(16)
+-156 + j*(40)
+-140 + j*(154)
+-14 + j*(196)
+58 + j*(135)
+78 + j*(104)
+120 + j*(43)
+58 + j*(-41)
+-25 + j*(34)
+86 + j*(121)
+199 + j*(-7)
+112 + j*(-131)
+44 + j*(-110)
+33 + j*(-158)
+-121 + j*(-179)
+-187 + j*(18)
+6 + j*(85)
+30 + j*(-119)
+-228 + j*(-107)
+-243 + j*(201)
+52 + j*(291)
+208 + j*(91)
+141 + j*(-68)
+42 + j*(-112)
+-58 + j*(-93)
+-100 + j*(0)
+-47 + j*(62)
+-12 + j*(48)
+-19 + j*(68)
+38 + j*(112)
+134 + j*(77)
+177 + j*(-38)
+98 + j*(-164)
+-70 + j*(-146)
+-91 + j*(26)
+86 + j*(44)
+100 + j*(-155)
+-105 + j*(-187)
+-153 + j*(-31)
+-88 + j*(-11)
+-148 + j*(4)
+-104 + j*(144)
+77 + j*(93)
+1 + j*(-83)
+-163 + j*(29)
+-42 + j*(179)
+59 + j*(88)
+6 + j*(103)
+173 + j*(161)
+295 + j*(-125)
+-27 + j*(-320)
+-240 + j*(-48)
+-51 + j*(89)
+-64 + j*(-56)
+-240 + j*(108)
+-5 + j*(366)
+302 + j*(178)
+229 + j*(-81)
+117 + j*(-100)
+71 + j*(-159)
+-107 + j*(-115)
+-44 + j*(127)
+263 + j*(4)
+87 + j*(-390)
+-380 + j*(-223)
+-282 + j*(247)
+94 + j*(209)
+51 + j*(-11)
+-28 + j*(110)
+204 + j*(122)
+228 + j*(-181)
+-72 + j*(-256)
+-180 + j*(-27)
+-45 + j*(78)
+35 + j*(24)
+47 + j*(-24)
+25 + j*(-95)
+-91 + j*(-107)
+-139 + j*(34)
+9 + j*(113)
+112 + j*(-32)
+-18 + j*(-163)
+-177 + j*(-57)
+-107 + j*(117)
+78 + j*(79)
+77 + j*(-130)
+-155 + j*(-194)
+-317 + j*(21)
+-192 + j*(254)
+25 + j*(245)
+75 + j*(124)
+42 + j*(116)
+113 + j*(134)
+172 + j*(31)
+92 + j*(-42)
+69 + j*(21)
+177 + j*(-21)
+120 + j*(-209)
+-117 + j*(-191)
+-136 + j*(36)
+48 + j*(42)
+5 + j*(-117)
+-158 + j*(-22)
+-24 + j*(159)
+185 + j*(-5)
+11 + j*(-269)
+-325 + j*(-140)
+-317 + j*(235)
+-3 + j*(373)
+219 + j*(210)
+212 + j*(26)
+151 + j*(-43)
+105 + j*(-101)
+-23 + j*(-127)
+-122 + j*(30)
+38 + j*(196)
+255 + j*(71)
+202 + j*(-150)
+57 + j*(-155)
+62 + j*(-115)
+39 + j*(-182)
+-60 + j*(-165)
+-47 + j*(-109)
+-64 + j*(-175)
+-222 + j*(-132)
+-204 + j*(82)
+8 + j*(83)
+1 + j*(-105)
+-180 + j*(-86)
+-175 + j*(76)
+-64 + j*(91)
+-54 + j*(36)
+-90 + j*(42)
+-106 + j*(91)
+-60 + j*(166)
+63 + j*(159)
+100 + j*(40)
+21 + j*(1)
+16 + j*(33)
+9 + j*(-4)
+-69 + j*(47)
+34 + j*(168)
+188 + j*(21)
+13 + j*(-138)
+-121 + j*(76)
+148 + j*(175)
+223 + j*(-135)
+-93 + j*(-193)
+-115 + j*(88)
+107 + j*(58)
+14 + j*(-93)
+-54 + j*(69)
+182 + j*(64)
+148 + j*(-245)
+-184 + j*(-229)
+-210 + j*(34)
+-93 + j*(59)
+-148 + j*(106)
+-1 + j*(295)
+303 + j*(149)
+215 + j*(-178)
+-49 + j*(-133)
+8 + j*(54)
+163 + j*(-39)
+81 + j*(-192)
+-59 + j*(-179)
+-118 + j*(-100)
+-118 + j*(-17)
+254 + j*(-10)
+76 + j*(-153)
+-18 + j*(-66)
+47 + j*(-84)
+-64 + j*(-223)
+-321 + j*(-112)
+-313 + j*(218)
+-22 + j*(334)
+153 + j*(167)
+99 + j*(27)
+22 + j*(46)
+63 + j*(111)
+179 + j*(66)
+187 + j*(-107)
+5 + j*(-195)
+-132 + j*(-49)
+-30 + j*(89)
+84 + j*(16)
+40 + j*(-76)
+-21 + j*(-76)
+-74 + j*(-69)
+-136 + j*(7)
+-70 + j*(119)
+35 + j*(62)
+-59 + j*(2)
+-95 + j*(186)
+182 + j*(254)
+316 + j*(-60)
+25 + j*(-243)
+-161 + j*(4)
+49 + j*(172)
+197 + j*(2)
+77 + j*(-119)
+9 + j*(-37)
+89 + j*(-21)
+93 + j*(-126)
+-8 + j*(-157)
+-58 + j*(-104)
+-63 + j*(-88)
+-116 + j*(-65)
+-126 + j*(49)
+14 + j*(114)
+130 + j*(-16)
+37 + j*(-168)
+-119 + j*(-136)
+-157 + j*(-20)
+-112 + j*(59)
+-28 + j*(83)
+31 + j*(3)
+-67 + j*(-66)
+-148 + j*(71)
+28 + j*(179)
+158 + j*(-12)
+-24 + j*(-141)
+-117 + j*(20)
+31 + j*(50)
+-12 + j*(-100)
+-171 + j*(-1)
+-35 + j*(156)
+93 + j*(-4)
+-98 + j*(-98)
+-174 + j*(116)
+35 + j*(187)
+96 + j*(18)
+-18 + j*(-19)
+-39 + j*(40)
+-48 + j*(51)
+-66 + j*(136)
+66 + j*(216)
+198 + j*(115)
+176 + j*(-5)
+137 + j*(-35)
+116 + j*(-69)
+88 + j*(-67)
+142 + j*(-100)
+82 + j*(-290)
+-246 + j*(-293)
+-373 + j*(76)
+-87 + j*(290)
+103 + j*(158)
+93 + j*(109)
+226 + j*(86)
+247 + j*(-175)
+-47 + j*(-240)
+-90 + j*(38)
+199 + j*(8)
+119 + j*(-333)
+-255 + j*(-281)
+-264 + j*(42)
+-71 + j*(64)
+-111 + j*(-4)
+-120 + j*(132)
+69 + j*(139)
+86 + j*(-52)
+-85 + j*(-52)
+-62 + j*(112)
+108 + j*(74)
+86 + j*(-99)
+-75 + j*(-96)
+-78 + j*(42)
+48 + j*(34)
+23 + j*(-105)
+-137 + j*(-85)
+-141 + j*(82)
+-5 + j*(100)
+-5 + j*(16)
+-49 + j*(69)
+77 + j*(88)
+92 + j*(-113)
+-182 + j*(-150)
+-276 + j*(168)
+23 + j*(330)
+208 + j*(107)
+64 + j*(-23)
+19 + j*(103)
+180 + j*(107)
+218 + j*(-68)
+98 + j*(-160)
+4 + j*(-145)
+-81 + j*(-99)
+-108 + j*(50)
+88 + j*(154)
+288 + j*(-64)
+101 + j*(-367)
+-256 + j*(-279)
+-276 + j*(37)
+-73 + j*(96)
+-68 + j*(-6)
+-135 + j*(78)
+10 + j*(161)
+100 + j*(9)
+-40 + j*(-54)
+-47 + j*(86)
+120 + j*(31)
+17 + j*(-182)
+-261 + j*(-69)
+-202 + j*(252)
+85 + j*(308)
+233 + j*(171)
+313 + j*(39)
+313 + j*(-197)
+59 + j*(-351)
+-148 + j*(-180)
+-38 + j*(-49)
+-19 + j*(-190)
+-227 + j*(-170)
+-216 + j*(52)
+-65 + j*(30)
+-182 + j*(-33)
+-238 + j*(215)
+83 + j*(325)
+241 + j*(23)
+12 + j*(-115)
+-50 + j*(55)
+91 + j*(32)
+-6 + j*(-98)
+-127 + j*(57)
+63 + j*(179)
+190 + j*(-16)
+9 + j*(-130)
+-76 + j*(42)
+98 + j*(110)
+183 + j*(-63)
+37 + j*(-179)
+-99 + j*(-83)
+-46 + j*(57)
+93 + j*(35)
+106 + j*(-106)
+-13 + j*(-163)
+-94 + j*(-113)
+-136 + j*(-58)
+-165 + j*(54)
+-32 + j*(177)
+162 + j*(64)
+71 + j*(-158)
+-149 + j*(-78)
+-66 + j*(133)
+136 + j*(49)
+71 + j*(-140)
+-71 + j*(-119)
+-86 + j*(-66)
+-157 + j*(-65)
+-223 + j*(89)
+-69 + j*(231)
+83 + j*(136)
+29 + j*(52)
+28 + j*(136)
+187 + j*(112)
+212 + j*(-88)
+43 + j*(-182)
+-72 + j*(-89)
+-44 + j*(-6)
+-4 + j*(-25)
+-49 + j*(-52)
+-112 + j*(14)
+-66 + j*(126)
+68 + j*(138)
+146 + j*(37)
+121 + j*(-84)
+-1 + j*(-151)
+-154 + j*(-57)
+-107 + j*(158)
+141 + j*(159)
+177 + j*(-77)
+-22 + j*(-104)
+13 + j*(62)
+192 + j*(-56)
+21 + j*(-290)
+-262 + j*(-132)
+-165 + j*(151)
+51 + j*(113)
+37 + j*(-5)
+8 + j*(18)
+48 + j*(-3)
+5 + j*(-36)
+13 + j*(17)
+94 + j*(-44)
+-9 + j*(-171)
+-174 + j*(-58)
+-77 + j*(116)
+74 + j*(33)
+-8 + j*(-82)
+-98 + j*(-1)
+-31 + j*(72)
+20 + j*(40)
+21 + j*(30)
+64 + j*(12)
+51 + j*(-73)
+-57 + j*(-83)
+-91 + j*(29)
+23 + j*(86)
+109 + j*(-33)
+-9 + j*(-166)
+-200 + j*(-70)
+-149 + j*(159)
+74 + j*(156)
+83 + j*(-26)
+-53 + j*(5)
+53 + j*(127)
+204 + j*(-57)
+-27 + j*(-267)
+-308 + j*(-41)
+-140 + j*(284)
+176 + j*(204)
+175 + j*(-47)
+9 + j*(-84)
+-35 + j*(17)
+29 + j*(69)
+103 + j*(41)
+121 + j*(-43)
+66 + j*(-91)
+41 + j*(-82)
+42 + j*(-129)
+-63 + j*(-180)
+-174 + j*(-76)
+-117 + j*(28)
+-91 + j*(-16)
+-206 + j*(47)
+-128 + j*(283)
+193 + j*(266)
+258 + j*(-54)
+-4 + j*(-167)
+-118 + j*(26)
+6 + j*(127)
+75 + j*(84)
+110 + j*(81)
+209 + j*(21)
+190 + j*(-151)
+24 + j*(-204)
+-61 + j*(-107)
+-36 + j*(-48)
+-18 + j*(-37)
+16 + j*(-31)
+38 + j*(-91)
+-39 + j*(-144)
+-117 + j*(-92)
+-119 + j*(-35)
+-132 + j*(4)
+-97 + j*(93)
+38 + j*(78)
+30 + j*(-82)
+-153 + j*(-69)
+-146 + j*(127)
+32 + j*(129)
+7 + j*(-2)
+-95 + j*(94)
+70 + j*(228)
+284 + j*(57)
+206 + j*(-215)
+-42 + j*(-288)
+-244 + j*(-165)
+-298 + j*(76)
+-113 + j*(277)
+151 + j*(194)
+148 + j*(-52)
+-52 + j*(-83)
+-88 + j*(83)
+62 + j*(131)
+139 + j*(-5)
+27 + j*(-122)
+-129 + j*(-40)
+-79 + j*(156)
+146 + j*(141)
+173 + j*(-105)
+-63 + j*(-176)
+-173 + j*(10)
+-83 + j*(117)
+-54 + j*(129)
+-1 + j*(231)
+201 + j*(235)
+281 + j*(44)
+183 + j*(-27)
+228 + j*(15)
+324 + j*(-140)
+168 + j*(-317)
+9 + j*(-233)
+95 + j*(-191)
+66 + j*(-401)
+-260 + j*(-458)
+-479 + j*(-179)
+-404 + j*(89)
+-280 + j*(207)
+-132 + j*(310)
+119 + j*(280)
+226 + j*(27)
+56 + j*(-135)
+-73 + j*(-43)
+-4 + j*(4)
+-29 + j*(-98)
+-199 + j*(-45)
+-175 + j*(177)
+49 + j*(215)
+124 + j*(40)
+13 + j*(-30)
+-31 + j*(44)
+29 + j*(79)
+76 + j*(40)
+74 + j*(-19)
+21 + j*(-52)
+-27 + j*(-10)
+15 + j*(32)
+49 + j*(-23)
+-18 + j*(-55)
+-40 + j*(7)
+6 + j*(-1)
+-54 + j*(-41)
+-117 + j*(76)
+35 + j*(183)
+183 + j*(40)
+79 + j*(-119)
+-56 + j*(-58)
+-21 + j*(38)
+50 + j*(14)
+41 + j*(-52)
+-28 + j*(-80)
+-106 + j*(-21)
+-86 + j*(90)
+12 + j*(117)
+50 + j*(80)
+88 + j*(90)
+192 + j*(17)
+143 + j*(-177)
+-98 + j*(-196)
+-193 + j*(33)
+-33 + j*(197)
+168 + j*(150)
+250 + j*(-32)
+138 + j*(-204)
+-47 + j*(-156)
+9 + j*(-8)
+151 + j*(-147)
+-70 + j*(-351)
+-349 + j*(-124)
+-182 + j*(161)
+18 + j*(32)
+-139 + j*(-53)
+-158 + j*(165)
+86 + j*(170)
+72 + j*(-34)
+-64 + j*(42)
+110 + j*(148)
+255 + j*(-100)
+24 + j*(-322)
+-247 + j*(-218)
+-320 + j*(-6)
+-276 + j*(197)
+-72 + j*(337)
+158 + j*(236)
+158 + j*(52)
+81 + j*(40)
+131 + j*(45)
+138 + j*(-57)
+52 + j*(-81)
+54 + j*(-54)
+50 + j*(-128)
+-89 + j*(-151)
+-167 + j*(-4)
+-62 + j*(112)
+55 + j*(58)
+35 + j*(-46)
+-64 + j*(-44)
+-78 + j*(58)
+19 + j*(84)
+42 + j*(1)
+-32 + j*(1)
+-6 + j*(69)
+49 + j*(25)
+-19 + j*(8)
+16 + j*(121)
+192 + j*(54)
+127 + j*(-167)
+-102 + j*(-120)
+-66 + j*(75)
+74 + j*(30)
+8 + j*(-43)
+1 + j*(54)
+139 + j*(17)
+100 + j*(-153)
+-66 + j*(-147)
+-98 + j*(-37)
+-68 + j*(16)
+-15 + j*(61)
+84 + j*(8)
+28 + j*(-129)
+-129 + j*(-59)
+-46 + j*(98)
+94 + j*(-8)
+-35 + j*(-121)
+-118 + j*(24)
+33 + j*(71)
+48 + j*(-83)
+-100 + j*(-80)
+-98 + j*(34)
+-57 + j*(25)
+-103 + j*(65)
+-9 + j*(173)
+144 + j*(78)
+78 + j*(-78)
+-37 + j*(-34)
+0 + j*(20)
+-2 + j*(-29)
+-74 + j*(18)
+-7 + j*(117)
+107 + j*(59)
+73 + j*(-45)
+1 + j*(-21)
+39 + j*(28)
+100 + j*(-18)
+72 + j*(-114)
+-42 + j*(-136)
+-112 + j*(-36)
+-37 + j*(57)
+66 + j*(1)
+25 + j*(-115)
+-92 + j*(-118)
+-153 + j*(-37)
+-148 + j*(53)
+-81 + j*(117)
+6 + j*(95)
+-6 + j*(8)
+-119 + j*(34)
+-115 + j*(215)
+116 + j*(305)
+327 + j*(112)
+244 + j*(-161)
+6 + j*(-180)
+-41 + j*(-23)
+54 + j*(-16)
+8 + j*(-91)
+-58 + j*(-13)
+45 + j*(30)
+57 + j*(-109)
+-122 + j*(-103)
+-122 + j*(91)
+43 + j*(95)
+12 + j*(-2)
+-17 + j*(115)
+218 + j*(117)
+244 + j*(-215)
+-125 + j*(-296)
+-244 + j*(61)
+66 + j*(191)
+192 + j*(-68)
+-1 + j*(-185)
+-94 + j*(-71)
+-57 + j*(-23)
+-71 + j*(-9)
+-31 + j*(62)
+89 + j*(21)
+81 + j*(-135)
+-74 + j*(-192)
+-194 + j*(-103)
+-212 + j*(11)
+-192 + j*(98)
+-140 + j*(192)
+-10 + j*(256)
+150 + j*(190)
+185 + j*(32)
+104 + j*(-49)
+66 + j*(-52)
+30 + j*(-100)
+-106 + j*(-81)
+-137 + j*(122)
+101 + j*(227)
+299 + j*(7)
+167 + j*(-274)
+-129 + j*(-287)
+-291 + j*(-65)
+-211 + j*(175)
+12 + j*(243)
+161 + j*(110)
+141 + j*(-30)
+76 + j*(-87)
+0 + j*(-122)
+-113 + j*(-66)
+-84 + j*(83)
+66 + j*(64)
+27 + j*(-73)
+-97 + j*(8)
+37 + j*(119)
+139 + j*(-71)
+-106 + j*(-170)
+-213 + j*(111)
+76 + j*(228)
+186 + j*(-36)
+-42 + j*(-121)
+-96 + j*(71)
+56 + j*(107)
+79 + j*(19)
+66 + j*(16)
+92 + j*(-28)
+16 + j*(-65)
+13 + j*(39)
+163 + j*(-16)
+59 + j*(-238)
+-233 + j*(-105)
+-89 + j*(243)
+305 + j*(105)
+205 + j*(-313)
+-194 + j*(-281)
+-226 + j*(44)
+-6 + j*(103)
+47 + j*(-24)
+-11 + j*(-57)
+-18 + j*(-42)
+-17 + j*(-63)
+-56 + j*(-95)
+-145 + j*(-77)
+-183 + j*(60)
+-34 + j*(148)
+72 + j*(-6)
+-105 + j*(-104)
+-199 + j*(105)
+18 + j*(197)
+80 + j*(-12)
+-137 + j*(-14)
+-93 + j*(242)
+199 + j*(199)
+197 + j*(-86)
+-37 + j*(-129)
+-113 + j*(28)
+-45 + j*(131)
+69 + j*(158)
+174 + j*(63)
+106 + j*(-69)
+-1 + j*(5)
+128 + j*(93)
+242 + j*(-97)
+55 + j*(-266)
+-127 + j*(-158)
+-124 + j*(-42)
+-134 + j*(18)
+-73 + j*(149)
+127 + j*(127)
+139 + j*(-74)
+-11 + j*(-93)
+-3 + j*(-16)
+10 + j*(-75)
+-98 + j*(-40)
+-27 + j*(89)
+96 + j*(-18)
+-55 + j*(-123)
+-149 + j*(67)
+45 + j*(164)
+137 + j*(19)
+86 + j*(-37)
+105 + j*(-89)
+-21 + j*(-194)
+-181 + j*(-13)
+57 + j*(156)
+234 + j*(-164)
+-155 + j*(-371)
+-403 + j*(13)
+-110 + j*(256)
+44 + j*(81)
+-47 + j*(73)
+78 + j*(133)
+125 + j*(-73)
+-116 + j*(-96)
+-110 + j*(153)
+117 + j*(132)
+90 + j*(-28)
+31 + j*(24)
+131 + j*(-12)
+42 + j*(-148)
+-80 + j*(-46)
+35 + j*(4)
+-16 + j*(-148)
+-221 + j*(-10)
+-23 + j*(239)
+247 + j*(18)
+35 + j*(-240)
+-163 + j*(-67)
+-24 + j*(13)
+-80 + j*(-137)
+-294 + j*(2)
+-169 + j*(264)
+54 + j*(219)
+59 + j*(127)
+112 + j*(136)
+174 + j*(1)
+14 + j*(-87)
+-62 + j*(85)
+124 + j*(143)
+178 + j*(-30)
+48 + j*(-71)
+57 + j*(12)
+126 + j*(-59)
+17 + j*(-147)
+-106 + j*(-33)
+-15 + j*(132)
+194 + j*(95)
+240 + j*(-132)
+50 + j*(-254)
+-88 + j*(-122)
+29 + j*(-28)
+99 + j*(-187)
+-95 + j*(-300)
+-267 + j*(-153)
+-228 + j*(6)
+-156 + j*(41)
+-122 + j*(45)
+-116 + j*(18)
+-200 + j*(42)
+-203 + j*(222)
+21 + j*(305)
+157 + j*(124)
+35 + j*(19)
+1 + j*(133)
+151 + j*(129)
+161 + j*(-35)
+23 + j*(-59)
+8 + j*(44)
+104 + j*(49)
+136 + j*(-48)
+61 + j*(-132)
+-68 + j*(-103)
+-92 + j*(47)
+61 + j*(115)
+170 + j*(-22)
+78 + j*(-151)
+-27 + j*(-126)
+-45 + j*(-93)
+-95 + j*(-88)
+-137 + j*(16)
+-23 + j*(93)
+66 + j*(-27)
+-81 + j*(-129)
+-231 + j*(39)
+-94 + j*(255)
+139 + j*(207)
+181 + j*(49)
+168 + j*(5)
+231 + j*(-105)
+105 + j*(-317)
+-192 + j*(-274)
+-228 + j*(-6)
+-57 + j*(23)
+-119 + j*(-89)
+-247 + j*(63)
+-71 + j*(233)
+102 + j*(82)
+-31 + j*(-52)
+-136 + j*(80)
+-28 + j*(187)
+78 + j*(155)
+148 + j*(89)
+148 + j*(-62)
+-52 + j*(-130)
+-185 + j*(100)
+29 + j*(301)
+266 + j*(177)
+280 + j*(9)
+292 + j*(-85)
+248 + j*(-291)
+-40 + j*(-396)
+-267 + j*(-170)
+-177 + j*(76)
+-1 + j*(95)
+80 + j*(14)
+73 + j*(-90)
+-40 + j*(-127)
+-90 + j*(-12)
+42 + j*(26)
+76 + j*(-139)
+-103 + j*(-202)
+-210 + j*(-71)
+-193 + j*(36)
+-164 + j*(129)
+-33 + j*(216)
+126 + j*(130)
+117 + j*(-5)
+87 + j*(-40)
+73 + j*(-141)
+-123 + j*(-200)
+-259 + j*(21)
+-77 + j*(185)
+45 + j*(64)
+-32 + j*(29)
+25 + j*(78)
+39 + j*(-61)
+-186 + j*(-27)
+-119 + j*(289)
+267 + j*(222)
+222 + j*(-170)
+-119 + j*(-139)
+-74 + j*(124)
+100 + j*(53)
+10 + j*(-36)
+6 + j*(71)
+132 + j*(1)
+15 + j*(-147)
+-148 + j*(-28)
+-78 + j*(127)
+16 + j*(134)
+77 + j*(156)
+214 + j*(111)
+246 + j*(-65)
+144 + j*(-152)
+95 + j*(-178)
+-23 + j*(-248)
+-216 + j*(-129)
+-152 + j*(127)
+95 + j*(122)
+135 + j*(-69)
+17 + j*(-143)
+-75 + j*(-119)
+-157 + j*(-23)
+-88 + j*(161)
+169 + j*(155)
+256 + j*(-113)
+64 + j*(-281)
+-111 + j*(-223)
+-162 + j*(-124)
+-154 + j*(-61)
+-140 + j*(-59)
+-221 + j*(-59)
+-289 + j*(105)
+-129 + j*(254)
+20 + j*(151)
+-62 + j*(88)
+-39 + j*(217)
+130 + j*(165)
+64 + j*(25)
+-11 + j*(163)
+244 + j*(229)
+377 + j*(-88)
+127 + j*(-293)
+-59 + j*(-196)
+-95 + j*(-131)
+-170 + j*(-47)
+-93 + j*(93)
+25 + j*(1)
+-151 + j*(-75)
+-233 + j*(204)
+87 + j*(337)
+245 + j*(80)
+103 + j*(-13)
+141 + j*(52)
+190 + j*(-105)
+-16 + j*(-148)
+-7 + j*(62)
+220 + j*(-32)
+76 + j*(-298)
+-201 + j*(-168)
+-111 + j*(37)
+-32 + j*(-49)
+-175 + j*(-12)
+-93 + j*(198)
+136 + j*(139)
+124 + j*(-34)
+64 + j*(-37)
+95 + j*(-90)
+-20 + j*(-189)
+-171 + j*(-74)
+-114 + j*(78)
+-15 + j*(88)
+44 + j*(83)
+137 + j*(1)
+63 + j*(-166)
+-142 + j*(-103)
+-74 + j*(103)
+123 + j*(6)
+-6 + j*(-195)
+-221 + j*(-57)
+-105 + j*(156)
+79 + j*(72)
+19 + j*(-69)
+-80 + j*(-19)
+-35 + j*(44)
+6 + j*(-13)
+-87 + j*(-61)
+-192 + j*(52)
+-112 + j*(243)
+129 + j*(253)
+236 + j*(35)
+91 + j*(-115)
+-44 + j*(-27)
+28 + j*(87)
+164 + j*(11)
+116 + j*(-182)
+-134 + j*(-210)
+-259 + j*(60)
+-3 + j*(262)
+236 + j*(19)
+-20 + j*(-234)
+-297 + j*(56)
+16 + j*(375)
+365 + j*(76)
+103 + j*(-260)
+-189 + j*(-14)
+66 + j*(234)
+293 + j*(-16)
+82 + j*(-218)
+-50 + j*(-61)
+93 + j*(-19)
+71 + j*(-188)
+-122 + j*(-160)
+-113 + j*(14)
+15 + j*(16)
+16 + j*(-71)
+-30 + j*(-85)
+-64 + j*(-98)
+-147 + j*(-69)
+-159 + j*(56)
+-42 + j*(100)
+-10 + j*(16)
+-82 + j*(27)
+-41 + j*(112)
+51 + j*(78)
+37 + j*(17)
+42 + j*(22)
+63 + j*(-54)
+-76 + j*(-110)
+-168 + j*(71)
+37 + j*(191)
+164 + j*(-25)
+-70 + j*(-147)
+-192 + j*(117)
+93 + j*(267)
+295 + j*(3)
+106 + j*(-244)
+-141 + j*(-170)
+-177 + j*(23)
+-72 + j*(125)
+36 + j*(92)
+20 + j*(3)
+-78 + j*(56)
+6 + j*(214)
+238 + j*(158)
+263 + j*(-87)
+98 + j*(-170)
+50 + j*(-124)
+33 + j*(-194)
+-156 + j*(-219)
+-292 + j*(2)
+-151 + j*(224)
+63 + j*(221)
+158 + j*(116)
+206 + j*(26)
+218 + j*(-108)
+115 + j*(-239)
+-49 + j*(-247)
+-142 + j*(-158)
+-155 + j*(-78)
+-161 + j*(-39)
+-186 + j*(23)
+-165 + j*(136)
+-27 + j*(216)
+141 + j*(137)
+158 + j*(-59)
+-6 + j*(-153)
+-134 + j*(-54)
+-101 + j*(64)
+-33 + j*(65)
+-40 + j*(52)
+-20 + j*(94)
+48 + j*(69)
+9 + j*(-5)
+-81 + j*(67)
+15 + j*(206)
+206 + j*(132)
+190 + j*(-62)
+49 + j*(-74)
+56 + j*(9)
+117 + j*(-29)
+82 + j*(-70)
+109 + j*(-51)
+172 + j*(-185)
+-23 + j*(-366)
+-314 + j*(-216)
+-270 + j*(88)
+-56 + j*(100)
+-87 + j*(-6)
+-153 + j*(111)
+8 + j*(194)
+96 + j*(55)
+1 + j*(24)
+62 + j*(109)
+177 + j*(-33)
+-5 + j*(-171)
+-139 + j*(36)
+106 + j*(148)
+213 + j*(-146)
+-103 + j*(-272)
+-249 + j*(13)
+-27 + j*(144)
+54 + j*(-21)
+-76 + j*(-47)
+-66 + j*(56)
+-2 + j*(21)
+-71 + j*(-16)
+-115 + j*(82)
+-36 + j*(163)
+71 + j*(156)
+151 + j*(59)
+82 + j*(-78)
+-102 + j*(-16)
+-26 + j*(233)
+302 + j*(174)
+305 + j*(-202)
+-49 + j*(-272)
+-136 + j*(16)
+96 + j*(71)
+115 + j*(-139)
+-86 + j*(-150)
+-104 + j*(27)
+35 + j*(42)
+37 + j*(-70)
+-75 + j*(-55)
+-54 + j*(78)
+115 + j*(75)
+156 + j*(-124)
+-50 + j*(-234)
+-222 + j*(-63)
+-117 + j*(148)
+104 + j*(119)
+156 + j*(-89)
+-21 + j*(-228)
+-242 + j*(-114)
+-213 + j*(168)
+88 + j*(238)
+245 + j*(-41)
+39 + j*(-260)
+-187 + j*(-162)
+-201 + j*(-8)
+-169 + j*(58)
+-125 + j*(132)
+-17 + j*(139)
+13 + j*(47)
+-62 + j*(23)
+-98 + j*(83)
+-105 + j*(158)
+-29 + j*(301)
+257 + j*(325)
+447 + j*(-21)
+163 + j*(-355)
+-231 + j*(-200)
+-208 + j*(164)
+71 + j*(241)
+204 + j*(75)
+139 + j*(-61)
+31 + j*(-52)
+40 + j*(45)
+155 + j*(26)
+152 + j*(-117)
+21 + j*(-144)
+-9 + j*(-71)
+-6 + j*(-77)
+-78 + j*(-23)
+15 + j*(126)
+240 + j*(30)
+194 + j*(-238)
+-36 + j*(-265)
+-91 + j*(-148)
+-93 + j*(-141)
+-160 + j*(-93)
+-126 + j*(-5)
+-101 + j*(-31)
+-165 + j*(47)
+11 + j*(185)
+234 + j*(-70)
+-75 + j*(-383)
+-466 + j*(-63)
+-175 + j*(363)
+235 + j*(107)
+8 + j*(-264)
+-322 + j*(-86)
+-228 + j*(157)
+-153 + j*(132)
+-203 + j*(249)
+27 + j*(402)
+252 + j*(170)
+44 + j*(-29)
+-88 + j*(217)
+237 + j*(332)
+385 + j*(-18)
+80 + j*(-173)
+-9 + j*(91)
+257 + j*(102)
+236 + j*(-187)
+-31 + j*(-152)
+47 + j*(62)
+228 + j*(-81)
+47 + j*(-245)
+-74 + j*(-57)
+150 + j*(-21)
+128 + j*(-331)
+-258 + j*(-325)
+-310 + j*(66)
+21 + j*(145)
+88 + j*(-127)
+-151 + j*(-194)
+-251 + j*(-11)
+-170 + j*(112)
+-82 + j*(139)
+-10 + j*(121)
+11 + j*(64)
+-31 + j*(62)
+-7 + j*(124)
+93 + j*(112)
+126 + j*(6)
+42 + j*(-59)
+-32 + j*(-1)
+19 + j*(89)
+142 + j*(49)
+147 + j*(-100)
+18 + j*(-167)
+-82 + j*(-115)
+-127 + j*(-44)
+-140 + j*(68)
+-24 + j*(180)
+145 + j*(122)
+173 + j*(-27)
+119 + j*(-105)
+63 + j*(-177)
+-92 + j*(-196)
+-182 + j*(-29)
+-30 + j*(71)
+28 + j*(-77)
+-143 + j*(-95)
+-134 + j*(83)
+23 + j*(35)
+-97 + j*(-97)
+-238 + j*(85)
+-45 + j*(245)
+86 + j*(83)
+-67 + j*(37)
+-52 + j*(232)
+197 + j*(238)
+286 + j*(17)
+182 + j*(-133)
+50 + j*(-175)
+-86 + j*(-118)
+-106 + j*(40)
+28 + j*(112)
+120 + j*(37)
+129 + j*(-43)
+112 + j*(-134)
+-9 + j*(-215)
+-161 + j*(-141)
+-180 + j*(-4)
+-148 + j*(71)
+-98 + j*(168)
+72 + j*(206)
+185 + j*(52)
+101 + j*(-66)
+54 + j*(-49)
+39 + j*(-105)
+-122 + j*(-78)
+-98 + j*(180)
+253 + j*(181)
+315 + j*(-221)
+-54 + j*(-357)
+-211 + j*(-95)
+-59 + j*(-6)
+-71 + j*(-112)
+-192 + j*(-51)
+-170 + j*(62)
+-144 + j*(98)
+-115 + j*(206)
+75 + j*(272)
+245 + j*(103)
+181 + j*(-96)
+48 + j*(-134)
+-18 + j*(-117)
+-96 + j*(-97)
+-159 + j*(6)
+-98 + j*(127)
+32 + j*(123)
+52 + j*(21)
+-45 + j*(25)
+-13 + j*(169)
+207 + j*(154)
+260 + j*(-107)
+22 + j*(-226)
+-115 + j*(-51)
+6 + j*(68)
+105 + j*(-15)
+75 + j*(-115)
+-16 + j*(-165)
+-156 + j*(-121)
+-179 + j*(66)
+6 + j*(146)
+101 + j*(-12)
+-24 + j*(-93)
+-80 + j*(9)
+5 + j*(45)
+41 + j*(-20)
+14 + j*(-86)
+-86 + j*(-133)
+-232 + j*(-35)
+-189 + j*(170)
+-17 + j*(186)
+-16 + j*(129)
+40 + j*(239)
+302 + j*(142)
+232 + j*(-231)
+-175 + j*(-193)
+-135 + j*(192)
+209 + j*(107)
+62 + j*(-202)
+-229 + j*(6)
+7 + j*(298)
+291 + j*(92)
+164 + j*(-139)
+38 + j*(-79)
+85 + j*(-69)
+36 + j*(-137)
+-35 + j*(-97)
+-25 + j*(-71)
+-74 + j*(-62)
+-58 + j*(52)
+118 + j*(33)
+110 + j*(-211)
+-180 + j*(-263)
+-324 + j*(4)
+-163 + j*(216)
+29 + j*(197)
+110 + j*(105)
+139 + j*(16)
+114 + j*(-91)
+-4 + j*(-152)
+-122 + j*(-69)
+-78 + j*(74)
+77 + j*(49)
+64 + j*(-122)
+-115 + j*(-130)
+-146 + j*(22)
+-57 + j*(50)
+-74 + j*(18)
+-73 + j*(103)
+56 + j*(91)
+34 + j*(-60)
+-123 + j*(-23)
+-85 + j*(131)
+33 + j*(101)
+-1 + j*(56)
+42 + j*(124)
+165 + j*(4)
+-16 + j*(-183)
+-284 + j*(33)
+-88 + j*(383)
+301 + j*(281)
+313 + j*(-45)
+132 + j*(-107)
+120 + j*(-59)
+117 + j*(-146)
+-25 + j*(-164)
+-78 + j*(-21)
+50 + j*(42)
+121 + j*(-77)
+15 + j*(-170)
+-95 + j*(-87)
+-25 + j*(22)
+95 + j*(-66)
+-10 + j*(-231)
+-231 + j*(-156)
+-216 + j*(67)
+-58 + j*(75)
+-108 + j*(-13)
+-192 + j*(141)
+27 + j*(284)
+223 + j*(67)
+39 + j*(-119)
+-94 + j*(57)
+118 + j*(142)
+185 + j*(-107)
+-74 + j*(-174)
+-129 + j*(74)
+108 + j*(103)
+122 + j*(-139)
+-121 + j*(-174)
+-208 + j*(45)
+-54 + j*(185)
+111 + j*(119)
+115 + j*(-40)
+-29 + j*(-81)
+-82 + j*(69)
+83 + j*(148)
+202 + j*(0)
+124 + j*(-132)
+52 + j*(-143)
+6 + j*(-183)
+-119 + j*(-177)
+-158 + j*(-59)
+-113 + j*(-46)
+-206 + j*(-45)
+-221 + j*(156)
+25 + j*(206)
+66 + j*(-45)
+-206 + j*(-42)
+-188 + j*(257)
+80 + j*(268)
+86 + j*(122)
+84 + j*(221)
+343 + j*(170)
+361 + j*(-197)
+23 + j*(-321)
+-142 + j*(-121)
+-106 + j*(-8)
+-95 + j*(71)
+39 + j*(152)
+164 + j*(8)
+15 + j*(-106)
+-46 + j*(63)
+163 + j*(71)
+142 + j*(-177)
+-112 + j*(-150)
+-83 + j*(72)
+87 + j*(40)
+53 + j*(-65)
+25 + j*(-30)
+74 + j*(-76)
+-7 + j*(-144)
+-54 + j*(-71)
+3 + j*(-107)
+-147 + j*(-208)
+-345 + j*(4)
+-169 + j*(287)
+110 + j*(211)
+119 + j*(41)
+110 + j*(19)
+148 + j*(-118)
+-73 + j*(-258)
+-314 + j*(-25)
+-127 + j*(276)
+167 + j*(165)
+117 + j*(-55)
+-4 + j*(-7)
+100 + j*(40)
+143 + j*(-129)
+-39 + j*(-216)
+-150 + j*(-91)
+-101 + j*(-23)
+-125 + j*(-52)
+-200 + j*(29)
+-144 + j*(153)
+-40 + j*(166)
+11 + j*(151)
+85 + j*(118)
+91 + j*(-7)
+-61 + j*(-33)
+-100 + j*(148)
+93 + j*(218)
+199 + j*(59)
+112 + j*(-40)
+63 + j*(-27)
+28 + j*(-44)
+-54 + j*(28)
+35 + j*(182)
+256 + j*(131)
+306 + j*(-94)
+187 + j*(-243)
+21 + j*(-292)
+-157 + j*(-193)
+-129 + j*(25)
+83 + j*(13)
+42 + j*(-211)
+-204 + j*(-165)
+-187 + j*(63)
+-46 + j*(74)
+-51 + j*(54)
+43 + j*(98)
+112 + j*(-78)
+-137 + j*(-135)
+-150 + j*(200)
+284 + j*(163)
+214 + j*(-362)
+-363 + j*(-276)
+-255 + j*(302)
+293 + j*(146)
+83 + j*(-375)
+-423 + j*(-147)
+-228 + j*(315)
+134 + j*(178)
+39 + j*(-47)
+-64 + j*(32)
+-3 + j*(41)
+-75 + j*(15)
+-71 + j*(171)
+154 + j*(167)
+175 + j*(-86)
+-69 + j*(-142)
+-149 + j*(66)
+4 + j*(169)
+115 + j*(78)
+75 + j*(-21)
+-17 + j*(6)
+23 + j*(125)
+205 + j*(89)
+219 + j*(-150)
+-26 + j*(-232)
+-145 + j*(-30)
+8 + j*(84)
+98 + j*(-42)
+-12 + j*(-126)
+-103 + j*(-57)
+-100 + j*(23)
+-71 + j*(86)
+13 + j*(136)
+128 + j*(88)
+135 + j*(-43)
+35 + j*(-82)
+3 + j*(-13)
+74 + j*(-7)
+74 + j*(-98)
+-23 + j*(-114)
+-48 + j*(-29)
+23 + j*(-13)
+37 + j*(-82)
+-19 + j*(-112)
+-54 + j*(-98)
+-83 + j*(-95)
+-122 + j*(-71)
+-146 + j*(-47)
+-209 + j*(-8)
+-245 + j*(141)
+-91 + j*(293)
+115 + j*(228)
+140 + j*(78)
+114 + j*(45)
+153 + j*(-23)
+64 + j*(-152)
+-105 + j*(-92)
+-72 + j*(58)
+28 + j*(18)
+-56 + j*(-42)
+-107 + j*(85)
+36 + j*(156)
+123 + j*(37)
+47 + j*(-40)
+1 + j*(1)
+21 + j*(21)
+24 + j*(16)
+45 + j*(29)
+75 + j*(-9)
+35 + j*(-57)
+-26 + j*(-11)
+36 + j*(71)
+168 + j*(4)
+137 + j*(-182)
+-62 + j*(-215)
+-121 + j*(-64)
+-18 + j*(-70)
+-149 + j*(-198)
+-399 + j*(23)
+-184 + j*(413)
+272 + j*(271)
+185 + j*(-159)
+-191 + j*(-66)
+-62 + j*(284)
+279 + j*(151)
+170 + j*(-151)
+-56 + j*(-49)
+82 + j*(110)
+231 + j*(-54)
+95 + j*(-223)
+-56 + j*(-167)
+-69 + j*(-92)
+-76 + j*(-71)
+-86 + j*(-23)
+-50 + j*(15)
+-8 + j*(13)
+24 + j*(-11)
+33 + j*(-72)
+-23 + j*(-122)
+-91 + j*(-112)
+-129 + j*(-92)
+-197 + j*(-66)
+-251 + j*(42)
+-188 + j*(165)
+-86 + j*(171)
+-81 + j*(136)
+-107 + j*(202)
+-6 + j*(310)
+184 + j*(270)
+243 + j*(90)
+127 + j*(6)
+94 + j*(98)
+244 + j*(95)
+273 + j*(-111)
+74 + j*(-185)
+13 + j*(-28)
+173 + j*(-26)
+148 + j*(-244)
+-113 + j*(-246)
+-159 + j*(-1)
+40 + j*(54)
+84 + j*(-108)
+-50 + j*(-150)
+-100 + j*(-60)
+-72 + j*(-21)
+-64 + j*(3)
+-14 + j*(33)
+53 + j*(-29)
+1 + j*(-134)
+-134 + j*(-132)
+-203 + j*(-6)
+-136 + j*(125)
+16 + j*(111)
+16 + j*(-48)
+-190 + j*(-33)
+-182 + j*(265)
+206 + j*(314)
+344 + j*(-115)
+-71 + j*(-330)
+-330 + j*(21)
+-79 + j*(273)
+98 + j*(139)
+45 + j*(103)
+168 + j*(148)
+262 + j*(-77)
+10 + j*(-212)
+-114 + j*(34)
+141 + j*(115)
+204 + j*(-159)
+-43 + j*(-242)
+-132 + j*(-90)
+-115 + j*(-62)
+-211 + j*(23)
+-103 + j*(257)
+225 + j*(193)
+228 + j*(-151)
+-64 + j*(-209)
+-135 + j*(-3)
+-9 + j*(37)
+-16 + j*(-38)
+-65 + j*(2)
+-9 + j*(28)
+-17 + j*(-59)
+-173 + j*(-44)
+-218 + j*(197)
+60 + j*(376)
+379 + j*(150)
+269 + j*(-243)
+-109 + j*(-243)
+-162 + j*(63)
+66 + j*(113)
+81 + j*(-51)
+-37 + j*(-18)
+35 + j*(69)
+100 + j*(-15)
+40 + j*(-34)
+110 + j*(-2)
+157 + j*(-185)
+-97 + j*(-291)
+-256 + j*(-37)
+-44 + j*(111)
+45 + j*(-82)
+-172 + j*(-120)
+-209 + j*(113)
+-8 + j*(174)
+56 + j*(55)
+19 + j*(27)
+41 + j*(8)
+-13 + j*(-49)
+-89 + j*(33)
+17 + j*(125)
+119 + j*(4)
+6 + j*(-98)
+-88 + j*(-2)
+-11 + j*(70)
+25 + j*(18)
+-7 + j*(28)
+58 + j*(59)
+112 + j*(-53)
+-15 + j*(-151)
+-150 + j*(-53)
+-114 + j*(76)
+-48 + j*(92)
+-37 + j*(117)
+45 + j*(177)
+184 + j*(117)
+210 + j*(-41)
+116 + j*(-142)
+1 + j*(-157)
+-101 + j*(-91)
+-107 + j*(54)
+39 + j*(117)
+136 + j*(-5)
+49 + j*(-109)
+-28 + j*(-47)
+35 + j*(-3)
+76 + j*(-88)
+-8 + j*(-164)
+-124 + j*(-138)
+-185 + j*(-31)
+-127 + j*(90)
+-1 + j*(72)
+-35 + j*(-47)
+-191 + j*(39)
+-83 + j*(275)
+226 + j*(209)
+233 + j*(-107)
+-24 + j*(-156)
+-54 + j*(23)
+73 + j*(-1)
+4 + j*(-107)
+-91 + j*(-16)
+14 + j*(49)
+49 + j*(-82)
+-109 + j*(-105)
+-136 + j*(57)
+6 + j*(71)
+-23 + j*(-66)
+-205 + j*(0)
+-170 + j*(249)
+99 + j*(314)
+259 + j*(119)
+187 + j*(-54)
+83 + j*(-64)
+80 + j*(-42)
+74 + j*(-91)
+-12 + j*(-110)
+-60 + j*(-23)
+15 + j*(33)
+69 + j*(-41)
+-9 + j*(-100)
+-71 + j*(-27)
+-15 + j*(25)
+7 + j*(-19)
+-36 + j*(-1)
+28 + j*(59)
+127 + j*(-49)
+-5 + j*(-206)
+-233 + j*(-87)
+-170 + j*(190)
+111 + j*(216)
+231 + j*(-8)
+119 + j*(-180)
+-25 + j*(-201)
+-130 + j*(-160)
+-214 + j*(-70)
+-226 + j*(76)
+-125 + j*(190)
+18 + j*(189)
+89 + j*(100)
+66 + j*(33)
+50 + j*(39)
+93 + j*(19)
+85 + j*(-71)
+-31 + j*(-95)
+-86 + j*(21)
+30 + j*(101)
+147 + j*(-8)
+78 + j*(-171)
+-108 + j*(-180)
+-200 + j*(-35)
+-151 + j*(91)
+-68 + j*(125)
+-8 + j*(127)
+56 + j*(101)
+77 + j*(23)
+11 + j*(-21)
+-42 + j*(26)
+-31 + j*(79)
+-11 + j*(127)
+71 + j*(201)
+253 + j*(163)
+330 + j*(-45)
+214 + j*(-199)
+112 + j*(-206)
+83 + j*(-250)
+-57 + j*(-326)
+-268 + j*(-235)
+-325 + j*(4)
+-178 + j*(190)
+42 + j*(175)
+108 + j*(-13)
+-57 + j*(-97)
+-132 + j*(84)
+90 + j*(159)
+181 + j*(-96)
+-88 + j*(-200)
+-194 + j*(58)
+47 + j*(148)
+115 + j*(-77)
+-90 + j*(-131)
+-146 + j*(30)
+-64 + j*(77)
+-58 + j*(88)
+11 + j*(163)
+161 + j*(100)
+155 + j*(-69)
+41 + j*(-119)
+-9 + j*(-103)
+-74 + j*(-113)
+-176 + j*(-38)
+-165 + j*(134)
+11 + j*(231)
+211 + j*(119)
+199 + j*(-142)
+-76 + j*(-228)
+-226 + j*(30)
+9 + j*(209)
+200 + j*(-6)
+21 + j*(-205)
+-164 + j*(-93)
+-141 + j*(21)
+-167 + j*(45)
+-193 + j*(214)
+25 + j*(373)
+298 + j*(247)
+339 + j*(-19)
+193 + j*(-187)
+6 + j*(-186)
+-74 + j*(-49)
+9 + j*(35)
+66 + j*(-16)
+44 + j*(-30)
+100 + j*(-42)
+60 + j*(-196)
+-193 + j*(-154)
+-158 + j*(175)
+229 + j*(144)
+200 + j*(-293)
+-264 + j*(-284)
+-288 + j*(158)
+83 + j*(194)
+88 + j*(-88)
+-126 + j*(-33)
+-25 + j*(153)
+156 + j*(48)
+86 + j*(-111)
+-18 + j*(-86)
+-4 + j*(-40)
+15 + j*(-69)
+-14 + j*(-108)
+-82 + j*(-122)
+-151 + j*(-66)
+-136 + j*(14)
+-91 + j*(25)
+-88 + j*(16)
+-79 + j*(6)
+-142 + j*(-51)
+-326 + j*(49)
+-298 + j*(388)
+96 + j*(531)
+383 + j*(238)
+268 + j*(-56)
+84 + j*(-71)
+29 + j*(-13)
+1 + j*(42)
+54 + j*(143)
+218 + j*(122)
+266 + j*(-61)
+140 + j*(-158)
+66 + j*(-114)
+79 + j*(-106)
+57 + j*(-148)
+2 + j*(-156)
+-47 + j*(-148)
+-113 + j*(-105)
+-115 + j*(8)
+15 + j*(54)
+98 + j*(-83)
+-35 + j*(-215)
+-214 + j*(-125)
+-200 + j*(57)
+-76 + j*(100)
+-28 + j*(53)
+-25 + j*(40)
+-6 + j*(14)
+-44 + j*(-23)
+-100 + j*(23)
+-60 + j*(91)
+-9 + j*(66)
+-38 + j*(46)
+-46 + j*(100)
+6 + j*(135)
+68 + j*(144)
+162 + j*(107)
+194 + j*(-35)
+66 + j*(-109)
+26 + j*(-7)
+151 + j*(-57)
+23 + j*(-262)
+-274 + j*(-100)
+-108 + j*(252)
+257 + j*(83)
+76 + j*(-270)
+-252 + j*(-71)
+-45 + j*(216)
+184 + j*(10)
+-11 + j*(-144)
+-75 + j*(35)
+95 + j*(13)
+1 + j*(-161)
+-164 + j*(-30)
+-23 + j*(100)
+51 + j*(-47)
+-111 + j*(-62)
+-88 + j*(113)
+86 + j*(73)
+46 + j*(-92)
+-112 + j*(-87)
+-181 + j*(48)
+-118 + j*(214)
+111 + j*(260)
+245 + j*(37)
+64 + j*(-98)
+10 + j*(86)
+279 + j*(38)
+194 + j*(-350)
+-269 + j*(-301)
+-269 + j*(151)
+103 + j*(166)
+97 + j*(-110)
+-85 + j*(-75)
+-29 + j*(7)
+-47 + j*(-75)
+-155 + j*(13)
+-47 + j*(115)
+-23 + j*(8)
+-161 + j*(115)
+73 + j*(341)
+402 + j*(43)
+104 + j*(-348)
+-291 + j*(-73)
+-41 + j*(291)
+286 + j*(80)
+141 + j*(-188)
+-30 + j*(-125)
+-25 + j*(-79)
+-93 + j*(-71)
+-95 + j*(68)
+67 + j*(79)
+82 + j*(-76)
+-42 + j*(-91)
+-57 + j*(-19)
+-46 + j*(-17)
+-73 + j*(24)
+-16 + j*(76)
+40 + j*(37)
+27 + j*(22)
+93 + j*(28)
+146 + j*(-124)
+-43 + j*(-261)
+-264 + j*(-112)
+-212 + j*(122)
+-37 + j*(161)
+26 + j*(78)
+6 + j*(52)
+33 + j*(64)
+81 + j*(0)
+-1 + j*(-100)
+-160 + j*(-18)
+-111 + j*(191)
+105 + j*(204)
+164 + j*(69)
+171 + j*(43)
+288 + j*(-88)
+132 + j*(-406)
+-337 + j*(-333)
+-398 + j*(167)
+19 + j*(324)
+200 + j*(46)
+62 + j*(-95)
+-21 + j*(-85)
+-133 + j*(-71)
+-204 + j*(156)
+99 + j*(325)
+346 + j*(9)
+52 + j*(-248)
+-148 + j*(45)
+208 + j*(187)
+358 + j*(-264)
+-139 + j*(-507)
+-506 + j*(-58)
+-180 + j*(391)
+290 + j*(215)
+249 + j*(-226)
+-124 + j*(-294)
+-255 + j*(-22)
+-95 + j*(107)
+-29 + j*(27)
+-74 + j*(37)
+-13 + j*(66)
+-13 + j*(-32)
+-161 + j*(-1)
+-132 + j*(199)
+66 + j*(206)
+91 + j*(81)
+59 + j*(102)
+163 + j*(83)
+148 + j*(-71)
+2 + j*(-67)
+16 + j*(41)
+86 + j*(13)
+69 + j*(-12)
+115 + j*(-17)
+103 + j*(-153)
+-99 + j*(-158)
+-127 + j*(71)
+85 + j*(114)
+129 + j*(-27)
+112 + j*(-34)
+218 + j*(-152)
+32 + j*(-427)
+-383 + j*(-278)
+-339 + j*(162)
+15 + j*(195)
+56 + j*(-23)
+-36 + j*(-38)
+-22 + j*(-61)
+-161 + j*(-107)
+-261 + j*(129)
+12 + j*(298)
+224 + j*(59)
+70 + j*(-136)
+-52 + j*(-70)
+-47 + j*(-59)
+-140 + j*(-52)
+-154 + j*(98)
+-23 + j*(129)
+-24 + j*(57)
+-47 + j*(139)
+116 + j*(153)
+151 + j*(-49)
+-37 + j*(-100)
+-79 + j*(33)
+-25 + j*(25)
+-133 + j*(35)
+-129 + j*(269)
+173 + j*(357)
+363 + j*(115)
+275 + j*(-83)
+205 + j*(-116)
+185 + j*(-214)
+9 + j*(-309)
+-196 + j*(-190)
+-194 + j*(33)
+-32 + j*(125)
+95 + j*(32)
+40 + j*(-100)
+-120 + j*(-52)
+-76 + j*(165)
+205 + j*(163)
+271 + j*(-156)
+-33 + j*(-278)
+-160 + j*(-15)
+83 + j*(70)
+123 + j*(-186)
+-147 + j*(-210)
+-156 + j*(40)
+52 + j*(11)
+-41 + j*(-169)
+-214 + j*(-28)
+-52 + j*(142)
+107 + j*(-16)
+-21 + j*(-165)
+-147 + j*(-124)
+-230 + j*(-78)
+-342 + j*(105)
+-146 + j*(390)
+249 + j*(259)
+194 + j*(-158)
+-195 + j*(-152)
+-223 + j*(187)
+37 + j*(253)
+122 + j*(97)
+56 + j*(23)
+-13 + j*(51)
+5 + j*(165)
+209 + j*(189)
+316 + j*(-83)
+35 + j*(-265)
+-167 + j*(-19)
+47 + j*(158)
+181 + j*(-25)
+46 + j*(-106)
+53 + j*(-27)
+105 + j*(-142)
+-91 + j*(-211)
+-183 + j*(-4)
+-4 + j*(66)
+-1 + j*(-104)
+-207 + j*(-59)
+-187 + j*(189)
+39 + j*(249)
+162 + j*(117)
+140 + j*(-4)
+64 + j*(-35)
+35 + j*(21)
+118 + j*(47)
+178 + j*(-62)
+99 + j*(-157)
+27 + j*(-137)
+33 + j*(-146)
+-40 + j*(-216)
+-193 + j*(-161)
+-205 + j*(27)
+-36 + j*(80)
+11 + j*(-88)
+-214 + j*(-137)
+-328 + j*(147)
+-54 + j*(356)
+190 + j*(168)
+86 + j*(-4)
+30 + j*(81)
+143 + j*(59)
+93 + j*(-39)
+91 + j*(59)
+321 + j*(-57)
+171 + j*(-471)
+-364 + j*(-392)
+-382 + j*(114)
+-21 + j*(144)
+-91 + j*(-66)
+-223 + j*(142)
+67 + j*(259)
+170 + j*(-28)
+-49 + j*(-78)
+-8 + j*(59)
+57 + j*(-97)
+-209 + j*(-124)
+-242 + j*(199)
+52 + j*(252)
+82 + j*(60)
+1 + j*(119)
+163 + j*(142)
+177 + j*(-79)
+-37 + j*(-81)
+-11 + j*(94)
+128 + j*(43)
+76 + j*(-49)
+56 + j*(-5)
+112 + j*(-57)
+29 + j*(-132)
+-37 + j*(-64)
+15 + j*(-53)
+-33 + j*(-123)
+-136 + j*(-69)
+-132 + j*(37)
+-85 + j*(86)
+-25 + j*(117)
+38 + j*(82)
+11 + j*(58)
+51 + j*(136)
+216 + j*(64)
+161 + j*(-162)
+-64 + j*(-133)
+-36 + j*(40)
+72 + j*(-15)
+-13 + j*(-60)
+1 + j*(43)
+103 + j*(-13)
+25 + j*(-83)
+36 + j*(16)
+181 + j*(-104)
+-18 + j*(-312)
+-258 + j*(-88)
+-38 + j*(113)
+69 + j*(-120)
+-192 + j*(-119)
+-91 + j*(164)
+205 + j*(-31)
+-57 + j*(-346)
+-381 + j*(-87)
+-197 + j*(186)
+-54 + j*(93)
+-95 + j*(115)
+54 + j*(133)
+33 + j*(-93)
+-244 + j*(-11)
+-107 + j*(305)
+207 + j*(138)
+18 + j*(-119)
+-147 + j*(105)
+119 + j*(175)
+96 + j*(-133)
+-253 + j*(-41)
+-149 + j*(344)
+222 + j*(285)
+220 + j*(11)
+82 + j*(6)
+124 + j*(48)
+144 + j*(-33)
+71 + j*(-71)
+6 + j*(-41)
+-13 + j*(59)
+137 + j*(151)
+328 + j*(-30)
+182 + j*(-309)
+-106 + j*(-240)
+-87 + j*(-27)
+31 + j*(-71)
+-78 + j*(-133)
+-141 + j*(31)
+40 + j*(122)
+172 + j*(-39)
+65 + j*(-214)
+-133 + j*(-192)
+-195 + j*(-4)
+-39 + j*(106)
+78 + j*(-33)
+-74 + j*(-144)
+-187 + j*(40)
+24 + j*(165)
+167 + j*(-59)
+-47 + j*(-227)
+-223 + j*(-54)
+-111 + j*(86)
+-56 + j*(2)
+-182 + j*(34)
+-129 + j*(248)
+155 + j*(257)
+254 + j*(-10)
+76 + j*(-153)
+-18 + j*(-66)
+47 + j*(-84)
+-64 + j*(-223)
+-321 + j*(-112)
+-313 + j*(218)
+-22 + j*(334)
+153 + j*(167)
+99 + j*(27)
+22 + j*(46)
+63 + j*(111)
+179 + j*(66)
+187 + j*(-107)
+5 + j*(-195)
+-132 + j*(-49)
+-30 + j*(89)
+84 + j*(16)
+40 + j*(-76)
+-21 + j*(-76)
+-74 + j*(-69)
+-136 + j*(7)
+-70 + j*(119)
+35 + j*(62)
+-59 + j*(2)
+-95 + j*(186)
+182 + j*(254)
+316 + j*(-60)
+25 + j*(-243)
+-161 + j*(4)
+49 + j*(172)
+197 + j*(2)
+77 + j*(-119)
+9 + j*(-37)
+89 + j*(-21)
+93 + j*(-126)
+-8 + j*(-157)
+-58 + j*(-104)
+-63 + j*(-88)
+-116 + j*(-65)
+-126 + j*(49)
+14 + j*(114)
+130 + j*(-16)
+37 + j*(-168)
+-119 + j*(-136)
+-157 + j*(-20)
+-112 + j*(59)
+-28 + j*(83)
+31 + j*(3)
+-67 + j*(-66)
+-148 + j*(71)
+28 + j*(179)
+158 + j*(-12)
+-24 + j*(-141)
+-117 + j*(20)
+31 + j*(50)
+-12 + j*(-100)
+-171 + j*(-1)
+-35 + j*(156)
+93 + j*(-4)
+-98 + j*(-98)
+-174 + j*(116)
+35 + j*(187)
+96 + j*(18)
+-18 + j*(-19)
+-39 + j*(40)
+-48 + j*(51)
+-66 + j*(136)
+66 + j*(216)
+198 + j*(115)
+176 + j*(-5)
+137 + j*(-35)
+116 + j*(-69)
+88 + j*(-67)
+142 + j*(-100)
+82 + j*(-290)
+-246 + j*(-293)
+-373 + j*(76)
+-87 + j*(290)
+103 + j*(158)
+93 + j*(109)
+226 + j*(86)
+247 + j*(-175)
+-47 + j*(-240)
+-90 + j*(38)
+199 + j*(8)
+119 + j*(-333)
+-255 + j*(-281)
+-264 + j*(42)
+-71 + j*(64)
+-111 + j*(-4)
+-120 + j*(132)
+69 + j*(139)
+86 + j*(-52)
+-85 + j*(-52)
+-62 + j*(112)
+108 + j*(74)
+86 + j*(-99)
+-75 + j*(-96)
+-78 + j*(42)
+48 + j*(34)
+23 + j*(-105)
+-137 + j*(-85)
+-141 + j*(82)
+-5 + j*(100)
+-5 + j*(16)
+-49 + j*(69)
+77 + j*(88)
+92 + j*(-113)
+-182 + j*(-150)
+-276 + j*(168)
+23 + j*(330)
+208 + j*(107)
+64 + j*(-23)
+19 + j*(103)
+180 + j*(107)
+218 + j*(-68)
+98 + j*(-160)
+4 + j*(-145)
+-81 + j*(-99)
+-108 + j*(50)
+88 + j*(154)
+288 + j*(-64)
+101 + j*(-367)
+-256 + j*(-279)
+-276 + j*(37)
+-73 + j*(96)
+-68 + j*(-6)
+-135 + j*(78)
+10 + j*(161)
+100 + j*(9)
+-40 + j*(-54)
+-47 + j*(86)
+120 + j*(31)
+17 + j*(-182)
+-261 + j*(-69)
+-202 + j*(252)
+85 + j*(308)
+233 + j*(171)
+313 + j*(39)
+313 + j*(-197)
+59 + j*(-351)
+-148 + j*(-180)
+-38 + j*(-49)
+-81 + j*(-46)
+-16 + j*(85)
+103 + j*(-8)
+-16 + j*(-98)
+-54 + j*(54)
+149 + j*(39)
+102 + j*(-221)
+-192 + j*(-181)
+-167 + j*(105)
+78 + j*(81)
+42 + j*(-127)
+-145 + j*(-88)
+-132 + j*(79)
+8 + j*(108)
+81 + j*(4)
+7 + j*(-110)
+-141 + j*(-67)
+-123 + j*(97)
+32 + j*(84)
+-13 + j*(-54)
+-156 + j*(39)
+-35 + j*(213)
+158 + j*(103)
+86 + j*(-72)
+-36 + j*(-31)
+-8 + j*(33)
+12 + j*(3)
+-18 + j*(3)
+-26 + j*(21)
+-40 + j*(49)
+-1 + j*(110)
+91 + j*(77)
+57 + j*(-6)
+1 + j*(72)
+150 + j*(144)
+295 + j*(-41)
+176 + j*(-265)
+-59 + j*(-291)
+-229 + j*(-135)
+-201 + j*(130)
+114 + j*(213)
+281 + j*(-125)
+-55 + j*(-348)
+-282 + j*(-45)
+-9 + j*(112)
+31 + j*(-186)
+-354 + j*(-137)
+-294 + j*(325)
+173 + j*(303)
+168 + j*(-91)
+-138 + j*(-62)
+-81 + j*(177)
+95 + j*(133)
+79 + j*(59)
+144 + j*(83)
+242 + j*(-95)
+37 + j*(-299)
+-247 + j*(-161)
+-223 + j*(132)
+5 + j*(216)
+146 + j*(88)
+110 + j*(-48)
+15 + j*(-57)
+13 + j*(1)
+62 + j*(-21)
+42 + j*(-80)
+-10 + j*(-93)
+-57 + j*(-95)
+-132 + j*(-48)
+-117 + j*(71)
+-4 + j*(81)
+-21 + j*(-1)
+-98 + j*(76)
+10 + j*(199)
+175 + j*(142)
+238 + j*(12)
+245 + j*(-152)
+62 + j*(-344)
+-260 + j*(-221)
+-199 + j*(131)
+117 + j*(80)
+23 + j*(-192)
+-208 + j*(-39)
+-1 + j*(132)
+88 + j*(-134)
+-250 + j*(-153)
+-228 + j*(236)
+160 + j*(183)
+52 + j*(-163)
+-254 + j*(30)
+9 + j*(329)
+326 + j*(51)
+100 + j*(-272)
+-187 + j*(-156)
+-197 + j*(35)
+-144 + j*(139)
+-6 + j*(221)
+158 + j*(98)
+41 + j*(-88)
+-153 + j*(50)
+-9 + j*(281)
+256 + j*(204)
+310 + j*(-22)
+224 + j*(-184)
+53 + j*(-279)
+-167 + j*(-194)
+-196 + j*(51)
+-12 + j*(165)
+132 + j*(88)
+176 + j*(-17)
+170 + j*(-149)
+28 + j*(-263)
+-156 + j*(-184)
+-144 + j*(-11)
+-22 + j*(-8)
+-47 + j*(-112)
+-171 + j*(-77)
+-164 + j*(60)
+-51 + j*(81)
+-47 + j*(-8)
+-152 + j*(21)
+-140 + j*(176)
+28 + j*(229)
+139 + j*(130)
+151 + j*(42)
+165 + j*(-37)
+103 + j*(-161)
+-70 + j*(-179)
+-158 + j*(-38)
+-97 + j*(66)
+-30 + j*(76)
+13 + j*(75)
+59 + j*(37)
+47 + j*(-21)
+20 + j*(-23)
+34 + j*(-53)
+-50 + j*(-124)
+-206 + j*(-18)
+-139 + j*(218)
+118 + j*(235)
+202 + j*(41)
+112 + j*(-37)
+115 + j*(-7)
+166 + j*(-97)
+58 + j*(-223)
+-95 + j*(-175)
+-90 + j*(-58)
+-28 + j*(-78)
+-98 + j*(-123)
+-185 + j*(-47)
+-167 + j*(49)
+-157 + j*(98)
+-117 + j*(235)
+140 + j*(299)
+325 + j*(19)
+93 + j*(-212)
+-86 + j*(-13)
+160 + j*(75)
+199 + j*(-272)
+-233 + j*(-331)
+-342 + j*(107)
+18 + j*(229)
+87 + j*(-29)
+-98 + j*(6)
+40 + j*(168)
+213 + j*(-25)
+25 + j*(-207)
+-131 + j*(-75)
+-62 + j*(12)
+-69 + j*(-28)
+-123 + j*(47)
+-41 + j*(129)
+35 + j*(94)
+56 + j*(64)
+83 + j*(13)
+10 + j*(-50)
+-74 + j*(51)
+56 + j*(165)
+204 + j*(49)
+142 + j*(-91)
+78 + j*(-69)
+125 + j*(-101)
+64 + j*(-228)
+-124 + j*(-233)
+-235 + j*(-74)
+-181 + j*(107)
+-5 + j*(154)
+80 + j*(28)
+-16 + j*(-20)
+17 + j*(107)
+236 + j*(8)
+134 + j*(-330)
+-291 + j*(-291)
+-337 + j*(137)
+24 + j*(231)
+107 + j*(-56)
+-137 + j*(-117)
+-220 + j*(99)
+-74 + j*(236)
+87 + j*(215)
+190 + j*(102)
+170 + j*(-55)
+44 + j*(-113)
+-37 + j*(-57)
+-55 + j*(-3)
+-64 + j*(71)
+32 + j*(159)
+192 + j*(98)
+202 + j*(-74)
+95 + j*(-137)
+58 + j*(-116)
+57 + j*(-165)
+-45 + j*(-228)
+-190 + j*(-177)
+-257 + j*(-37)
+-233 + j*(117)
+-110 + j*(246)
+111 + j*(260)
+280 + j*(59)
+185 + j*(-203)
+-71 + j*(-223)
+-153 + j*(-43)
+-52 + j*(22)
+-49 + j*(-45)
+-122 + j*(-13)
+-112 + j*(59)
+-109 + j*(77)
+-118 + j*(186)
+57 + j*(296)
+267 + j*(158)
+236 + j*(-60)
+112 + j*(-116)
+49 + j*(-120)
+-46 + j*(-100)
+-64 + j*(30)
+73 + j*(61)
+98 + j*(-70)
+-2 + j*(-81)
+14 + j*(-40)
+-16 + j*(-98)
+-130 + j*(4)
+43 + j*(180)
+282 + j*(-47)
+43 + j*(-334)
+-238 + j*(-124)
+-54 + j*(81)
+45 + j*(-129)
+-231 + j*(-156)
+-253 + j*(165)
+40 + j*(216)
+103 + j*(1)
+-19 + j*(-45)
+-43 + j*(-1)
+-65 + j*(13)
+-57 + j*(88)
+45 + j*(73)
+1 + j*(-36)
+-126 + j*(59)
+-6 + j*(226)
+196 + j*(142)
+196 + j*(-37)
+100 + j*(-117)
+-24 + j*(-124)
+-115 + j*(30)
+78 + j*(194)
+328 + j*(-31)
+119 + j*(-364)
+-248 + j*(-228)
+-198 + j*(104)
+54 + j*(115)
+112 + j*(-59)
+21 + j*(-175)
+-156 + j*(-185)
+-276 + j*(3)
+-127 + j*(174)
+-3 + j*(57)
+-167 + j*(33)
+-131 + j*(307)
+233 + j*(283)
+233 + j*(-86)
+-93 + j*(-55)
+10 + j*(262)
+358 + j*(125)
+259 + j*(-226)
+-8 + j*(-181)
+48 + j*(-40)
+110 + j*(-176)
+-99 + j*(-247)
+-218 + j*(-33)
+-54 + j*(109)
+65 + j*(-14)
+-57 + j*(-100)
+-139 + j*(45)
+28 + j*(158)
+182 + j*(0)
+69 + j*(-180)
+-88 + j*(-124)
+-69 + j*(-43)
+-74 + j*(-78)
+-165 + j*(-21)
+-103 + j*(114)
+45 + j*(63)
+-7 + j*(-81)
+-170 + j*(-40)
+-177 + j*(142)
+-13 + j*(234)
+148 + j*(132)
+103 + j*(-50)
+-79 + j*(-21)
+-26 + j*(179)
+214 + j*(95)
+111 + j*(-183)
+-202 + j*(-62)
+-65 + j*(286)
+315 + j*(166)
+247 + j*(-214)
+-81 + j*(-214)
+-130 + j*(21)
+3 + j*(99)
+97 + j*(65)
+159 + j*(-36)
+64 + j*(-176)
+-128 + j*(-100)
+-64 + j*(124)
+179 + j*(76)
+174 + j*(-169)
+-23 + j*(-226)
+-122 + j*(-134)
+-151 + j*(-48)
+-122 + j*(69)
+34 + j*(99)
+103 + j*(-63)
+-43 + j*(-161)
+-153 + j*(-62)
+-126 + j*(22)
+-119 + j*(59)
+-62 + j*(153)
+116 + j*(122)
+127 + j*(-105)
+-116 + j*(-155)
+-199 + j*(83)
+21 + j*(189)
+140 + j*(-9)
+-33 + j*(-146)
+-199 + j*(-18)
+-157 + j*(160)
+-21 + j*(222)
+100 + j*(185)
+158 + j*(81)
+110 + j*(-5)
+48 + j*(25)
+108 + j*(71)
+187 + j*(-6)
+154 + j*(-117)
+86 + j*(-159)
+15 + j*(-206)
+-144 + j*(-207)
+-269 + j*(-13)
+-130 + j*(208)
+117 + j*(156)
+132 + j*(-68)
+-62 + j*(-125)
+-164 + j*(41)
+-47 + j*(194)
+119 + j*(163)
+163 + j*(57)
+165 + j*(20)
+226 + j*(-57)
+159 + j*(-233)
+-67 + j*(-223)
+-69 + j*(-4)
+162 + j*(-57)
+66 + j*(-364)
+-327 + j*(-300)
+-351 + j*(98)
+-35 + j*(180)
+35 + j*(-36)
+-113 + j*(-70)
+-138 + j*(25)
+-122 + j*(54)
+-122 + j*(134)
+18 + j*(202)
+151 + j*(71)
+77 + j*(-88)
+-50 + j*(-88)
+-115 + j*(-35)
+-170 + j*(60)
+-103 + j*(218)
+100 + j*(221)
+163 + j*(52)
+70 + j*(0)
+94 + j*(52)
+177 + j*(-44)
+76 + j*(-206)
+-129 + j*(-180)
+-207 + j*(-13)
+-145 + j*(124)
+-36 + j*(175)
+72 + j*(143)
+110 + j*(42)
+35 + j*(-27)
+-54 + j*(42)
+8 + j*(174)
+184 + j*(151)
+238 + j*(-20)
+127 + j*(-120)
+41 + j*(-89)
+18 + j*(-49)
+14 + j*(13)
+120 + j*(69)
+255 + j*(-63)
+156 + j*(-270)
+-48 + j*(-243)
+-50 + j*(-122)
+-13 + j*(-175)
+-153 + j*(-200)
+-223 + j*(-23)
+-74 + j*(87)
+52 + j*(-10)
+15 + j*(-144)
+-121 + j*(-197)
+-276 + j*(-108)
+-284 + j*(95)
+-121 + j*(185)
+-32 + j*(103)
+-72 + j*(75)
+-62 + j*(121)
+-23 + j*(132)
+16 + j*(161)
+151 + j*(142)
+204 + j*(-68)
+-15 + j*(-202)
+-190 + j*(-33)
+-98 + j*(127)
+-8 + j*(94)
+-21 + j*(100)
+47 + j*(135)
+111 + j*(59)
+66 + j*(-3)
+42 + j*(13)
+32 + j*(-7)
+-28 + j*(33)
+42 + j*(144)
+214 + j*(71)
+183 + j*(-139)
+-11 + j*(-169)
+-77 + j*(-37)
+-13 + j*(28)
+28 + j*(4)
+6 + j*(-13)
+-9 + j*(39)
+87 + j*(86)
+190 + j*(-39)
+71 + j*(-185)
+-72 + j*(-78)
+59 + j*(27)
+148 + j*(-169)
+-95 + j*(-299)
+-284 + j*(-90)
+-183 + j*(114)
+-41 + j*(128)
+42 + j*(76)
+41 + j*(-37)
+-104 + j*(-27)
+-61 + j*(190)
+254 + j*(127)
+204 + j*(-261)
+-199 + j*(-235)
+-174 + j*(119)
+93 + j*(52)
+-48 + j*(-120)
+-139 + j*(107)
+165 + j*(136)
+159 + j*(-217)
+-197 + j*(-197)
+-162 + j*(107)
+62 + j*(37)
+-49 + j*(-124)
+-175 + j*(-10)
+-124 + j*(65)
+-156 + j*(110)
+-60 + j*(294)
+245 + j*(221)
+237 + j*(-116)
+-35 + j*(-135)
+-19 + j*(35)
+81 + j*(-70)
+-105 + j*(-158)
+-230 + j*(45)
+-98 + j*(192)
+4 + j*(180)
+74 + j*(200)
+221 + j*(139)
+243 + j*(-57)
+95 + j*(-151)
+-8 + j*(-93)
+-18 + j*(-30)
+0 + j*(6)
+32 + j*(16)
+68 + j*(11)
+120 + j*(-41)
+82 + j*(-187)
+-162 + j*(-208)
+-276 + j*(105)
+57 + j*(322)
+353 + j*(23)
+128 + j*(-309)
+-186 + j*(-168)
+-115 + j*(102)
+116 + j*(84)
+170 + j*(-120)
+5 + j*(-276)
+-236 + j*(-190)
+-244 + j*(74)
+-15 + j*(129)
+18 + j*(-59)
+-169 + j*(-57)
+-166 + j*(146)
+8 + j*(187)
+89 + j*(97)
+104 + j*(8)
+26 + j*(-96)
+-151 + j*(-27)
+-93 + j*(222)
+204 + j*(211)
+271 + j*(-60)
+118 + j*(-177)
+35 + j*(-197)
+-118 + j*(-234)
+-296 + j*(-45)
+-152 + j*(199)
+51 + j*(112)
+-34 + j*(23)
+-15 + j*(175)
+233 + j*(110)
+190 + j*(-203)
+-110 + j*(-227)
+-203 + j*(-18)
+-148 + j*(100)
+-77 + j*(214)
+154 + j*(251)
+313 + j*(-6)
+112 + j*(-228)
+-91 + j*(-103)
+2 + j*(36)
+103 + j*(-71)
+-13 + j*(-194)
+-187 + j*(-126)
+-211 + j*(74)
+-35 + j*(177)
+103 + j*(34)
+-38 + j*(-107)
+-194 + j*(48)
+-54 + j*(236)
+139 + j*(153)
+111 + j*(17)
+49 + j*(28)
+78 + j*(55)
+118 + j*(41)
+170 + j*(-4)
+170 + j*(-122)
+45 + j*(-183)
+-30 + j*(-103)
+19 + j*(-76)
+-4 + j*(-136)
+-82 + j*(-109)
+-69 + j*(-55)
+-71 + j*(-72)
+-119 + j*(-47)
+-114 + j*(8)
+-107 + j*(29)
+-91 + j*(101)
+47 + j*(107)
+65 + j*(-80)
+-173 + j*(-102)
+-209 + j*(184)
+93 + j*(252)
+185 + j*(-21)
+-38 + j*(-115)
+-121 + j*(50)
+-29 + j*(117)
+-6 + j*(107)
+30 + j*(156)
+132 + j*(152)
+189 + j*(82)
+221 + j*(23)
+244 + j*(-66)
+218 + j*(-163)
+179 + j*(-264)
+26 + j*(-409)
+-295 + j*(-341)
+-363 + j*(37)
+-18 + j*(168)
+91 + j*(-151)
+-255 + j*(-233)
+-349 + j*(125)
+-42 + j*(233)
+11 + j*(0)
+-204 + j*(31)
+-136 + j*(288)
+141 + j*(272)
+200 + j*(45)
+67 + j*(-45)
+-9 + j*(32)
+59 + j*(119)
+215 + j*(54)
+209 + j*(-194)
+-94 + j*(-302)
+-320 + j*(-16)
+-112 + j*(284)
+194 + j*(171)
+148 + j*(-88)
+-57 + j*(-61)
+-19 + j*(124)
+183 + j*(101)
+230 + j*(-124)
+29 + j*(-272)
+-207 + j*(-153)
+-192 + j*(122)
+68 + j*(192)
+184 + j*(-30)
+1 + j*(-141)
+-74 + j*(33)
+127 + j*(67)
+157 + j*(-180)
+-114 + j*(-251)
+-228 + j*(-17)
+-82 + j*(104)
+-14 + j*(49)
+-8 + j*(66)
+86 + j*(42)
+71 + j*(-99)
+-79 + j*(-98)
+-80 + j*(25)
+-6 + j*(4)
+-71 + j*(-25)
+-71 + j*(88)
+77 + j*(71)
+49 + j*(-103)
+-151 + j*(-70)
+-147 + j*(149)
+59 + j*(213)
+199 + j*(84)
+207 + j*(-97)
+67 + j*(-251)
+-182 + j*(-228)
+-293 + j*(14)
+-147 + j*(204)
+23 + j*(180)
+74 + j*(98)
+80 + j*(47)
+62 + j*(-4)
+2 + j*(-7)
+-12 + j*(57)
+57 + j*(87)
+107 + j*(38)
+102 + j*(0)
+119 + j*(-10)
+156 + j*(-88)
+71 + j*(-206)
+-96 + j*(-164)
+-83 + j*(-8)
+54 + j*(-48)
+-49 + j*(-215)
+-287 + j*(-91)
+-204 + j*(205)
+94 + j*(183)
+115 + j*(-76)
+-100 + j*(-132)
+-210 + j*(28)
+-159 + j*(198)
+22 + j*(296)
+242 + j*(185)
+238 + j*(-55)
+69 + j*(-94)
+85 + j*(-11)
+148 + j*(-138)
+-55 + j*(-249)
+-222 + j*(-41)
+-63 + j*(134)
+74 + j*(28)
+4 + j*(-62)
+-53 + j*(-33)
+-95 + j*(4)
+-113 + j*(147)
+127 + j*(271)
+388 + j*(-3)
+170 + j*(-368)
+-207 + j*(-255)
+-165 + j*(28)
+-20 + j*(-34)
+-176 + j*(-87)
+-212 + j*(161)
+56 + j*(214)
+88 + j*(-25)
+-130 + j*(20)
+-13 + j*(269)
+270 + j*(145)
+179 + j*(-109)
+32 + j*(-13)
+214 + j*(32)
+240 + j*(-249)
+-54 + j*(-318)
+-115 + j*(-124)
+-49 + j*(-179)
+-281 + j*(-192)
+-308 + j*(177)
+122 + j*(210)
+110 + j*(-257)
+-413 + j*(-193)
+-341 + j*(371)
+194 + j*(319)
+129 + j*(-114)
+-196 + j*(16)
+9 + j*(273)
+226 + j*(30)
+-14 + j*(-144)
+-143 + j*(71)
+37 + j*(160)
+98 + j*(29)
+11 + j*(-23)
+-62 + j*(30)
+-59 + j*(172)
+170 + j*(260)
+374 + j*(-22)
+91 + j*(-315)
+-235 + j*(-52)
+17 + j*(264)
+308 + j*(32)
+112 + j*(-209)
+-40 + j*(-46)
+129 + j*(11)
+146 + j*(-182)
+-29 + j*(-237)
+-134 + j*(-165)
+-228 + j*(-64)
+-201 + j*(183)
+124 + j*(269)
+307 + j*(-57)
+36 + j*(-274)
+-158 + j*(-65)
+25 + j*(76)
+141 + j*(-103)
+-4 + j*(-233)
+-125 + j*(-177)
+-166 + j*(-139)
+-263 + j*(-87)
+-305 + j*(98)
+-144 + j*(253)
+52 + j*(184)
+46 + j*(33)
+-37 + j*(44)
+24 + j*(87)
+57 + j*(-37)
+-132 + j*(-75)
+-199 + j*(168)
+64 + j*(276)
+189 + j*(35)
+-25 + j*(-61)
+-81 + j*(156)
+144 + j*(209)
+223 + j*(22)
+127 + j*(-48)
+130 + j*(-33)
+136 + j*(-127)
+8 + j*(-185)
+-102 + j*(-104)
+-106 + j*(10)
+-30 + j*(91)
+103 + j*(66)
+124 + j*(-93)
+-32 + j*(-141)
+-78 + j*(-13)
+25 + j*(-13)
+-52 + j*(-115)
+-190 + j*(29)
+-10 + j*(219)
+214 + j*(38)
+43 + j*(-186)
+-152 + j*(-14)
+47 + j*(155)
+214 + j*(-83)
+-40 + j*(-281)
+-275 + j*(-59)
+-132 + j*(180)
+62 + j*(122)
+66 + j*(18)
+66 + j*(-15)
+33 + j*(-124)
+-178 + j*(-131)
+-274 + j*(151)
+3 + j*(363)
+296 + j*(180)
+255 + j*(-107)
+62 + j*(-172)
+-33 + j*(-97)
+-42 + j*(-28)
+-8 + j*(23)
+67 + j*(13)
+92 + j*(-84)
+-1 + j*(-163)
+-136 + j*(-114)
+-154 + j*(33)
+-37 + j*(105)
+46 + j*(37)
+23 + j*(-28)
+-10 + j*(-42)
+-65 + j*(-58)
+-161 + j*(40)
+-48 + j*(238)
+242 + j*(153)
+208 + j*(-176)
+-96 + j*(-171)
+-71 + j*(79)
+141 + j*(0)
+22 + j*(-195)
+-145 + j*(-69)
+-23 + j*(32)
+1 + j*(-106)
+-158 + j*(-91)
+-144 + j*(37)
+-114 + j*(6)
+-225 + j*(88)
+-99 + j*(313)
+187 + j*(224)
+156 + j*(-27)
+6 + j*(-21)
+26 + j*(18)
+-44 + j*(-21)
+-110 + j*(156)
+166 + j*(279)
+373 + j*(-39)
+102 + j*(-322)
+-210 + j*(-171)
+-206 + j*(98)
+-38 + j*(230)
+175 + j*(190)
+238 + j*(-39)
+24 + j*(-137)
+-42 + j*(72)
+193 + j*(92)
+178 + j*(-170)
+-78 + j*(-119)
+30 + j*(127)
+289 + j*(-23)
+171 + j*(-293)
+-29 + j*(-264)
+-54 + j*(-238)
+-212 + j*(-272)
+-380 + j*(-33)
+-190 + j*(227)
+57 + j*(135)
+23 + j*(-16)
+-23 + j*(14)
+38 + j*(-11)
+-19 + j*(-117)
+-170 + j*(-73)
+-187 + j*(109)
+-20 + j*(211)
+161 + j*(103)
+127 + j*(-109)
+-69 + j*(-141)
+-123 + j*(8)
+-30 + j*(41)
+-50 + j*(-23)
+-117 + j*(51)
+-20 + j*(134)
+69 + j*(46)
+-4 + j*(-28)
+-60 + j*(30)
+-26 + j*(81)
+18 + j*(88)
+84 + j*(67)
+106 + j*(-46)
+-32 + j*(-121)
+-155 + j*(11)
+-52 + j*(162)
+104 + j*(91)
+49 + j*(-57)
+-107 + j*(-10)
+-84 + j*(162)
+78 + j*(184)
+108 + j*(79)
+66 + j*(119)
+233 + j*(180)
+402 + j*(-80)
+151 + j*(-373)
+-197 + j*(-202)
+-103 + j*(110)
+122 + j*(50)
+57 + j*(-78)
+13 + j*(30)
+183 + j*(25)
+190 + j*(-180)
+16 + j*(-221)
+-12 + j*(-131)
+28 + j*(-171)
+-58 + j*(-234)
+-159 + j*(-191)
+-208 + j*(-126)
+-233 + j*(-35)
+-175 + j*(46)
+-124 + j*(7)
+-218 + j*(2)
+-249 + j*(175)
+-74 + j*(280)
+54 + j*(189)
+38 + j*(134)
+87 + j*(160)
+177 + j*(76)
+134 + j*(-44)
+55 + j*(-45)
+66 + j*(-36)
+42 + j*(-107)
+-86 + j*(-110)
+-147 + j*(40)
+-18 + j*(158)
+138 + j*(78)
+116 + j*(-87)
+-26 + j*(-118)
+-91 + j*(-23)
+-45 + j*(52)
+23 + j*(49)
+59 + j*(-13)
+6 + j*(-88)
+-102 + j*(-58)
+-103 + j*(64)
+0 + j*(80)
+0 + j*(1)
+-79 + j*(38)
+-22 + j*(141)
+101 + j*(96)
+76 + j*(-18)
+-18 + j*(6)
+22 + j*(97)
+136 + j*(53)
+112 + j*(-92)
+-50 + j*(-98)
+-86 + j*(70)
+83 + j*(131)
+158 + j*(-28)
+12 + j*(-99)
+-45 + j*(52)
+128 + j*(119)
+250 + j*(-48)
+161 + j*(-238)
+-41 + j*(-281)
+-210 + j*(-143)
+-170 + j*(83)
+44 + j*(117)
+103 + j*(-55)
+-17 + j*(-90)
+6 + j*(-11)
+67 + j*(-115)
+-100 + j*(-185)
+-186 + j*(7)
+6 + j*(85)
+59 + j*(-106)
+-128 + j*(-150)
+-174 + j*(-2)
+-106 + j*(23)
+-146 + j*(30)
+-115 + j*(137)
+16 + j*(115)
+-12 + j*(10)
+-88 + j*(73)
+11 + j*(140)
+76 + j*(25)
+-41 + j*(-23)
+-69 + j*(100)
+61 + j*(120)
+73 + j*(-14)
+-76 + j*(-17)
+-76 + j*(166)
+146 + j*(190)
+203 + j*(-59)
+-65 + j*(-141)
+-179 + j*(158)
+127 + j*(331)
+366 + j*(92)
+271 + j*(-130)
+192 + j*(-168)
+129 + j*(-303)
+-170 + j*(-330)
+-313 + j*(18)
+4 + j*(231)
+230 + j*(-30)
+35 + j*(-240)
+-133 + j*(-135)
+-115 + j*(-52)
+-153 + j*(-35)
+-172 + j*(101)
+-16 + j*(192)
+129 + j*(86)
+98 + j*(-69)
+-40 + j*(-105)
+-125 + j*(18)
+-9 + j*(138)
+136 + j*(25)
+25 + j*(-136)
+-140 + j*(-26)
+-40 + j*(128)
+86 + j*(42)
+8 + j*(-37)
+-24 + j*(43)
+59 + j*(53)
+67 + j*(-8)
+61 + j*(-6)
+91 + j*(-59)
+16 + j*(-127)
+-57 + j*(-59)
+2 + j*(-24)
+-6 + j*(-105)
+-116 + j*(-82)
+-112 + j*(23)
+-62 + j*(28)
+-76 + j*(44)
+-19 + j*(91)
+38 + j*(19)
+-56 + j*(-11)
+-56 + j*(129)
+135 + j*(124)
+157 + j*(-80)
+3 + j*(-127)
+-21 + j*(-65)
+-49 + j*(-135)
+-255 + j*(-85)
+-267 + j*(240)
+88 + j*(366)
+314 + j*(74)
+134 + j*(-172)
+-48 + j*(-84)
+16 + j*(-5)
+13 + j*(-124)
+-199 + j*(-104)
+-243 + j*(177)
+21 + j*(323)
+231 + j*(174)
+241 + j*(6)
+211 + j*(-120)
+67 + j*(-256)
+-177 + j*(-171)
+-163 + j*(88)
+32 + j*(101)
+6 + j*(3)
+-6 + j*(133)
+254 + j*(110)
+267 + j*(-250)
+-100 + j*(-334)
+-221 + j*(-70)
+-113 + j*(-4)
+-188 + j*(12)
+-129 + j*(237)
+175 + j*(192)
+129 + j*(-105)
+-121 + j*(4)
+83 + j*(243)
+358 + j*(-13)
+136 + j*(-320)
+-134 + j*(-193)
+-85 + j*(-28)
+-25 + j*(-49)
+-39 + j*(-59)
+-42 + j*(-81)
+-126 + j*(-83)
+-144 + j*(44)
+-16 + j*(53)
+-59 + j*(-66)
+-182 + j*(48)
+-15 + j*(173)
+83 + j*(-40)
+-190 + j*(-96)
+-234 + j*(235)
+103 + j*(293)
+141 + j*(22)
+-61 + j*(75)
+105 + j*(276)
+367 + j*(68)
+211 + j*(-231)
+-35 + j*(-161)
+0 + j*(-14)
+74 + j*(-76)
+-12 + j*(-136)
+-82 + j*(-64)
+-36 + j*(-12)
+-21 + j*(-69)
+-129 + j*(-76)
+-170 + j*(76)
+-22 + j*(163)
+64 + j*(42)
+-47 + j*(8)
+-32 + j*(148)
+131 + j*(115)
+85 + j*(-23)
+4 + j*(89)
+236 + j*(157)
+371 + j*(-161)
+77 + j*(-395)
+-167 + j*(-233)
+-142 + j*(-103)
+-190 + j*(-85)
+-221 + j*(99)
+-4 + j*(197)
+113 + j*(18)
+-13 + j*(-54)
+-8 + j*(36)
+69 + j*(-48)
+-64 + j*(-131)
+-150 + j*(8)
+-42 + j*(59)
+-83 + j*(-22)
+-187 + j*(132)
+33 + j*(313)
+291 + j*(114)
+173 + j*(-157)
+-25 + j*(-118)
+-11 + j*(-26)
+-4 + j*(-68)
+-82 + j*(-47)
+-72 + j*(32)
+-42 + j*(31)
+-70 + j*(67)
+2 + j*(145)
+115 + j*(83)
+69 + j*(-19)
+2 + j*(51)
+117 + j*(122)
+245 + j*(2)
+214 + j*(-159)
+125 + j*(-253)
+-7 + j*(-340)
+-247 + j*(-320)
+-415 + j*(-74)
+-314 + j*(210)
+-62 + j*(283)
+95 + j*(155)
+68 + j*(13)
+-33 + j*(16)
+-16 + j*(117)
+112 + j*(99)
+112 + j*(-35)
+4 + j*(-37)
+42 + j*(50)
+138 + j*(-35)
+48 + j*(-168)
+-95 + j*(-132)
+-135 + j*(-46)
+-175 + j*(45)
+-99 + j*(234)
+212 + j*(230)
+308 + j*(-136)
+-42 + j*(-317)
+-255 + j*(-39)
+-71 + j*(141)
+24 + j*(26)
+-61 + j*(32)
+14 + j*(115)
+88 + j*(12)
+-23 + j*(-21)
+12 + j*(112)
+178 + j*(14)
+47 + j*(-193)
+-189 + j*(-53)
+-62 + j*(185)
+148 + j*(84)
+74 + j*(-69)
+-12 + j*(-4)
+55 + j*(35)
+66 + j*(-12)
+81 + j*(13)
+192 + j*(-59)
+122 + j*(-283)
+-159 + j*(-285)
+-238 + j*(-45)
+-95 + j*(30)
+-93 + j*(-46)
+-166 + j*(18)
+-97 + j*(98)
+-63 + j*(34)
+-175 + j*(78)
+-115 + j*(289)
+161 + j*(317)
+301 + j*(96)
+231 + j*(-69)
+163 + j*(-127)
+91 + j*(-209)
+-72 + j*(-214)
+-153 + j*(-78)
+-91 + j*(0)
+-83 + j*(-28)
+-144 + j*(37)
+-59 + j*(159)
+102 + j*(96)
+62 + j*(-69)
+-101 + j*(-29)
+-47 + j*(142)
+145 + j*(75)
+66 + j*(-145)
+-194 + j*(-59)
+-121 + j*(255)
+226 + j*(237)
+284 + j*(-82)
+60 + j*(-177)
+6 + j*(-68)
+46 + j*(-112)
+-89 + j*(-147)
+-141 + j*(33)
+42 + j*(86)
+74 + j*(-95)
+-98 + j*(-101)
+-79 + j*(47)
+28 + j*(-16)
+-104 + j*(-104)
+-210 + j*(83)
+-21 + j*(232)
+139 + j*(103)
+92 + j*(-8)
+67 + j*(-16)
+40 + j*(-74)
+-71 + j*(-34)
+2 + j*(122)
+231 + j*(6)
+110 + j*(-317)
+-290 + j*(-269)
+-358 + j*(111)
+-109 + j*(267)
+21 + j*(192)
+65 + j*(185)
+185 + j*(136)
+192 + j*(-16)
+103 + j*(-41)
+150 + j*(-35)
+134 + j*(-185)
+-76 + j*(-198)
+-94 + j*(1)
+70 + j*(-44)
+-75 + j*(-212)
+-285 + j*(13)
+-35 + j*(257)
+196 + j*(19)
+-34 + j*(-148)
+-113 + j*(96)
+163 + j*(103)
+129 + j*(-198)
+-148 + j*(-154)
+-99 + j*(44)
+-8 + j*(-47)
+-171 + j*(-51)
+-137 + j*(169)
+82 + j*(134)
+39 + j*(-27)
+-40 + j*(47)
+66 + j*(49)
+6 + j*(-69)
+-103 + j*(54)
+69 + j*(132)
+98 + j*(-70)
+-124 + j*(-29)
+-10 + j*(222)
+260 + j*(67)
+114 + j*(-181)
+-49 + j*(-58)
+71 + j*(-25)
+-18 + j*(-165)
+-169 + j*(13)
+81 + j*(142)
+180 + j*(-171)
+-167 + j*(-261)
+-250 + j*(37)
+-76 + j*(62)
+-204 + j*(18)
+-202 + j*(334)
+235 + j*(380)
+347 + j*(-47)
+23 + j*(-152)
+3 + j*(66)
+168 + j*(-11)
+37 + j*(-153)
+-72 + j*(-21)
+45 + j*(47)
+83 + j*(-41)
+49 + j*(-69)
+35 + j*(-114)
+-78 + j*(-126)
+-99 + j*(24)
+77 + j*(13)
+19 + j*(-216)
+-276 + j*(-156)
+-284 + j*(150)
+-77 + j*(244)
+25 + j*(216)
+167 + j*(210)
+296 + j*(-6)
+105 + j*(-216)
+-93 + j*(-66)
+57 + j*(64)
+146 + j*(-127)
+-79 + j*(-224)
+-211 + j*(-19)
+-73 + j*(138)
+80 + j*(81)
+96 + j*(-46)
+1 + j*(-110)
+-70 + j*(-42)
+5 + j*(-4)
+1 + j*(-139)
+-228 + j*(-139)
+-295 + j*(160)
+-11 + j*(317)
+194 + j*(139)
+155 + j*(-28)
+108 + j*(-105)
+-11 + j*(-213)
+-255 + j*(-135)
+-271 + j*(165)
+-18 + j*(264)
+84 + j*(119)
+25 + j*(99)
+105 + j*(161)
+235 + j*(39)
+151 + j*(-148)
+-40 + j*(-140)
+-90 + j*(16)
+25 + j*(94)
+120 + j*(14)
+75 + j*(-83)
+5 + j*(-74)
+2 + j*(-60)
+-56 + j*(-86)
+-141 + j*(25)
+-11 + j*(178)
+184 + j*(57)
+73 + j*(-150)
+-120 + j*(-24)
+37 + j*(170)
+266 + j*(-8)
+126 + j*(-279)
+-144 + j*(-231)
+-191 + j*(-41)
+-134 + j*(50)
+-66 + j*(119)
+76 + j*(112)
+122 + j*(-46)
+-18 + j*(-110)
+-66 + j*(10)
+49 + j*(23)
+34 + j*(-105)
+-104 + j*(-74)
+-68 + j*(72)
+86 + j*(34)
+71 + j*(-132)
+-91 + j*(-177)
+-204 + j*(-71)
+-194 + j*(69)
+-88 + j*(142)
+6 + j*(93)
+-11 + j*(27)
+-46 + j*(41)
+-32 + j*(51)
+-63 + j*(48)
+-66 + j*(142)
+88 + j*(167)
+131 + j*(-28)
+-103 + j*(-74)
+-167 + j*(211)
+144 + j*(334)
+329 + j*(72)
+173 + j*(-104)
+86 + j*(-20)
+187 + j*(-28)
+176 + j*(-183)
+21 + j*(-251)
+-116 + j*(-192)
+-187 + j*(-69)
+-146 + j*(75)
+-13 + j*(116)
+58 + j*(46)
+50 + j*(-4)
+40 + j*(-40)
+-24 + j*(-63)
+-74 + j*(33)
+59 + j*(116)
+192 + j*(-36)
+55 + j*(-223)
+-163 + j*(-145)
+-164 + j*(65)
+-1 + j*(142)
+137 + j*(43)
+119 + j*(-133)
+-65 + j*(-199)
+-193 + j*(-47)
+-95 + j*(98)
+14 + j*(49)
+-11 + j*(-2)
+-1 + j*(20)
+31 + j*(-43)
+-79 + j*(-95)
+-156 + j*(33)
+-37 + j*(119)
+28 + j*(18)
+-74 + j*(-13)
+-95 + j*(91)
+-21 + j*(122)
+-11 + j*(119)
+47 + j*(191)
+222 + j*(151)
+265 + j*(-71)
+82 + j*(-185)
+-40 + j*(-66)
+66 + j*(24)
+174 + j*(-113)
+35 + j*(-313)
+-267 + j*(-271)
+-388 + j*(52)
+-160 + j*(308)
+133 + j*(223)
+158 + j*(-12)
+13 + j*(-76)
+-36 + j*(-8)
+-13 + j*(6)
+-27 + j*(-4)
+-44 + j*(18)
+-49 + j*(32)
+-75 + j*(81)
+-13 + j*(182)
+148 + j*(168)
+200 + j*(19)
+131 + j*(-46)
+139 + j*(-54)
+121 + j*(-175)
+-78 + j*(-204)
+-154 + j*(7)
+37 + j*(87)
+86 + j*(-81)
+-64 + j*(-85)
+-6 + j*(43)
+111 + j*(-93)
+-103 + j*(-233)
+-294 + j*(11)
+-91 + j*(235)
+106 + j*(117)
+64 + j*(27)
+110 + j*(53)
+191 + j*(-95)
+31 + j*(-250)
+-144 + j*(-170)
+-157 + j*(-76)
+-209 + j*(-36)
+-236 + j*(128)
+-69 + j*(251)
+84 + j*(177)
+125 + j*(95)
+177 + j*(-8)
+71 + j*(-192)
+-204 + j*(-117)
+-164 + j*(200)
+153 + j*(187)
+148 + j*(-98)
+-88 + j*(-79)
+-40 + j*(113)
+110 + j*(35)
+11 + j*(-76)
+-71 + j*(46)
+70 + j*(124)
+175 + j*(-5)
+114 + j*(-146)
+-22 + j*(-192)
+-167 + j*(-117)
+-182 + j*(71)
+-16 + j*(154)
+81 + j*(30)
+-27 + j*(-45)
+-94 + j*(90)
+71 + j*(202)
+274 + j*(52)
+215 + j*(-234)
+-93 + j*(-301)
+-268 + j*(-52)
+-110 + j*(161)
+73 + j*(81)
+32 + j*(-45)
+-45 + j*(-16)
+-29 + j*(23)
+-31 + j*(35)
+9 + j*(85)
+100 + j*(33)
+43 + j*(-78)
+-61 + j*(1)
+64 + j*(94)
+168 + j*(-78)
+-13 + j*(-205)
+-144 + j*(-61)
+-56 + j*(13)
+-86 + j*(-42)
+-156 + j*(94)
+42 + j*(208)
+191 + j*(-6)
+-13 + j*(-153)
+-127 + j*(37)
+59 + j*(109)
+88 + j*(-75)
+-93 + j*(-64)
+-45 + j*(118)
+148 + j*(40)
+61 + j*(-171)
+-164 + j*(-104)
+-133 + j*(106)
+27 + j*(103)
+9 + j*(1)
+-65 + j*(74)
+59 + j*(178)
+222 + j*(57)
+158 + j*(-132)
+12 + j*(-125)
+33 + j*(-59)
+55 + j*(-160)
+-129 + j*(-214)
+-256 + j*(-8)
+-85 + j*(175)
+112 + j*(47)
+15 + j*(-156)
+-210 + j*(-97)
+-221 + j*(140)
+-15 + j*(230)
+112 + j*(87)
+8 + j*(-23)
+-72 + j*(98)
+100 + j*(187)
+235 + j*(-24)
+18 + j*(-221)
+-236 + j*(-31)
+-109 + j*(274)
+211 + j*(248)
+299 + j*(-25)
+122 + j*(-179)
+-27 + j*(-86)
+56 + j*(40)
+208 + j*(-78)
+81 + j*(-318)
+-235 + j*(-260)
+-277 + j*(49)
+-59 + j*(149)
+13 + j*(44)
+-18 + j*(52)
+71 + j*(60)
+81 + j*(-71)
+-65 + j*(-76)
+-45 + j*(76)
+122 + j*(35)
+91 + j*(-156)
+-100 + j*(-170)
+-175 + j*(-18)
+-83 + j*(103)
+70 + j*(66)
+72 + j*(-126)
+-162 + j*(-174)
+-268 + j*(81)
+-34 + j*(223)
+95 + j*(27)
+-81 + j*(-58)
+-129 + j*(103)
+-10 + j*(121)
+-62 + j*(67)
+-89 + j*(242)
+182 + j*(332)
+387 + j*(71)
+248 + j*(-204)
+-4 + j*(-214)
+-124 + j*(-41)
+-28 + j*(148)
+207 + j*(115)
+240 + j*(-131)
+43 + j*(-199)
+14 + j*(-80)
+99 + j*(-156)
+-59 + j*(-278)
+-228 + j*(-122)
+-134 + j*(25)
+-71 + j*(-31)
+-134 + j*(-13)
+-91 + j*(50)
+-78 + j*(2)
+-161 + j*(66)
+-52 + j*(206)
+125 + j*(95)
+28 + j*(-72)
+-110 + j*(14)
+-52 + j*(128)
+25 + j*(127)
+94 + j*(114)
+146 + j*(-5)
+-8 + j*(-91)
+-98 + j*(117)
+173 + j*(220)
+301 + j*(-74)
+52 + j*(-197)
+16 + j*(-13)
+180 + j*(-112)
+-13 + j*(-313)
+-245 + j*(-104)
+-64 + j*(89)
+49 + j*(-84)
+-145 + j*(-141)
+-194 + j*(45)
+-72 + j*(105)
+-32 + j*(76)
+17 + j*(74)
+37 + j*(-18)
+-81 + j*(-42)
+-104 + j*(80)
+-23 + j*(100)
+-51 + j*(107)
+42 + j*(243)
+305 + j*(128)
+233 + j*(-210)
+-93 + j*(-184)
+-76 + j*(74)
+112 + j*(35)
+50 + j*(-95)
+-22 + j*(-21)
+63 + j*(-1)
+66 + j*(-93)
+1 + j*(-117)
+-45 + j*(-119)
+-119 + j*(-73)
+-69 + j*(36)
+47 + j*(-61)
+-136 + j*(-212)
+-364 + j*(19)
+-169 + j*(305)
+76 + j*(196)
+14 + j*(92)
+61 + j*(190)
+235 + j*(61)
+98 + j*(-155)
+-96 + j*(-29)
+35 + j*(119)
+154 + j*(-23)
+37 + j*(-140)
+-79 + j*(-98)
+-150 + j*(-16)
+-151 + j*(161)
+73 + j*(278)
+285 + j*(93)
+202 + j*(-139)
+32 + j*(-159)
+-49 + j*(-87)
+-57 + j*(21)
+84 + j*(85)
+197 + j*(-92)
+2 + j*(-245)
+-152 + j*(-64)
+23 + j*(43)
+71 + j*(-156)
+-158 + j*(-175)
+-177 + j*(49)
+2 + j*(60)
+-1 + j*(-68)
+-82 + j*(-66)
+-103 + j*(-56)
+-190 + j*(-33)
+-222 + j*(119)
+-102 + j*(221)
+-3 + j*(219)
+112 + j*(226)
+266 + j*(72)
+149 + j*(-171)
+-91 + j*(-102)
+-21 + j*(69)
+61 + j*(-51)
+-136 + j*(-63)
+-110 + j*(204)
+182 + j*(163)
+125 + j*(-103)
+-85 + j*(6)
+95 + j*(177)
+266 + j*(-32)
+110 + j*(-194)
+34 + j*(-147)
+1 + j*(-245)
+-282 + j*(-225)
+-354 + j*(159)
+15 + j*(309)
+162 + j*(33)
+-21 + j*(-33)
+23 + j*(92)
+115 + j*(-56)
+-123 + j*(-117)
+-177 + j*(212)
+219 + j*(306)
+383 + j*(-83)
+90 + j*(-290)
+-67 + j*(-128)
+14 + j*(-94)
+-74 + j*(-182)
+-212 + j*(-44)
+-86 + j*(112)
+40 + j*(11)
+-71 + j*(-66)
+-117 + j*(74)
+45 + j*(103)
+53 + j*(-76)
+-162 + j*(-62)
+-153 + j*(212)
+172 + j*(257)
+296 + j*(-73)
+11 + j*(-260)
+-197 + j*(-38)
+-28 + j*(155)
+134 + j*(14)
+11 + j*(-101)
+-45 + j*(18)
+98 + j*(8)
+37 + j*(-184)
+-190 + j*(-105)
+-107 + j*(119)
+73 + j*(1)
+-116 + j*(-134)
+-236 + j*(137)
+83 + j*(258)
+188 + j*(-74)
+-141 + j*(-133)
+-141 + j*(196)
+178 + j*(144)
+77 + j*(-153)
+-197 + j*(-9)
+-36 + j*(248)
+184 + j*(119)
+115 + j*(-14)
+110 + j*(16)
+146 + j*(-99)
+-31 + j*(-158)
+-87 + j*(29)
+91 + j*(44)
+52 + j*(-133)
+-122 + j*(-55)
+-30 + j*(98)
+74 + j*(4)
+-31 + j*(-33)
+-4 + j*(100)
+165 + j*(47)
+131 + j*(-136)
+-23 + j*(-144)
+-62 + j*(-45)
+-7 + j*(18)
+103 + j*(-16)
+102 + j*(-202)
+-154 + j*(-264)
+-269 + j*(8)
+-14 + j*(118)
+39 + j*(-144)
+-268 + j*(-148)
+-272 + j*(185)
+19 + j*(200)
+-1 + j*(0)
+-125 + j*(96)
+30 + j*(173)
+55 + j*(-4)
+-146 + j*(56)
+-10 + j*(319)
+322 + j*(182)
+257 + j*(-162)
+-13 + j*(-180)
+-65 + j*(-35)
+-40 + j*(-1)
+-58 + j*(54)
+21 + j*(128)
+138 + j*(82)
+168 + j*(-33)
+116 + j*(-145)
+-39 + j*(-184)
+-156 + j*(-38)
+-47 + j*(105)
+68 + j*(25)
+-13 + j*(-14)
+35 + j*(111)
+247 + j*(3)
+142 + j*(-295)
+-182 + j*(-240)
+-173 + j*(28)
+1 + j*(16)
+-51 + j*(-80)
+-89 + j*(-8)
+-27 + j*(-38)
+-166 + j*(-100)
+-269 + j*(147)
+30 + j*(319)
+247 + j*(24)
+-16 + j*(-187)
+-190 + j*(47)
+23 + j*(173)
+90 + j*(-25)
+-108 + j*(-33)
+-93 + j*(188)
+130 + j*(202)
+206 + j*(45)
+183 + j*(-49)
+161 + j*(-170)
+-33 + j*(-283)
+-267 + j*(-117)
+-189 + j*(159)
+41 + j*(152)
+41 + j*(3)
+-54 + j*(52)
+41 + j*(136)
+129 + j*(34)
+35 + j*(-28)
+20 + j*(85)
+183 + j*(83)
+219 + j*(-107)
+69 + j*(-186)
+3 + j*(-112)
+37 + j*(-106)
+4 + j*(-153)
+-51 + j*(-147)
+-91 + j*(-144)
+-175 + j*(-95)
+-158 + j*(46)
+-6 + j*(42)
+-35 + j*(-116)
+-227 + j*(-52)
+-151 + j*(165)
+64 + j*(83)
+-52 + j*(-116)
+-252 + j*(39)
+-90 + j*(250)
+103 + j*(104)
+-49 + j*(-39)
+-174 + j*(150)
+37 + j*(317)
+267 + j*(153)
+196 + j*(-101)
+-31 + j*(-114)
+-81 + j*(76)
+90 + j*(135)
+138 + j*(-33)
+-36 + j*(-49)
+-8 + j*(163)
+263 + j*(107)
+215 + j*(-211)
+-100 + j*(-178)
+-57 + j*(99)
+180 + j*(23)
+81 + j*(-173)
+-51 + j*(-57)
+98 + j*(-8)
+91 + j*(-219)
+-158 + j*(-207)
+-163 + j*(16)
+-11 + j*(6)
+-74 + j*(-83)
+-141 + j*(24)
+-35 + j*(77)
+-21 + j*(10)
+-57 + j*(75)
+102 + j*(112)
+183 + j*(-119)
+-65 + j*(-275)
+-282 + j*(-79)
+-187 + j*(134)
+-65 + j*(109)
+-110 + j*(112)
+-45 + j*(265)
+230 + j*(242)
+305 + j*(-80)
+11 + j*(-239)
+-171 + j*(6)
+42 + j*(171)
+181 + j*(-25)
+2 + j*(-136)
+-69 + j*(27)
+86 + j*(60)
+97 + j*(-74)
+13 + j*(-67)
+77 + j*(-61)
+39 + j*(-223)
+-218 + j*(-214)
+-292 + j*(66)
+-76 + j*(206)
+69 + j*(94)
+37 + j*(-4)
+-6 + j*(-4)
+2 + j*(16)
+38 + j*(-16)
+-6 + j*(-115)
+-191 + j*(-93)
+-235 + j*(159)
+21 + j*(279)
+175 + j*(70)
+17 + j*(-56)
+-59 + j*(85)
+85 + j*(141)
+148 + j*(23)
+102 + j*(-33)
+99 + j*(-64)
+39 + j*(-146)
+-107 + j*(-110)
+-124 + j*(42)
+-4 + j*(92)
+40 + j*(16)
+-25 + j*(-8)
+-51 + j*(77)
+54 + j*(139)
+168 + j*(46)
+113 + j*(-96)
+-28 + j*(-76)
+-30 + j*(47)
+65 + j*(81)
+136 + j*(57)
+230 + j*(-17)
+228 + j*(-216)
+7 + j*(-314)
+-117 + j*(-148)
+7 + j*(-106)
+-64 + j*(-285)
+-361 + j*(-161)
+-272 + j*(223)
+129 + j*(195)
+146 + j*(-167)
+-153 + j*(-218)
+-223 + j*(-16)
+-141 + j*(37)
+-156 + j*(42)
+-127 + j*(127)
+-32 + j*(117)
+-32 + j*(57)
+-54 + j*(74)
+-26 + j*(62)
+-93 + j*(35)
+-158 + j*(176)
+22 + j*(332)
+271 + j*(197)
+228 + j*(-80)
+-19 + j*(-112)
+-82 + j*(104)
+122 + j*(197)
+270 + j*(11)
+146 + j*(-187)
+-59 + j*(-143)
+-78 + j*(24)
+31 + j*(86)
+126 + j*(44)
+180 + j*(-72)
+92 + j*(-243)
+-170 + j*(-241)
+-284 + j*(40)
+-55 + j*(232)
+149 + j*(73)
+33 + j*(-94)
+-103 + j*(19)
+11 + j*(149)
+144 + j*(65)
+103 + j*(-41)
+56 + j*(-19)
+107 + j*(-18)
+112 + j*(-110)
+12 + j*(-151)
+-49 + j*(-78)
+7 + j*(-21)
+65 + j*(-89)
+-4 + j*(-190)
+-156 + j*(-168)
+-218 + j*(-20)
+-136 + j*(106)
+-19 + j*(116)
+57 + j*(67)
+105 + j*(-18)
+68 + j*(-156)
+-119 + j*(-213)
+-281 + j*(-46)
+-193 + j*(177)
+11 + j*(179)
+53 + j*(48)
+-5 + j*(34)
+45 + j*(67)
+104 + j*(-28)
+14 + j*(-131)
+-103 + j*(-93)
+-124 + j*(-23)
+-140 + j*(9)
+-147 + j*(88)
+-59 + j*(136)
+-20 + j*(49)
+-163 + j*(47)
+-187 + j*(293)
+126 + j*(425)
+369 + j*(152)
+197 + j*(-113)
+-4 + j*(-4)
+114 + j*(127)
+217 + j*(-8)
+110 + j*(-86)
+119 + j*(-16)
+207 + j*(-158)
+-29 + j*(-351)
+-351 + j*(-115)
+-214 + j*(274)
+127 + j*(270)
+202 + j*(71)
+164 + j*(25)
+209 + j*(-23)
+180 + j*(-123)
+125 + j*(-127)
+163 + j*(-175)
+66 + j*(-309)
+-121 + j*(-241)
+-70 + j*(-93)
+13 + j*(-209)
+-196 + j*(-296)
+-332 + j*(-61)
+-144 + j*(71)
+-88 + j*(-83)
+-279 + j*(-66)
+-269 + j*(167)
+-64 + j*(204)
+-10 + j*(82)
+-59 + j*(57)
+-69 + j*(72)
+-88 + j*(90)
+-69 + j*(161)
+24 + j*(179)
+76 + j*(122)
+96 + j*(81)
+103 + j*(7)
+4 + j*(-44)
+-62 + j*(68)
+54 + j*(134)
+95 + j*(29)
+12 + j*(61)
+164 + j*(158)
+338 + j*(-107)
+28 + j*(-395)
+-340 + j*(-124)
+-163 + j*(250)
+137 + j*(159)
+92 + j*(-22)
+24 + j*(29)
+103 + j*(35)
+98 + j*(-47)
+66 + j*(-48)
+89 + j*(-93)
+-3 + j*(-174)
+-129 + j*(-92)
+-98 + j*(28)
+-38 + j*(42)
+-7 + j*(63)
+78 + j*(34)
+50 + j*(-86)
+-81 + j*(-46)
+-16 + j*(85)
+103 + j*(-8)
+-16 + j*(-98)
+-54 + j*(54)
+149 + j*(39)
+102 + j*(-221)
+-192 + j*(-181)
+-167 + j*(105)
+78 + j*(81)
+42 + j*(-127)
+-145 + j*(-88)
+-132 + j*(79)
+8 + j*(108)
+81 + j*(4)
+7 + j*(-110)
+-141 + j*(-67)
+-123 + j*(97)
+32 + j*(84)
+-13 + j*(-54)
+-156 + j*(39)
+-35 + j*(213)
+158 + j*(103)
+86 + j*(-72)
+-36 + j*(-31)
+-8 + j*(33)
+12 + j*(3)
+-18 + j*(3)
+-26 + j*(21)
+-40 + j*(49)
+-1 + j*(110)
+91 + j*(77)
+57 + j*(-6)
+1 + j*(72)
+150 + j*(144)
+295 + j*(-41)
+176 + j*(-265)
+-59 + j*(-291)
+-229 + j*(-135)
+-201 + j*(130)
+114 + j*(213)
+281 + j*(-125)
+-55 + j*(-348)
+-282 + j*(-45)
+-9 + j*(112)
+31 + j*(-186)
+-354 + j*(-137)
+-294 + j*(325)
+173 + j*(303)
+168 + j*(-91)
+-138 + j*(-62)
+-81 + j*(177)
+95 + j*(133)
+79 + j*(59)
+144 + j*(83)
+242 + j*(-95)
+37 + j*(-299)
+-247 + j*(-161)
+-223 + j*(132)
+5 + j*(216)
+146 + j*(88)
+110 + j*(-48)
+15 + j*(-57)
+13 + j*(1)
+62 + j*(-21)
+42 + j*(-80)
+-10 + j*(-93)
+-57 + j*(-95)
+-132 + j*(-48)
+-117 + j*(71)
+-4 + j*(81)
+-21 + j*(-1)
+-98 + j*(76)
+10 + j*(199)
+175 + j*(142)
+238 + j*(12)
+245 + j*(-152)
+62 + j*(-344)
+-260 + j*(-221)
+-199 + j*(131)
+117 + j*(80)
+23 + j*(-192)
+-208 + j*(-39)
+-1 + j*(132)
+88 + j*(-134)
+-250 + j*(-153)
+-228 + j*(236)
+160 + j*(183)
+52 + j*(-163)
+-254 + j*(30)
+9 + j*(329)
+326 + j*(51)
+100 + j*(-272)
+-187 + j*(-156)
+-197 + j*(35)
+-144 + j*(139)
+-6 + j*(221)
+158 + j*(98)
+41 + j*(-88)
+-153 + j*(50)
+-9 + j*(281)
+256 + j*(204)
+310 + j*(-22)
+224 + j*(-184)
+53 + j*(-279)
+-167 + j*(-194)
+-196 + j*(51)
+-12 + j*(165)
+132 + j*(88)
+176 + j*(-17)
+170 + j*(-149)
+28 + j*(-263)
+-156 + j*(-184)
+-144 + j*(-11)
+-22 + j*(-8)
+-47 + j*(-112)
+-171 + j*(-77)
+-164 + j*(60)
+-51 + j*(81)
+-47 + j*(-8)
+-152 + j*(21)
+-140 + j*(176)
+28 + j*(229)
+139 + j*(130)
+151 + j*(42)
+165 + j*(-37)
+103 + j*(-161)
+-70 + j*(-179)
+-158 + j*(-38)
+-97 + j*(66)
+-30 + j*(76)
+13 + j*(75)
+59 + j*(37)
+47 + j*(-21)
+20 + j*(-23)
+34 + j*(-53)
+-50 + j*(-124)
+-206 + j*(-18)
+-139 + j*(218)
+118 + j*(235)
+202 + j*(41)
+112 + j*(-37)
+115 + j*(-7)
+166 + j*(-97)
+34 + j*(-267)
+-239 + j*(-119)
+-108 + j*(65)
+-68 + j*(-85)
+-296 + j*(1)
+-157 + j*(327)
+224 + j*(201)
+135 + j*(-182)
+-231 + j*(-141)
+-275 + j*(192)
+-20 + j*(354)
+240 + j*(245)
+291 + j*(-37)
+54 + j*(-195)
+-135 + j*(-11)
+25 + j*(170)
+205 + j*(23)
+100 + j*(-162)
+-71 + j*(-133)
+-131 + j*(-20)
+-115 + j*(113)
+40 + j*(216)
+250 + j*(104)
+235 + j*(-154)
+15 + j*(-248)
+-147 + j*(-132)
+-148 + j*(35)
+-17 + j*(121)
+110 + j*(30)
+44 + j*(-112)
+-106 + j*(-56)
+-55 + j*(97)
+101 + j*(49)
+62 + j*(-112)
+-109 + j*(-88)
+-120 + j*(91)
+51 + j*(150)
+152 + j*(11)
+57 + j*(-103)
+-35 + j*(-41)
+23 + j*(16)
+52 + j*(-61)
+-41 + j*(-70)
+-28 + j*(37)
+96 + j*(8)
+76 + j*(-127)
+-33 + j*(-134)
+-47 + j*(-99)
+-90 + j*(-128)
+-177 + j*(-52)
+-112 + j*(59)
+-25 + j*(-8)
+-124 + j*(-69)
+-187 + j*(62)
+-61 + j*(129)
+-21 + j*(21)
+-146 + j*(18)
+-155 + j*(183)
+16 + j*(247)
+124 + j*(129)
+52 + j*(31)
+-17 + j*(124)
+143 + j*(221)
+337 + j*(25)
+185 + j*(-251)
+-93 + j*(-180)
+-52 + j*(13)
+37 + j*(-83)
+-168 + j*(-117)
+-214 + j*(187)
+127 + j*(282)
+261 + j*(-25)
+44 + j*(-146)
+-10 + j*(-31)
+24 + j*(-95)
+-183 + j*(-95)
+-222 + j*(240)
+168 + j*(390)
+433 + j*(71)
+298 + j*(-221)
+113 + j*(-276)
+-38 + j*(-285)
+-211 + j*(-148)
+-129 + j*(102)
+140 + j*(42)
+71 + j*(-243)
+-246 + j*(-169)
+-197 + j*(172)
+141 + j*(163)
+176 + j*(-131)
+-39 + j*(-188)
+-71 + j*(-68)
+-6 + j*(-113)
+-122 + j*(-194)
+-250 + j*(-72)
+-182 + j*(49)
+-130 + j*(2)
+-233 + j*(1)
+-279 + j*(167)
+-152 + j*(306)
+4 + j*(311)
+115 + j*(258)
+196 + j*(161)
+183 + j*(35)
+96 + j*(2)
+91 + j*(52)
+163 + j*(17)
+135 + j*(-98)
+13 + j*(-98)
+6 + j*(10)
+126 + j*(-1)
+124 + j*(-168)
+-72 + j*(-218)
+-180 + j*(-43)
+-50 + j*(76)
+38 + j*(-34)
+-102 + j*(-103)
+-193 + j*(77)
+-8 + j*(222)
+180 + j*(76)
+91 + j*(-114)
+-70 + j*(-62)
+-25 + j*(64)
+83 + j*(8)
+17 + j*(-104)
+-108 + j*(-43)
+-68 + j*(95)
+66 + j*(85)
+87 + j*(-28)
+7 + j*(-65)
+-32 + j*(-13)
+8 + j*(21)
+50 + j*(-14)
+21 + j*(-77)
+-58 + j*(-66)
+-64 + j*(24)
+18 + j*(32)
+10 + j*(-45)
+-84 + j*(0)
+-7 + j*(138)
+182 + j*(66)
+154 + j*(-149)
+-35 + j*(-161)
+-43 + j*(-35)
+47 + j*(-86)
+-53 + j*(-212)
+-228 + j*(-121)
+-199 + j*(75)
+-38 + j*(105)
+-4 + j*(0)
+-91 + j*(-20)
+-118 + j*(69)
+-45 + j*(129)
+31 + j*(110)
+70 + j*(59)
+72 + j*(-11)
+1 + j*(-50)
+-55 + j*(21)
+40 + j*(91)
+129 + j*(-38)
+-18 + j*(-161)
+-184 + j*(-22)
+-86 + j*(154)
+49 + j*(109)
+23 + j*(70)
+81 + j*(145)
+249 + j*(54)
+211 + j*(-182)
+-6 + j*(-238)
+-119 + j*(-112)
+-94 + j*(-16)
+-45 + j*(4)
+-40 + j*(-24)
+-111 + j*(-7)
+-115 + j*(140)
+83 + j*(215)
+242 + j*(36)
+144 + j*(-174)
+-55 + j*(-186)
+-177 + j*(-56)
+-151 + j*(151)
+97 + j*(248)
+300 + j*(8)
+105 + j*(-250)
+-141 + j*(-107)
+-28 + j*(91)
+112 + j*(-6)
+44 + j*(-77)
+77 + j*(-43)
+118 + j*(-206)
+-136 + j*(-317)
+-323 + j*(-78)
+-179 + j*(105)
+-104 + j*(43)
+-173 + j*(98)
+-71 + j*(229)
+88 + j*(177)
+116 + j*(83)
+140 + j*(18)
+84 + j*(-103)
+-86 + j*(-54)
+-16 + j*(139)
+209 + j*(42)
+120 + j*(-204)
+-91 + j*(-161)
+-88 + j*(-69)
+-161 + j*(-97)
+-286 + j*(111)
+-36 + j*(347)
+242 + j*(135)
+69 + j*(-81)
+-37 + j*(124)
+262 + j*(174)
+354 + j*(-204)
+2 + j*(-390)
+-237 + j*(-170)
+-171 + j*(34)
+-58 + j*(66)
+-5 + j*(24)
+-40 + j*(-21)
+-98 + j*(57)
+17 + j*(168)
+192 + j*(62)
+145 + j*(-131)
+6 + j*(-157)
+-46 + j*(-134)
+-132 + j*(-122)
+-197 + j*(14)
+-73 + j*(123)
+19 + j*(25)
+-85 + j*(-29)
+-125 + j*(93)
+-18 + j*(140)
+16 + j*(88)
+4 + j*(108)
+71 + j*(125)
+114 + j*(65)
+103 + j*(39)
+145 + j*(17)
+142 + j*(-93)
+8 + j*(-139)
+-78 + j*(-27)
+-11 + j*(73)
+76 + j*(73)
+147 + j*(40)
+218 + j*(-68)
+157 + j*(-252)
+-81 + j*(-305)
+-247 + j*(-103)
+-129 + j*(117)
+89 + j*(69)
+76 + j*(-133)
+-103 + j*(-138)
+-116 + j*(15)
+-3 + j*(2)
+-71 + j*(-87)
+-168 + j*(54)
+42 + j*(187)
+231 + j*(-71)
+-33 + j*(-334)
+-361 + j*(-124)
+-255 + j*(204)
+-13 + j*(185)
+-21 + j*(64)
+-66 + j*(123)
+37 + j*(165)
+95 + j*(77)
+58 + j*(33)
+67 + j*(37)
+74 + j*(-26)
+-30 + j*(-59)
+-108 + j*(63)
+1 + j*(209)
+211 + j*(170)
+277 + j*(-49)
+127 + j*(-202)
+-37 + j*(-149)
+-49 + j*(-40)
+-4 + j*(-18)
+2 + j*(-22)
+18 + j*(-16)
+25 + j*(-37)
+17 + j*(-31)
+79 + j*(-47)
+69 + j*(-206)
+-183 + j*(-267)
+-346 + j*(2)
+-140 + j*(216)
+21 + j*(79)
+-124 + j*(21)
+-123 + j*(237)
+144 + j*(259)
+203 + j*(23)
+47 + j*(-21)
+65 + j*(90)
+180 + j*(37)
+152 + j*(-79)
+76 + j*(-94)
+55 + j*(-66)
+95 + j*(-49)
+170 + j*(-146)
+53 + j*(-356)
+-285 + j*(-315)
+-371 + j*(47)
+-97 + j*(212)
+49 + j*(59)
+-17 + j*(-6)
+-7 + j*(9)
+-35 + j*(-49)
+-129 + j*(38)
+21 + j*(176)
+208 + j*(-23)
+5 + j*(-260)
+-254 + j*(-107)
+-191 + j*(100)
+-117 + j*(107)
+-118 + j*(190)
+64 + j*(272)
+217 + j*(83)
+73 + j*(-70)
+-32 + j*(52)
+101 + j*(117)
+176 + j*(-16)
+87 + j*(-118)
+-18 + j*(-108)
+-82 + j*(-35)
+-58 + j*(65)
+35 + j*(84)
+73 + j*(41)
+102 + j*(31)
+163 + j*(-49)
+85 + j*(-190)
+-89 + j*(-156)
+-95 + j*(-13)
+-11 + j*(-6)
+-22 + j*(-48)
+-49 + j*(-43)
+-93 + j*(-39)
+-145 + j*(78)
+29 + j*(209)
+235 + j*(17)
+60 + j*(-231)
+-168 + j*(-93)
+-69 + j*(47)
+-81 + j*(-54)
+-246 + j*(132)
+73 + j*(419)
+487 + j*(60)
+174 + j*(-421)
+-269 + j*(-190)
+-85 + j*(129)
+81 + j*(-65)
+-154 + j*(-115)
+-136 + j*(141)
+96 + j*(64)
+-59 + j*(-118)
+-215 + j*(124)
+84 + j*(286)
+255 + j*(-15)
+-16 + j*(-170)
+-146 + j*(68)
+57 + j*(194)
+195 + j*(58)
+163 + j*(-68)
+100 + j*(-120)
+36 + j*(-140)
+-8 + j*(-136)
+-66 + j*(-155)
+-198 + j*(-103)
+-226 + j*(107)
+-17 + j*(230)
+150 + j*(91)
+87 + j*(-49)
+8 + j*(-22)
+44 + j*(16)
+93 + j*(-31)
+83 + j*(-126)
+-42 + j*(-206)
+-228 + j*(-101)
+-180 + j*(163)
+112 + j*(176)
+170 + j*(-102)
+-66 + j*(-179)
+-119 + j*(-8)
+2 + j*(-32)
+-122 + j*(-159)
+-315 + j*(13)
+-185 + j*(263)
+39 + j*(226)
+61 + j*(107)
+42 + j*(103)
+80 + j*(82)
+66 + j*(42)
+73 + j*(47)
+92 + j*(-11)
+-8 + j*(-42)
+-36 + j*(92)
+136 + j*(116)
+161 + j*(-85)
+-52 + j*(-107)
+-78 + j*(107)
+115 + j*(158)
+198 + j*(37)
+206 + j*(-30)
+233 + j*(-147)
+105 + j*(-296)
+-91 + j*(-243)
+-107 + j*(-116)
+-93 + j*(-111)
+-156 + j*(-58)
+-100 + j*(51)
+-8 + j*(5)
+-76 + j*(-36)
+-76 + j*(80)
+89 + j*(67)
+88 + j*(-130)
+-109 + j*(-154)
+-163 + j*(4)
+-71 + j*(72)
+-11 + j*(50)
+28 + j*(6)
+4 + j*(-98)
+-163 + j*(-115)
+-266 + j*(84)
+-107 + j*(284)
+148 + j*(235)
+229 + j*(-1)
+65 + j*(-182)
+-173 + j*(-113)
+-206 + j*(139)
+15 + j*(269)
+215 + j*(127)
+177 + j*(-83)
+16 + j*(-129)
+-66 + j*(-47)
+-53 + j*(12)
+-54 + j*(39)
+-33 + j*(121)
+116 + j*(142)
+199 + j*(-38)
+25 + j*(-173)
+-127 + j*(-29)
+-23 + j*(112)
+71 + j*(55)
+71 + j*(41)
+174 + j*(1)
+127 + j*(-229)
+-209 + j*(-211)
+-235 + j*(178)
+154 + j*(242)
+226 + j*(-96)
+-25 + j*(-138)
+-1 + j*(19)
+86 + j*(-87)
+-87 + j*(-129)
+-107 + j*(76)
+92 + j*(91)
+117 + j*(-59)
+75 + j*(-100)
+46 + j*(-206)
+-205 + j*(-226)
+-292 + j*(119)
+88 + j*(243)
+202 + j*(-139)
+-165 + j*(-208)
+-170 + j*(136)
+146 + j*(70)
+25 + j*(-223)
+-239 + j*(-89)
+-125 + j*(107)
+-38 + j*(11)
+-151 + j*(28)
+-81 + j*(168)
+54 + j*(91)
+-25 + j*(-14)
+-119 + j*(71)
+-67 + j*(187)
+62 + j*(231)
+211 + j*(141)
+182 + j*(-53)
+4 + j*(-33)
+92 + j*(132)
+301 + j*(-38)
+110 + j*(-316)
+-187 + j*(-183)
+-132 + j*(46)
+-33 + j*(34)
+-54 + j*(67)
+66 + j*(127)
+159 + j*(-26)
+22 + j*(-117)
+-34 + j*(-18)
+18 + j*(-16)
+-23 + j*(-11)
+64 + j*(69)
+196 + j*(-114)
+-57 + j*(-320)
+-330 + j*(-72)
+-152 + j*(192)
+-2 + j*(98)
+-83 + j*(132)
+121 + j*(293)
+404 + j*(18)
+167 + j*(-352)
+-204 + j*(-215)
+-169 + j*(91)
+43 + j*(148)
+187 + j*(39)
+197 + j*(-179)
+-52 + j*(-305)
+-244 + j*(-71)
+-23 + j*(115)
+124 + j*(-132)
+-166 + j*(-276)
+-333 + j*(7)
+-122 + j*(169)
+-35 + j*(35)
+-150 + j*(45)
+-89 + j*(186)
+71 + j*(132)
+36 + j*(-23)
+-124 + j*(-6)
+-153 + j*(177)
+23 + j*(295)
+215 + j*(187)
+194 + j*(6)
+92 + j*(1)
+140 + j*(35)
+164 + j*(-89)
+0 + j*(-136)
+-56 + j*(47)
+154 + j*(107)
+251 + j*(-138)
+10 + j*(-301)
+-205 + j*(-109)
+-66 + j*(111)
+130 + j*(-16)
+-21 + j*(-204)
+-230 + j*(-14)
+-6 + j*(218)
+248 + j*(-33)
+-30 + j*(-313)
+-336 + j*(-28)
+-74 + j*(287)
+214 + j*(66)
+23 + j*(-171)
+-169 + j*(6)
+-18 + j*(186)
+165 + j*(110)
+215 + j*(-51)
+141 + j*(-221)
+-84 + j*(-267)
+-209 + j*(-71)
+-64 + j*(42)
+-12 + j*(-101)
+-207 + j*(-122)
+-271 + j*(94)
+-121 + j*(217)
+-10 + j*(194)
+59 + j*(175)
+134 + j*(99)
+99 + j*(0)
+27 + j*(18)
+67 + j*(83)
+180 + j*(54)
+252 + j*(-110)
+118 + j*(-344)
+-245 + j*(-345)
+-413 + j*(30)
+-139 + j*(291)
+91 + j*(139)
+-4 + j*(32)
+15 + j*(153)
+206 + j*(59)
+92 + j*(-194)
+-200 + j*(-92)
+-145 + j*(218)
+156 + j*(247)
+284 + j*(16)
+176 + j*(-186)
+-37 + j*(-201)
+-136 + j*(-23)
+21 + j*(102)
+150 + j*(-71)
+-67 + j*(-228)
+-292 + j*(19)
+-73 + j*(336)
+310 + j*(216)
+332 + j*(-157)
+56 + j*(-287)
+-94 + j*(-136)
+-10 + j*(-37)
+43 + j*(-132)
+-78 + j*(-206)
+-198 + j*(-115)
+-190 + j*(-6)
+-173 + j*(41)
+-153 + j*(139)
+8 + j*(206)
+163 + j*(44)
+36 + j*(-164)
+-196 + j*(-98)
+-203 + j*(114)
+-78 + j*(181)
+-26 + j*(182)
+62 + j*(232)
+237 + j*(156)
+251 + j*(-74)
+62 + j*(-168)
+-41 + j*(-62)
+3 + j*(-13)
+-21 + j*(-46)
+-76 + j*(36)
+42 + j*(139)
+205 + j*(18)
+135 + j*(-199)
+-91 + j*(-214)
+-186 + j*(-43)
+-100 + j*(76)
+-15 + j*(37)
+-72 + j*(-13)
+-146 + j*(102)
+-11 + j*(252)
+202 + j*(170)
+194 + j*(-18)
+103 + j*(-23)
+181 + j*(-23)
+166 + j*(-228)
+-115 + j*(-272)
+-225 + j*(10)
+1 + j*(140)
+100 + j*(-16)
+-1 + j*(-50)
+47 + j*(25)
+138 + j*(-90)
+16 + j*(-223)
+-127 + j*(-161)
+-138 + j*(-84)
+-164 + j*(-64)
+-204 + j*(10)
+-188 + j*(89)
+-175 + j*(176)
+-53 + j*(317)
+230 + j*(272)
+305 + j*(-43)
+55 + j*(-187)
+-64 + j*(-13)
+90 + j*(30)
+88 + j*(-156)
+-129 + j*(-174)
+-196 + j*(16)
+-98 + j*(94)
+-83 + j*(88)
+-60 + j*(185)
+122 + j*(215)
+223 + j*(18)
+56 + j*(-102)
+-25 + j*(59)
+197 + j*(101)
+256 + j*(-204)
+-93 + j*(-337)
+-296 + j*(-22)
+-63 + j*(194)
+100 + j*(45)
+-1 + j*(-23)
+26 + j*(77)
+159 + j*(-20)
+41 + j*(-190)
+-141 + j*(-94)
+-85 + j*(64)
+17 + j*(31)
+-13 + j*(-13)
+-18 + j*(30)
+35 + j*(13)
+6 + j*(-37)
+-47 + j*(8)
+11 + j*(77)
+110 + j*(32)
+112 + j*(-88)
+20 + j*(-143)
+-46 + j*(-119)
+-78 + j*(-110)
+-158 + j*(-88)
+-196 + j*(45)
+-78 + j*(132)
+3 + j*(45)
+-91 + j*(6)
+-100 + j*(129)
+20 + j*(136)
+-5 + j*(57)
+-52 + j*(176)
+173 + j*(255)
+332 + j*(-16)
+96 + j*(-234)
+-121 + j*(-66)
+-5 + j*(100)
+100 + j*(18)
+38 + j*(-21)
+70 + j*(42)
+169 + j*(-37)
+86 + j*(-180)
+-71 + j*(-134)
+-54 + j*(-3)
+48 + j*(-19)
+24 + j*(-111)
+-67 + j*(-94)
+-61 + j*(-22)
+-18 + j*(-33)
+-43 + j*(-50)
+-28 + j*(-21)
+10 + j*(-98)
+-150 + j*(-191)
+-346 + j*(9)
+-187 + j*(305)
+134 + j*(229)
+122 + j*(-38)
+-75 + j*(-45)
+-81 + j*(108)
+35 + j*(128)
+87 + j*(60)
+73 + j*(-12)
+-1 + j*(-37)
+-43 + j*(38)
+37 + j*(85)
+69 + j*(6)
+-5 + j*(9)
+47 + j*(98)
+168 + j*(11)
+84 + j*(-131)
+-36 + j*(-69)
+14 + j*(-11)
+0 + j*(-80)
+-106 + j*(-10)
+-7 + j*(136)
+168 + j*(38)
+94 + j*(-140)
+-55 + j*(-88)
+1 + j*(16)
+88 + j*(-73)
+-23 + j*(-194)
+-198 + j*(-105)
+-177 + j*(92)
+-8 + j*(129)
+30 + j*(16)
+-53 + j*(25)
+8 + j*(119)
+132 + j*(45)
+78 + j*(-69)
+28 + j*(-37)
+82 + j*(-84)
+-40 + j*(-209)
+-239 + j*(-71)
+-139 + j*(154)
+50 + j*(103)
+24 + j*(-12)
+-9 + j*(5)
+-3 + j*(-36)
+-116 + j*(-28)
+-100 + j*(141)
+89 + j*(119)
+43 + j*(-52)
+-103 + j*(43)
+37 + j*(163)
+112 + j*(13)
+-36 + j*(25)
+91 + j*(203)
+330 + j*(-5)
+105 + j*(-291)
+-171 + j*(-92)
+3 + j*(132)
+169 + j*(-21)
+66 + j*(-124)
+59 + j*(-92)
+61 + j*(-216)
+-166 + j*(-260)
+-288 + j*(-28)
+-144 + j*(124)
+-42 + j*(82)
+-34 + j*(65)
+1 + j*(53)
+-16 + j*(18)
+-38 + j*(60)
+28 + j*(83)
+56 + j*(20)
+27 + j*(11)
+66 + j*(15)
+75 + j*(-78)
+-39 + j*(-118)
+-107 + j*(-30)
+-64 + j*(39)
+-19 + j*(25)
+-37 + j*(-17)
+-118 + j*(4)
+-134 + j*(147)
+31 + j*(228)
+143 + j*(97)
+49 + j*(32)
+76 + j*(151)
+277 + j*(72)
+225 + j*(-197)
+-33 + j*(-203)
+-60 + j*(-19)
+44 + j*(-20)
+-1 + j*(-74)
+-28 + j*(-5)
+49 + j*(11)
+67 + j*(-62)
+25 + j*(-95)
+-18 + j*(-107)
+-86 + j*(-66)
+-52 + j*(37)
+77 + j*(2)
+51 + j*(-151)
+-102 + j*(-160)
+-155 + j*(-52)
+-123 + j*(10)
+-77 + j*(35)
+-37 + j*(-19)
+-151 + j*(-78)
+-279 + j*(107)
+-80 + j*(320)
+166 + j*(162)
+40 + j*(-37)
+-87 + j*(115)
+116 + j*(214)
+234 + j*(-7)
+59 + j*(-147)
+-79 + j*(-52)
+-74 + j*(62)
+0 + j*(154)
+177 + j*(139)
+238 + j*(-76)
+45 + j*(-194)
+-65 + j*(-65)
+10 + j*(-18)
+-23 + j*(-69)
+-79 + j*(30)
+66 + j*(104)
+166 + j*(-57)
+38 + j*(-192)
+-109 + j*(-149)
+-170 + j*(-40)
+-140 + j*(96)
+20 + j*(132)
+81 + j*(-31)
+-105 + j*(-83)
+-165 + j*(148)
+92 + j*(245)
+236 + j*(13)
+61 + j*(-146)
+-80 + j*(-19)
+27 + j*(107)
+159 + j*(11)
+81 + j*(-136)
+-73 + j*(-70)
+13 + j*(98)
+228 + j*(-10)
+141 + j*(-288)
+-147 + j*(-269)
+-175 + j*(-65)
+-96 + j*(-78)
+-225 + j*(-78)
+-224 + j*(160)
+59 + j*(181)
+83 + j*(-113)
+-226 + j*(-141)
+-305 + j*(163)
+-93 + j*(317)
+67 + j*(287)
+216 + j*(245)
+365 + j*(32)
+216 + j*(-264)
+-116 + j*(-228)
+-151 + j*(48)
+54 + j*(88)
+63 + j*(-82)
+-107 + j*(-66)
+-95 + j*(116)
+88 + j*(127)
+116 + j*(-40)
+-36 + j*(-79)
+-89 + j*(66)
+40 + j*(155)
+170 + j*(84)
+196 + j*(-43)
+141 + j*(-147)
+37 + j*(-197)
+-66 + j*(-172)
+-134 + j*(-96)
+-136 + j*(9)
+-40 + j*(70)
+35 + j*(-16)
+-76 + j*(-89)
+-170 + j*(64)
+11 + j*(190)
+152 + j*(13)
+-12 + j*(-109)
+-90 + j*(52)
+77 + j*(80)
+54 + j*(-91)
+-123 + j*(-16)
+-5 + j*(180)
+223 + j*(46)
+123 + j*(-204)
+-119 + j*(-177)
+-174 + j*(16)
+-52 + j*(139)
+118 + j*(87)
+125 + j*(-110)
+-74 + j*(-159)
+-132 + j*(8)
+-10 + j*(21)
+-101 + j*(-79)
+-238 + j*(122)
+15 + j*(330)
+260 + j*(115)
+121 + j*(-69)
+85 + j*(38)
+250 + j*(-74)
+77 + j*(-341)
+-238 + j*(-199)
+-146 + j*(61)
+8 + j*(-41)
+-161 + j*(-130)
+-271 + j*(75)
+-132 + j*(226)
+-8 + j*(225)
+101 + j*(228)
+247 + j*(119)
+230 + j*(-91)
+74 + j*(-165)
+-19 + j*(-128)
+-75 + j*(-95)
+-127 + j*(-25)
+-117 + j*(65)
+-79 + j*(142)
+49 + j*(235)
+298 + j*(139)
+308 + j*(-222)
+-73 + j*(-368)
+-323 + j*(-56)
+-135 + j*(231)
+115 + j*(166)
+129 + j*(3)
+47 + j*(-31)
+39 + j*(25)
+129 + j*(23)
+165 + j*(-124)
+3 + j*(-222)
+-131 + j*(-92)
+-35 + j*(14)
+15 + j*(-88)
+-119 + j*(-105)
+-146 + j*(41)
+-48 + j*(86)
+-21 + j*(86)
+78 + j*(122)
+211 + j*(-35)
+49 + j*(-244)
+-173 + j*(-111)
+-52 + j*(62)
+48 + j*(-91)
+-158 + j*(-151)
+-210 + j*(82)
+1 + j*(119)
+-11 + j*(-60)
+-188 + j*(6)
+-103 + j*(201)
+93 + j*(146)
+90 + j*(-23)
+-31 + j*(-64)
+-115 + j*(-6)
+-129 + j*(91)
+-73 + j*(156)
+-34 + j*(175)
+8 + j*(250)
+199 + j*(287)
+373 + j*(81)
+259 + j*(-160)
+71 + j*(-150)
+55 + j*(-83)
+28 + j*(-115)
+-59 + j*(-50)
+13 + j*(64)
+136 + j*(-8)
+74 + j*(-134)
+-45 + j*(-95)
+-34 + j*(8)
+62 + j*(33)
+138 + j*(-57)
+73 + j*(-204)
+-126 + j*(-192)
+-165 + j*(19)
+34 + j*(80)
+88 + j*(-112)
+-105 + j*(-161)
+-154 + j*(27)
+13 + j*(75)
+53 + j*(-72)
+-76 + j*(-108)
+-110 + j*(0)
+-18 + j*(25)
+4 + j*(-70)
+-103 + j*(-115)
+-195 + j*(-31)
+-182 + j*(82)
+-122 + j*(148)
+-19 + j*(197)
+145 + j*(121)
+130 + j*(-141)
+-204 + j*(-209)
+-380 + j*(159)
+-49 + j*(431)
+254 + j*(199)
+109 + j*(-46)
+-40 + j*(69)
+76 + j*(146)
+103 + j*(42)
+23 + j*(88)
+150 + j*(185)
+306 + j*(30)
+202 + j*(-156)
+64 + j*(-117)
+97 + j*(-59)
+127 + j*(-127)
+59 + j*(-185)
+-7 + j*(-177)
+-52 + j*(-165)
+-100 + j*(-148)
+-152 + j*(-111)
+-204 + j*(-42)
+-206 + j*(82)
+-100 + j*(183)
+35 + j*(167)
+95 + j*(85)
+105 + j*(21)
+103 + j*(-40)
+58 + j*(-119)
+-71 + j*(-144)
+-182 + j*(-22)
+-114 + j*(151)
+64 + j*(158)
+118 + j*(35)
+75 + j*(-1)
+117 + j*(-11)
+117 + j*(-136)
+-44 + j*(-187)
+-122 + j*(-53)
+-40 + j*(-3)
+-56 + j*(-62)
+-124 + j*(5)
+-46 + j*(85)
+11 + j*(18)
+-49 + j*(7)
+-18 + j*(71)
+37 + j*(21)
+-21 + j*(4)
+23 + j*(83)
+139 + j*(-21)
+6 + j*(-177)
+-162 + j*(-49)
+-58 + j*(91)
+13 + j*(4)
+-66 + j*(15)
+26 + j*(85)
+84 + j*(-81)
+-144 + j*(-136)
+-197 + j*(111)
+9 + j*(126)
+-88 + j*(-19)
+-234 + j*(235)
+132 + j*(465)
+454 + j*(116)
+223 + j*(-209)
+18 + j*(-98)
+71 + j*(-66)
+-54 + j*(-120)
+-129 + j*(120)
+187 + j*(238)
+367 + j*(-93)
+122 + j*(-313)
+-61 + j*(-222)
+-101 + j*(-175)
+-223 + j*(-97)
+-185 + j*(135)
+59 + j*(154)
+94 + j*(-38)
+-36 + j*(-45)
+-3 + j*(41)
+57 + j*(-8)
+19 + j*(-36)
+42 + j*(-23)
+47 + j*(-97)
+-47 + j*(-107)
+-39 + j*(-42)
+-11 + j*(-113)
+-172 + j*(-134)
+-220 + j*(83)
+5 + j*(147)
+57 + j*(-65)
+-144 + j*(-103)
+-192 + j*(58)
+-134 + j*(111)
+-146 + j*(188)
+15 + j*(324)
+254 + j*(173)
+148 + j*(-80)
+-52 + j*(23)
+94 + j*(183)
+257 + j*(17)
+134 + j*(-141)
+34 + j*(-82)
+66 + j*(-64)
+51 + j*(-109)
+25 + j*(-139)
+-74 + j*(-213)
+-311 + j*(-86)
+-231 + j*(309)
+259 + j*(319)
+364 + j*(-181)
+-62 + j*(-348)
+-226 + j*(-56)
+-77 + j*(29)
+-122 + j*(-21)
+-134 + j*(138)
+69 + j*(139)
+33 + j*(-44)
+-113 + j*(81)
+110 + j*(214)
+250 + j*(-69)
+-32 + j*(-199)
+-103 + j*(50)
+117 + j*(23)
+-11 + j*(-203)
+-255 + j*(-18)
+-77 + j*(229)
+121 + j*(95)
+27 + j*(-4)
+33 + j*(86)
+142 + j*(11)
+57 + j*(-103)
+-25 + j*(-51)
+-18 + j*(-39)
+-105 + j*(-1)
+-42 + j*(191)
+243 + j*(138)
+227 + j*(-188)
+-71 + j*(-205)
+-73 + j*(17)
+75 + j*(-42)
+-54 + j*(-156)
+-165 + j*(5)
+-11 + j*(103)
+47 + j*(-25)
+-75 + j*(-35)
+-68 + j*(111)
+99 + j*(136)
+199 + j*(-17)
+103 + j*(-174)
+-64 + j*(-142)
+-41 + j*(-4)
+87 + j*(-76)
+-41 + j*(-238)
+-248 + j*(-98)
+-129 + j*(101)
+1 + j*(-13)
+-146 + j*(-62)
+-127 + j*(126)
+78 + j*(33)
+-100 + j*(-194)
+-372 + j*(47)
+-139 + j*(343)
+95 + j*(155)
+-95 + j*(54)
+-81 + j*(323)
+264 + j*(278)
+234 + j*(-66)
+-50 + j*(-19)
+48 + j*(223)
+284 + j*(112)
+224 + j*(-91)
+134 + j*(-91)
+138 + j*(-142)
+-8 + j*(-211)
+-136 + j*(-45)
+19 + j*(98)
+153 + j*(-49)
+11 + j*(-176)
+-105 + j*(-61)
+-22 + j*(21)
+2 + j*(-51)
+-99 + j*(-24)
+-56 + j*(127)
+128 + j*(113)
+160 + j*(-46)
+81 + j*(-84)
+115 + j*(-97)
+65 + j*(-268)
+-238 + j*(-262)
+-328 + j*(115)
+54 + j*(303)
+318 + j*(-23)
+104 + j*(-321)
+-145 + j*(-260)
+-211 + j*(-163)
+-313 + j*(-78)
+-312 + j*(160)
+-65 + j*(249)
+25 + j*(66)
+-114 + j*(55)
+-45 + j*(205)
+119 + j*(95)
+-11 + j*(-44)
+-98 + j*(122)
+107 + j*(158)
+88 + j*(-76)
+-170 + j*(13)
+-18 + j*(310)
+313 + j*(129)
+136 + j*(-189)
+-126 + j*(-7)
+83 + j*(190)
+230 + j*(-31)
+31 + j*(-122)
+38 + j*(31)
+165 + j*(-95)
+-62 + j*(-211)
+-161 + j*(81)
+185 + j*(142)
+208 + j*(-250)
+-206 + j*(-253)
+-192 + j*(141)
+153 + j*(92)
+63 + j*(-202)
+-186 + j*(-95)
+-95 + j*(91)
+0 + j*(26)
+-43 + j*(40)
+65 + j*(83)
+115 + j*(-91)
+-76 + j*(-152)
+-131 + j*(6)
+-35 + j*(12)
+-111 + j*(-40)
+-175 + j*(98)
+-62 + j*(197)
+20 + j*(194)
+148 + j*(226)
+348 + j*(36)
+168 + j*(-298)
+-222 + j*(-152)
+-85 + j*(243)
+297 + j*(108)
+188 + j*(-240)
+-70 + j*(-167)
+7 + j*(-41)
+28 + j*(-183)
+-185 + j*(-180)
+-223 + j*(41)
+-71 + j*(119)
+10 + j*(57)
+11 + j*(-16)
+-75 + j*(-59)
+-168 + j*(67)
+-23 + j*(224)
+180 + j*(88)
+67 + j*(-110)
+-99 + j*(-6)
+11 + j*(132)
+138 + j*(37)
+91 + j*(-74)
+19 + j*(-91)
+-42 + j*(-75)
+-66 + j*(5)
+25 + j*(30)
+19 + j*(-80)
+-114 + j*(-31)
+-13 + j*(120)
+162 + j*(-45)
+-66 + j*(-266)
+-356 + j*(-14)
+-152 + j*(330)
+183 + j*(220)
+167 + j*(-35)
+26 + j*(-68)
+-13 + j*(-28)
+-38 + j*(4)
+-9 + j*(59)
+47 + j*(23)
+-9 + j*(-20)
+-32 + j*(76)
+98 + j*(88)
+107 + j*(-59)
+-37 + j*(-49)
+12 + j*(94)
+174 + j*(8)
+88 + j*(-179)
+-100 + j*(-131)
+-91 + j*(10)
+-30 + j*(9)
+-70 + j*(28)
+-10 + j*(131)
+158 + j*(77)
+141 + j*(-124)
+-57 + j*(-151)
+-112 + j*(18)
+19 + j*(88)
+95 + j*(-1)
+59 + j*(-68)
+23 + j*(-81)
+-15 + j*(-88)
+-47 + j*(-52)
+-13 + j*(-25)
+2 + j*(-80)
+-78 + j*(-100)
+-107 + j*(-23)
+-51 + j*(-14)
+-87 + j*(-75)
+-187 + j*(-18)
+-170 + j*(98)
+-112 + j*(129)
+-97 + j*(177)
+15 + j*(250)
+170 + j*(165)
+148 + j*(12)
+64 + j*(20)
+124 + j*(47)
+161 + j*(-74)
+35 + j*(-153)
+-64 + j*(-81)
+-49 + j*(-13)
+-33 + j*(-3)
+-28 + j*(11)
+-21 + j*(12)
+-44 + j*(30)
+-15 + j*(107)
+117 + j*(91)
+134 + j*(-70)
+-36 + j*(-107)
+-75 + j*(66)
+117 + j*(116)
+204 + j*(-89)
+24 + j*(-230)
+-148 + j*(-127)
+-139 + j*(30)
+-41 + j*(98)
+69 + j*(69)
+103 + j*(-61)
+-25 + j*(-137)
+-119 + j*(-23)
+-18 + j*(52)
+8 + j*(-64)
+-153 + j*(-33)
+-83 + j*(189)
+197 + j*(93)
+86 + j*(-235)
+-293 + j*(-129)
+-226 + j*(281)
+158 + j*(278)
+195 + j*(-12)
+13 + j*(-35)
+42 + j*(86)
+158 + j*(42)
+163 + j*(-66)
+129 + j*(-132)
+66 + j*(-199)
+-32 + j*(-218)
+-116 + j*(-207)
+-245 + j*(-177)
+-373 + j*(11)
+-266 + j*(280)
+18 + j*(331)
+182 + j*(159)
+158 + j*(-23)
+15 + j*(-107)
+-128 + j*(-4)
+-47 + j*(170)
+136 + j*(105)
+69 + j*(-54)
+-55 + j*(49)
+98 + j*(155)
+208 + j*(-11)
+83 + j*(-102)
+73 + j*(-41)
+92 + j*(-145)
+-116 + j*(-157)
+-128 + j*(124)
+205 + j*(135)
+236 + j*(-214)
+-62 + j*(-278)
+-117 + j*(-98)
+-63 + j*(-123)
+-197 + j*(-114)
+-185 + j*(81)
+-5 + j*(66)
+-50 + j*(-69)
+-143 + j*(8)
+-59 + j*(42)
+-122 + j*(-60)
+-296 + j*(93)
+-145 + j*(368)
+175 + j*(320)
+255 + j*(62)
+122 + j*(-95)
+-64 + j*(-74)
+-113 + j*(142)
+149 + j*(253)
+330 + j*(-47)
+31 + j*(-283)
+-222 + j*(-14)
+6 + j*(216)
+192 + j*(39)
+72 + j*(-78)
+43 + j*(-16)
+64 + j*(-79)
+-71 + j*(-67)
+-28 + j*(125)
+212 + j*(54)
+131 + j*(-217)
+-133 + j*(-146)
+-68 + j*(70)
+76 + j*(-16)
+-59 + j*(-91)
+-95 + j*(104)
+144 + j*(139)
+205 + j*(-93)
+36 + j*(-150)
+50 + j*(-59)
+124 + j*(-183)
+-73 + j*(-305)
+-228 + j*(-122)
+-81 + j*(-23)
+-100 + j*(-214)
+-424 + j*(-128)
+-380 + j*(317)
+73 + j*(366)
+153 + j*(8)
+-98 + j*(-6)
+-1 + j*(191)
+185 + j*(2)
+-50 + j*(-177)
+-202 + j*(67)
+40 + j*(162)
+50 + j*(-89)
+-235 + j*(-28)
+-160 + j*(301)
+161 + j*(273)
+180 + j*(40)
+69 + j*(28)
+107 + j*(59)
+119 + j*(-6)
+87 + j*(-18)
+110 + j*(-49)
+35 + j*(-127)
+-82 + j*(-34)
+22 + j*(100)
+173 + j*(-21)
+50 + j*(-208)
+-171 + j*(-125)
+-165 + j*(105)
+37 + j*(181)
+170 + j*(35)
+77 + j*(-113)
+-60 + j*(-45)
+16 + j*(80)
+151 + j*(-3)
+94 + j*(-148)
+-14 + j*(-153)
+-68 + j*(-142)
+-179 + j*(-107)
+-211 + j*(71)
+-58 + j*(149)
+-26 + j*(57)
+-117 + j*(155)
+84 + j*(344)
+407 + j*(170)
+378 + j*(-184)
+158 + j*(-296)
+35 + j*(-284)
+-87 + j*(-274)
+-168 + j*(-157)
+-114 + j*(-103)
+-168 + j*(-168)
+-328 + j*(-48)
+-250 + j*(185)
+-42 + j*(190)
+-8 + j*(85)
+-21 + j*(76)
+-8 + j*(45)
+-76 + j*(54)
+-27 + j*(190)
+190 + j*(132)
+170 + j*(-142)
+-105 + j*(-183)
+-204 + j*(33)
+-92 + j*(165)
+28 + j*(173)
+127 + j*(103)
+102 + j*(-33)
+-23 + j*(-9)
+51 + j*(109)
+190 + j*(-38)
+-11 + j*(-218)
+-225 + j*(-1)
+-25 + j*(212)
+148 + j*(43)
+-7 + j*(-45)
+1 + j*(132)
+233 + j*(62)
+165 + j*(-228)
+-132 + j*(-211)
+-180 + j*(21)
+-56 + j*(96)
+-8 + j*(82)
+44 + j*(94)
+104 + j*(25)
+35 + j*(-51)
+-43 + j*(27)
+45 + j*(134)
+209 + j*(76)
+254 + j*(-117)
+107 + j*(-292)
+-150 + j*(-268)
+-263 + j*(-11)
+-60 + j*(197)
+191 + j*(55)
+93 + j*(-218)
+-197 + j*(-148)
+-148 + j*(162)
+184 + j*(128)
+178 + j*(-226)
+-180 + j*(-267)
+-271 + j*(51)
+-34 + j*(158)
+41 + j*(13)
+-38 + j*(0)
+1 + j*(40)
+6 + j*(-18)
+-59 + j*(40)
+88 + j*(136)
+261 + j*(-80)
+59 + j*(-350)
+-248 + j*(-250)
+-266 + j*(-21)
+-182 + j*(36)
+-177 + j*(53)
+-161 + j*(85)
+-193 + j*(107)
+-207 + j*(268)
+27 + j*(402)
+247 + j*(209)
+129 + j*(17)
+56 + j*(136)
+258 + j*(120)
+229 + j*(-168)
+-78 + j*(-160)
+-64 + j*(113)
+170 + j*(59)
+77 + j*(-148)
+-108 + j*(-31)
+15 + j*(130)
+151 + j*(8)
+51 + j*(-105)
+-40 + j*(-45)
+-42 + j*(8)
+-46 + j*(79)
+69 + j*(174)
+252 + j*(73)
+219 + j*(-144)
+48 + j*(-170)
+27 + j*(-79)
+76 + j*(-110)
+14 + j*(-173)
+-57 + j*(-125)
+-37 + j*(-83)
+-28 + j*(-112)
+-76 + j*(-127)
+-127 + j*(-107)
+-182 + j*(-55)
+-190 + j*(67)
+-52 + j*(153)
+88 + j*(37)
+-12 + j*(-134)
+-209 + j*(-48)
+-156 + j*(166)
+36 + j*(158)
+42 + j*(40)
+16 + j*(83)
+163 + j*(47)
+121 + j*(-222)
+-246 + j*(-230)
+-334 + j*(179)
+50 + j*(338)
+243 + j*(25)
+16 + j*(-159)
+-142 + j*(-8)
+-72 + j*(122)
+25 + j*(144)
+138 + j*(94)
+143 + j*(-86)
+-79 + j*(-124)
+-121 + j*(132)
+185 + j*(173)
+239 + j*(-182)
+-132 + j*(-284)
+-294 + j*(43)
+-78 + j*(240)
+91 + j*(185)
+195 + j*(122)
+308 + j*(-75)
+124 + j*(-369)
+-279 + j*(-296)
+-353 + j*(95)
+-79 + j*(262)
+76 + j*(132)
+30 + j*(67)
+55 + j*(129)
+194 + j*(81)
+192 + j*(-132)
+-52 + j*(-206)
+-191 + j*(40)
+42 + j*(218)
+232 + j*(6)
+36 + j*(-152)
+-55 + j*(59)
+214 + j*(88)
+226 + j*(-250)
+-139 + j*(-286)
+-190 + j*(41)
+70 + j*(71)
+55 + j*(-124)
+-89 + j*(-54)
+37 + j*(49)
+132 + j*(-125)
+-43 + j*(-244)
+-177 + j*(-129)
+-149 + j*(-38)
+-137 + j*(-24)
+-142 + j*(4)
+-150 + j*(25)
+-171 + j*(105)
+-52 + j*(214)
+131 + j*(100)
+37 + j*(-120)
+-204 + j*(-43)
+-158 + j*(200)
+51 + j*(194)
+59 + j*(61)
+1 + j*(87)
+82 + j*(112)
+108 + j*(1)
+-3 + j*(-28)
+-23 + j*(77)
+76 + j*(83)
+66 + j*(-2)
+-14 + j*(46)
+72 + j*(158)
+244 + j*(79)
+236 + j*(-113)
+114 + j*(-178)
+60 + j*(-178)
+-21 + j*(-221)
+-165 + j*(-146)
+-140 + j*(19)
+-21 + j*(2)
+-102 + j*(-72)
+-185 + j*(98)
+42 + j*(233)
+225 + j*(3)
+28 + j*(-192)
+-140 + j*(-33)
+-7 + j*(78)
+38 + j*(-54)
+-113 + j*(-42)
+-71 + j*(146)
+151 + j*(107)
+143 + j*(-125)
+-66 + j*(-162)
+-119 + j*(-9)
+-29 + j*(5)
+-102 + j*(-79)
+-268 + j*(76)
+-108 + j*(378)
+293 + j*(308)
+334 + j*(-91)
+11 + j*(-167)
+0 + j*(102)
+304 + j*(29)
+221 + j*(-356)
+-197 + j*(-358)
+-294 + j*(-16)
+-108 + j*(108)
+-43 + j*(82)
+37 + j*(127)
+197 + j*(-4)
+68 + j*(-255)
+-235 + j*(-165)
+-197 + j*(137)
+63 + j*(132)
+61 + j*(-66)
+-91 + j*(-42)
+-37 + j*(91)
+100 + j*(26)
+60 + j*(-134)
+-96 + j*(-156)
+-182 + j*(-64)
+-192 + j*(13)
+-215 + j*(84)
+-202 + j*(231)
+-19 + j*(366)
+247 + j*(267)
+278 + j*(-31)
+21 + j*(-142)
+-112 + j*(76)
+100 + j*(225)
+283 + j*(19)
+115 + j*(-186)
+-77 + j*(-58)
+45 + j*(105)
+199 + j*(-28)
+84 + j*(-192)
+-70 + j*(-128)
+-62 + j*(-35)
+-59 + j*(-8)
+-18 + j*(86)
+176 + j*(46)
+160 + j*(-254)
+-221 + j*(-291)
+-323 + j*(122)
+72 + j*(262)
+206 + j*(-103)
+-147 + j*(-211)
+-238 + j*(141)
+100 + j*(235)
+200 + j*(-59)
+-37 + j*(-152)
+-114 + j*(34)
+33 + j*(107)
+126 + j*(5)
+100 + j*(-115)
+-15 + j*(-191)
+-179 + j*(-140)
+-224 + j*(51)
+-86 + j*(173)
+54 + j*(123)
+80 + j*(24)
+42 + j*(-43)
+-30 + j*(-70)
+-118 + j*(-21)
+-136 + j*(110)
+-18 + j*(228)
+181 + j*(202)
+283 + j*(4)
+170 + j*(-181)
+2 + j*(-163)
+-1 + j*(-71)
+43 + j*(-122)
+-56 + j*(-192)
+-161 + j*(-115)
+-156 + j*(-45)
+-197 + j*(-29)
+-255 + j*(115)
+-100 + j*(283)
+112 + j*(202)
+103 + j*(40)
+40 + j*(46)
+104 + j*(28)
+45 + j*(-110)
+-158 + j*(-43)
+-114 + j*(212)
+162 + j*(218)
+224 + j*(-30)
+39 + j*(-115)
+-30 + j*(13)
+65 + j*(57)
+101 + j*(-19)
+54 + j*(-53)
+42 + j*(-27)
+81 + j*(-44)
+65 + j*(-117)
+-36 + j*(-137)
+-88 + j*(-47)
+-27 + j*(-2)
+-19 + j*(-59)
+-105 + j*(-21)
+-44 + j*(110)
+124 + j*(50)
+86 + j*(-128)
+-64 + j*(-110)
+-41 + j*(-31)
+-33 + j*(-107)
+-197 + j*(-87)
+-207 + j*(129)
+-13 + j*(190)
+45 + j*(83)
+28 + j*(101)
+155 + j*(90)
+182 + j*(-108)
+-11 + j*(-187)
+-96 + j*(-67)
+-54 + j*(-40)
+-118 + j*(-52)
+-151 + j*(76)
+-30 + j*(140)
+28 + j*(68)
+-1 + j*(66)
+59 + j*(91)
+106 + j*(13)
+63 + j*(-46)
+30 + j*(-65)
+-52 + j*(-95)
+-160 + j*(30)
+-26 + j*(209)
+195 + j*(98)
+116 + j*(-109)
+-30 + j*(-35)
+85 + j*(37)
+122 + j*(-138)
+-80 + j*(-183)
+-139 + j*(-16)
+-52 + j*(21)
+-83 + j*(8)
+-54 + j*(124)
+121 + j*(78)
+69 + j*(-126)
+-141 + j*(-68)
+-84 + j*(131)
+74 + j*(79)
+15 + j*(-7)
+12 + j*(95)
+184 + j*(45)
+122 + j*(-194)
+-146 + j*(-146)
+-102 + j*(121)
+168 + j*(62)
+98 + j*(-232)
+-227 + j*(-185)
+-233 + j*(142)
+51 + j*(192)
+104 + j*(-26)
+-62 + j*(-37)
+-11 + j*(115)
+159 + j*(13)
+35 + j*(-194)
+-204 + j*(-81)
+-124 + j*(170)
+105 + j*(130)
+91 + j*(-57)
+-46 + j*(-47)
+-34 + j*(46)
+18 + j*(25)
+-19 + j*(13)
+-1 + j*(90)
+125 + j*(73)
+142 + j*(-82)
+-7 + j*(-134)
+-57 + j*(-12)
+56 + j*(1)
+25 + j*(-146)
+-174 + j*(-100)
+-139 + j*(134)
+93 + j*(115)
+64 + j*(-90)
+-108 + j*(-28)
+-1 + j*(120)
+132 + j*(-34)
+-59 + j*(-165)
+-207 + j*(35)
+-47 + j*(202)
+100 + j*(136)
+141 + j*(77)
+220 + j*(-18)
+155 + j*(-210)
+-57 + j*(-214)
+-86 + j*(-76)
+-43 + j*(-117)
+-204 + j*(-126)
+-249 + j*(128)
+28 + j*(229)
+165 + j*(-16)
+-25 + j*(-170)
+-192 + j*(-66)
+-209 + j*(88)
+-129 + j*(233)
+81 + j*(271)
+209 + j*(80)
+72 + j*(-46)
+18 + j*(77)
+187 + j*(63)
+157 + j*(-168)
+-95 + j*(-155)
+-91 + j*(73)
+98 + j*(53)
+54 + j*(-110)
+-90 + j*(-47)
+-23 + j*(76)
+80 + j*(1)
+1 + j*(-93)
+-100 + j*(-33)
+-98 + j*(78)
+-21 + j*(166)
+151 + j*(190)
+321 + j*(1)
+203 + j*(-288)
+-123 + j*(-281)
+-194 + j*(-1)
+13 + j*(88)
+78 + j*(-65)
+-23 + j*(-102)
+-22 + j*(-69)
+-57 + j*(-141)
+-228 + j*(-72)
+-181 + j*(177)
+86 + j*(182)
+119 + j*(-33)
+4 + j*(-56)
+50 + j*(-43)
+-4 + j*(-202)
+-270 + j*(-153)
+-286 + j*(146)
+-64 + j*(211)
+-37 + j*(127)
+-25 + j*(225)
+196 + j*(214)
+241 + j*(-38)
+58 + j*(-103)
+51 + j*(-18)
+80 + j*(-117)
+-96 + j*(-141)
+-125 + j*(45)
+23 + j*(34)
+-79 + j*(-83)
+-216 + j*(120)
+38 + j*(322)
+293 + j*(91)
+132 + j*(-173)
+-103 + j*(-79)
+-69 + j*(127)
+124 + j*(176)
+286 + j*(19)
+222 + j*(-245)
+-86 + j*(-308)
+-252 + j*(-31)
+-45 + j*(192)
+200 + j*(66)
+170 + j*(-175)
+-29 + j*(-252)
+-189 + j*(-151)
+-204 + j*(22)
+-84 + j*(115)
+18 + j*(67)
+18 + j*(1)
+-2 + j*(-13)
+-11 + j*(-31)
+-57 + j*(-40)
+-103 + j*(17)
+-69 + j*(106)
+46 + j*(123)
+122 + j*(16)
+49 + j*(-89)
+-46 + j*(-57)
+-28 + j*(-10)
+-50 + j*(-45)
+-136 + j*(37)
+-18 + j*(188)
+182 + j*(63)
+70 + j*(-157)
+-140 + j*(-64)
+-78 + j*(111)
+35 + j*(95)
+66 + j*(81)
+185 + j*(32)
+162 + j*(-202)
+-117 + j*(-233)
+-161 + j*(8)
+6 + j*(-26)
+-165 + j*(-170)
+-362 + j*(101)
+-98 + j*(355)
+115 + j*(180)
+-6 + j*(114)
+75 + j*(283)
+329 + j*(164)
+286 + j*(-95)
+141 + j*(-126)
+104 + j*(-136)
+-6 + j*(-132)
+7 + j*(22)
+205 + j*(-46)
+93 + j*(-307)
+-196 + j*(-183)
+-59 + j*(74)
+151 + j*(-113)
+-83 + j*(-315)
+-296 + j*(-106)
+-171 + j*(77)
+-71 + j*(35)
+-72 + j*(4)
+-87 + j*(-40)
+-209 + j*(-25)
+-231 + j*(175)
+-37 + j*(239)
+-9 + j*(131)
+-40 + j*(248)
+265 + j*(286)
+378 + j*(-141)
+-78 + j*(-327)
+-289 + j*(93)
+57 + j*(281)
+181 + j*(31)
+14 + j*(23)
+139 + j*(173)
+344 + j*(-11)
+225 + j*(-270)
+10 + j*(-289)
+-103 + j*(-218)
+-167 + j*(-113)
+-125 + j*(-10)
+-69 + j*(-30)
+-124 + j*(-33)
+-103 + j*(62)
+4 + j*(15)
+-92 + j*(-112)
+-288 + j*(6)
+-251 + j*(276)
+4 + j*(411)
+286 + j*(305)
+386 + j*(-4)
+161 + j*(-228)
+-64 + j*(-95)
+54 + j*(63)
+171 + j*(-109)
+-41 + j*(-246)
+-227 + j*(-56)
+-119 + j*(155)
+76 + j*(156)
+170 + j*(5)
+58 + j*(-159)
+-158 + j*(-61)
+-49 + j*(208)
+276 + j*(100)
+196 + j*(-252)
+-112 + j*(-204)
+-63 + j*(-6)
+14 + j*(-114)
+-177 + j*(-100)
+-102 + j*(158)
+188 + j*(33)
+34 + j*(-267)
+-239 + j*(-119)
+-108 + j*(65)
+-68 + j*(-85)
+-296 + j*(1)
+-157 + j*(327)
+224 + j*(201)
+135 + j*(-182)
+-231 + j*(-141)
+-275 + j*(192)
+-20 + j*(354)
+240 + j*(245)
+291 + j*(-37)
+54 + j*(-195)
+-135 + j*(-11)
+25 + j*(170)
+205 + j*(23)
+100 + j*(-162)
+-71 + j*(-133)
+-131 + j*(-20)
+-115 + j*(113)
+40 + j*(216)
+250 + j*(104)
+235 + j*(-154)
+15 + j*(-248)
+-147 + j*(-132)
+-148 + j*(35)
+-17 + j*(121)
+110 + j*(30)
+44 + j*(-112)
+-106 + j*(-56)
+-55 + j*(97)
+101 + j*(49)
+62 + j*(-112)
+-109 + j*(-88)
+-120 + j*(91)
+51 + j*(150)
+152 + j*(11)
+57 + j*(-103)
+-35 + j*(-41)
+23 + j*(16)
+52 + j*(-61)
+-41 + j*(-70)
+-28 + j*(37)
+96 + j*(8)
+76 + j*(-127)
+-33 + j*(-134)
+-47 + j*(-99)
+-90 + j*(-128)
+-177 + j*(-52)
+-112 + j*(59)
+-25 + j*(-8)
+-124 + j*(-69)
+-187 + j*(62)
+-61 + j*(129)
+-21 + j*(21)
+-146 + j*(18)
+-155 + j*(183)
+16 + j*(247)
+124 + j*(129)
+52 + j*(31)
+-17 + j*(124)
+143 + j*(221)
+337 + j*(25)
+185 + j*(-251)
+-93 + j*(-180)
+-52 + j*(13)
+37 + j*(-83)
+-168 + j*(-117)
+-214 + j*(187)
+127 + j*(282)
+261 + j*(-25)
+44 + j*(-146)
+-10 + j*(-31)
+24 + j*(-95)
+-183 + j*(-95)
+-222 + j*(240)
+168 + j*(390)
+433 + j*(71)
+298 + j*(-221)
+113 + j*(-276)
+-38 + j*(-285)
+-211 + j*(-148)
+-129 + j*(102)
+140 + j*(42)
+71 + j*(-243)
+-246 + j*(-169)
+-197 + j*(172)
+141 + j*(163)
+176 + j*(-131)
+-39 + j*(-188)
+-71 + j*(-68)
+-6 + j*(-113)
+-122 + j*(-194)
+-250 + j*(-72)
+-182 + j*(49)
+-130 + j*(2)
+-233 + j*(1)
+-279 + j*(167)
+-152 + j*(306)
+4 + j*(311)
+115 + j*(258)
+196 + j*(161)
+183 + j*(35)
+96 + j*(2)
+91 + j*(52)
+163 + j*(17)
+135 + j*(-98)
+13 + j*(-98)
+6 + j*(10)
+126 + j*(-1)
+124 + j*(-168)
+-72 + j*(-218)
+-180 + j*(-43)
+-50 + j*(76)
+38 + j*(-34)
+-102 + j*(-103)
+-193 + j*(77)
+-8 + j*(222)
+180 + j*(76)
+91 + j*(-114)
+-70 + j*(-62)
+-25 + j*(64)
+83 + j*(8)
+17 + j*(-104)
+-108 + j*(-43)
+-68 + j*(95)
+66 + j*(85)
+87 + j*(-28)
+7 + j*(-65)
+-32 + j*(-13)
+8 + j*(21)
+50 + j*(-14)
+21 + j*(-77)
+-58 + j*(-66)
+-64 + j*(24)
+18 + j*(32)
+10 + j*(-45)
+-84 + j*(0)
+-7 + j*(138)
+182 + j*(66)
+154 + j*(-149)
+-35 + j*(-161)
+-43 + j*(-35)
+289 + j*(-105)
+48 + j*(-267)
+-117 + j*(-80)
+29 + j*(9)
+35 + j*(-146)
+-147 + j*(-115)
+-127 + j*(57)
+-21 + j*(53)
+-33 + j*(38)
+35 + j*(74)
+91 + j*(-54)
+-83 + j*(-115)
+-143 + j*(86)
+59 + j*(139)
+90 + j*(-30)
+-27 + j*(-8)
+72 + j*(67)
+134 + j*(-110)
+-86 + j*(-178)
+-147 + j*(43)
+63 + j*(65)
+36 + j*(-163)
+-241 + j*(-127)
+-261 + j*(175)
+-10 + j*(271)
+105 + j*(127)
+33 + j*(82)
+76 + j*(185)
+282 + j*(139)
+342 + j*(-134)
+117 + j*(-313)
+-91 + j*(-217)
+-93 + j*(-85)
+-62 + j*(-66)
+-66 + j*(-48)
+-45 + j*(-54)
+-103 + j*(-93)
+-198 + j*(10)
+-96 + j*(158)
+62 + j*(83)
+-5 + j*(-36)
+-83 + j*(56)
+40 + j*(118)
+115 + j*(-21)
+-5 + j*(-117)
+-124 + j*(-46)
+-124 + j*(76)
+-24 + j*(152)
+101 + j*(85)
+59 + j*(-54)
+-82 + j*(-16)
+-40 + j*(128)
+96 + j*(98)
+89 + j*(8)
+78 + j*(14)
+117 + j*(-49)
+11 + j*(-134)
+-95 + j*(-16)
+24 + j*(91)
+124 + j*(-26)
+34 + j*(-121)
+-38 + j*(-86)
+-65 + j*(-70)
+-132 + j*(-6)
+-73 + j*(136)
+105 + j*(129)
+165 + j*(-20)
+114 + j*(-127)
+27 + j*(-206)
+-149 + j*(-214)
+-279 + j*(-35)
+-199 + j*(165)
+-30 + j*(222)
+127 + j*(180)
+237 + j*(3)
+117 + j*(-216)
+-130 + j*(-172)
+-134 + j*(24)
+-23 + j*(24)
+-66 + j*(-16)
+-55 + j*(66)
+30 + j*(5)
+-110 + j*(-68)
+-191 + j*(171)
+123 + j*(295)
+298 + j*(-30)
+11 + j*(-223)
+-153 + j*(-2)
+4 + j*(105)
+43 + j*(1)
+-23 + j*(31)
+62 + j*(81)
+114 + j*(-18)
+42 + j*(-70)
+21 + j*(-55)
+-17 + j*(-88)
+-118 + j*(-25)
+-51 + j*(135)
+152 + j*(98)
+173 + j*(-116)
+-1 + j*(-206)
+-134 + j*(-121)
+-135 + j*(-4)
+-72 + j*(30)
+-74 + j*(0)
+-143 + j*(57)
+-77 + j*(211)
+144 + j*(200)
+202 + j*(-10)
+59 + j*(-81)
+58 + j*(10)
+178 + j*(-93)
+22 + j*(-322)
+-337 + j*(-206)
+-330 + j*(221)
+78 + j*(327)
+239 + j*(-14)
+-35 + j*(-155)
+-123 + j*(98)
+151 + j*(136)
+168 + j*(-165)
+-141 + j*(-185)
+-166 + j*(93)
+47 + j*(113)
+43 + j*(-6)
+30 + j*(49)
+165 + j*(-33)
+17 + j*(-255)
+-269 + j*(-81)
+-86 + j*(231)
+225 + j*(40)
+30 + j*(-259)
+-252 + j*(-91)
+-139 + j*(146)
+13 + j*(98)
+14 + j*(58)
+77 + j*(35)
+42 + j*(-102)
+-147 + j*(-42)
+-55 + j*(191)
+230 + j*(76)
+115 + j*(-262)
+-256 + j*(-185)
+-249 + j*(168)
+25 + j*(216)
+93 + j*(48)
+23 + j*(21)
+58 + j*(40)
+56 + j*(-28)
+-37 + j*(-1)
+32 + j*(119)
+198 + j*(11)
+76 + j*(-219)
+-213 + j*(-105)
+-132 + j*(235)
+230 + j*(217)
+286 + j*(-113)
+52 + j*(-210)
+-11 + j*(-78)
+75 + j*(-99)
+-7 + j*(-212)
+-186 + j*(-150)
+-212 + j*(49)
+-55 + j*(184)
+151 + j*(121)
+186 + j*(-97)
+4 + j*(-198)
+-103 + j*(-67)
+1 + j*(5)
+44 + j*(-101)
+-55 + j*(-142)
+-87 + j*(-94)
+-101 + j*(-129)
+-243 + j*(-112)
+-301 + j*(93)
+-132 + j*(234)
+18 + j*(151)
+-12 + j*(62)
+-49 + j*(107)
+35 + j*(147)
+117 + j*(44)
+16 + j*(-88)
+-175 + j*(0)
+-128 + j*(248)
+146 + j*(272)
+226 + j*(30)
+36 + j*(-52)
+-14 + j*(125)
+177 + j*(180)
+288 + j*(15)
+226 + j*(-129)
+146 + j*(-189)
+43 + j*(-238)
+-108 + j*(-192)
+-154 + j*(-26)
+-35 + j*(66)
+40 + j*(-11)
+-47 + j*(-35)
+-35 + j*(124)
+231 + j*(130)
+330 + j*(-210)
+6 + j*(-432)
+-267 + j*(-223)
+-188 + j*(-30)
+-155 + j*(-62)
+-239 + j*(41)
+-90 + j*(183)
+37 + j*(34)
+-144 + j*(-7)
+-110 + j*(267)
+263 + j*(215)
+240 + j*(-197)
+-127 + j*(-203)
+-124 + j*(60)
+16 + j*(-4)
+-152 + j*(-30)
+-110 + j*(262)
+289 + j*(213)
+280 + j*(-238)
+-146 + j*(-282)
+-222 + j*(64)
+23 + j*(141)
+82 + j*(-6)
+25 + j*(-49)
+6 + j*(-81)
+-108 + j*(-105)
+-194 + j*(47)
+-64 + j*(187)
+83 + j*(114)
+59 + j*(8)
+0 + j*(14)
+-1 + j*(57)
+37 + j*(90)
+122 + j*(75)
+168 + j*(-39)
+73 + j*(-146)
+-55 + j*(-95)
+-36 + j*(14)
+54 + j*(-6)
+14 + j*(-96)
+-99 + j*(-51)
+-68 + j*(88)
+85 + j*(91)
+134 + j*(-51)
+41 + j*(-154)
+-95 + j*(-151)
+-206 + j*(-25)
+-144 + j*(183)
+107 + j*(202)
+188 + j*(-37)
+-20 + j*(-119)
+-62 + j*(71)
+147 + j*(68)
+124 + j*(-173)
+-122 + j*(-161)
+-127 + j*(53)
+21 + j*(59)
+6 + j*(-20)
+-13 + j*(25)
+59 + j*(1)
+4 + j*(-86)
+-95 + j*(-6)
+8 + j*(105)
+144 + j*(-4)
+68 + j*(-172)
+-110 + j*(-169)
+-196 + j*(-29)
+-133 + j*(106)
+-3 + j*(113)
+34 + j*(15)
+-41 + j*(-21)
+-91 + j*(33)
+-90 + j*(110)
+-18 + j*(216)
+197 + j*(218)
+314 + j*(-42)
+87 + j*(-242)
+-115 + j*(-71)
+33 + j*(80)
+140 + j*(-82)
+-29 + j*(-170)
+-99 + j*(-30)
+-1 + j*(-6)
+-40 + j*(-76)
+-98 + j*(8)
+1 + j*(52)
+15 + j*(-54)
+-93 + j*(-42)
+-65 + j*(50)
+-20 + j*(-1)
+-129 + j*(8)
+-103 + j*(194)
+134 + j*(193)
+154 + j*(-35)
+-39 + j*(-37)
+11 + j*(146)
+216 + j*(68)
+156 + j*(-149)
+-17 + j*(-116)
+37 + j*(-21)
+90 + j*(-150)
+-112 + j*(-232)
+-263 + j*(-30)
+-138 + j*(153)
+8 + j*(112)
+-6 + j*(47)
+-35 + j*(86)
+14 + j*(156)
+151 + j*(177)
+316 + j*(31)
+255 + j*(-251)
+-49 + j*(-311)
+-167 + j*(-69)
+13 + j*(4)
+6 + j*(-192)
+-267 + j*(-154)
+-273 + j*(182)
+54 + j*(267)
+185 + j*(0)
+-18 + j*(-135)
+-144 + j*(32)
+2 + j*(172)
+166 + j*(59)
+109 + j*(-117)
+-37 + j*(-109)
+-45 + j*(-27)
+-28 + j*(-60)
+-139 + j*(-47)
+-143 + j*(141)
+78 + j*(190)
+168 + j*(-18)
+1 + j*(-113)
+-71 + j*(6)
+6 + j*(42)
+5 + j*(3)
+-3 + j*(49)
+91 + j*(45)
+108 + j*(-82)
+-16 + j*(-148)
+-133 + j*(-73)
+-136 + j*(76)
+23 + j*(173)
+211 + j*(23)
+102 + j*(-249)
+-216 + j*(-225)
+-303 + j*(62)
+-138 + j*(218)
+-2 + j*(214)
+100 + j*(173)
+144 + j*(47)
+25 + j*(-8)
+6 + j*(151)
+246 + j*(177)
+357 + j*(-109)
+131 + j*(-318)
+-112 + j*(-233)
+-158 + j*(-30)
+-19 + j*(103)
+180 + j*(0)
+107 + j*(-271)
+-215 + j*(-262)
+-282 + j*(39)
+-81 + j*(137)
+-29 + j*(65)
+1 + j*(115)
+158 + j*(27)
+47 + j*(-217)
+-241 + j*(-107)
+-150 + j*(170)
+54 + j*(88)
+-59 + j*(-16)
+-83 + j*(154)
+124 + j*(134)
+70 + j*(-66)
+-105 + j*(45)
+65 + j*(219)
+265 + j*(42)
+152 + j*(-168)
+-22 + j*(-149)
+-83 + j*(-40)
+-25 + j*(85)
+170 + j*(56)
+179 + j*(-217)
+-138 + j*(-293)
+-273 + j*(-1)
+-75 + j*(133)
+-13 + j*(32)
+-70 + j*(78)
+46 + j*(151)
+146 + j*(57)
+153 + j*(-16)
+195 + j*(-137)
+28 + j*(-334)
+-276 + j*(-197)
+-188 + j*(105)
+34 + j*(-1)
+-150 + j*(-147)
+-267 + j*(112)
+5 + j*(197)
+16 + j*(-44)
+-216 + j*(57)
+-28 + j*(312)
+238 + j*(98)
+31 + j*(-144)
+-156 + j*(45)
+-7 + j*(180)
+56 + j*(98)
+30 + j*(136)
+173 + j*(168)
+258 + j*(-6)
+145 + j*(-132)
+42 + j*(-111)
+1 + j*(-65)
+16 + j*(-4)
+90 + j*(-25)
+50 + j*(-115)
+-30 + j*(-59)
+59 + j*(-30)
+15 + j*(-192)
+-250 + j*(-86)
+-112 + j*(277)
+327 + j*(137)
+206 + j*(-332)
+-237 + j*(-243)
+-171 + j*(117)
+79 + j*(52)
+-7 + j*(-91)
+-53 + j*(17)
+75 + j*(-9)
+6 + j*(-153)
+-129 + j*(-91)
+-99 + j*(-10)
+-106 + j*(-25)
+-136 + j*(52)
+-40 + j*(88)
+-48 + j*(1)
+-161 + j*(84)
+-45 + j*(264)
+179 + j*(209)
+245 + j*(39)
+233 + j*(-105)
+105 + j*(-275)
+-171 + j*(-233)
+-192 + j*(54)
+74 + j*(65)
+41 + j*(-211)
+-262 + j*(-182)
+-293 + j*(94)
+-141 + j*(161)
+-134 + j*(158)
+-73 + j*(276)
+132 + j*(254)
+175 + j*(54)
+16 + j*(-18)
+-84 + j*(126)
+39 + j*(310)
+330 + j*(296)
+501 + j*(-6)
+334 + j*(-305)
+71 + j*(-325)
+-45 + j*(-229)
+-115 + j*(-142)
+-98 + j*(11)
+86 + j*(33)
+119 + j*(-179)
+-106 + j*(-235)
+-180 + j*(-46)
+-73 + j*(-6)
+-128 + j*(-57)
+-189 + j*(103)
+11 + j*(227)
+194 + j*(70)
+141 + j*(-124)
+-1 + j*(-195)
+-173 + j*(-159)
+-265 + j*(54)
+-91 + j*(255)
+147 + j*(177)
+175 + j*(-4)
+122 + j*(-93)
+39 + j*(-185)
+-155 + j*(-162)
+-191 + j*(64)
+11 + j*(116)
+21 + j*(-49)
+-126 + j*(13)
+-3 + j*(163)
+136 + j*(6)
+-46 + j*(-89)
+-78 + j*(132)
+209 + j*(125)
+206 + j*(-209)
+-115 + j*(-246)
+-169 + j*(-5)
+-25 + j*(13)
+-78 + j*(-70)
+-147 + j*(35)
+-38 + j*(98)
+-1 + j*(-1)
+-103 + j*(-11)
+-120 + j*(90)
+-57 + j*(137)
+-13 + j*(147)
+47 + j*(153)
+107 + j*(101)
+100 + j*(24)
+37 + j*(-1)
+-18 + j*(52)
+26 + j*(156)
+185 + j*(162)
+270 + j*(-8)
+148 + j*(-137)
+51 + j*(-60)
+148 + j*(-20)
+189 + j*(-180)
+4 + j*(-284)
+-164 + j*(-153)
+-118 + j*(13)
+3 + j*(23)
+24 + j*(-56)
+-43 + j*(-78)
+-88 + j*(-6)
+-18 + j*(78)
+110 + j*(32)
+114 + j*(-117)
+-15 + j*(-175)
+-87 + j*(-96)
+-46 + j*(-64)
+-71 + j*(-127)
+-206 + j*(-91)
+-226 + j*(105)
+-23 + j*(203)
+134 + j*(45)
+30 + j*(-124)
+-115 + j*(-62)
+-65 + j*(28)
+-31 + j*(-54)
+-179 + j*(-63)
+-210 + j*(136)
+-16 + j*(198)
+36 + j*(40)
+-106 + j*(38)
+-68 + j*(192)
+78 + j*(156)
+47 + j*(64)
+39 + j*(136)
+185 + j*(86)
+110 + j*(-131)
+-153 + j*(-52)
+-91 + j*(232)
+165 + j*(208)
+156 + j*(53)
+134 + j*(125)
+352 + j*(78)
+346 + j*(-262)
+-13 + j*(-349)
+-147 + j*(-60)
+64 + j*(48)
+127 + j*(-127)
+-36 + j*(-159)
+-47 + j*(2)
+148 + j*(4)
+195 + j*(-245)
+-71 + j*(-416)
+-358 + j*(-235)
+-324 + j*(68)
+-119 + j*(122)
+-91 + j*(37)
+-129 + j*(89)
+-40 + j*(146)
+21 + j*(93)
+28 + j*(99)
+151 + j*(76)
+176 + j*(-152)
+-89 + j*(-262)
+-268 + j*(-39)
+-136 + j*(136)
+-42 + j*(90)
+-69 + j*(110)
+40 + j*(185)
+185 + j*(63)
+122 + j*(-134)
+-73 + j*(-173)
+-218 + j*(-44)
+-208 + j*(163)
+-20 + j*(275)
+141 + j*(173)
+112 + j*(64)
+101 + j*(95)
+206 + j*(52)
+184 + j*(-124)
+-6 + j*(-166)
+-108 + j*(-8)
+-1 + j*(148)
+205 + j*(106)
+245 + j*(-127)
+27 + j*(-231)
+-72 + j*(-45)
+124 + j*(-6)
+107 + j*(-274)
+-233 + j*(-255)
+-246 + j*(96)
+51 + j*(117)
+33 + j*(-96)
+-96 + j*(-16)
+52 + j*(31)
+20 + j*(-190)
+-269 + j*(-102)
+-158 + j*(219)
+146 + j*(103)
+16 + j*(-148)
+-162 + j*(-1)
+-6 + j*(86)
+-26 + j*(-93)
+-250 + j*(21)
+-105 + j*(300)
+186 + j*(184)
+116 + j*(-55)
+-38 + j*(-11)
+-4 + j*(71)
+16 + j*(56)
+22 + j*(95)
+110 + j*(95)
+133 + j*(8)
+105 + j*(-18)
+121 + j*(-63)
+32 + j*(-133)
+-62 + j*(-13)
+107 + j*(81)
+227 + j*(-165)
+-63 + j*(-356)
+-326 + j*(-103)
+-173 + j*(166)
+21 + j*(103)
+-13 + j*(16)
+-28 + j*(69)
+35 + j*(64)
+17 + j*(31)
+24 + j*(100)
+172 + j*(95)
+235 + j*(-98)
+76 + j*(-238)
+-76 + j*(-169)
+-74 + j*(-90)
+-94 + j*(-104)
+-181 + j*(-21)
+-91 + j*(144)
+133 + j*(70)
+83 + j*(-201)
+-218 + j*(-201)
+-285 + j*(86)
+-70 + j*(182)
+-14 + j*(47)
+-133 + j*(74)
+-64 + j*(236)
+134 + j*(196)
+145 + j*(21)
+33 + j*(-3)
+31 + j*(71)
+93 + j*(63)
+103 + j*(27)
+136 + j*(8)
+159 + j*(-101)
+6 + j*(-204)
+-166 + j*(-51)
+-32 + j*(163)
+197 + j*(45)
+89 + j*(-181)
+-113 + j*(-66)
+34 + j*(115)
+224 + j*(-70)
+40 + j*(-300)
+-203 + j*(-174)
+-153 + j*(20)
+-46 + j*(-1)
+-86 + j*(-54)
+-144 + j*(-4)
+-142 + j*(78)
+-77 + j*(152)
+35 + j*(143)
+64 + j*(58)
+30 + j*(57)
+103 + j*(73)
+147 + j*(-69)
+-13 + j*(-156)
+-113 + j*(-19)
+-8 + j*(49)
+1 + j*(-51)
+-122 + j*(-18)
+-88 + j*(131)
+46 + j*(125)
+52 + j*(45)
+18 + j*(74)
+99 + j*(122)
+229 + j*(40)
+226 + j*(-179)
+-26 + j*(-305)
+-270 + j*(-82)
+-103 + j*(228)
+225 + j*(115)
+159 + j*(-190)
+-81 + j*(-153)
+-35 + j*(-6)
+34 + j*(-107)
+-125 + j*(-144)
+-168 + j*(22)
+-47 + j*(45)
+-95 + j*(-20)
+-159 + j*(114)
+14 + j*(233)
+197 + j*(102)
+174 + j*(-106)
+-4 + j*(-222)
+-247 + j*(-124)
+-266 + j*(206)
+88 + j*(342)
+296 + j*(18)
+17 + j*(-190)
+-146 + j*(75)
+149 + j*(204)
+288 + j*(-123)
+-25 + j*(-312)
+-264 + j*(-69)
+-137 + j*(181)
+74 + j*(180)
+169 + j*(55)
+150 + j*(-76)
+47 + j*(-137)
+-26 + j*(-86)
+4 + j*(-62)
+-24 + j*(-129)
+-163 + j*(-97)
+-177 + j*(95)
+24 + j*(166)
+134 + j*(-13)
+-17 + j*(-141)
+-153 + j*(-25)
+-85 + j*(95)
+-29 + j*(76)
+-37 + j*(125)
+110 + j*(194)
+278 + j*(7)
+135 + j*(-240)
+-113 + j*(-179)
+-115 + j*(-4)
+-42 + j*(2)
+-67 + j*(11)
+-9 + j*(69)
+59 + j*(-32)
+-93 + j*(-112)
+-205 + j*(74)
+-33 + j*(229)
+126 + j*(125)
+100 + j*(23)
+87 + j*(9)
+70 + j*(-52)
+-30 + j*(-29)
+18 + j*(99)
+185 + j*(21)
+101 + j*(-180)
+-99 + j*(-108)
+-31 + j*(54)
+78 + j*(-33)
+-46 + j*(-89)
+-52 + j*(81)
+185 + j*(49)
+157 + j*(-255)
+-177 + j*(-282)
+-271 + j*(8)
+-87 + j*(125)
+-6 + j*(40)
+-25 + j*(14)
+-21 + j*(-10)
+-103 + j*(-24)
+-145 + j*(128)
+56 + j*(224)
+201 + j*(26)
+47 + j*(-132)
+-82 + j*(-22)
+-1 + j*(52)
+16 + j*(-13)
+-42 + j*(16)
+16 + j*(66)
+49 + j*(-5)
+-40 + j*(-9)
+-18 + j*(112)
+144 + j*(107)
+204 + j*(-70)
+72 + j*(-212)
+-123 + j*(-176)
+-181 + j*(23)
+-6 + j*(134)
+121 + j*(-31)
+-50 + j*(-162)
+-195 + j*(7)
+-65 + j*(153)
+37 + j*(91)
+40 + j*(92)
+170 + j*(61)
+163 + j*(-193)
+-170 + j*(-240)
+-288 + j*(107)
+-1 + j*(282)
+185 + j*(114)
+162 + j*(-13)
+153 + j*(-107)
+-3 + j*(-224)
+-206 + j*(-63)
+-57 + j*(169)
+165 + j*(22)
+11 + j*(-170)
+-147 + j*(-13)
+1 + j*(107)
+85 + j*(-23)
+-13 + j*(-83)
+-57 + j*(-38)
+-77 + j*(-19)
+-95 + j*(47)
+-35 + j*(86)
+-41 + j*(71)
+-32 + j*(205)
+263 + j*(254)
+446 + j*(-144)
+64 + j*(-469)
+-317 + j*(-196)
+-170 + j*(134)
+43 + j*(57)
+-21 + j*(-52)
+-77 + j*(8)
+-59 + j*(57)
+-23 + j*(123)
+140 + j*(134)
+221 + j*(-90)
+-5 + j*(-235)
+-171 + j*(-45)
+-26 + j*(109)
+98 + j*(6)
+53 + j*(-85)
+20 + j*(-107)
+-38 + j*(-162)
+-164 + j*(-141)
+-222 + j*(-29)
+-217 + j*(60)
+-197 + j*(170)
+-65 + j*(260)
+76 + j*(199)
+81 + j*(114)
+95 + j*(112)
+139 + j*(42)
+67 + j*(-21)
+35 + j*(58)
+151 + j*(43)
+117 + j*(-108)
+-39 + j*(-65)
+33 + j*(71)
+153 + j*(-46)
+3 + j*(-164)
+-120 + j*(-2)
+28 + j*(127)
+170 + j*(25)
+165 + j*(-112)
+88 + j*(-227)
+-107 + j*(-260)
+-238 + j*(-64)
+-82 + j*(87)
+16 + j*(-58)
+-175 + j*(-95)
+-187 + j*(146)
+65 + j*(148)
+33 + j*(-88)
+-204 + j*(-8)
+-112 + j*(245)
+112 + j*(188)
+80 + j*(72)
+94 + j*(163)
+308 + j*(91)
+301 + j*(-218)
+12 + j*(-330)
+-177 + j*(-164)
+-170 + j*(13)
+-62 + j*(122)
+107 + j*(92)
+132 + j*(-90)
+-40 + j*(-125)
+-41 + j*(42)
+165 + j*(-6)
+113 + j*(-285)
+-213 + j*(-308)
+-335 + j*(-26)
+-180 + j*(148)
+-30 + j*(113)
+8 + j*(11)
+-77 + j*(-79)
+-247 + j*(-12)
+-247 + j*(233)
+-6 + j*(336)
+141 + j*(191)
+93 + j*(113)
+146 + j*(161)
+292 + j*(35)
+192 + j*(-216)
+-88 + j*(-197)
+-121 + j*(41)
+64 + j*(60)
+31 + j*(-109)
+-173 + j*(-31)
+-81 + j*(224)
+200 + j*(147)
+132 + j*(-132)
+-136 + j*(-41)
+-18 + j*(240)
+288 + j*(127)
+226 + j*(-165)
+8 + j*(-162)
+-4 + j*(-52)
+6 + j*(-53)
+-10 + j*(20)
+144 + j*(53)
+215 + j*(-162)
+6 + j*(-276)
+-84 + j*(-134)
+16 + j*(-155)
+-129 + j*(-308)
+-391 + j*(-144)
+-329 + j*(155)
+-134 + j*(208)
+-63 + j*(195)
+69 + j*(210)
+174 + j*(31)
+-1 + j*(-110)
+-136 + j*(81)
+98 + j*(218)
+280 + j*(-43)
+37 + j*(-285)
+-244 + j*(-103)
+-130 + j*(182)
+132 + j*(116)
+78 + j*(-113)
+-134 + j*(-38)
+-12 + j*(190)
+277 + j*(32)
+137 + j*(-336)
+-269 + j*(-279)
+-306 + j*(73)
+-84 + j*(141)
+-79 + j*(33)
+-160 + j*(114)
+-60 + j*(229)
+64 + j*(197)
+116 + j*(135)
+141 + j*(62)
+92 + j*(-4)
+40 + j*(38)
+105 + j*(69)
+138 + j*(-11)
+86 + j*(-39)
+103 + j*(-30)
+90 + j*(-114)
+-45 + j*(-99)
+-21 + j*(61)
+155 + j*(28)
+143 + j*(-152)
+14 + j*(-182)
+-38 + j*(-177)
+-177 + j*(-168)
+-257 + j*(71)
+22 + j*(226)
+203 + j*(-59)
+-80 + j*(-229)
+-218 + j*(40)
+30 + j*(115)
+11 + j*(-123)
+-260 + j*(-18)
+-127 + j*(306)
+204 + j*(222)
+184 + j*(-29)
+74 + j*(-21)
+145 + j*(-28)
+97 + j*(-173)
+-65 + j*(-141)
+-32 + j*(-24)
+42 + j*(-103)
+-76 + j*(-190)
+-200 + j*(-114)
+-247 + j*(-19)
+-295 + j*(141)
+-132 + j*(388)
+254 + j*(333)
+330 + j*(-62)
+25 + j*(-201)
+-71 + j*(1)
+73 + j*(-6)
+-41 + j*(-155)
+-235 + j*(30)
+-35 + j*(269)
+218 + j*(110)
+127 + j*(-100)
+16 + j*(-71)
+24 + j*(-86)
+-116 + j*(-117)
+-199 + j*(104)
+41 + j*(250)
+223 + j*(57)
+123 + j*(-101)
+54 + j*(-88)
+33 + j*(-143)
+-110 + j*(-144)
+-150 + j*(2)
+-69 + j*(37)
+-112 + j*(37)
+-70 + j*(188)
+166 + j*(158)
+164 + j*(-104)
+-70 + j*(-116)
+-74 + j*(55)
+14 + j*(47)
+-10 + j*(61)
+119 + j*(114)
+215 + j*(-118)
+-82 + j*(-257)
+-247 + j*(54)
+39 + j*(202)
+122 + j*(-38)
+-81 + j*(-23)
+25 + j*(167)
+210 + j*(18)
+73 + j*(-124)
+33 + j*(-14)
+141 + j*(-105)
+-53 + j*(-239)
+-199 + j*(8)
+69 + j*(123)
+135 + j*(-160)
+-154 + j*(-180)
+-127 + j*(86)
+100 + j*(2)
+-37 + j*(-207)
+-245 + j*(-57)
+-139 + j*(126)
+-26 + j*(81)
+-37 + j*(59)
+4 + j*(56)
+-21 + j*(-15)
+-119 + j*(55)
+-18 + j*(194)
+148 + j*(102)
+82 + j*(-47)
+-7 + j*(17)
+97 + j*(55)
+132 + j*(-103)
+-51 + j*(-179)
+-177 + j*(-28)
+-92 + j*(119)
+30 + j*(105)
+57 + j*(37)
+43 + j*(4)
+25 + j*(-22)
+-23 + j*(-17)
+-28 + j*(54)
+62 + j*(68)
+92 + j*(-38)
+-19 + j*(-83)
+-71 + j*(21)
+14 + j*(81)
+79 + j*(25)
+70 + j*(-34)
+31 + j*(-78)
+-53 + j*(-79)
+-98 + j*(21)
+-20 + j*(96)
+56 + j*(66)
+81 + j*(31)
+117 + j*(-33)
+43 + j*(-134)
+-94 + j*(-61)
+-4 + j*(74)
+112 + j*(-68)
+-100 + j*(-173)
+-209 + j*(107)
+116 + j*(230)
+250 + j*(-109)
+-65 + j*(-243)
+-179 + j*(18)
+12 + j*(88)
+21 + j*(-33)
+-46 + j*(14)
+36 + j*(38)
+23 + j*(-49)
+-44 + j*(4)
+50 + j*(33)
+29 + j*(-98)
+-134 + j*(-14)
+22 + j*(192)
+293 + j*(-10)
+109 + j*(-337)
+-204 + j*(-235)
+-176 + j*(-43)
+-158 + j*(-93)
+-324 + j*(-2)
+-251 + j*(276)
+33 + j*(293)
+100 + j*(108)
+23 + j*(74)
+47 + j*(98)
+50 + j*(59)
+31 + j*(103)
+155 + j*(132)
+241 + j*(-50)
+63 + j*(-202)
+-117 + j*(-78)
+-51 + j*(88)
+74 + j*(75)
+110 + j*(15)
+144 + j*(-58)
+79 + j*(-200)
+-139 + j*(-191)
+-190 + j*(33)
+-8 + j*(96)
+7 + j*(-53)
+-159 + j*(1)
+-78 + j*(213)
+152 + j*(168)
+161 + j*(-13)
+86 + j*(-45)
+86 + j*(-71)
+-5 + j*(-117)
+-72 + j*(0)
+64 + j*(57)
+101 + j*(-98)
+-54 + j*(-114)
+-33 + j*(19)
+74 + j*(-61)
+-57 + j*(-158)
+-146 + j*(-16)
+-35 + j*(30)
+-71 + j*(-45)
+-130 + j*(91)
+86 + j*(144)
+123 + j*(-132)
+-199 + j*(-146)
+-197 + j*(214)
+173 + j*(206)
+166 + j*(-143)
+-147 + j*(-138)
+-156 + j*(122)
+28 + j*(158)
+74 + j*(79)
+92 + j*(67)
+139 + j*(16)
+139 + j*(-55)
+127 + j*(-139)
+9 + j*(-258)
+-230 + j*(-187)
+-246 + j*(93)
+-12 + j*(165)
+50 + j*(8)
+-50 + j*(1)
+4 + j*(67)
+45 + j*(-31)
+-97 + j*(-49)
+-100 + j*(129)
+100 + j*(128)
+93 + j*(-74)
+-117 + j*(-50)
+-92 + j*(185)
+175 + j*(204)
+278 + j*(-47)
+117 + j*(-231)
+-79 + j*(-203)
+-175 + j*(-86)
+-193 + j*(62)
+-84 + j*(206)
+129 + j*(198)
+231 + j*(-6)
+102 + j*(-179)
+-88 + j*(-148)
+-156 + j*(2)
+-88 + j*(147)
+98 + j*(192)
+267 + j*(23)
+168 + j*(-235)
+-110 + j*(-236)
+-180 + j*(1)
+-2 + j*(80)
+46 + j*(-66)
+-109 + j*(-97)
+-160 + j*(77)
+1 + j*(176)
+139 + j*(74)
+117 + j*(-64)
+33 + j*(-117)
+-59 + j*(-117)
+-161 + j*(-37)
+-133 + j*(150)
+104 + j*(219)
+291 + j*(-16)
+139 + j*(-310)
+-199 + j*(-314)
+-378 + j*(-46)
+-284 + j*(239)
+-25 + j*(341)
+194 + j*(214)
+214 + j*(10)
+110 + j*(-87)
+23 + j*(-93)
+-47 + j*(-53)
+-41 + j*(39)
+58 + j*(28)
+17 + j*(-89)
+-136 + j*(-11)
+-37 + j*(188)
+182 + j*(91)
+91 + j*(-105)
+-46 + j*(6)
+108 + j*(94)
+180 + j*(-86)
+37 + j*(-130)
+85 + j*(-60)
+135 + j*(-260)
+-185 + j*(-387)
+-421 + j*(-73)
+-231 + j*(197)
+-42 + j*(148)
+-9 + j*(95)
+47 + j*(28)
+-54 + j*(-99)
+-247 + j*(40)
+-104 + j*(290)
+146 + j*(186)
+71 + j*(12)
+3 + j*(115)
+165 + j*(115)
+146 + j*(-84)
+-47 + j*(-49)
+16 + j*(131)
+212 + j*(54)
+180 + j*(-160)
+-13 + j*(-214)
+-140 + j*(-92)
+-93 + j*(52)
+25 + j*(36)
+-27 + j*(-58)
+-121 + j*(58)
+49 + j*(178)
+180 + j*(-21)
+-45 + j*(-127)
+-101 + j*(151)
+255 + j*(185)
+320 + j*(-228)
+-79 + j*(-355)
+-247 + j*(-40)
+-45 + j*(126)
+95 + j*(31)
+101 + j*(-80)
+32 + j*(-185)
+-139 + j*(-178)
+-192 + j*(-7)
+-73 + j*(47)
+-81 + j*(-33)
+-180 + j*(51)
+-69 + j*(201)
+110 + j*(124)
+83 + j*(-42)
+-50 + j*(-42)
+-71 + j*(80)
+69 + j*(144)
+213 + j*(-8)
+88 + j*(-250)
+-221 + j*(-203)
+-274 + j*(106)
+-42 + j*(234)
+100 + j*(119)
+87 + j*(26)
+66 + j*(-14)
+21 + j*(-45)
+-20 + j*(-9)
+13 + j*(8)
+4 + j*(-40)
+-59 + j*(-20)
+-49 + j*(38)
+-25 + j*(42)
+-22 + j*(71)
+52 + j*(76)
+53 + j*(-28)
+-86 + j*(-1)
+-26 + j*(194)
+226 + j*(132)
+187 + j*(-146)
+-77 + j*(-126)
+-53 + j*(110)
+164 + j*(88)
+166 + j*(-105)
+30 + j*(-148)
+-29 + j*(-98)
+-57 + j*(-61)
+-66 + j*(14)
+28 + j*(76)
+149 + j*(-6)
+115 + j*(-182)
+-88 + j*(-221)
+-185 + j*(-33)
+-21 + j*(79)
+82 + j*(-96)
+-125 + j*(-214)
+-287 + j*(-10)
+-146 + j*(173)
+-12 + j*(116)
+-25 + j*(76)
+11 + j*(93)
+31 + j*(28)
+-45 + j*(43)
+14 + j*(156)
+173 + j*(86)
+139 + j*(-89)
+6 + j*(-100)
+-23 + j*(-38)
+-27 + j*(-8)
+13 + j*(44)
+117 + j*(-16)
+51 + j*(-180)
+-146 + j*(-136)
+-134 + j*(37)
+-23 + j*(21)
+-78 + j*(-34)
+-112 + j*(47)
+-48 + j*(56)
+-108 + j*(28)
+-144 + j*(182)
+54 + j*(279)
+195 + j*(128)
+129 + j*(27)
+136 + j*(62)
+218 + j*(-19)
+161 + j*(-156)
+49 + j*(-178)
+-12 + j*(-179)
+-121 + j*(-172)
+-220 + j*(-45)
+-171 + j*(123)
+-26 + j*(193)
+110 + j*(132)
+129 + j*(3)
+39 + j*(-29)
+65 + j*(55)
+211 + j*(-35)
+109 + j*(-274)
+-185 + j*(-220)
+-183 + j*(54)
+26 + j*(59)
+-7 + j*(-98)
+-143 + j*(-27)
+-61 + j*(94)
+26 + j*(10)
+-83 + j*(-47)
+-158 + j*(103)
+-2 + j*(258)
+251 + j*(173)
+300 + j*(-131)
+28 + j*(-305)
+-199 + j*(-117)
+-73 + j*(78)
+47 + j*(-50)
+-134 + j*(-120)
+-199 + j*(110)
+38 + j*(192)
+126 + j*(-15)
+-35 + j*(-98)
+-124 + j*(2)
+-126 + j*(100)
+-49 + j*(239)
+209 + j*(235)
+294 + j*(-68)
+13 + j*(-176)
+-31 + j*(79)
+262 + j*(23)
+144 + j*(-357)
+-298 + j*(-252)
+-250 + j*(172)
+72 + j*(168)
+68 + j*(1)
+73 + j*(57)
+232 + j*(-107)
+-36 + j*(-400)
+-446 + j*(-110)
+-196 + j*(342)
+204 + j*(129)
+-45 + j*(-166)
+-267 + j*(185)
+194 + j*(424)
+521 + j*(-70)
+105 + j*(-478)
+-304 + j*(-208)
+-165 + j*(102)
+0 + j*(15)
+-111 + j*(-33)
+-99 + j*(129)
+104 + j*(97)
+68 + j*(-135)
+-190 + j*(-107)
+-194 + j*(148)
+14 + j*(179)
+18 + j*(48)
+-71 + j*(122)
+74 + j*(238)
+245 + j*(97)
+179 + j*(-89)
+52 + j*(-107)
+-18 + j*(-81)
+-87 + j*(2)
+-12 + j*(144)
+167 + j*(89)
+122 + j*(-79)
+-1 + j*(-8)
+138 + j*(82)
+232 + j*(-118)
+33 + j*(-228)
+-41 + j*(-73)
+85 + j*(-91)
+-19 + j*(-235)
+-194 + j*(-97)
+-62 + j*(70)
+66 + j*(-56)
+-55 + j*(-144)
+-111 + j*(-49)
+-57 + j*(-36)
+-92 + j*(-65)
+-105 + j*(-19)
+-88 + j*(-44)
+-190 + j*(-34)
+-196 + j*(132)
+-33 + j*(165)
+-22 + j*(61)
+-68 + j*(141)
+124 + j*(167)
+168 + j*(-108)
+-149 + j*(-180)
+-244 + j*(127)
+-2 + j*(221)
+33 + j*(65)
+-71 + j*(139)
+95 + j*(257)
+263 + j*(78)
+151 + j*(-98)
+33 + j*(-74)
+5 + j*(-63)
+-97 + j*(-25)
+-93 + j*(167)
+140 + j*(245)
+302 + j*(45)
+200 + j*(-151)
+46 + j*(-136)
+48 + j*(-49)
+122 + j*(-85)
+79 + j*(-211)
+-98 + j*(-222)
+-182 + j*(-57)
+-70 + j*(57)
+24 + j*(-21)
+-59 + j*(-98)
+-161 + j*(4)
+-69 + j*(160)
+134 + j*(116)
+154 + j*(-108)
+-57 + j*(-182)
+-161 + j*(-10)
+-42 + j*(93)
+23 + j*(33)
+18 + j*(42)
+133 + j*(21)
+133 + j*(-211)
+-172 + j*(-284)
+-332 + j*(1)
+-152 + j*(195)
+-28 + j*(141)
+-17 + j*(161)
+130 + j*(177)
+220 + j*(-8)
+100 + j*(-139)
+10 + j*(-124)
+-48 + j*(-148)
+-190 + j*(-85)
+-171 + j*(121)
+27 + j*(141)
+56 + j*(-9)
+-40 + j*(-22)
+-37 + j*(16)
+-66 + j*(1)
+-113 + j*(91)
+0 + j*(174)
+98 + j*(89)
+57 + j*(23)
+44 + j*(35)
+30 + j*(5)
+-23 + j*(73)
+120 + j*(161)
+271 + j*(-38)
+64 + j*(-243)
+-151 + j*(-73)
+-24 + j*(100)
+72 + j*(12)
+13 + j*(2)
+74 + j*(50)
+113 + j*(-50)
+20 + j*(-53)
+93 + j*(24)
+184 + j*(-129)
+-1 + j*(-242)
+-82 + j*(-81)
+67 + j*(-92)
+-29 + j*(-284)
+-260 + j*(-185)
+-206 + j*(-7)
+-161 + j*(-64)
+-305 + j*(-4)
+-243 + j*(209)
+-74 + j*(191)
+-119 + j*(148)
+-81 + j*(298)
+144 + j*(272)
+154 + j*(89)
+76 + j*(119)
+211 + j*(135)
+238 + j*(-69)
+45 + j*(-116)
+28 + j*(28)
+146 + j*(1)
+110 + j*(-107)
+45 + j*(-105)
+16 + j*(-117)
+-69 + j*(-81)
+-28 + j*(48)
+132 + j*(-17)
+42 + j*(-207)
+-167 + j*(-116)
+-84 + j*(81)
+78 + j*(-4)
+-19 + j*(-136)
+-136 + j*(-39)
+-55 + j*(69)
+43 + j*(12)
+22 + j*(-86)
+-69 + j*(-117)
+-155 + j*(-61)
+-162 + j*(35)
+-115 + j*(83)
+-90 + j*(102)
+-52 + j*(128)
+-16 + j*(120)
+-25 + j*(138)
+55 + j*(226)
+257 + j*(161)
+288 + j*(-102)
+76 + j*(-227)
+-66 + j*(-138)
+-85 + j*(-68)
+-132 + j*(-14)
+-106 + j*(112)
+21 + j*(136)
+40 + j*(70)
+32 + j*(154)
+274 + j*(192)
+470 + j*(-161)
+147 + j*(-558)
+-358 + j*(-407)
+-404 + j*(30)
+-165 + j*(161)
+-110 + j*(119)
+-52 + j*(228)
+209 + j*(174)
+204 + j*(-175)
+-187 + j*(-217)
+-269 + j*(175)
+78 + j*(296)
+209 + j*(49)
+89 + j*(-22)
+134 + j*(-6)
+108 + j*(-174)
+-145 + j*(-147)
+-117 + j*(135)
+160 + j*(94)
+94 + j*(-165)
+-141 + j*(-80)
+-43 + j*(127)
+132 + j*(31)
+54 + j*(-102)
+-30 + j*(-47)
+19 + j*(-6)
+48 + j*(-57)
+17 + j*(-117)
+-84 + j*(-141)
+-181 + j*(-30)
+-98 + j*(112)
+36 + j*(63)
+11 + j*(-26)
+-16 + j*(-16)
+-29 + j*(-71)
+-196 + j*(-40)
+-182 + j*(252)
+190 + j*(307)
+325 + j*(-54)
+77 + j*(-206)
+13 + j*(-109)
+13 + j*(-216)
+-254 + j*(-208)
+-281 + j*(120)
+9 + j*(128)
+-92 + j*(-108)
+-335 + j*(128)
+-39 + j*(413)
+235 + j*(158)
+40 + j*(-4)
+47 + j*(185)
+272 + j*(43)
+58 + j*(-199)
+-151 + j*(68)
+185 + j*(223)
+320 + j*(-168)
+-80 + j*(-320)
+-244 + j*(13)
+-34 + j*(158)
+46 + j*(89)
+90 + j*(115)
+222 + j*(21)
+141 + j*(-165)
+-11 + j*(-110)
+69 + j*(-47)
+57 + j*(-207)
+-177 + j*(-183)
+-182 + j*(69)
+19 + j*(83)
+4 + j*(-45)
+-62 + j*(29)
+73 + j*(46)
+56 + j*(-146)
+-194 + j*(-108)
+-160 + j*(185)
+148 + j*(170)
+151 + j*(-126)
+-126 + j*(-132)
+-126 + j*(131)
+123 + j*(138)
+142 + j*(-78)
+-23 + j*(-88)
+12 + j*(37)
+146 + j*(-54)
+37 + j*(-241)
+-188 + j*(-173)
+-185 + j*(35)
+-38 + j*(55)
+-45 + j*(-38)
+-124 + j*(16)
+-33 + j*(112)
+83 + j*(-2)
+-41 + j*(-153)
+-229 + j*(-45)
+-171 + j*(152)
+-30 + j*(144)
+-42 + j*(91)
+-32 + j*(158)
+83 + j*(134)
+56 + j*(16)
+-47 + j*(80)
+69 + j*(199)
+236 + j*(71)
+161 + j*(-123)
+-4 + j*(-136)
+-93 + j*(-64)
+-148 + j*(62)
+-47 + j*(245)
+218 + j*(224)
+298 + j*(-30)
+145 + j*(-163)
+47 + j*(-138)
+-21 + j*(-137)
+-120 + j*(-38)
+-23 + j*(128)
+176 + j*(43)
+117 + j*(-156)
+-56 + j*(-127)
+-53 + j*(-14)
+-11 + j*(-1)
+14 + j*(35)
+124 + j*(-1)
+84 + j*(-180)
+-141 + j*(-144)
+-107 + j*(107)
+157 + j*(79)
+155 + j*(-175)
+-37 + j*(-204)
+-59 + j*(-121)
+-61 + j*(-178)
+-214 + j*(-185)
+-306 + j*(-16)
+-241 + j*(144)
+-115 + j*(222)
+52 + j*(216)
+165 + j*(67)
+101 + j*(-112)
+-72 + j*(-145)
+-185 + j*(-23)
+-122 + j*(134)
+55 + j*(108)
+33 + j*(-105)
+-250 + j*(-77)
+-265 + j*(286)
+128 + j*(386)
+296 + j*(48)
+64 + j*(-122)
+-53 + j*(13)
+15 + j*(66)
+23 + j*(66)
+108 + j*(94)
+180 + j*(-81)
+-65 + j*(-205)
+-232 + j*(86)
+78 + j*(267)
+239 + j*(-42)
+-71 + j*(-153)
+-117 + j*(177)
+238 + j*(168)
+198 + j*(-204)
+-176 + j*(-141)
+-97 + j*(228)
+262 + j*(150)
+208 + j*(-185)
+-86 + j*(-157)
+-82 + j*(98)
+142 + j*(136)
+242 + j*(-37)
+164 + j*(-181)
+35 + j*(-193)
+2 + j*(-112)
+82 + j*(-119)
+57 + j*(-270)
+-162 + j*(-302)
+-274 + j*(-95)
+-132 + j*(29)
+-64 + j*(-79)
+-197 + j*(-99)
+-213 + j*(50)
+-98 + j*(53)
+-172 + j*(-28)
+-287 + j*(146)
+-75 + j*(344)
+168 + j*(168)
+29 + j*(-42)
+-130 + j*(121)
+88 + j*(276)
+290 + j*(46)
+116 + j*(-192)
+-108 + j*(-100)
+-81 + j*(66)
+20 + j*(63)
+8 + j*(11)
+-29 + j*(52)
+40 + j*(115)
+158 + j*(41)
+110 + j*(-136)
+-104 + j*(-132)
+-139 + j*(93)
+78 + j*(148)
+141 + j*(-59)
+-54 + j*(-121)
+-123 + j*(51)
+1 + j*(128)
+66 + j*(78)
+93 + j*(68)
+163 + j*(-1)
+104 + j*(-146)
+-76 + j*(-124)
+-93 + j*(61)
+79 + j*(119)
+188 + j*(-23)
+113 + j*(-179)
+-43 + j*(-187)
+-100 + j*(-78)
+-45 + j*(-51)
+-98 + j*(-113)
+-233 + j*(1)
+-123 + j*(232)
+156 + j*(174)
+148 + j*(-90)
+-66 + j*(-91)
+-35 + j*(91)
+155 + j*(33)
+121 + j*(-197)
+-119 + j*(-256)
+-310 + j*(-78)
+-269 + j*(197)
+3 + j*(300)
+182 + j*(91)
+19 + j*(-75)
+-105 + j*(106)
+130 + j*(225)
+284 + j*(-35)
+54 + j*(-224)
+-133 + j*(-47)
+-6 + j*(124)
+160 + j*(51)
+171 + j*(-109)
+57 + j*(-223)
+-130 + j*(-194)
+-180 + j*(4)
+-11 + j*(92)
+74 + j*(-50)
+-52 + j*(-118)
+-97 + j*(-11)
+-3 + j*(7)
+8 + j*(-91)
+-86 + j*(-139)
+-194 + j*(-109)
+-279 + j*(10)
+-231 + j*(179)
+-83 + j*(216)
+-47 + j*(160)
+-45 + j*(217)
+106 + j*(235)
+167 + j*(57)
+-2 + j*(1)
+-26 + j*(185)
+186 + j*(215)
+257 + j*(21)
+141 + j*(-59)
+119 + j*(-13)
+165 + j*(-59)
+110 + j*(-144)
+8 + j*(-139)
+-33 + j*(-65)
+11 + j*(-12)
+63 + j*(-57)
+-11 + j*(-122)
+-100 + j*(-14)
+40 + j*(100)
+182 + j*(-69)
+-8 + j*(-233)
+-179 + j*(-41)
+19 + j*(117)
+161 + j*(-88)
+-35 + j*(-218)
+-136 + j*(-60)
+-17 + j*(-28)
+-75 + j*(-149)
+-241 + j*(-43)
+-153 + j*(168)
+45 + j*(142)
+80 + j*(20)
+69 + j*(-28)
+76 + j*(-134)
+-96 + j*(-247)
+-325 + j*(-105)
+-283 + j*(164)
+-85 + j*(204)
+-66 + j*(121)
+-98 + j*(215)
+92 + j*(301)
+265 + j*(112)
+143 + j*(-83)
+3 + j*(-4)
+103 + j*(76)
+180 + j*(-63)
+59 + j*(-177)
+-62 + j*(-136)
+-111 + j*(-74)
+-144 + j*(11)
+-81 + j*(103)
+1 + j*(78)
+-28 + j*(57)
+13 + j*(127)
+128 + j*(42)
+-3 + j*(-99)
+-172 + j*(89)
+55 + j*(308)
+307 + j*(102)
+168 + j*(-109)
+77 + j*(-8)
+207 + j*(-42)
+105 + j*(-216)
+-57 + j*(-90)
+122 + j*(7)
+168 + j*(-257)
+-159 + j*(-298)
+-193 + j*(23)
+97 + j*(0)
+6 + j*(-298)
+-320 + j*(-202)
+-291 + j*(93)
+-113 + j*(110)
+-132 + j*(59)
+-149 + j*(163)
+-18 + j*(245)
+150 + j*(180)
+192 + j*(-21)
+-12 + j*(-139)
+-167 + j*(93)
+133 + j*(296)
+422 + j*(-64)
+78 + j*(-441)
+-328 + j*(-182)
+-164 + j*(155)
+32 + j*(40)
+-94 + j*(-28)
+-88 + j*(132)
+64 + j*(98)
+8 + j*(21)
+30 + j*(139)
+245 + j*(49)
+146 + j*(-260)
+-206 + j*(-195)
+-180 + j*(150)
+134 + j*(155)
+177 + j*(-130)
+-66 + j*(-232)
+-235 + j*(-58)
+-152 + j*(147)
+47 + j*(132)
+57 + j*(-49)
+-119 + j*(-60)
+-140 + j*(104)
+-33 + j*(127)
+-69 + j*(110)
+-46 + j*(278)
+240 + j*(312)
+383 + j*(20)
+192 + j*(-167)
+70 + j*(-82)
+132 + j*(-64)
+102 + j*(-156)
+2 + j*(-146)
+-12 + j*(-86)
+6 + j*(-78)
+10 + j*(-89)
+1 + j*(-121)
+-66 + j*(-136)
+-112 + j*(-70)
+-74 + j*(-28)
+-65 + j*(-53)
+-93 + j*(-38)
+-75 + j*(-33)
+-134 + j*(-76)
+-257 + j*(40)
+-152 + j*(264)
+122 + j*(228)
+159 + j*(-25)
+-31 + j*(-98)
+-112 + j*(28)
+-53 + j*(109)
+6 + j*(115)
+55 + j*(113)
+119 + j*(81)
+160 + j*(-12)
+98 + j*(-134)
+-69 + j*(-132)
+-108 + j*(42)
+71 + j*(84)
+102 + j*(-123)
+-149 + j*(-164)
+-233 + j*(99)
+-30 + j*(226)
+82 + j*(144)
+124 + j*(140)
+285 + j*(53)
+253 + j*(-241)
+-65 + j*(-312)
+-187 + j*(-81)
+-78 + j*(-13)
+-146 + j*(-58)
+-225 + j*(144)
+30 + j*(315)
+274 + j*(113)
+185 + j*(-124)
+39 + j*(-122)
+31 + j*(-100)
+-21 + j*(-143)
+-119 + j*(-92)
+-108 + j*(5)
+-59 + j*(8)
+-90 + j*(-4)
+-119 + j*(73)
+-38 + j*(153)
+69 + j*(119)
+79 + j*(35)
+44 + j*(34)
+98 + j*(56)
+162 + j*(-49)
+58 + j*(-182)
+-121 + j*(-129)
+-134 + j*(50)
+6 + j*(117)
+101 + j*(33)
+76 + j*(-61)
+10 + j*(-74)
+-4 + j*(-46)
+1 + j*(-69)
+-63 + j*(-79)
+-99 + j*(14)
+19 + j*(67)
+86 + j*(-82)
+-101 + j*(-184)
+-262 + j*(23)
+-74 + j*(246)
+199 + j*(108)
+130 + j*(-200)
+-197 + j*(-220)
+-322 + j*(87)
+-86 + j*(292)
+134 + j*(148)
+47 + j*(-25)
+-66 + j*(71)
+64 + j*(151)
+130 + j*(-6)
+-42 + j*(-47)
+-55 + j*(150)
+165 + j*(156)
+183 + j*(-57)
+16 + j*(-71)
+38 + j*(48)
+134 + j*(-11)
+57 + j*(-99)
+-16 + j*(-20)
+64 + j*(59)
+183 + j*(12)
+243 + j*(-139)
+146 + j*(-344)
+-136 + j*(-390)
+-310 + j*(-160)
+-190 + j*(20)
+-101 + j*(-61)
+-244 + j*(-89)
+-314 + j*(119)
+-135 + j*(274)
+37 + j*(193)
+9 + j*(93)
+-30 + j*(167)
+136 + j*(244)
+330 + j*(52)
+206 + j*(-245)
+-100 + j*(-232)
+-156 + j*(-1)
+-20 + j*(57)
+-2 + j*(-8)
+-21 + j*(8)
+9 + j*(-23)
+-84 + j*(-71)
+-172 + j*(70)
+-40 + j*(197)
+71 + j*(134)
+69 + j*(122)
+204 + j*(131)
+289 + j*(-105)
+48 + j*(-267)
+-117 + j*(-80)
+29 + j*(9)
+35 + j*(-146)
+-147 + j*(-115)
+-127 + j*(57)
+-21 + j*(53)
+-33 + j*(38)
+35 + j*(74)
+91 + j*(-54)
+-83 + j*(-115)
+-143 + j*(86)
+59 + j*(139)
+90 + j*(-30)
+-27 + j*(-8)
+72 + j*(67)
+134 + j*(-110)
+-86 + j*(-178)
+-147 + j*(43)
+63 + j*(65)
+36 + j*(-163)
+-241 + j*(-127)
+-261 + j*(175)
+-10 + j*(271)
+105 + j*(127)
+33 + j*(82)
+76 + j*(185)
+282 + j*(139)
+342 + j*(-134)
+117 + j*(-313)
+-91 + j*(-217)
+-93 + j*(-85)
+-62 + j*(-66)
+-66 + j*(-48)
+-45 + j*(-54)
+-103 + j*(-93)
+-198 + j*(10)
+-96 + j*(158)
+62 + j*(83)
+-5 + j*(-36)
+-83 + j*(56)
+40 + j*(118)
+115 + j*(-21)
+-5 + j*(-117)
+-124 + j*(-46)
+-124 + j*(76)
+-24 + j*(152)
+101 + j*(85)
+59 + j*(-54)
+-82 + j*(-16)
+-40 + j*(128)
+96 + j*(98)
+89 + j*(8)
+78 + j*(14)
+117 + j*(-49)
+11 + j*(-134)
+-95 + j*(-16)
+24 + j*(91)
+124 + j*(-26)
+34 + j*(-121)
+-38 + j*(-86)
+-65 + j*(-70)
+-132 + j*(-6)
+-73 + j*(136)
+105 + j*(129)
+165 + j*(-20)
+114 + j*(-127)
+27 + j*(-206)
+-149 + j*(-214)
+-279 + j*(-35)
+-199 + j*(165)
+-30 + j*(222)
+127 + j*(180)
+237 + j*(3)
+117 + j*(-216)
+-130 + j*(-172)
+-134 + j*(24)
+-23 + j*(24)
+-66 + j*(-16)
+-55 + j*(66)
+30 + j*(5)
+-110 + j*(-68)
+-191 + j*(171)
+123 + j*(295)
+298 + j*(-30)
+11 + j*(-223)
+-153 + j*(-2)
+4 + j*(105)
+43 + j*(1)
+-23 + j*(31)
+62 + j*(81)
+114 + j*(-18)
+42 + j*(-70)
+21 + j*(-55)
+-17 + j*(-88)
+-118 + j*(-25)
+-51 + j*(135)
+152 + j*(98)
+173 + j*(-116)
+-1 + j*(-206)
+-134 + j*(-121)
+-135 + j*(-4)
+-72 + j*(30)
+-74 + j*(0)
+-143 + j*(57)
+-77 + j*(211)
+144 + j*(200)
+202 + j*(-10)
+59 + j*(-81)
+58 + j*(10)
+178 + j*(-93)
+22 + j*(-322)
+-337 + j*(-206)
+-330 + j*(221)
+78 + j*(327)
+239 + j*(-14)
+-35 + j*(-155)
+-123 + j*(98)
+151 + j*(136)
+168 + j*(-165)
+-141 + j*(-185)
+-166 + j*(93)
+47 + j*(113)
+43 + j*(-6)
+30 + j*(49)
+165 + j*(-33)
+17 + j*(-255)
+-269 + j*(-81)
+-86 + j*(231)
+225 + j*(40)
+30 + j*(-259)
+-252 + j*(-91)
+-139 + j*(146)
+13 + j*(98)
+14 + j*(58)
+77 + j*(35)
+42 + j*(-102)
+-147 + j*(-42)
+-55 + j*(191)
+230 + j*(76)
+115 + j*(-262)
+-256 + j*(-185)
+-249 + j*(168)
+-23 + j*(28)
+142 + j*(89)
+243 + j*(-152)
+-11 + j*(-301)
+-160 + j*(-95)
+-9 + j*(-13)
+-18 + j*(-156)
+-180 + j*(-100)
+-137 + j*(49)
+-59 + j*(32)
+-93 + j*(57)
+9 + j*(139)
+139 + j*(30)
+85 + j*(-95)
+49 + j*(-113)
+-1 + j*(-236)
+-292 + j*(-232)
+-390 + j*(163)
+18 + j*(347)
+232 + j*(-16)
+-69 + j*(-199)
+-178 + j*(31)
+-9 + j*(29)
+-153 + j*(-123)
+-350 + j*(132)
+-78 + j*(395)
+177 + j*(175)
+-3 + j*(17)
+-54 + j*(233)
+233 + j*(250)
+274 + j*(-47)
+47 + j*(-99)
+62 + j*(39)
+161 + j*(-92)
+-80 + j*(-226)
+-301 + j*(77)
+-18 + j*(404)
+385 + j*(230)
+369 + j*(-156)
+106 + j*(-264)
+-22 + j*(-159)
+-18 + j*(-98)
+-25 + j*(-91)
+-62 + j*(-67)
+-71 + j*(3)
+14 + j*(64)
+128 + j*(-19)
+71 + j*(-185)
+-119 + j*(-175)
+-159 + j*(-13)
+-60 + j*(39)
+-55 + j*(-1)
+-75 + j*(60)
+33 + j*(105)
+115 + j*(1)
+66 + j*(-100)
+3 + j*(-122)
+-59 + j*(-150)
+-186 + j*(-126)
+-264 + j*(36)
+-168 + j*(209)
+22 + j*(231)
+126 + j*(107)
+83 + j*(4)
+36 + j*(27)
+107 + j*(28)
+112 + j*(-110)
+-60 + j*(-147)
+-120 + j*(21)
+26 + j*(76)
+58 + j*(-45)
+-23 + j*(-40)
+44 + j*(-8)
+48 + j*(-170)
+-195 + j*(-199)
+-287 + j*(54)
+-105 + j*(174)
+-40 + j*(91)
+-74 + j*(122)
+21 + j*(158)
+40 + j*(59)
+-60 + j*(115)
+76 + j*(275)
+334 + j*(137)
+289 + j*(-160)
+68 + j*(-228)
+-31 + j*(-156)
+-88 + j*(-124)
+-161 + j*(-33)
+-124 + j*(107)
+8 + j*(153)
+107 + j*(76)
+85 + j*(-28)
+-11 + j*(-13)
+36 + j*(100)
+209 + j*(28)
+150 + j*(-202)
+-91 + j*(-184)
+-93 + j*(16)
+47 + j*(-1)
+-6 + j*(-98)
+-74 + j*(-21)
+4 + j*(15)
+9 + j*(-45)
+-18 + j*(-18)
+45 + j*(-42)
+-28 + j*(-154)
+-188 + j*(-57)
+-95 + j*(119)
+54 + j*(37)
+-26 + j*(-59)
+-64 + j*(36)
+48 + j*(21)
+4 + j*(-108)
+-123 + j*(-68)
+-115 + j*(13)
+-122 + j*(18)
+-150 + j*(101)
+-64 + j*(182)
+11 + j*(168)
+74 + j*(197)
+255 + j*(128)
+258 + j*(-156)
+-20 + j*(-245)
+-132 + j*(-64)
+-83 + j*(-25)
+-188 + j*(30)
+-97 + j*(302)
+292 + j*(246)
+298 + j*(-159)
+-21 + j*(-179)
+32 + j*(19)
+153 + j*(-161)
+-119 + j*(-269)
+-227 + j*(11)
+1 + j*(71)
+-40 + j*(-97)
+-175 + j*(52)
+53 + j*(170)
+153 + j*(-105)
+-145 + j*(-195)
+-250 + j*(85)
+-49 + j*(207)
+48 + j*(129)
+69 + j*(92)
+109 + j*(19)
+41 + j*(-40)
+16 + j*(28)
+91 + j*(10)
+21 + j*(-59)
+-27 + j*(63)
+158 + j*(100)
+209 + j*(-114)
+35 + j*(-167)
+47 + j*(-66)
+111 + j*(-199)
+-112 + j*(-295)
+-257 + j*(-64)
+-81 + j*(86)
+22 + j*(-27)
+-33 + j*(-78)
+-40 + j*(-95)
+-135 + j*(-163)
+-308 + j*(-43)
+-243 + j*(182)
+-76 + j*(193)
+-74 + j*(161)
+-16 + j*(262)
+194 + j*(226)
+250 + j*(6)
+122 + j*(-113)
+16 + j*(-117)
+-87 + j*(-83)
+-140 + j*(62)
+-11 + j*(180)
+116 + j*(110)
+89 + j*(40)
+112 + j*(82)
+233 + j*(13)
+198 + j*(-182)
+-1 + j*(-221)
+-87 + j*(-75)
+7 + j*(4)
+69 + j*(-75)
+-1 + j*(-138)
+-55 + j*(-95)
+-35 + j*(-101)
+-127 + j*(-163)
+-291 + j*(-27)
+-199 + j*(238)
+83 + j*(233)
+132 + j*(16)
+-4 + j*(-6)
+42 + j*(98)
+173 + j*(21)
+136 + j*(-142)
+4 + j*(-189)
+-103 + j*(-150)
+-156 + j*(-56)
+-114 + j*(25)
+-72 + j*(-2)
+-146 + j*(-1)
+-158 + j*(125)
+-50 + j*(185)
+4 + j*(173)
+88 + j*(221)
+277 + j*(117)
+223 + j*(-158)
+-43 + j*(-142)
+3 + j*(74)
+201 + j*(-54)
+4 + j*(-277)
+-254 + j*(-63)
+-64 + j*(196)
+165 + j*(43)
+50 + j*(-132)
+-64 + j*(-62)
+-34 + j*(-21)
+-73 + j*(-23)
+-63 + j*(88)
+105 + j*(88)
+138 + j*(-120)
+-75 + j*(-207)
+-221 + j*(-44)
+-150 + j*(121)
+-31 + j*(136)
+4 + j*(95)
+-1 + j*(103)
+50 + j*(145)
+151 + j*(125)
+222 + j*(25)
+218 + j*(-111)
+110 + j*(-235)
+-87 + j*(-225)
+-169 + j*(-39)
+-33 + j*(73)
+58 + j*(-28)
+-32 + j*(-81)
+-56 + j*(-4)
+0 + j*(-13)
+-52 + j*(-40)
+-47 + j*(54)
+88 + j*(6)
+-13 + j*(-171)
+-248 + j*(-30)
+-103 + j*(257)
+195 + j*(141)
+110 + j*(-98)
+-19 + j*(-1)
+159 + j*(16)
+120 + j*(-291)
+-305 + j*(-276)
+-378 + j*(201)
+63 + j*(371)
+286 + j*(28)
+67 + j*(-182)
+-76 + j*(-67)
+-17 + j*(-21)
+-61 + j*(-85)
+-170 + j*(4)
+-101 + j*(160)
+56 + j*(147)
+92 + j*(47)
+78 + j*(16)
+103 + j*(-33)
+47 + j*(-131)
+-84 + j*(-116)
+-113 + j*(-16)
+-83 + j*(1)
+-139 + j*(10)
+-166 + j*(136)
+-43 + j*(240)
+93 + j*(202)
+138 + j*(125)
+150 + j*(73)
+153 + j*(25)
+153 + j*(-23)
+118 + j*(-97)
+-18 + j*(-105)
+-68 + j*(83)
+180 + j*(184)
+353 + j*(-104)
+77 + j*(-334)
+-151 + j*(-103)
+63 + j*(66)
+168 + j*(-168)
+-89 + j*(-233)
+-119 + j*(25)
+132 + j*(16)
+107 + j*(-228)
+-86 + j*(-214)
+-54 + j*(-138)
+-92 + j*(-265)
+-349 + j*(-207)
+-356 + j*(107)
+-93 + j*(160)
+-73 + j*(-28)
+-248 + j*(10)
+-212 + j*(209)
+-37 + j*(228)
+18 + j*(128)
+-33 + j*(85)
+-90 + j*(137)
+-46 + j*(281)
+199 + j*(336)
+417 + j*(77)
+261 + j*(-259)
+-77 + j*(-247)
+-156 + j*(1)
+-24 + j*(88)
+17 + j*(42)
+16 + j*(64)
+92 + j*(48)
+74 + j*(-57)
+-51 + j*(-31)
+-7 + j*(107)
+146 + j*(42)
+68 + j*(-126)
+-114 + j*(-33)
+-16 + j*(158)
+170 + j*(69)
+87 + j*(-78)
+-1 + j*(31)
+176 + j*(82)
+247 + j*(-149)
+19 + j*(-266)
+-98 + j*(-95)
+27 + j*(-35)
+33 + j*(-168)
+-127 + j*(-173)
+-180 + j*(-40)
+-136 + j*(45)
+-74 + j*(109)
+67 + j*(114)
+138 + j*(-57)
+-23 + j*(-173)
+-140 + j*(-45)
+-43 + j*(23)
+-66 + j*(-90)
+-259 + j*(13)
+-144 + j*(330)
+278 + j*(287)
+363 + j*(-161)
+-17 + j*(-372)
+-299 + j*(-127)
+-216 + j*(142)
+-33 + j*(185)
+62 + j*(124)
+99 + j*(53)
+91 + j*(-22)
+33 + j*(-68)
+-33 + j*(-50)
+-51 + j*(11)
+7 + j*(47)
+59 + j*(-15)
+-10 + j*(-90)
+-110 + j*(-23)
+-59 + j*(87)
+34 + j*(46)
+-17 + j*(-21)
+-74 + j*(53)
+9 + j*(121)
+81 + j*(61)
+57 + j*(22)
+82 + j*(31)
+119 + j*(-49)
+18 + j*(-129)
+-86 + j*(-42)
+-18 + j*(55)
+60 + j*(-11)
+-16 + j*(-70)
+-66 + j*(14)
+22 + j*(47)
+23 + j*(-51)
+-113 + j*(-11)
+-48 + j*(196)
+238 + j*(147)
+247 + j*(-192)
+-85 + j*(-257)
+-155 + j*(30)
+103 + j*(41)
+40 + j*(-253)
+-333 + j*(-172)
+-313 + j*(243)
+45 + j*(299)
+109 + j*(74)
+-7 + j*(95)
+122 + j*(183)
+224 + j*(11)
+69 + j*(-73)
+57 + j*(95)
+303 + j*(52)
+310 + j*(-268)
+7 + j*(-387)
+-173 + j*(-211)
+-130 + j*(-76)
+-92 + j*(-74)
+-115 + j*(-60)
+-124 + j*(-13)
+-91 + j*(41)
+-10 + j*(51)
+42 + j*(-41)
+-47 + j*(-139)
+-182 + j*(-78)
+-173 + j*(54)
+-92 + j*(66)
+-122 + j*(40)
+-153 + j*(150)
+-4 + j*(240)
+147 + j*(111)
+57 + j*(-50)
+-78 + j*(25)
+3 + j*(144)
+118 + j*(59)
+32 + j*(-44)
+-53 + j*(49)
+57 + j*(134)
+166 + j*(28)
+100 + j*(-100)
+-23 + j*(-94)
+-69 + j*(-5)
+-24 + j*(75)
+73 + j*(71)
+105 + j*(-28)
+19 + j*(-87)
+-48 + j*(-28)
+-14 + j*(33)
+34 + j*(14)
+28 + j*(-35)
+-40 + j*(-55)
+-118 + j*(28)
+-57 + j*(181)
+138 + j*(190)
+226 + j*(35)
+182 + j*(-69)
+153 + j*(-136)
+42 + j*(-231)
+-151 + j*(-138)
+-90 + j*(93)
+134 + j*(37)
+58 + j*(-165)
+-120 + j*(-41)
+66 + j*(122)
+249 + j*(-115)
+25 + j*(-331)
+-183 + j*(-188)
+-133 + j*(-76)
+-165 + j*(-93)
+-202 + j*(42)
+-27 + j*(93)
+-12 + j*(-100)
+-242 + j*(-66)
+-185 + j*(194)
+54 + j*(130)
+-50 + j*(-53)
+-193 + j*(125)
+37 + j*(274)
+191 + j*(54)
+31 + j*(-66)
+-7 + j*(38)
+71 + j*(-16)
+-44 + j*(-88)
+-101 + j*(44)
+20 + j*(53)
+-57 + j*(-65)
+-210 + j*(97)
+-16 + j*(304)
+215 + j*(141)
+97 + j*(-46)
+-6 + j*(60)
+120 + j*(99)
+136 + j*(-38)
+18 + j*(-38)
+42 + j*(48)
+107 + j*(1)
+57 + j*(-47)
+26 + j*(5)
+81 + j*(33)
+141 + j*(0)
+173 + j*(-95)
+95 + j*(-210)
+-70 + j*(-194)
+-105 + j*(-44)
+3 + j*(1)
+30 + j*(-78)
+-32 + j*(-98)
+-53 + j*(-66)
+-62 + j*(-49)
+-61 + j*(-18)
+-31 + j*(-13)
+-39 + j*(-23)
+-13 + j*(19)
+91 + j*(-51)
+-1 + j*(-260)
+-320 + j*(-216)
+-397 + j*(143)
+-115 + j*(337)
+115 + j*(214)
+139 + j*(40)
+49 + j*(-75)
+-118 + j*(-44)
+-129 + j*(173)
+124 + j*(238)
+250 + j*(3)
+105 + j*(-143)
+11 + j*(-124)
+-68 + j*(-156)
+-247 + j*(-36)
+-146 + j*(260)
+207 + j*(206)
+195 + j*(-151)
+-132 + j*(-167)
+-176 + j*(112)
+36 + j*(192)
+151 + j*(66)
+110 + j*(-78)
+-63 + j*(-106)
+-148 + j*(112)
+112 + j*(264)
+325 + j*(5)
+118 + j*(-218)
+-31 + j*(-66)
+116 + j*(-28)
+83 + j*(-211)
+-91 + j*(-182)
+-86 + j*(-112)
+-183 + j*(-161)
+-344 + j*(81)
+-52 + j*(357)
+272 + j*(78)
+11 + j*(-212)
+-203 + j*(57)
+82 + j*(208)
+194 + j*(-78)
+-54 + j*(-166)
+-121 + j*(7)
+-37 + j*(44)
+-34 + j*(38)
+3 + j*(48)
+-25 + j*(-1)
+-94 + j*(120)
+136 + j*(245)
+339 + j*(-54)
+30 + j*(-305)
+-209 + j*(-25)
+49 + j*(156)
+170 + j*(-87)
+-35 + j*(-169)
+-88 + j*(-43)
+-66 + j*(-39)
+-115 + j*(36)
+23 + j*(114)
+80 + j*(-83)
+-192 + j*(-81)
+-143 + j*(287)
+305 + j*(229)
+269 + j*(-241)
+-158 + j*(-226)
+-134 + j*(123)
+133 + j*(91)
+112 + j*(-100)
+21 + j*(-112)
+-12 + j*(-141)
+-151 + j*(-126)
+-176 + j*(70)
+25 + j*(135)
+128 + j*(-49)
+-12 + j*(-217)
+-269 + j*(-181)
+-410 + j*(129)
+-139 + j*(447)
+255 + j*(280)
+152 + j*(-53)
+-63 + j*(101)
+237 + j*(246)
+395 + j*(-192)
+-105 + j*(-402)
+-348 + j*(83)
+75 + j*(325)
+288 + j*(1)
+97 + j*(-154)
+42 + j*(-95)
+8 + j*(-169)
+-168 + j*(-93)
+-78 + j*(130)
+153 + j*(20)
+26 + j*(-214)
+-209 + j*(-102)
+-149 + j*(105)
+-20 + j*(105)
+6 + j*(71)
+43 + j*(59)
+47 + j*(8)
+25 + j*(18)
+91 + j*(8)
+78 + j*(-132)
+-117 + j*(-150)
+-182 + j*(47)
+-35 + j*(133)
+28 + j*(59)
+6 + j*(62)
+74 + j*(63)
+69 + j*(-37)
+-41 + j*(-14)
+18 + j*(109)
+173 + j*(21)
+81 + j*(-160)
+-103 + j*(-80)
+-34 + j*(78)
+88 + j*(11)
+18 + j*(-66)
+-6 + j*(19)
+110 + j*(-4)
+63 + j*(-157)
+-106 + j*(-113)
+-64 + j*(42)
+68 + j*(-10)
+10 + j*(-130)
+-93 + j*(-92)
+-92 + j*(-38)
+-109 + j*(-23)
+-107 + j*(44)
+-27 + j*(44)
+-62 + j*(-31)
+-153 + j*(49)
+-58 + j*(158)
+23 + j*(69)
+-84 + j*(64)
+-25 + j*(244)
+223 + j*(180)
+191 + j*(-71)
+10 + j*(-33)
+115 + j*(78)
+214 + j*(-107)
+6 + j*(-233)
+-123 + j*(-74)
+-34 + j*(-1)
+-45 + j*(-49)
+-81 + j*(33)
+39 + j*(55)
+24 + j*(-92)
+-163 + j*(-40)
+-100 + j*(196)
+172 + j*(156)
+171 + j*(-119)
+-78 + j*(-161)
+-156 + j*(51)
+6 + j*(148)
+101 + j*(45)
+38 + j*(-13)
+35 + j*(58)
+165 + j*(34)
+175 + j*(-161)
+-36 + j*(-250)
+-189 + j*(-88)
+-101 + j*(69)
+21 + j*(22)
+-23 + j*(-78)
+-138 + j*(-33)
+-126 + j*(103)
+-8 + j*(134)
+12 + j*(66)
+-43 + j*(127)
+112 + j*(260)
+383 + j*(100)
+330 + j*(-258)
+23 + j*(-337)
+-91 + j*(-199)
+-110 + j*(-185)
+-264 + j*(-117)
+-245 + j*(149)
+30 + j*(205)
+112 + j*(-11)
+-33 + j*(-68)
+-39 + j*(21)
+15 + j*(-33)
+-98 + j*(-83)
+-180 + j*(64)
+-58 + j*(203)
+113 + j*(162)
+166 + j*(11)
+74 + j*(-98)
+-35 + j*(-45)
+30 + j*(42)
+125 + j*(-70)
+-13 + j*(-211)
+-194 + j*(-110)
+-166 + j*(54)
+-81 + j*(71)
+-74 + j*(62)
+-68 + j*(71)
+-101 + j*(92)
+-91 + j*(233)
+141 + j*(305)
+310 + j*(66)
+131 + j*(-126)
+1 + j*(6)
+140 + j*(49)
+129 + j*(-116)
+-45 + j*(-67)
+49 + j*(110)
+257 + j*(-18)
+165 + j*(-269)
+-75 + j*(-278)
+-187 + j*(-138)
+-194 + j*(9)
+-90 + j*(130)
+77 + j*(91)
+92 + j*(-62)
+-18 + j*(-95)
+-43 + j*(-37)
+-19 + j*(-49)
+-71 + j*(-74)
+-126 + j*(-21)
+-115 + j*(54)
+-66 + j*(91)
+-29 + j*(91)
+-13 + j*(107)
+62 + j*(142)
+178 + j*(54)
+115 + j*(-120)
+-73 + j*(-76)
+-18 + j*(118)
+209 + j*(47)
+165 + j*(-208)
+-64 + j*(-236)
+-146 + j*(-114)
+-171 + j*(-52)
+-197 + j*(86)
+-19 + j*(215)
+181 + j*(56)
+65 + j*(-170)
+-143 + j*(-106)
+-127 + j*(49)
+-51 + j*(53)
+-61 + j*(43)
+-43 + j*(68)
+-45 + j*(40)
+-124 + j*(97)
+-59 + j*(291)
+234 + j*(317)
+419 + j*(34)
+269 + j*(-258)
+0 + j*(-274)
+-101 + j*(-117)
+-46 + j*(-37)
+-21 + j*(-72)
+-90 + j*(-83)
+-137 + j*(1)
+-93 + j*(83)
+-21 + j*(95)
+9 + j*(76)
+27 + j*(77)
+75 + j*(76)
+117 + j*(24)
+112 + j*(-40)
+88 + j*(-76)
+69 + j*(-136)
+-57 + j*(-201)
+-231 + j*(-71)
+-143 + j*(190)
+165 + j*(153)
+162 + j*(-180)
+-190 + j*(-209)
+-260 + j*(144)
+57 + j*(249)
+159 + j*(-2)
+-35 + j*(-54)
+-25 + j*(131)
+188 + j*(100)
+193 + j*(-130)
+9 + j*(-199)
+-107 + j*(-110)
+-122 + j*(3)
+-39 + j*(104)
+126 + j*(49)
+95 + j*(-164)
+-158 + j*(-164)
+-190 + j*(103)
+61 + j*(153)
+91 + j*(-58)
+-81 + j*(-35)
+20 + j*(119)
+177 + j*(-62)
+-69 + j*(-240)
+-276 + j*(49)
+34 + j*(281)
+285 + j*(-22)
+19 + j*(-272)
+-194 + j*(-66)
+-27 + j*(69)
+28 + j*(-104)
+-188 + j*(-129)
+-248 + j*(105)
+-57 + j*(221)
+81 + j*(108)
+33 + j*(-18)
+-84 + j*(-7)
+-110 + j*(110)
+-21 + j*(176)
+41 + j*(153)
+64 + j*(177)
+202 + j*(193)
+331 + j*(9)
+216 + j*(-207)
+10 + j*(-214)
+-82 + j*(-117)
+-124 + j*(-12)
+-60 + j*(143)
+165 + j*(153)
+257 + j*(-86)
+69 + j*(-237)
+-88 + j*(-146)
+-94 + j*(-47)
+-86 + j*(23)
+16 + j*(106)
+173 + j*(-12)
+57 + j*(-231)
+-211 + j*(-134)
+-149 + j*(158)
+141 + j*(144)
+181 + j*(-113)
+-13 + j*(-198)
+-105 + j*(-86)
+-56 + j*(-25)
+-36 + j*(-57)
+-80 + j*(-63)
+-96 + j*(-18)
+-71 + j*(-6)
+-88 + j*(-24)
+-124 + j*(11)
+-108 + j*(51)
+-127 + j*(59)
+-153 + j*(185)
+56 + j*(325)
+334 + j*(108)
+181 + j*(-267)
+-224 + j*(-204)
+-241 + j*(168)
+48 + j*(234)
+113 + j*(47)
+2 + j*(36)
+62 + j*(136)
+213 + j*(46)
+154 + j*(-175)
+-127 + j*(-190)
+-233 + j*(129)
+107 + j*(342)
+432 + j*(21)
+193 + j*(-389)
+-214 + j*(-258)
+-167 + j*(44)
+-10 + j*(-9)
+-145 + j*(-54)
+-161 + j*(165)
+77 + j*(206)
+124 + j*(30)
+33 + j*(39)
+134 + j*(86)
+187 + j*(-78)
+29 + j*(-138)
+6 + j*(-11)
+123 + j*(-55)
+44 + j*(-189)
+-88 + j*(-116)
+-22 + j*(-35)
+0 + j*(-133)
+-151 + j*(-132)
+-167 + j*(40)
+-13 + j*(62)
+-16 + j*(-68)
+-141 + j*(-30)
+-83 + j*(93)
+20 + j*(7)
+-124 + j*(-78)
+-226 + j*(129)
+3 + j*(272)
+150 + j*(62)
+-44 + j*(-34)
+-73 + j*(190)
+191 + j*(197)
+207 + j*(-57)
+29 + j*(-50)
+119 + j*(46)
+187 + j*(-148)
+-65 + j*(-232)
+-148 + j*(8)
+50 + j*(37)
+-4 + j*(-137)
+-182 + j*(-20)
+-45 + j*(158)
+105 + j*(30)
+-4 + j*(-66)
+-45 + j*(23)
+9 + j*(13)
+-52 + j*(4)
+-19 + j*(126)
+153 + j*(77)
+108 + j*(-109)
+-53 + j*(-69)
+4 + j*(52)
+96 + j*(-33)
+2 + j*(-112)
+-69 + j*(-32)
+-9 + j*(22)
+33 + j*(-21)
+0 + j*(-68)
+-62 + j*(-46)
+-46 + j*(37)
+66 + j*(11)
+30 + j*(-150)
+-177 + j*(-118)
+-157 + j*(100)
+45 + j*(60)
+-61 + j*(-139)
+-303 + j*(23)
+-157 + j*(322)
+144 + j*(255)
+147 + j*(33)
+25 + j*(8)
+7 + j*(61)
+13 + j*(86)
+44 + j*(142)
+145 + j*(150)
+210 + j*(77)
+241 + j*(18)
+287 + j*(-81)
+238 + j*(-244)
+66 + j*(-323)
+-96 + j*(-256)
+-141 + j*(-104)
+-23 + j*(-13)
+90 + j*(-146)
+-77 + j*(-325)
+-341 + j*(-188)
+-293 + j*(81)
+-135 + j*(83)
+-202 + j*(64)
+-162 + j*(275)
+168 + j*(275)
+245 + j*(-84)
+-76 + j*(-218)
+-229 + j*(35)
+-60 + j*(180)
+47 + j*(89)
+11 + j*(42)
+16 + j*(64)
+44 + j*(25)
+-13 + j*(-21)
+-99 + j*(47)
+-55 + j*(198)
+146 + j*(237)
+291 + j*(61)
+218 + j*(-129)
+86 + j*(-161)
+35 + j*(-143)
+-24 + j*(-154)
+-101 + j*(-112)
+-124 + j*(-42)
+-135 + j*(21)
+-102 + j*(127)
+57 + j*(161)
+150 + j*(1)
+18 + j*(-112)
+-95 + j*(-10)
+-21 + j*(100)
+87 + j*(67)
+116 + j*(-28)
+54 + j*(-124)
+-98 + j*(-109)
+-133 + j*(77)
+69 + j*(161)
+203 + j*(-35)
+54 + j*(-216)
+-146 + j*(-167)
+-224 + j*(-10)
+-188 + j*(171)
+14 + j*(291)
+250 + j*(158)
+218 + j*(-100)
+19 + j*(-132)
+-16 + j*(-2)
+76 + j*(18)
+112 + j*(-52)
+95 + j*(-116)
+40 + j*(-169)
+-35 + j*(-170)
+-69 + j*(-151)
+-129 + j*(-165)
+-239 + j*(-93)
+-221 + j*(59)
+-125 + j*(80)
+-156 + j*(69)
+-143 + j*(208)
+67 + j*(241)
+147 + j*(46)
+19 + j*(-22)
+22 + j*(44)
+44 + j*(-50)
+-145 + j*(-43)
+-127 + j*(237)
+229 + j*(223)
+235 + j*(-165)
+-151 + j*(-180)
+-155 + j*(177)
+153 + j*(168)
+124 + j*(-74)
+-42 + j*(-8)
+70 + j*(91)
+132 + j*(-57)
+-16 + j*(-89)
+-14 + j*(28)
+62 + j*(-24)
+-44 + j*(-62)
+-59 + j*(84)
+106 + j*(90)
+103 + j*(-62)
+-1 + j*(-36)
+63 + j*(8)
+52 + j*(-102)
+-98 + j*(-39)
+11 + j*(155)
+250 + j*(24)
+140 + j*(-243)
+-105 + j*(-181)
+-74 + j*(-2)
+33 + j*(-24)
+21 + j*(-81)
+16 + j*(-94)
+-13 + j*(-163)
+-137 + j*(-158)
+-172 + j*(-35)
+-105 + j*(8)
+-95 + j*(-8)
+-82 + j*(9)
+-61 + j*(-47)
+-184 + j*(-91)
+-302 + j*(69)
+-197 + j*(250)
+-46 + j*(255)
+18 + j*(230)
+116 + j*(202)
+153 + j*(69)
+47 + j*(14)
+29 + j*(103)
+125 + j*(91)
+109 + j*(3)
+63 + j*(23)
+106 + j*(21)
+71 + j*(-32)
+40 + j*(49)
+194 + j*(54)
+204 + j*(-183)
+-79 + j*(-221)
+-124 + j*(70)
+163 + j*(100)
+186 + j*(-181)
+-60 + j*(-213)
+-83 + j*(-37)
+16 + j*(-55)
+-47 + j*(-115)
+-82 + j*(-51)
+-53 + j*(-66)
+-161 + j*(-73)
+-185 + j*(126)
+58 + j*(189)
+151 + j*(-55)
+-72 + j*(-164)
+-196 + j*(13)
+-115 + j*(155)
+0 + j*(219)
+228 + j*(195)
+358 + j*(-156)
+-49 + j*(-463)
+-512 + j*(-72)
+-199 + j*(486)
+371 + j*(288)
+278 + j*(-197)
+-54 + j*(-151)
+15 + j*(26)
+78 + j*(-95)
+-64 + j*(-87)
+24 + j*(35)
+124 + j*(-163)
+-172 + j*(-277)
+-321 + j*(49)
+-28 + j*(185)
+27 + j*(-65)
+-226 + j*(-18)
+-119 + j*(266)
+170 + j*(151)
+62 + j*(-108)
+-163 + j*(-12)
+-113 + j*(191)
+39 + j*(240)
+192 + j*(206)
+313 + j*(23)
+193 + j*(-197)
+-11 + j*(-159)
+4 + j*(-62)
+-11 + j*(-136)
+-180 + j*(-67)
+-119 + j*(165)
+107 + j*(136)
+76 + j*(-18)
+13 + j*(76)
+216 + j*(109)
+313 + j*(-185)
+30 + j*(-404)
+-285 + j*(-245)
+-296 + j*(75)
+-49 + j*(220)
+146 + j*(54)
+26 + j*(-124)
+-112 + j*(8)
+83 + j*(111)
+186 + j*(-162)
+-133 + j*(-306)
+-315 + j*(-18)
+-127 + j*(135)
+-94 + j*(33)
+-190 + j*(153)
+16 + j*(314)
+231 + j*(128)
+124 + j*(-67)
+6 + j*(-33)
+-10 + j*(6)
+-33 + j*(81)
+122 + j*(173)
+308 + j*(-51)
+71 + j*(-327)
+-252 + j*(-132)
+-125 + j*(173)
+107 + j*(110)
+95 + j*(-14)
+96 + j*(-24)
+103 + j*(-139)
+-78 + j*(-181)
+-139 + j*(-2)
+4 + j*(33)
+-23 + j*(-80)
+-119 + j*(13)
+23 + j*(93)
+81 + j*(-90)
+-136 + j*(-134)
+-177 + j*(100)
+45 + j*(131)
+47 + j*(-78)
+-180 + j*(-56)
+-181 + j*(211)
+100 + j*(286)
+260 + j*(47)
+89 + j*(-166)
+-144 + j*(-52)
+-66 + j*(201)
+208 + j*(168)
+238 + j*(-100)
+21 + j*(-173)
+-49 + j*(-18)
+68 + j*(19)
+83 + j*(-82)
+11 + j*(-84)
+57 + j*(-57)
+86 + j*(-197)
+-140 + j*(-319)
+-407 + j*(-100)
+-293 + j*(264)
+62 + j*(272)
+123 + j*(-11)
+-105 + j*(-58)
+-134 + j*(163)
+80 + j*(209)
+155 + j*(46)
+71 + j*(-19)
+59 + j*(8)
+74 + j*(-35)
+5 + j*(-65)
+-40 + j*(6)
+34 + j*(63)
+116 + j*(-18)
+32 + j*(-153)
+-170 + j*(-86)
+-151 + j*(177)
+139 + j*(230)
+243 + j*(-25)
+66 + j*(-116)
+74 + j*(6)
+221 + j*(-123)
+40 + j*(-356)
+-243 + j*(-229)
+-197 + j*(-8)
+-124 + j*(-42)
+-238 + j*(3)
+-178 + j*(206)
+31 + j*(197)
+49 + j*(81)
+47 + j*(99)
+131 + j*(35)
+40 + j*(-76)
+-39 + j*(45)
+158 + j*(82)
+191 + j*(-202)
+-130 + j*(-276)
+-243 + j*(3)
+-60 + j*(94)
+-45 + j*(-2)
+-97 + j*(67)
+23 + j*(94)
+18 + j*(-47)
+-141 + j*(-11)
+-109 + j*(154)
+14 + j*(155)
+25 + j*(129)
+100 + j*(160)
+185 + j*(37)
+62 + j*(-59)
+3 + j*(79)
+188 + j*(106)
+227 + j*(-115)
+23 + j*(-181)
+-41 + j*(-38)
+45 + j*(1)
+62 + j*(-45)
+61 + j*(-53)
+73 + j*(-99)
+13 + j*(-140)
+-21 + j*(-116)
+-33 + j*(-151)
+-171 + j*(-154)
+-229 + j*(52)
+-4 + j*(153)
+103 + j*(-88)
+-177 + j*(-197)
+-326 + j*(118)
+-32 + j*(326)
+197 + j*(108)
+51 + j*(-71)
+-46 + j*(61)
+132 + j*(113)
+211 + j*(-117)
+-11 + j*(-269)
+-214 + j*(-139)
+-204 + j*(35)
+-146 + j*(99)
+-97 + j*(165)
+25 + j*(192)
+98 + j*(83)
+19 + j*(37)
+25 + j*(147)
+209 + j*(139)
+269 + j*(-86)
+95 + j*(-238)
+-99 + j*(-180)
+-173 + j*(-10)
+-62 + j*(173)
+209 + j*(134)
+254 + j*(-197)
+-91 + j*(-333)
+-283 + j*(-34)
+-62 + j*(144)
+40 + j*(-25)
+-119 + j*(-35)
+-71 + j*(138)
+100 + j*(65)
+6 + j*(-73)
+-84 + j*(53)
+74 + j*(112)
+125 + j*(-59)
+-14 + j*(-108)
+-41 + j*(-36)
+-42 + j*(-70)
+-158 + j*(-33)
+-133 + j*(139)
+28 + j*(144)
+23 + j*(42)
+-23 + j*(112)
+120 + j*(163)
+221 + j*(-5)
+98 + j*(-145)
+-37 + j*(-106)
+-77 + j*(-18)
+-59 + j*(86)
+88 + j*(149)
+236 + j*(-10)
+112 + j*(-234)
+-153 + j*(-170)
+-163 + j*(105)
+103 + j*(191)
+279 + j*(-30)
+151 + j*(-290)
+-133 + j*(-298)
+-257 + j*(-75)
+-139 + j*(90)
+-11 + j*(49)
+-37 + j*(-28)
+-92 + j*(16)
+-48 + j*(84)
+35 + j*(72)
+73 + j*(-1)
+42 + j*(-86)
+-60 + j*(-117)
+-154 + j*(-37)
+-120 + j*(92)
+1 + j*(97)
+3 + j*(-5)
+-102 + j*(25)
+-38 + j*(170)
+160 + j*(95)
+95 + j*(-149)
+-180 + j*(-106)
+-170 + j*(175)
+74 + j*(199)
+105 + j*(33)
+28 + j*(47)
+117 + j*(69)
+129 + j*(-82)
+-30 + j*(-98)
+-29 + j*(21)
+37 + j*(-44)
+-129 + j*(-81)
+-194 + j*(180)
+102 + j*(317)
+298 + j*(81)
+173 + j*(-95)
+102 + j*(-45)
+161 + j*(-87)
+81 + j*(-207)
+-82 + j*(-163)
+-88 + j*(-7)
+56 + j*(30)
+127 + j*(-134)
+-72 + j*(-274)
+-305 + j*(-72)
+-132 + j*(230)
+192 + j*(95)
+82 + j*(-211)
+-176 + j*(-114)
+-77 + j*(59)
+-11 + j*(-83)
+-235 + j*(-65)
+-198 + j*(243)
+132 + j*(240)
+163 + j*(-30)
+12 + j*(-59)
+31 + j*(-41)
+-71 + j*(-137)
+-261 + j*(53)
+-30 + j*(332)
+298 + j*(107)
+107 + j*(-206)
+-142 + j*(-31)
+54 + j*(141)
+179 + j*(-92)
+-74 + j*(-200)
+-170 + j*(34)
+23 + j*(98)
+40 + j*(-74)
+-140 + j*(-59)
+-141 + j*(135)
+32 + j*(186)
+118 + j*(77)
+79 + j*(4)
+48 + j*(21)
+94 + j*(35)
+141 + j*(-46)
+68 + j*(-148)
+-57 + j*(-112)
+-39 + j*(-5)
+47 + j*(-55)
+-49 + j*(-160)
+-205 + j*(-52)
+-132 + j*(129)
+9 + j*(98)
+-30 + j*(44)
+-6 + j*(156)
+211 + j*(107)
+202 + j*(-187)
+-104 + j*(-248)
+-214 + j*(-8)
+-91 + j*(83)
+-95 + j*(62)
+-86 + j*(191)
+116 + j*(219)
+183 + j*(42)
+83 + j*(14)
+173 + j*(68)
+264 + j*(-135)
+28 + j*(-305)
+-180 + j*(-119)
+-67 + j*(59)
+47 + j*(-4)
+14 + j*(-62)
+-4 + j*(-70)
+-54 + j*(-95)
+-126 + j*(-25)
+-64 + j*(67)
+6 + j*(30)
+-21 + j*(11)
+15 + j*(41)
+45 + j*(-38)
+-64 + j*(-52)
+-44 + j*(86)
+132 + j*(28)
+57 + j*(-187)
+-176 + j*(-132)
+-165 + j*(63)
+-75 + j*(78)
+-80 + j*(124)
+78 + j*(195)
+228 + j*(-22)
+-4 + j*(-223)
+-209 + j*(0)
+10 + j*(181)
+164 + j*(-49)
+-78 + j*(-202)
+-262 + j*(8)
+-151 + j*(211)
+1 + j*(238)
+120 + j*(220)
+247 + j*(115)
+237 + j*(-69)
+106 + j*(-139)
+52 + j*(-100)
+54 + j*(-134)
+-59 + j*(-187)
+-202 + j*(-62)
+-113 + j*(153)
+134 + j*(106)
+117 + j*(-168)
+-192 + j*(-185)
+-261 + j*(141)
+46 + j*(265)
+199 + j*(12)
+1 + j*(-146)
+-157 + j*(-1)
+-92 + j*(164)
+56 + j*(206)
+194 + j*(130)
+205 + j*(-42)
+58 + j*(-83)
+63 + j*(59)
+267 + j*(-2)
+223 + j*(-295)
+-92 + j*(-331)
+-177 + j*(-91)
+-37 + j*(-39)
+-65 + j*(-134)
+-171 + j*(-64)
+-117 + j*(47)
+-39 + j*(30)
+-30 + j*(-4)
+-33 + j*(-50)
+-153 + j*(-89)
+-280 + j*(112)
+-45 + j*(370)
+330 + j*(176)
+233 + j*(-250)
+-165 + j*(-257)
+-235 + j*(44)
+-67 + j*(118)
+-48 + j*(67)
+-37 + j*(130)
+82 + j*(110)
+69 + j*(-7)
+-2 + j*(18)
+66 + j*(23)
+4 + j*(-115)
+-230 + j*(-1)
+-110 + j*(342)
+310 + j*(286)
+354 + j*(-125)
+48 + j*(-234)
+-42 + j*(-73)
+11 + j*(-70)
+-78 + j*(-76)
+-73 + j*(71)
+103 + j*(57)
+84 + j*(-134)
+-106 + j*(-129)
+-124 + j*(27)
+-36 + j*(40)
+-80 + j*(10)
+-114 + j*(134)
+54 + j*(240)
+247 + j*(107)
+209 + j*(-124)
+13 + j*(-175)
+-80 + j*(-55)
+-42 + j*(37)
+24 + j*(83)
+164 + j*(77)
+269 + j*(-146)
+24 + j*(-402)
+-358 + j*(-215)
+-275 + j*(216)
+124 + j*(223)
+179 + j*(-100)
+-56 + j*(-172)
+-129 + j*(-26)
+-68 + j*(35)
+-28 + j*(37)
+10 + j*(16)
+-11 + j*(-30)
+-37 + j*(6)
+37 + j*(-8)
+-33 + j*(-153)
+-266 + j*(-46)
+-162 + j*(266)
+182 + j*(187)
+122 + j*(-136)
+-151 + j*(-84)
+-108 + j*(118)
+-5 + j*(82)
+-60 + j*(91)
+23 + j*(199)
+167 + j*(116)
+136 + j*(15)
+152 + j*(13)
+181 + j*(-128)
+-24 + j*(-211)
+-124 + j*(-5)
+68 + j*(65)
+100 + j*(-121)
+-51 + j*(-142)
+-59 + j*(-98)
+-165 + j*(-158)
+-366 + j*(54)
+-148 + j*(388)
+223 + j*(250)
+158 + j*(-40)
+1 + j*(21)
+99 + j*(75)
+97 + j*(-37)
+21 + j*(12)
+141 + j*(35)
+142 + j*(-153)
+-66 + j*(-161)
+-83 + j*(11)
+17 + j*(23)
+25 + j*(18)
+141 + j*(21)
+177 + j*(-226)
+-158 + j*(-329)
+-309 + j*(18)
+6 + j*(153)
+71 + j*(-148)
+-248 + j*(-166)
+-279 + j*(146)
+-52 + j*(199)
+-49 + j*(99)
+-93 + j*(208)
+93 + j*(319)
+321 + j*(184)
+340 + j*(-88)
+131 + j*(-234)
+-27 + j*(-103)
+121 + j*(-9)
+181 + j*(-267)
+-188 + j*(-376)
+-365 + j*(25)
+10 + j*(214)
+159 + j*(-136)
+-173 + j*(-258)
+-288 + j*(6)
+-164 + j*(73)
+-237 + j*(85)
+-181 + j*(339)
+178 + j*(332)
+226 + j*(-12)
+-47 + j*(-44)
+-12 + j*(185)
+211 + j*(103)
+128 + j*(-105)
+-33 + j*(-25)
+66 + j*(81)
+156 + j*(-54)
+0 + j*(-157)
+-127 + j*(-10)
+-4 + j*(132)
+139 + j*(40)
+79 + j*(-74)
+23 + j*(-24)
+107 + j*(-37)
+53 + j*(-196)
+-178 + j*(-147)
+-179 + j*(122)
+74 + j*(182)
+185 + j*(-1)
+119 + j*(-127)
+28 + j*(-185)
+-113 + j*(-173)
+-170 + j*(-17)
+-35 + j*(49)
+-16 + j*(-71)
+-151 + j*(-37)
+-85 + j*(115)
+68 + j*(21)
+-51 + j*(-130)
+-218 + j*(-13)
+-162 + j*(153)
+-63 + j*(190)
+18 + j*(219)
+161 + j*(182)
+217 + j*(19)
+130 + j*(-104)
+2 + j*(-137)
+-141 + j*(-49)
+-119 + j*(186)
+168 + j*(240)
+290 + j*(-35)
+86 + j*(-157)
+57 + j*(-26)
+190 + j*(-136)
+-6 + j*(-339)
+-279 + j*(-161)
+-187 + j*(89)
+-35 + j*(71)
+-34 + j*(38)
+9 + j*(36)
+-21 + j*(-38)
+-119 + j*(59)
+58 + j*(194)
+231 + j*(-33)
+-16 + j*(-212)
+-141 + j*(44)
+158 + j*(81)
+125 + j*(-313)
+-374 + j*(-289)
+-446 + j*(250)
+17 + j*(442)
+265 + j*(146)
+147 + j*(-57)
+49 + j*(-35)
+74 + j*(-35)
+49 + j*(-120)
+-98 + j*(-146)
+-208 + j*(21)
+-69 + j*(197)
+124 + j*(98)
+37 + j*(-71)
+-103 + j*(37)
+32 + j*(169)
+162 + j*(35)
+54 + j*(-69)
+-1 + j*(23)
+96 + j*(36)
+104 + j*(-56)
+58 + j*(-69)
+78 + j*(-97)
+1 + j*(-203)
+-190 + j*(-150)
+-219 + j*(67)
+-55 + j*(164)
+41 + j*(95)
+35 + j*(70)
+101 + j*(92)
+202 + j*(-23)
+112 + j*(-209)
+-103 + j*(-188)
+-135 + j*(-6)
+-16 + j*(25)
+-25 + j*(-49)
+-83 + j*(2)
+-8 + j*(53)
+23 + j*(-26)
+-57 + j*(-25)
+-11 + j*(57)
+82 + j*(-37)
+-43 + j*(-152)
+-170 + j*(-37)
+-93 + j*(54)
+-96 + j*(-8)
+-214 + j*(91)
+-90 + j*(313)
+190 + j*(255)
+225 + j*(22)
+115 + j*(-39)
+119 + j*(-33)
+105 + j*(-135)
+-41 + j*(-175)
+-135 + j*(-68)
+-116 + j*(19)
+-103 + j*(53)
+-94 + j*(129)
+4 + j*(206)
+153 + j*(180)
+245 + j*(44)
+206 + j*(-132)
+28 + j*(-211)
+-133 + j*(-80)
+-57 + j*(109)
+135 + j*(76)
+141 + j*(-91)
+40 + j*(-116)
+51 + j*(-105)
+4 + j*(-216)
+-210 + j*(-176)
+-216 + j*(76)
+6 + j*(90)
+-40 + j*(-96)
+-239 + j*(27)
+-95 + j*(268)
+145 + j*(173)
+111 + j*(28)
+119 + j*(60)
+221 + j*(-74)
+40 + j*(-259)
+-171 + j*(-100)
+-47 + j*(68)
+50 + j*(-38)
+-37 + j*(-72)
+-7 + j*(-37)
+-42 + j*(-154)
+-260 + j*(-73)
+-182 + j*(211)
+93 + j*(139)
+1 + j*(-67)
+-121 + j*(69)
+54 + j*(108)
+-10 + j*(-86)
+-221 + j*(101)
+77 + j*(344)
+349 + j*(-26)
+-51 + j*(-301)
+-306 + j*(91)
+35 + j*(310)
+177 + j*(62)
+26 + j*(54)
+174 + j*(157)
+295 + j*(-98)
+20 + j*(-240)
+-98 + j*(-3)
+103 + j*(49)
+100 + j*(-137)
+-69 + j*(-115)
+-49 + j*(13)
+22 + j*(-11)
+-23 + j*(-35)
+-29 + j*(40)
+65 + j*(64)
+139 + j*(-15)
+112 + j*(-129)
+4 + j*(-163)
+-49 + j*(-100)
+-20 + j*(-83)
+-41 + j*(-118)
+-83 + j*(-96)
+-82 + j*(-107)
+-192 + j*(-139)
+-315 + j*(43)
+-140 + j*(250)
+73 + j*(127)
+-40 + j*(-17)
+-107 + j*(146)
+124 + j*(192)
+196 + j*(-69)
+-19 + j*(-176)
+-128 + j*(-65)
+-133 + j*(-17)
+-197 + j*(58)
+-139 + j*(213)
+13 + j*(219)
+35 + j*(163)
+75 + j*(223)
+249 + j*(183)
+296 + j*(-32)
+154 + j*(-146)
+62 + j*(-116)
+40 + j*(-108)
+-14 + j*(-113)
+-75 + j*(-64)
+-81 + j*(28)
+11 + j*(87)
+102 + j*(11)
+26 + j*(-83)
+-47 + j*(13)
+97 + j*(66)
+144 + j*(-139)
+-105 + j*(-196)
+-170 + j*(65)
+74 + j*(124)
+102 + j*(-91)
+-80 + j*(-80)
+-29 + j*(71)
+97 + j*(2)
+42 + j*(-81)
+35 + j*(-62)
+48 + j*(-177)
+-178 + j*(-238)
+-325 + j*(26)
+-100 + j*(229)
+79 + j*(75)
+-45 + j*(-35)
+-101 + j*(106)
+62 + j*(166)
+164 + j*(25)
+97 + j*(-110)
+-28 + j*(-144)
+-144 + j*(-75)
+-161 + j*(84)
+-7 + j*(173)
+120 + j*(52)
+18 + j*(-78)
+-114 + j*(42)
+45 + j*(204)
+273 + j*(22)
+107 + j*(-272)
+-217 + j*(-142)
+-112 + j*(176)
+195 + j*(71)
+88 + j*(-234)
+-211 + j*(-156)
+-177 + j*(99)
+-6 + j*(92)
+-29 + j*(5)
+-69 + j*(59)
+-11 + j*(93)
+20 + j*(63)
+31 + j*(49)
+30 + j*(6)
+-49 + j*(11)
+-37 + j*(144)
+149 + j*(153)
+198 + j*(-51)
+23 + j*(-128)
+-43 + j*(4)
+64 + j*(35)
+70 + j*(-76)
+-52 + j*(-81)
+-86 + j*(45)
+15 + j*(118)
+117 + j*(75)
+143 + j*(-13)
+119 + j*(-71)
+87 + j*(-121)
+4 + j*(-158)
+-98 + j*(-84)
+-44 + j*(57)
+132 + j*(25)
+141 + j*(-175)
+-33 + j*(-253)
+-145 + j*(-178)
+-187 + j*(-118)
+-250 + j*(-28)
+-211 + j*(132)
+-40 + j*(179)
+53 + j*(59)
+-20 + j*(-36)
+-122 + j*(10)
+-110 + j*(148)
+61 + j*(212)
+224 + j*(52)
+129 + j*(-190)
+-135 + j*(-187)
+-214 + j*(35)
+-81 + j*(148)
+1 + j*(98)
+-6 + j*(98)
+69 + j*(136)
+181 + j*(28)
+91 + j*(-155)
+-130 + j*(-107)
+-113 + j*(127)
+132 + j*(112)
+103 + j*(-163)
+-225 + j*(-134)
+-235 + j*(238)
+124 + j*(314)
+231 + j*(42)
+78 + j*(-9)
+156 + j*(80)
+275 + j*(-119)
+40 + j*(-315)
+-192 + j*(-129)
+-70 + j*(52)
+16 + j*(-64)
+-165 + j*(-95)
+-232 + j*(161)
+25 + j*(338)
+308 + j*(185)
+317 + j*(-112)
+103 + j*(-245)
+-50 + j*(-148)
+-11 + j*(-56)
+17 + j*(-116)
+-97 + j*(-125)
+-129 + j*(23)
+25 + j*(85)
+115 + j*(-62)
+-6 + j*(-184)
+-159 + j*(-110)
+-139 + j*(45)
+-1 + j*(64)
+28 + j*(-65)
+-100 + j*(-98)
+-138 + j*(18)
+-51 + j*(27)
+-122 + j*(-42)
+-230 + j*(123)
+-16 + j*(313)
+245 + j*(122)
+118 + j*(-151)
+-115 + j*(-88)
+-102 + j*(78)
+-15 + j*(105)
+45 + j*(103)
+127 + j*(21)
+37 + j*(-133)
+-170 + j*(-50)
+-119 + j*(180)
+85 + j*(175)
+108 + j*(61)
+115 + j*(46)
+151 + j*(-66)
+-31 + j*(-154)
+-152 + j*(68)
+88 + j*(200)
+204 + j*(-35)
+-8 + j*(-97)
+10 + j*(114)
+246 + j*(33)
+162 + j*(-222)
+-52 + j*(-168)
+-8 + j*(-47)
+22 + j*(-113)
+-56 + j*(-87)
+23 + j*(-35)
+49 + j*(-194)
+-185 + j*(-232)
+-262 + j*(21)
+-47 + j*(101)
+8 + j*(-89)
+-191 + j*(-145)
+-322 + j*(28)
+-266 + j*(245)
+-43 + j*(359)
+177 + j*(213)
+93 + j*(-14)
+-114 + j*(91)
+46 + j*(342)
+381 + j*(202)
+356 + j*(-164)
+76 + j*(-260)
+-67 + j*(-126)
+-42 + j*(-6)
+54 + j*(9)
+84 + j*(-112)
+-93 + j*(-175)
+-216 + j*(41)
+-4 + j*(220)
+187 + j*(48)
+62 + j*(-99)
+-8 + j*(18)
+151 + j*(32)
+170 + j*(-167)
+1 + j*(-237)
+-81 + j*(-171)
+-116 + j*(-170)
+-235 + j*(-134)
+-296 + j*(37)
+-192 + j*(194)
+-21 + j*(214)
+74 + j*(98)
+-1 + j*(-1)
+-93 + j*(92)
+38 + j*(225)
+244 + j*(106)
+206 + j*(-135)
+13 + j*(-202)
+-122 + j*(-124)
+-175 + j*(12)
+-77 + j*(171)
+138 + j*(122)
+132 + j*(-113)
+-93 + j*(-131)
+-113 + j*(52)
+14 + j*(35)
+-81 + j*(-54)
+-184 + j*(119)
+7 + j*(270)
+177 + j*(148)
+148 + j*(47)
+192 + j*(47)
+250 + j*(-116)
+63 + j*(-264)
+-123 + j*(-127)
+-39 + j*(22)
+52 + j*(-51)
+-25 + j*(-103)
+-47 + j*(-40)
+-6 + j*(-68)
+-97 + j*(-120)
+-204 + j*(-2)
+-122 + j*(153)
+33 + j*(144)
+76 + j*(43)
+42 + j*(-7)
+21 + j*(-5)
+32 + j*(-12)
+24 + j*(-70)
+-91 + j*(-107)
+-226 + j*(40)
+-106 + j*(296)
+238 + j*(284)
+373 + j*(-71)
+105 + j*(-325)
+-190 + j*(-192)
+-182 + j*(65)
+-12 + j*(129)
+65 + j*(48)
+39 + j*(-4)
+18 + j*(13)
+54 + j*(33)
+107 + j*(-6)
+110 + j*(-91)
+38 + j*(-165)
+-86 + j*(-168)
+-182 + j*(-47)
+-103 + j*(130)
+128 + j*(115)
+190 + j*(-144)
+-47 + j*(-298)
+-258 + j*(-156)
+-246 + j*(28)
+-178 + j*(105)
+-101 + j*(175)
+53 + j*(149)
+76 + j*(-33)
+-113 + j*(-80)
+-179 + j*(104)
+-24 + j*(184)
+38 + j*(68)
+-64 + j*(44)
+-83 + j*(166)
+38 + j*(235)
+155 + j*(177)
+173 + j*(84)
+158 + j*(74)
+257 + j*(64)
+337 + j*(-165)
+70 + j*(-406)
+-300 + j*(-202)
+-197 + j*(201)
+158 + j*(170)
+151 + j*(-98)
+-24 + j*(-82)
+13 + j*(11)
+29 + j*(-41)
+-23 + j*(28)
+142 + j*(89)
+243 + j*(-152)
+-11 + j*(-301)
+-160 + j*(-95)
+-9 + j*(-13)
+-18 + j*(-156)
+-180 + j*(-100)
+-137 + j*(49)
+-59 + j*(32)
+-93 + j*(57)
+9 + j*(139)
+139 + j*(30)
+85 + j*(-95)
+49 + j*(-113)
+-1 + j*(-236)
+-292 + j*(-232)
+-390 + j*(163)
+18 + j*(347)
+232 + j*(-16)
+-69 + j*(-199)
+-178 + j*(31)
+-9 + j*(29)
+-153 + j*(-123)
+-350 + j*(132)
+-78 + j*(395)
+177 + j*(175)
+-3 + j*(17)
+-54 + j*(233)
+233 + j*(250)
+274 + j*(-47)
+47 + j*(-99)
+62 + j*(39)
+161 + j*(-92)
+-80 + j*(-226)
+-301 + j*(77)
+-18 + j*(404)
+385 + j*(230)
+369 + j*(-156)
+106 + j*(-264)
+-22 + j*(-159)
+-18 + j*(-98)
+-25 + j*(-91)
+-62 + j*(-67)
+-71 + j*(3)
+14 + j*(64)
+128 + j*(-19)
+71 + j*(-185)
+-119 + j*(-175)
+-159 + j*(-13)
+-60 + j*(39)
+-55 + j*(-1)
+-75 + j*(60)
+33 + j*(105)
+115 + j*(1)
+66 + j*(-100)
+3 + j*(-122)
+-59 + j*(-150)
+-186 + j*(-126)
+-264 + j*(36)
+-168 + j*(209)
+22 + j*(231)
+126 + j*(107)
+83 + j*(4)
+36 + j*(27)
+107 + j*(28)
+112 + j*(-110)
+-60 + j*(-147)
+-120 + j*(21)
+26 + j*(76)
+58 + j*(-45)
+-23 + j*(-40)
+44 + j*(-8)
+48 + j*(-170)
+-195 + j*(-199)
+-287 + j*(54)
+-105 + j*(174)
+-40 + j*(91)
+-74 + j*(122)
+21 + j*(158)
+40 + j*(59)
+-60 + j*(115)
+76 + j*(275)
+334 + j*(137)
+289 + j*(-160)
+68 + j*(-228)
+-31 + j*(-156)
+-88 + j*(-124)
+-161 + j*(-33)
+-124 + j*(107)
+8 + j*(153)
+107 + j*(76)
+85 + j*(-28)
+-11 + j*(-13)
+36 + j*(100)
+209 + j*(28)
+150 + j*(-202)
+-91 + j*(-184)
+-93 + j*(16)
+47 + j*(-1)
+-6 + j*(-98)
+-74 + j*(-21)
+4 + j*(15)
+9 + j*(-45)
+-18 + j*(-18)
+45 + j*(-42)
+-28 + j*(-154)
+-188 + j*(-57)
+-95 + j*(119)
+54 + j*(37)
+-26 + j*(-59)
+-64 + j*(36)
+48 + j*(21)
+4 + j*(-108)
+-123 + j*(-68)
+-115 + j*(13)
+-122 + j*(18)
+-150 + j*(101)
+-64 + j*(182)
+11 + j*(168)
+74 + j*(197)
+255 + j*(128)
+258 + j*(-156)
+-20 + j*(-245)
+-132 + j*(-64)
+-83 + j*(-25)
+-188 + j*(30)
+-97 + j*(302)
+292 + j*(246)
+298 + j*(-159)
+-21 + j*(-179)
+32 + j*(19)
+153 + j*(-161)
+-119 + j*(-269)
+-227 + j*(11)
+1 + j*(71)
+-40 + j*(-97)
+-175 + j*(52)
+53 + j*(170)
+153 + j*(-105)
+-145 + j*(-195)
+-250 + j*(85)
+-49 + j*(207)
+48 + j*(129)
+20 + j*(-16)
+-153 + j*(39)
+-67 + j*(248)
+168 + j*(204)
+190 + j*(6)
+79 + j*(-42)
+55 + j*(11)
+116 + j*(11)
+151 + j*(-91)
+37 + j*(-217)
+-189 + j*(-141)
+-180 + j*(150)
+139 + j*(216)
+272 + j*(-98)
+0 + j*(-273)
+-162 + j*(-72)
+-13 + j*(18)
+-18 + j*(-144)
+-253 + j*(-80)
+-201 + j*(224)
+119 + j*(223)
+158 + j*(-62)
+-76 + j*(-111)
+-123 + j*(72)
+-8 + j*(115)
+5 + j*(85)
+42 + j*(146)
+187 + j*(103)
+190 + j*(-75)
+51 + j*(-117)
+18 + j*(-45)
+43 + j*(-53)
+4 + j*(-48)
+48 + j*(8)
+132 + j*(-81)
+28 + j*(-197)
+-75 + j*(-110)
+22 + j*(-79)
+-21 + j*(-257)
+-312 + j*(-221)
+-363 + j*(127)
+-65 + j*(267)
+102 + j*(74)
+8 + j*(-53)
+-57 + j*(-21)
+-49 + j*(-23)
+-98 + j*(-45)
+-168 + j*(1)
+-192 + j*(103)
+-134 + j*(218)
+10 + j*(260)
+124 + j*(185)
+151 + j*(85)
+132 + j*(1)
+42 + j*(-52)
+-50 + j*(34)
+49 + j*(156)
+209 + j*(53)
+132 + j*(-117)
+2 + j*(-72)
+53 + j*(-21)
+35 + j*(-124)
+-127 + j*(-79)
+-94 + j*(112)
+71 + j*(101)
+65 + j*(6)
+58 + j*(45)
+162 + j*(-21)
+55 + j*(-196)
+-175 + j*(-70)
+-47 + j*(199)
+252 + j*(92)
+190 + j*(-209)
+-69 + j*(-199)
+-71 + j*(-8)
+73 + j*(-34)
+11 + j*(-181)
+-168 + j*(-110)
+-112 + j*(105)
+133 + j*(71)
+139 + j*(-204)
+-138 + j*(-275)
+-276 + j*(-60)
+-179 + j*(93)
+-94 + j*(119)
+18 + j*(148)
+162 + j*(6)
+26 + j*(-228)
+-247 + j*(-132)
+-196 + j*(110)
+-56 + j*(52)
+-201 + j*(25)
+-186 + j*(303)
+185 + j*(322)
+255 + j*(-55)
+-76 + j*(-139)
+-141 + j*(135)
+88 + j*(190)
+140 + j*(19)
+35 + j*(-28)
+-6 + j*(30)
+34 + j*(95)
+163 + j*(86)
+219 + j*(-117)
+-15 + j*(-264)
+-230 + j*(-56)
+-86 + j*(169)
+83 + j*(84)
+21 + j*(7)
+28 + j*(96)
+162 + j*(54)
+146 + j*(-94)
+45 + j*(-119)
+13 + j*(-106)
+-49 + j*(-112)
+-103 + j*(-21)
+-24 + j*(58)
+58 + j*(6)
+44 + j*(-64)
+-5 + j*(-103)
+-108 + j*(-93)
+-155 + j*(63)
+35 + j*(171)
+190 + j*(-23)
+7 + j*(-206)
+-175 + j*(-45)
+-35 + j*(121)
+113 + j*(-3)
+18 + j*(-146)
+-119 + j*(-103)
+-148 + j*(11)
+-88 + j*(97)
+18 + j*(88)
+26 + j*(-2)
+-47 + j*(23)
+50 + j*(112)
+197 + j*(-47)
+23 + j*(-272)
+-256 + j*(-141)
+-197 + j*(119)
+-28 + j*(103)
+-75 + j*(49)
+-61 + j*(182)
+146 + j*(168)
+159 + j*(-66)
+-41 + j*(-97)
+-52 + j*(81)
+131 + j*(78)
+152 + j*(-101)
+-6 + j*(-171)
+-116 + j*(-80)
+-110 + j*(36)
+-23 + j*(101)
+86 + j*(69)
+116 + j*(-40)
+59 + j*(-113)
+-4 + j*(-137)
+-81 + j*(-152)
+-188 + j*(-98)
+-225 + j*(40)
+-157 + j*(156)
+-58 + j*(203)
+49 + j*(203)
+142 + j*(134)
+159 + j*(27)
+109 + j*(-42)
+33 + j*(-64)
+-49 + j*(4)
+13 + j*(147)
+227 + j*(116)
+262 + j*(-137)
+35 + j*(-221)
+-35 + j*(-57)
+105 + j*(-54)
+57 + j*(-218)
+-124 + j*(-179)
+-112 + j*(-45)
+-62 + j*(-72)
+-150 + j*(-71)
+-165 + j*(53)
+-93 + j*(107)
+-51 + j*(159)
+119 + j*(214)
+309 + j*(1)
+148 + j*(-280)
+-118 + j*(-215)
+-103 + j*(-68)
+-106 + j*(-115)
+-245 + j*(-18)
+-124 + j*(192)
+93 + j*(70)
+-49 + j*(-119)
+-227 + j*(47)
+-80 + j*(221)
+50 + j*(139)
+16 + j*(105)
+64 + j*(148)
+132 + j*(102)
+154 + j*(76)
+253 + j*(1)
+211 + j*(-228)
+-62 + j*(-268)
+-141 + j*(-52)
+-21 + j*(-23)
+-99 + j*(-81)
+-146 + j*(102)
+98 + j*(163)
+176 + j*(-89)
+-30 + j*(-168)
+-74 + j*(-58)
+-72 + j*(-105)
+-255 + j*(-44)
+-206 + j*(249)
+106 + j*(258)
+140 + j*(19)
+6 + j*(35)
+111 + j*(107)
+173 + j*(-62)
+7 + j*(-121)
+-20 + j*(1)
+59 + j*(-44)
+-64 + j*(-100)
+-124 + j*(90)
+105 + j*(177)
+235 + j*(-37)
+90 + j*(-192)
+-28 + j*(-144)
+-42 + j*(-128)
+-148 + j*(-137)
+-256 + j*(38)
+-103 + j*(261)
+194 + j*(200)
+233 + j*(-95)
+-8 + j*(-198)
+-115 + j*(-16)
+40 + j*(62)
+106 + j*(-97)
+-47 + j*(-189)
+-173 + j*(-98)
+-190 + j*(20)
+-149 + j*(123)
+-37 + j*(182)
+63 + j*(129)
+74 + j*(73)
+105 + j*(53)
+122 + j*(-39)
+19 + j*(-87)
+-16 + j*(11)
+98 + j*(8)
+78 + j*(-145)
+-92 + j*(-151)
+-136 + j*(-19)
+-94 + j*(37)
+-70 + j*(81)
+18 + j*(103)
+47 + j*(9)
+-56 + j*(27)
+33 + j*(182)
+274 + j*(57)
+168 + j*(-253)
+-151 + j*(-201)
+-143 + j*(74)
+79 + j*(80)
+96 + j*(-104)
+-49 + j*(-161)
+-158 + j*(-77)
+-153 + j*(47)
+-65 + j*(85)
+-58 + j*(42)
+-104 + j*(119)
+37 + j*(215)
+175 + j*(63)
+37 + j*(-49)
+5 + j*(101)
+208 + j*(50)
+102 + j*(-205)
+-168 + j*(-50)
+47 + j*(210)
+306 + j*(-73)
+-16 + j*(-332)
+-255 + j*(-18)
+41 + j*(160)
+139 + j*(-130)
+-158 + j*(-171)
+-180 + j*(115)
+55 + j*(134)
+56 + j*(-25)
+-40 + j*(18)
+54 + j*(101)
+173 + j*(-6)
+116 + j*(-182)
+-86 + j*(-226)
+-232 + j*(-57)
+-132 + j*(143)
+54 + j*(100)
+23 + j*(-40)
+-83 + j*(20)
+1 + j*(123)
+117 + j*(54)
+103 + j*(-50)
+57 + j*(-96)
+-11 + j*(-141)
+-128 + j*(-109)
+-163 + j*(13)
+-107 + j*(88)
+-53 + j*(115)
+16 + j*(123)
+62 + j*(72)
+40 + j*(47)
+73 + j*(71)
+129 + j*(-10)
+32 + j*(-91)
+-40 + j*(18)
+92 + j*(69)
+134 + j*(-86)
+-20 + j*(-116)
+-22 + j*(19)
+113 + j*(-21)
+64 + j*(-169)
+-74 + j*(-158)
+-113 + j*(-92)
+-147 + j*(-40)
+-122 + j*(71)
+29 + j*(62)
+12 + j*(-122)
+-220 + j*(-116)
+-272 + j*(134)
+-90 + j*(245)
+-1 + j*(192)
+25 + j*(218)
+171 + j*(227)
+279 + j*(64)
+198 + j*(-95)
+87 + j*(-100)
+73 + j*(-67)
+80 + j*(-100)
+35 + j*(-149)
+-53 + j*(-163)
+-153 + j*(-111)
+-209 + j*(27)
+-129 + j*(186)
+68 + j*(223)
+205 + j*(86)
+179 + j*(-74)
+88 + j*(-138)
+5 + j*(-157)
+-96 + j*(-119)
+-115 + j*(1)
+-16 + j*(38)
+-15 + j*(-49)
+-125 + j*(6)
+-32 + j*(174)
+199 + j*(79)
+140 + j*(-194)
+-129 + j*(-188)
+-168 + j*(26)
+-37 + j*(71)
+-35 + j*(20)
+-45 + j*(83)
+76 + j*(84)
+86 + j*(-76)
+-113 + j*(-103)
+-179 + j*(133)
+62 + j*(269)
+273 + j*(88)
+204 + j*(-132)
+66 + j*(-167)
+2 + j*(-162)
+-103 + j*(-144)
+-148 + j*(13)
+28 + j*(86)
+103 + j*(-114)
+-116 + j*(-188)
+-182 + j*(15)
+-18 + j*(18)
+-134 + j*(-136)
+-347 + j*(89)
+-95 + j*(383)
+220 + j*(180)
+69 + j*(-60)
+-48 + j*(91)
+146 + j*(103)
+101 + j*(-139)
+-162 + j*(-80)
+-118 + j*(158)
+24 + j*(144)
+-9 + j*(153)
+144 + j*(295)
+445 + j*(102)
+343 + j*(-304)
+-41 + j*(-339)
+-161 + j*(-82)
+-35 + j*(47)
+82 + j*(1)
+88 + j*(-138)
+-106 + j*(-212)
+-285 + j*(14)
+-85 + j*(303)
+262 + j*(192)
+267 + j*(-119)
+84 + j*(-187)
+59 + j*(-170)
+-18 + j*(-281)
+-279 + j*(-235)
+-345 + j*(93)
+-56 + j*(264)
+149 + j*(54)
+-6 + j*(-124)
+-141 + j*(19)
+14 + j*(121)
+86 + j*(-53)
+-107 + j*(-88)
+-104 + j*(133)
+148 + j*(91)
+79 + j*(-190)
+-215 + j*(-110)
+-141 + j*(163)
+71 + j*(98)
+-9 + j*(-30)
+-50 + j*(76)
+74 + j*(47)
+-21 + j*(-69)
+-111 + j*(97)
+124 + j*(161)
+175 + j*(-124)
+-117 + j*(-168)
+-140 + j*(79)
+18 + j*(42)
+-129 + j*(-30)
+-170 + j*(247)
+187 + j*(317)
+292 + j*(-23)
+37 + j*(-107)
+30 + j*(71)
+175 + j*(-1)
+69 + j*(-127)
+-26 + j*(-14)
+93 + j*(53)
+172 + j*(-49)
+153 + j*(-153)
+76 + j*(-268)
+-137 + j*(-300)
+-285 + j*(-99)
+-179 + j*(86)
+-56 + j*(67)
+-50 + j*(33)
+-41 + j*(37)
+-47 + j*(40)
+-22 + j*(98)
+101 + j*(63)
+71 + j*(-103)
+-99 + j*(-73)
+-39 + j*(54)
+16 + j*(-78)
+-238 + j*(-69)
+-216 + j*(317)
+238 + j*(336)
+301 + j*(-74)
+30 + j*(-109)
+119 + j*(-5)
+102 + j*(-274)
+-336 + j*(-198)
+-234 + j*(338)
+317 + j*(203)
+107 + j*(-310)
+-373 + j*(9)
+39 + j*(494)
+548 + j*(83)
+259 + j*(-392)
+-59 + j*(-276)
+-50 + j*(-222)
+-245 + j*(-243)
+-345 + j*(76)
+-46 + j*(217)
+41 + j*(0)
+-101 + j*(28)
+41 + j*(107)
+47 + j*(-132)
+-296 + j*(-61)
+-186 + j*(387)
+322 + j*(310)
+317 + j*(-164)
+-23 + j*(-210)
+-63 + j*(-51)
+-68 + j*(-73)
+-175 + j*(40)
+-20 + j*(210)
+158 + j*(66)
+35 + j*(-66)
+-25 + j*(49)
+91 + j*(58)
+83 + j*(-30)
+75 + j*(-8)
+147 + j*(-103)
+-15 + j*(-257)
+-227 + j*(-94)
+-94 + j*(96)
+3 + j*(-42)
+-209 + j*(-49)
+-199 + j*(257)
+140 + j*(306)
+250 + j*(40)
+117 + j*(-65)
+97 + j*(-48)
+59 + j*(-125)
+-77 + j*(-87)
+-37 + j*(62)
+100 + j*(11)
+37 + j*(-114)
+-59 + j*(-43)
+25 + j*(4)
+25 + j*(-114)
+-153 + j*(-93)
+-145 + j*(137)
+109 + j*(171)
+191 + j*(-75)
+-13 + j*(-193)
+-144 + j*(-52)
+-71 + j*(59)
+-11 + j*(46)
+20 + j*(59)
+115 + j*(11)
+86 + j*(-164)
+-141 + j*(-180)
+-206 + j*(53)
+-4 + j*(141)
+72 + j*(-33)
+-84 + j*(-98)
+-161 + j*(37)
+-96 + j*(133)
+-21 + j*(173)
+110 + j*(175)
+214 + j*(13)
+74 + j*(-158)
+-111 + j*(-55)
+-28 + j*(112)
+115 + j*(41)
+57 + j*(-75)
+-24 + j*(-36)
+-1 + j*(-3)
+-20 + j*(-16)
+-31 + j*(53)
+78 + j*(77)
+124 + j*(-49)
+11 + j*(-101)
+-12 + j*(-10)
+84 + j*(-37)
+29 + j*(-175)
+-149 + j*(-140)
+-162 + j*(32)
+-39 + j*(63)
+-34 + j*(-16)
+-105 + j*(19)
+-59 + j*(109)
+41 + j*(71)
+3 + j*(-23)
+-98 + j*(30)
+-42 + j*(162)
+121 + j*(127)
+112 + j*(-46)
+-64 + j*(-49)
+-78 + j*(147)
+136 + j*(196)
+232 + j*(0)
+93 + j*(-115)
+-5 + j*(-24)
+59 + j*(53)
+144 + j*(33)
+218 + j*(-44)
+221 + j*(-222)
+6 + j*(-361)
+-238 + j*(-199)
+-153 + j*(69)
+88 + j*(24)
+55 + j*(-197)
+-150 + j*(-198)
+-190 + j*(-41)
+-102 + j*(-2)
+-101 + j*(-59)
+-194 + j*(-53)
+-261 + j*(78)
+-156 + j*(254)
+87 + j*(235)
+144 + j*(-18)
+-100 + j*(-113)
+-231 + j*(132)
+-11 + j*(312)
+197 + j*(161)
+122 + j*(-5)
+43 + j*(53)
+148 + j*(74)
+173 + j*(-95)
+-18 + j*(-148)
+-86 + j*(41)
+116 + j*(92)
+151 + j*(-148)
+-134 + j*(-187)
+-187 + j*(127)
+143 + j*(188)
+202 + j*(-142)
+-109 + j*(-194)
+-141 + j*(74)
+67 + j*(52)
+-37 + j*(-107)
+-177 + j*(85)
+66 + j*(231)
+214 + j*(-20)
+-19 + j*(-139)
+-97 + j*(74)
+100 + j*(126)
+143 + j*(-30)
+59 + j*(-60)
+67 + j*(-48)
+49 + j*(-99)
+-6 + j*(-85)
+2 + j*(-83)
+-78 + j*(-118)
+-170 + j*(35)
+22 + j*(202)
+261 + j*(16)
+144 + j*(-269)
+-115 + j*(-267)
+-222 + j*(-120)
+-230 + j*(24)
+-117 + j*(153)
+61 + j*(76)
+-21 + j*(-107)
+-218 + j*(6)
+-86 + j*(230)
+141 + j*(103)
+21 + j*(-98)
+-153 + j*(20)
+-58 + j*(168)
+37 + j*(133)
+56 + j*(142)
+192 + j*(128)
+230 + j*(-85)
+17 + j*(-165)
+-42 + j*(20)
+144 + j*(10)
+78 + j*(-226)
+-221 + j*(-146)
+-165 + j*(190)
+173 + j*(174)
+194 + j*(-137)
+-57 + j*(-189)
+-112 + j*(-10)
+4 + j*(12)
+-13 + j*(-78)
+-116 + j*(-51)
+-128 + j*(61)
+-35 + j*(141)
+119 + j*(104)
+158 + j*(-125)
+-125 + j*(-265)
+-395 + j*(30)
+-168 + j*(416)
+249 + j*(329)
+288 + j*(0)
+127 + j*(-76)
+122 + j*(-61)
+76 + j*(-166)
+-107 + j*(-134)
+-115 + j*(67)
+70 + j*(103)
+136 + j*(-47)
+35 + j*(-147)
+-89 + j*(-117)
+-135 + j*(0)
+-57 + j*(94)
+35 + j*(58)
+16 + j*(11)
+26 + j*(54)
+121 + j*(8)
+77 + j*(-132)
+-66 + j*(-115)
+-62 + j*(-21)
+-44 + j*(-54)
+-147 + j*(-11)
+-90 + j*(163)
+119 + j*(127)
+98 + j*(-64)
+-51 + j*(-28)
+23 + j*(93)
+136 + j*(-2)
+59 + j*(-98)
+25 + j*(-46)
+92 + j*(-109)
+-35 + j*(-244)
+-247 + j*(-124)
+-176 + j*(107)
+21 + j*(59)
+-58 + j*(-110)
+-253 + j*(-2)
+-168 + j*(241)
+71 + j*(222)
+96 + j*(59)
+28 + j*(57)
+93 + j*(68)
+86 + j*(-60)
+-78 + j*(-46)
+-54 + j*(137)
+134 + j*(111)
+105 + j*(-52)
+-15 + j*(-2)
+73 + j*(86)
+153 + j*(-13)
+109 + j*(-70)
+141 + j*(-113)
+49 + j*(-303)
+-291 + j*(-239)
+-296 + j*(175)
+111 + j*(217)
+139 + j*(-158)
+-216 + j*(-148)
+-193 + j*(179)
+64 + j*(148)
+-6 + j*(-11)
+-98 + j*(140)
+112 + j*(226)
+215 + j*(31)
+93 + j*(-42)
+110 + j*(34)
+212 + j*(-61)
+122 + j*(-230)
+-73 + j*(-220)
+-151 + j*(-72)
+-80 + j*(49)
+42 + j*(33)
+48 + j*(-71)
+-34 + j*(-74)
+-5 + j*(-15)
+45 + j*(-105)
+-96 + j*(-188)
+-226 + j*(-47)
+-139 + j*(88)
+-63 + j*(54)
+-95 + j*(61)
+-36 + j*(117)
+24 + j*(41)
+-85 + j*(0)
+-132 + j*(162)
+52 + j*(274)
+237 + j*(158)
+254 + j*(-29)
+160 + j*(-160)
+0 + j*(-185)
+-93 + j*(-59)
+9 + j*(45)
+118 + j*(-73)
+-11 + j*(-226)
+-217 + j*(-146)
+-233 + j*(57)
+-114 + j*(142)
+-49 + j*(125)
+-33 + j*(145)
+49 + j*(185)
+175 + j*(114)
+163 + j*(-51)
+4 + j*(-78)
+-24 + j*(78)
+165 + j*(107)
+232 + j*(-113)
+29 + j*(-233)
+-103 + j*(-90)
+-6 + j*(2)
+33 + j*(-94)
+-83 + j*(-117)
+-119 + j*(-3)
+-40 + j*(37)
+-17 + j*(-3)
+-37 + j*(-3)
+-30 + j*(6)
+-42 + j*(1)
+-52 + j*(42)
+6 + j*(63)
+35 + j*(1)
+-27 + j*(-25)
+-57 + j*(37)
+-6 + j*(85)
+65 + j*(64)
+93 + j*(-26)
+-6 + j*(-112)
+-162 + j*(-6)
+-62 + j*(223)
+232 + j*(156)
+214 + j*(-170)
+-101 + j*(-198)
+-153 + j*(74)
+57 + j*(127)
+87 + j*(-12)
+13 + j*(11)
+103 + j*(54)
+158 + j*(-85)
+23 + j*(-167)
+-68 + j*(-73)
+-16 + j*(6)
+66 + j*(-13)
+106 + j*(-112)
+16 + j*(-253)
+-206 + j*(-235)
+-287 + j*(-20)
+-161 + j*(94)
+-115 + j*(45)
+-179 + j*(110)
+-66 + j*(265)
+177 + j*(206)
+229 + j*(-56)
+29 + j*(-212)
+-180 + j*(-122)
+-211 + j*(67)
+-111 + j*(175)
+-7 + j*(196)
+98 + j*(174)
+173 + j*(52)
+76 + j*(-78)
+-70 + j*(-5)
+-7 + j*(144)
+130 + j*(100)
+120 + j*(18)
+137 + j*(25)
+191 + j*(-89)
+27 + j*(-209)
+-123 + j*(-37)
+49 + j*(95)
+144 + j*(-89)
+-53 + j*(-139)
+-40 + j*(62)
+180 + j*(-23)
+50 + j*(-293)
+-267 + j*(-175)
+-211 + j*(141)
+48 + j*(148)
+93 + j*(-32)
+-21 + j*(-88)
+-88 + j*(-21)
+-52 + j*(52)
+20 + j*(28)
+-15 + j*(-39)
+-94 + j*(19)
+-23 + j*(121)
+88 + j*(68)
+71 + j*(-22)
+28 + j*(-31)
+0 + j*(-36)
+-36 + j*(21)
+67 + j*(81)
+156 + j*(-72)
+-31 + j*(-177)
+-110 + j*(28)
+133 + j*(40)
+74 + j*(-280)
+-330 + j*(-195)
+-272 + j*(250)
+146 + j*(238)
+168 + j*(-88)
+-37 + j*(-124)
+-72 + j*(-48)
+-106 + j*(-19)
+-66 + j*(86)
+80 + j*(-11)
+-115 + j*(-216)
+-410 + j*(63)
+-127 + j*(443)
+249 + j*(223)
+89 + j*(-33)
+8 + j*(133)
+240 + j*(65)
+91 + j*(-233)
+-233 + j*(-70)
+-98 + j*(220)
+87 + j*(124)
+2 + j*(88)
+93 + j*(220)
+280 + j*(86)
+178 + j*(-92)
+82 + j*(-25)
+150 + j*(-11)
+131 + j*(-62)
+169 + j*(-24)
+284 + j*(-177)
+86 + j*(-409)
+-194 + j*(-261)
+-110 + j*(-54)
+-40 + j*(-146)
+-190 + j*(-113)
+-112 + j*(75)
+57 + j*(-34)
+-89 + j*(-157)
+-156 + j*(21)
+44 + j*(25)
+-8 + j*(-208)
+-265 + j*(-150)
+-250 + j*(71)
+-143 + j*(82)
+-176 + j*(101)
+-104 + j*(218)
+48 + j*(175)
+52 + j*(69)
+42 + j*(62)
+76 + j*(-13)
+-42 + j*(-117)
+-218 + j*(-21)
+-216 + j*(183)
+-65 + j*(296)
+95 + j*(268)
+155 + j*(155)
+118 + j*(115)
+166 + j*(144)
+257 + j*(42)
+170 + j*(-81)
+105 + j*(-21)
+202 + j*(-64)
+71 + j*(-257)
+-216 + j*(-83)
+-33 + j*(272)
+344 + j*(103)
+203 + j*(-236)
+-35 + j*(-91)
+180 + j*(45)
+285 + j*(-255)
+-16 + j*(-395)
+-144 + j*(-194)
+-54 + j*(-185)
+-204 + j*(-263)
+-358 + j*(-25)
+-134 + j*(192)
+87 + j*(17)
+-61 + j*(-190)
+-274 + j*(-67)
+-202 + j*(146)
+-24 + j*(114)
+-71 + j*(-14)
+-197 + j*(93)
+-50 + j*(267)
+165 + j*(129)
+54 + j*(-76)
+-102 + j*(35)
+39 + j*(137)
+101 + j*(-47)
+-115 + j*(-85)
+-144 + j*(139)
+53 + j*(161)
+45 + j*(17)
+-57 + j*(78)
+47 + j*(170)
+136 + j*(62)
+45 + j*(-3)
+9 + j*(91)
+122 + j*(133)
+210 + j*(30)
+152 + j*(-102)
+6 + j*(-80)
+28 + j*(83)
+249 + j*(54)
+253 + j*(-223)
+-12 + j*(-285)
+-82 + j*(-117)
+-32 + j*(-133)
+-198 + j*(-104)
+-148 + j*(222)
+318 + j*(199)
+364 + j*(-360)
+-198 + j*(-505)
+-407 + j*(-36)
+-81 + j*(146)
+15 + j*(-82)
+-185 + j*(-115)
+-231 + j*(62)
+-135 + j*(154)
+-32 + j*(180)
+85 + j*(121)
+83 + j*(-10)
+-6 + j*(-30)
+-6 + j*(5)
+-22 + j*(-37)
+-99 + j*(20)
+-8 + j*(119)
+107 + j*(-13)
+-62 + j*(-148)
+-233 + j*(29)
+-110 + j*(229)
+69 + j*(205)
+139 + j*(107)
+148 + j*(-12)
+15 + j*(-99)
+-117 + j*(44)
+35 + j*(213)
+230 + j*(81)
+153 + j*(-101)
+45 + j*(-81)
+46 + j*(-70)
+-18 + j*(-79)
+-33 + j*(27)
+107 + j*(33)
+115 + j*(-139)
+-54 + j*(-181)
+-138 + j*(-85)
+-167 + j*(-8)
+-170 + j*(141)
+24 + j*(254)
+207 + j*(93)
+97 + j*(-66)
+15 + j*(45)
+188 + j*(88)
+281 + j*(-124)
+144 + j*(-306)
+-56 + j*(-351)
+-270 + j*(-260)
+-339 + j*(7)
+-134 + j*(148)
+-58 + j*(4)
+-243 + j*(64)
+-98 + j*(387)
+372 + j*(268)
+358 + j*(-269)
+-140 + j*(-374)
+-326 + j*(1)
+-108 + j*(205)
+54 + j*(144)
+113 + j*(67)
+145 + j*(-55)
+17 + j*(-186)
+-179 + j*(-106)
+-173 + j*(105)
+6 + j*(173)
+120 + j*(52)
+62 + j*(-79)
+-54 + j*(-76)
+-91 + j*(-2)
+-81 + j*(37)
+-84 + j*(86)
+-18 + j*(156)
+94 + j*(109)
+66 + j*(1)
+-30 + j*(43)
+35 + j*(156)
+177 + j*(122)
+224 + j*(-8)
+184 + j*(-121)
+73 + j*(-189)
+-50 + j*(-130)
+-21 + j*(-18)
+64 + j*(-62)
+3 + j*(-136)
+-38 + j*(-88)
+1 + j*(-141)
+-177 + j*(-245)
+-417 + j*(-3)
+-223 + j*(356)
+144 + j*(274)
+133 + j*(2)
+-23 + j*(29)
+54 + j*(130)
+156 + j*(40)
+117 + j*(-54)
+80 + j*(-83)
+22 + j*(-125)
+-69 + j*(-81)
+-42 + j*(8)
+26 + j*(-35)
+-51 + j*(-103)
+-154 + j*(-21)
+-129 + j*(120)
+-1 + j*(198)
+175 + j*(153)
+254 + j*(-54)
+97 + j*(-231)
+-97 + j*(-167)
+-103 + j*(-42)
+-78 + j*(-31)
+-126 + j*(18)
+-64 + j*(139)
+108 + j*(125)
+172 + j*(-43)
+69 + j*(-180)
+-100 + j*(-182)
+-194 + j*(-36)
+-94 + j*(103)
+51 + j*(16)
+-61 + j*(-156)
+-307 + j*(-35)
+-250 + j*(295)
+100 + j*(351)
+247 + j*(54)
+11 + j*(-116)
+-156 + j*(104)
+71 + j*(301)
+324 + j*(105)
+209 + j*(-163)
+2 + j*(-124)
+25 + j*(-20)
+53 + j*(-74)
+-29 + j*(-71)
+-11 + j*(-1)
+18 + j*(-50)
+-83 + j*(-41)
+-61 + j*(117)
+119 + j*(110)
+141 + j*(-40)
+78 + j*(-63)
+103 + j*(-100)
+-4 + j*(-199)
+-146 + j*(-67)
+11 + j*(60)
+96 + j*(-160)
+-206 + j*(-229)
+-296 + j*(124)
+49 + j*(225)
+127 + j*(-81)
+-148 + j*(-121)
+-178 + j*(133)
+12 + j*(196)
+109 + j*(129)
+199 + j*(47)
+197 + j*(-168)
+-59 + j*(-260)
+-194 + j*(-43)
+-33 + j*(56)
+-24 + j*(-89)
+-209 + j*(-33)
+-154 + j*(204)
+91 + j*(205)
+155 + j*(6)
+28 + j*(-95)
+-91 + j*(-32)
+-73 + j*(102)
+71 + j*(110)
+86 + j*(-47)
+-96 + j*(-49)
+-97 + j*(175)
+162 + j*(208)
+236 + j*(-28)
+86 + j*(-104)
+83 + j*(-31)
+144 + j*(-143)
+-41 + j*(-261)
+-227 + j*(-84)
+-100 + j*(122)
+78 + j*(37)
+5 + j*(-104)
+-107 + j*(-34)
+-36 + j*(46)
+-1 + j*(-52)
+-163 + j*(-68)
+-221 + j*(161)
+13 + j*(306)
+222 + j*(154)
+190 + j*(-35)
+95 + j*(-87)
+23 + j*(-92)
+-39 + j*(-25)
+51 + j*(57)
+160 + j*(-88)
+-40 + j*(-257)
+-277 + j*(-37)
+-72 + j*(240)
+201 + j*(61)
+33 + j*(-181)
+-167 + j*(-4)
+23 + j*(164)
+177 + j*(-35)
+-9 + j*(-182)
+-146 + j*(-37)
+-55 + j*(64)
+-23 + j*(12)
+-80 + j*(59)
+23 + j*(174)
+213 + j*(78)
+189 + j*(-164)
+-45 + j*(-227)
+-160 + j*(-63)
+-71 + j*(49)
+1 + j*(5)
+-30 + j*(-38)
+-71 + j*(-27)
+-113 + j*(4)
+-131 + j*(110)
+4 + j*(221)
+197 + j*(117)
+167 + j*(-107)
+-25 + j*(-143)
+-84 + j*(-18)
+-26 + j*(17)
+-46 + j*(-12)
+-90 + j*(59)
+-5 + j*(156)
+136 + j*(110)
+164 + j*(-22)
+103 + j*(-94)
+66 + j*(-124)
+-8 + j*(-197)
+-194 + j*(-173)
+-287 + j*(54)
+-124 + j*(237)
+52 + j*(200)
+112 + j*(145)
+231 + j*(81)
+262 + j*(-181)
+-52 + j*(-349)
+-326 + j*(-77)
+-149 + j*(221)
+91 + j*(129)
+30 + j*(-11)
+-32 + j*(62)
+56 + j*(96)
+81 + j*(35)
+79 + j*(51)
+174 + j*(16)
+170 + j*(-146)
+-2 + j*(-214)
+-122 + j*(-100)
+-80 + j*(30)
+39 + j*(37)
+77 + j*(-76)
+-37 + j*(-143)
+-120 + j*(-40)
+-34 + j*(30)
+1 + j*(-59)
+-99 + j*(-75)
+-117 + j*(10)
+-101 + j*(12)
+-173 + j*(83)
+-59 + j*(276)
+235 + j*(181)
+185 + j*(-144)
+-124 + j*(-111)
+-71 + j*(191)
+264 + j*(134)
+277 + j*(-245)
+-90 + j*(-402)
+-404 + j*(-138)
+-311 + j*(268)
+90 + j*(347)
+272 + j*(21)
+45 + j*(-173)
+-86 + j*(-25)
+25 + j*(-8)
+-83 + j*(-120)
+-233 + j*(86)
+33 + j*(272)
+226 + j*(-22)
+-98 + j*(-202)
+-271 + j*(151)
+78 + j*(340)
+279 + j*(57)
+95 + j*(-117)
+-16 + j*(-28)
+-4 + j*(8)
+-40 + j*(69)
+78 + j*(198)
+313 + j*(81)
+272 + j*(-214)
+9 + j*(-281)
+-112 + j*(-127)
+-78 + j*(-23)
+-30 + j*(23)
+56 + j*(36)
+119 + j*(-63)
+35 + j*(-156)
+-47 + j*(-92)
+40 + j*(-49)
+76 + j*(-214)
+-148 + j*(-326)
+-365 + j*(-142)
+-317 + j*(88)
+-206 + j*(148)
+-161 + j*(208)
+-7 + j*(267)
+136 + j*(120)
+17 + j*(-25)
+-86 + j*(106)
+84 + j*(185)
+154 + j*(1)
+-25 + j*(-38)
+-8 + j*(156)
+233 + j*(115)
+233 + j*(-157)
+8 + j*(-231)
+-100 + j*(-129)
+-130 + j*(-64)
+-159 + j*(37)
+-62 + j*(146)
+66 + j*(83)
+18 + j*(-22)
+-67 + j*(44)
+8 + j*(146)
+142 + j*(98)
+158 + j*(-36)
+64 + j*(-110)
+-27 + j*(-71)
+-23 + j*(11)
+54 + j*(26)
+107 + j*(-57)
+52 + j*(-185)
+-147 + j*(-221)
+-330 + j*(-16)
+-221 + j*(300)
+131 + j*(345)
+312 + j*(74)
+192 + j*(-150)
+23 + j*(-168)
+-71 + j*(-105)
+-102 + j*(1)
+-19 + j*(91)
+97 + j*(45)
+91 + j*(-66)
+22 + j*(-88)
+5 + j*(-83)
+-33 + j*(-119)
+-137 + j*(-95)
+-184 + j*(43)
+-74 + j*(170)
+91 + j*(133)
+119 + j*(-13)
+25 + j*(-51)
+32 + j*(11)
+110 + j*(-62)
+6 + j*(-186)
+-143 + j*(-97)
+-69 + j*(28)
+4 + j*(-74)
+-153 + j*(-144)
+-278 + j*(28)
+-190 + j*(209)
+-28 + j*(267)
+151 + j*(206)
+205 + j*(-18)
+-10 + j*(-141)
+-157 + j*(59)
+28 + j*(205)
+158 + j*(63)
+80 + j*(-13)
+98 + j*(9)
+91 + j*(-105)
+-86 + j*(-76)
+-18 + j*(132)
+211 + j*(1)
+16 + j*(-245)
+-234 + j*(1)
+52 + j*(231)
+251 + j*(-89)
+-86 + j*(-255)
+-217 + j*(79)
+84 + j*(165)
+110 + j*(-91)
+-110 + j*(-47)
+-6 + j*(163)
+218 + j*(46)
+154 + j*(-189)
+-40 + j*(-220)
+-156 + j*(-128)
+-184 + j*(17)
+-69 + j*(131)
+78 + j*(55)
+26 + j*(-98)
+-136 + j*(-69)
+-156 + j*(100)
+-10 + j*(195)
+146 + j*(112)
+135 + j*(-62)
+-30 + j*(-98)
+-86 + j*(69)
+99 + j*(153)
+250 + j*(-33)
+122 + j*(-255)
+-124 + j*(-231)
+-188 + j*(-32)
+-55 + j*(51)
+-4 + j*(-64)
+-158 + j*(-104)
+-240 + j*(84)
+-83 + j*(220)
+44 + j*(142)
+14 + j*(95)
+55 + j*(151)
+163 + j*(98)
+175 + j*(-11)
+154 + j*(-71)
+121 + j*(-178)
+-61 + j*(-245)
+-223 + j*(-83)
+-134 + j*(109)
+23 + j*(90)
+40 + j*(-26)
+-63 + j*(-75)
+-184 + j*(28)
+-112 + j*(262)
+214 + j*(273)
+328 + j*(-78)
+25 + j*(-257)
+-150 + j*(-34)
+-2 + j*(88)
+49 + j*(14)
+53 + j*(50)
+209 + j*(-34)
+84 + j*(-334)
+-343 + j*(-233)
+-317 + j*(254)
+139 + j*(308)
+239 + j*(-45)
+21 + j*(-132)
+0 + j*(-38)
+14 + j*(-110)
+-142 + j*(-103)
+-156 + j*(95)
+34 + j*(137)
+92 + j*(-17)
+-23 + j*(-77)
+-86 + j*(4)
+-31 + j*(71)
+35 + j*(28)
+-18 + j*(-49)
+-136 + j*(23)
+-76 + j*(206)
+143 + j*(209)
+216 + j*(33)
+142 + j*(-41)
+165 + j*(-47)
+182 + j*(-200)
+-25 + j*(-333)
+-278 + j*(-192)
+-284 + j*(89)
+-81 + j*(228)
+116 + j*(163)
+187 + j*(-5)
+106 + j*(-158)
+-52 + j*(-189)
+-170 + j*(-98)
+-185 + j*(35)
+-110 + j*(132)
+-6 + j*(145)
+54 + j*(98)
+74 + j*(59)
+112 + j*(23)
+127 + j*(-89)
+-16 + j*(-196)
+-223 + j*(-80)
+-173 + j*(192)
+114 + j*(220)
+196 + j*(-34)
+-5 + j*(-118)
+-51 + j*(45)
+115 + j*(42)
+88 + j*(-138)
+-77 + j*(-112)
+-34 + j*(0)
+28 + j*(-119)
+-189 + j*(-197)
+-359 + j*(57)
+-176 + j*(310)
+58 + j*(261)
+83 + j*(140)
+59 + j*(148)
+132 + j*(187)
+263 + j*(144)
+366 + j*(-21)
+301 + j*(-267)
+38 + j*(-374)
+-177 + j*(-218)
+-143 + j*(-13)
+6 + j*(8)
+45 + j*(-118)
+-83 + j*(-208)
+-263 + j*(-126)
+-303 + j*(107)
+-120 + j*(285)
+124 + j*(221)
+164 + j*(6)
+16 + j*(-66)
+-30 + j*(45)
+92 + j*(52)
+81 + j*(-104)
+-105 + j*(-95)
+-105 + j*(107)
+95 + j*(117)
+110 + j*(-64)
+-30 + j*(-69)
+-7 + j*(24)
+49 + j*(-38)
+-51 + j*(-72)
+-76 + j*(49)
+45 + j*(69)
+59 + j*(-28)
+1 + j*(-32)
+18 + j*(-15)
+1 + j*(-49)
+-28 + j*(1)
+68 + j*(8)
+63 + j*(-148)
+-140 + j*(-156)
+-158 + j*(49)
+18 + j*(35)
+-69 + j*(-136)
+-291 + j*(12)
+-151 + j*(303)
+156 + j*(231)
+154 + j*(-16)
+4 + j*(-32)
+25 + j*(35)
+49 + j*(-44)
+-81 + j*(-60)
+-117 + j*(100)
+45 + j*(158)
+107 + j*(18)
+-14 + j*(-22)
+-25 + j*(106)
+119 + j*(108)
+124 + j*(-33)
+1 + j*(-24)
+39 + j*(105)
+204 + j*(71)
+243 + j*(-117)
+103 + j*(-262)
+-107 + j*(-233)
+-186 + j*(-18)
+9 + j*(117)
+169 + j*(-78)
+-38 + j*(-264)
+-255 + j*(-65)
+-93 + j*(146)
+71 + j*(24)
+-35 + j*(-64)
+-45 + j*(53)
+103 + j*(7)
+45 + j*(-185)
+-169 + j*(-179)
+-259 + j*(-13)
+-221 + j*(146)
+-75 + j*(259)
+122 + j*(190)
+117 + j*(1)
+-24 + j*(11)
+30 + j*(129)
+163 + j*(53)
+115 + j*(-79)
+39 + j*(-78)
+24 + j*(-94)
+-67 + j*(-115)
+-146 + j*(-1)
+-71 + j*(117)
+44 + j*(117)
+119 + j*(50)
+122 + j*(-75)
+-22 + j*(-142)
+-129 + j*(-4)
+-5 + j*(119)
+114 + j*(24)
+69 + j*(-62)
+50 + j*(-61)
+43 + j*(-132)
+-81 + j*(-155)
+-127 + j*(-49)
+-80 + j*(-35)
+-148 + j*(-53)
+-191 + j*(80)
+-61 + j*(153)
+-11 + j*(72)
+-51 + j*(94)
+46 + j*(123)
+75 + j*(-23)
+-107 + j*(-56)
+-169 + j*(133)
+-46 + j*(234)
+39 + j*(260)
+209 + j*(301)
+429 + j*(98)
+305 + j*(-234)
+-11 + j*(-199)
+-4 + j*(39)
+181 + j*(17)
+167 + j*(-130)
+95 + j*(-141)
+110 + j*(-161)
+57 + j*(-264)
+-107 + j*(-279)
+-221 + j*(-151)
+-187 + j*(2)
+-64 + j*(31)
+-30 + j*(-67)
+-136 + j*(-105)
+-219 + j*(-16)
+-222 + j*(110)
+-134 + j*(257)
+118 + j*(292)
+275 + j*(26)
+51 + j*(-173)
+-101 + j*(43)
+176 + j*(127)
+243 + j*(-247)
+-187 + j*(-356)
+-349 + j*(45)
+-35 + j*(218)
+104 + j*(-2)
+-42 + j*(-104)
+-130 + j*(-30)
+-140 + j*(59)
+-53 + j*(153)
+100 + j*(58)
+-21 + j*(-139)
+-265 + j*(11)
+-124 + j*(286)
+123 + j*(177)
+21 + j*(18)
+-54 + j*(158)
+110 + j*(206)
+146 + j*(98)
+148 + j*(144)
+346 + j*(78)
+331 + j*(-241)
+21 + j*(-313)
+-62 + j*(-134)
+-5 + j*(-163)
+-192 + j*(-202)
+-315 + j*(64)
+-100 + j*(282)
+128 + j*(213)
+204 + j*(84)
+226 + j*(-52)
+133 + j*(-189)
+-13 + j*(-185)
+-60 + j*(-127)
+-117 + j*(-110)
+-192 + j*(11)
+-81 + j*(163)
+76 + j*(117)
+71 + j*(33)
+98 + j*(65)
+218 + j*(-32)
+136 + j*(-245)
+-103 + j*(-230)
+-140 + j*(-43)
+-17 + j*(-5)
+2 + j*(-107)
+-103 + j*(-146)
+-204 + j*(-68)
+-201 + j*(74)
+-77 + j*(156)
+43 + j*(87)
+18 + j*(-26)
+-78 + j*(-23)
+-92 + j*(71)
+-6 + j*(110)
+65 + j*(51)
+54 + j*(-28)
+3 + j*(-69)
+-63 + j*(-95)
+-188 + j*(-63)
+-260 + j*(119)
+-112 + j*(305)
+105 + j*(266)
+153 + j*(124)
+122 + j*(88)
+158 + j*(67)
+161 + j*(-8)
+119 + j*(-23)
+158 + j*(-27)
+180 + j*(-141)
+59 + j*(-246)
+-91 + j*(-214)
+-161 + j*(-121)
+-182 + j*(-28)
+-158 + j*(57)
+-108 + j*(107)
+-62 + j*(150)
+40 + j*(182)
+164 + j*(95)
+141 + j*(-78)
+-38 + j*(-122)
+-150 + j*(40)
+-28 + j*(221)
+210 + j*(173)
+235 + j*(-68)
+36 + j*(-117)
+44 + j*(62)
+269 + j*(-25)
+148 + j*(-341)
+-221 + j*(-246)
+-154 + j*(107)
+140 + j*(24)
+11 + j*(-214)
+-194 + j*(-41)
+-2 + j*(136)
+152 + j*(-42)
+34 + j*(-159)
+0 + j*(-144)
+-70 + j*(-254)
+-342 + j*(-173)
+-310 + j*(194)
+59 + j*(204)
+55 + j*(-135)
+-282 + j*(-95)
+-249 + j*(260)
+87 + j*(286)
+177 + j*(19)
+3 + j*(-105)
+-130 + j*(-4)
+-79 + j*(127)
+51 + j*(107)
+32 + j*(-21)
+-107 + j*(11)
+-69 + j*(170)
+93 + j*(142)
+66 + j*(13)
+-25 + j*(60)
+45 + j*(134)
+104 + j*(72)
+62 + j*(64)
+124 + j*(116)
+233 + j*(27)
+179 + j*(-120)
+54 + j*(-121)
+39 + j*(-40)
+120 + j*(-28)
+174 + j*(-146)
+57 + j*(-303)
+-192 + j*(-267)
+-262 + j*(-21)
+-100 + j*(103)
+-4 + j*(28)
+-45 + j*(-1)
+-27 + j*(39)
+15 + j*(4)
+-26 + j*(-27)
+-45 + j*(16)
+-8 + j*(23)
+-14 + j*(3)
+-22 + j*(30)
+24 + j*(40)
+49 + j*(-11)
+18 + j*(-54)
+-32 + j*(-62)
+-83 + j*(-26)
+-80 + j*(49)
+-13 + j*(76)
+18 + j*(38)
+1 + j*(34)
+29 + j*(61)
+78 + j*(30)
+78 + j*(-23)
+62 + j*(-53)
+33 + j*(-89)
+-33 + j*(-95)
+-72 + j*(-38)
+-35 + j*(1)
+-16 + j*(-37)
+-78 + j*(-54)
+-124 + j*(26)
+-56 + j*(110)
+44 + j*(68)
+13 + j*(-25)
+-82 + j*(21)
+-27 + j*(143)
+125 + j*(108)
+138 + j*(-32)
+62 + j*(-75)
+40 + j*(-86)
+-35 + j*(-128)
+-145 + j*(-28)
+-37 + j*(131)
+164 + j*(13)
+54 + j*(-241)
+-240 + j*(-185)
+-275 + j*(87)
+-105 + j*(175)
+-54 + j*(129)
+-41 + j*(175)
+83 + j*(185)
+124 + j*(48)
+2 + j*(26)
+26 + j*(180)
+254 + j*(150)
+280 + j*(-119)
+47 + j*(-206)
+-38 + j*(-61)
+35 + j*(-46)
+-37 + j*(-86)
+-65 + j*(52)
+115 + j*(58)
+78 + j*(-153)
+-162 + j*(-54)
+6 + j*(223)
+328 + j*(5)
+98 + j*(-344)
+-228 + j*(-127)
+-13 + j*(134)
+175 + j*(-97)
+-51 + j*(-226)
+-109 + j*(-45)
+19 + j*(-105)
+-165 + j*(-229)
+-330 + j*(17)
+-105 + j*(196)
+25 + j*(25)
+-117 + j*(-30)
+-136 + j*(91)
+-75 + j*(111)
+-64 + j*(157)
+81 + j*(193)
+156 + j*(-6)
+-69 + j*(-76)
+-107 + j*(180)
+178 + j*(200)
+199 + j*(-71)
+-4 + j*(-74)
+49 + j*(42)
+105 + j*(-75)
+-48 + j*(-87)
+-8 + j*(64)
+129 + j*(-42)
+-34 + j*(-173)
+-140 + j*(16)
+51 + j*(69)
+30 + j*(-128)
+-188 + j*(-42)
+-73 + j*(185)
+127 + j*(80)
+44 + j*(-42)
+45 + j*(36)
+153 + j*(-95)
+-71 + j*(-272)
+-311 + j*(-13)
+-74 + j*(242)
+141 + j*(32)
+-62 + j*(-125)
+-179 + j*(77)
+-16 + j*(167)
+16 + j*(71)
+-38 + j*(141)
+119 + j*(219)
+250 + j*(59)
+155 + j*(-83)
+79 + j*(-50)
+105 + j*(-57)
+56 + j*(-115)
+-28 + j*(-63)
+15 + j*(38)
+155 + j*(28)
+233 + j*(-149)
+82 + j*(-362)
+-228 + j*(-315)
+-295 + j*(-9)
+-49 + j*(83)
+-19 + j*(-139)
+-301 + j*(-110)
+-281 + j*(252)
+97 + j*(297)
+186 + j*(-23)
+-48 + j*(-92)
+-55 + j*(87)
+105 + j*(33)
+14 + j*(-136)
+-166 + j*(-42)
+-105 + j*(145)
+69 + j*(142)
+126 + j*(14)
+69 + j*(-76)
+-10 + j*(-82)
+-33 + j*(-52)
+-43 + j*(-77)
+-158 + j*(-76)
+-227 + j*(112)
+-27 + j*(276)
+199 + j*(119)
+109 + j*(-119)
+-103 + j*(-88)
+-129 + j*(78)
+-34 + j*(158)
+71 + j*(153)
+141 + j*(63)
+81 + j*(-21)
+36 + j*(50)
+183 + j*(53)
+187 + j*(-201)
+-153 + j*(-245)
+-253 + j*(144)
+149 + j*(292)
+339 + j*(-86)
+25 + j*(-294)
+-154 + j*(-68)
+-1 + j*(33)
+15 + j*(-88)
+-103 + j*(-47)
+-32 + j*(57)
+37 + j*(-40)
+-107 + j*(-82)
+-166 + j*(107)
+23 + j*(222)
+186 + j*(107)
+190 + j*(-50)
+103 + j*(-158)
+-57 + j*(-165)
+-136 + j*(8)
+44 + j*(134)
+214 + j*(-54)
+40 + j*(-269)
+-199 + j*(-137)
+-110 + j*(89)
+91 + j*(24)
+50 + j*(-169)
+-138 + j*(-184)
+-230 + j*(-40)
+-163 + j*(98)
+-31 + j*(94)
+-35 + j*(-19)
+-166 + j*(23)
+-93 + j*(205)
+140 + j*(119)
+37 + j*(-144)
+-257 + j*(-19)
+-130 + j*(305)
+187 + j*(207)
+112 + j*(-46)
+-50 + j*(41)
+73 + j*(127)
+92 + j*(-15)
+-51 + j*(43)
+88 + j*(204)
+276 + j*(23)
+107 + j*(-150)
+25 + j*(11)
+241 + j*(-28)
+145 + j*(-346)
+-242 + j*(-277)
+-223 + j*(87)
+62 + j*(66)
+-9 + j*(-175)
+-272 + j*(-85)
+-260 + j*(204)
+-30 + j*(338)
+209 + j*(269)
+321 + j*(43)
+205 + j*(-158)
+29 + j*(-143)
+21 + j*(-46)
+69 + j*(-63)
+43 + j*(-95)
+40 + j*(-97)
+26 + j*(-156)
+-83 + j*(-180)
+-163 + j*(-90)
+-137 + j*(-2)
+-98 + j*(28)
+-65 + j*(42)
+-40 + j*(33)
+-45 + j*(40)
+2 + j*(71)
+71 + j*(3)
+12 + j*(-86)
+-49 + j*(-52)
+-18 + j*(-75)
+-158 + j*(-172)
+-394 + j*(39)
+-216 + j*(417)
+215 + j*(356)
+267 + j*(-4)
+39 + j*(-91)
+-21 + j*(19)
+14 + j*(40)
+23 + j*(61)
+95 + j*(56)
+98 + j*(-49)
+4 + j*(-43)
+59 + j*(7)
+77 + j*(-148)
+-192 + j*(-173)
+-273 + j*(172)
+69 + j*(319)
+239 + j*(54)
+88 + j*(-60)
+86 + j*(-1)
+102 + j*(-127)
+-129 + j*(-129)
+-141 + j*(173)
+198 + j*(213)
+281 + j*(-101)
+58 + j*(-202)
+4 + j*(-91)
+53 + j*(-126)
+-39 + j*(-185)
+-129 + j*(-119)
+-148 + j*(-39)
+-126 + j*(63)
+30 + j*(96)
+95 + j*(-108)
+-163 + j*(-204)
+-314 + j*(91)
+-50 + j*(296)
+163 + j*(134)
+129 + j*(0)
+139 + j*(-59)
+47 + j*(-234)
+-250 + j*(-158)
+-202 + j*(202)
+178 + j*(155)
+110 + j*(-235)
+-288 + j*(-155)
+-218 + j*(224)
+96 + j*(153)
+-20 + j*(-86)
+-237 + j*(98)
+-28 + j*(359)
+277 + j*(214)
+241 + j*(-70)
+39 + j*(-107)
+-6 + j*(23)
+114 + j*(50)
+146 + j*(-100)
+-25 + j*(-165)
+-116 + j*(1)
+40 + j*(86)
+90 + j*(-74)
+-91 + j*(-78)
+-48 + j*(143)
+234 + j*(71)
+175 + j*(-279)
+-200 + j*(-285)
+-286 + j*(40)
+-75 + j*(151)
+-17 + j*(57)
+-71 + j*(105)
+59 + j*(202)
+235 + j*(68)
+175 + j*(-158)
+-39 + j*(-190)
+-136 + j*(-37)
+-61 + j*(75)
+27 + j*(76)
+87 + j*(53)
+165 + j*(-28)
+125 + j*(-212)
+-119 + j*(-264)
+-262 + j*(-40)
+-106 + j*(139)
+42 + j*(45)
+-30 + j*(-46)
+-74 + j*(23)
+-8 + j*(40)
+-19 + j*(-18)
+-76 + j*(11)
+-53 + j*(69)
+-13 + j*(94)
+71 + j*(114)
+192 + j*(-9)
+81 + j*(-239)
+-222 + j*(-189)
+-243 + j*(119)
+6 + j*(170)
+20 + j*(-16)
+-153 + j*(39)
+-67 + j*(248)
+168 + j*(204)
+190 + j*(6)
+79 + j*(-42)
+55 + j*(11)
+116 + j*(11)
+151 + j*(-91)
+37 + j*(-217)
+-189 + j*(-141)
+-180 + j*(150)
+139 + j*(216)
+272 + j*(-98)
+0 + j*(-273)
+-162 + j*(-72)
+-13 + j*(18)
+-18 + j*(-144)
+-253 + j*(-80)
+-201 + j*(224)
+119 + j*(223)
+158 + j*(-62)
+-76 + j*(-111)
+-123 + j*(72)
+-8 + j*(115)
+5 + j*(85)
+42 + j*(146)
+187 + j*(103)
+190 + j*(-75)
+51 + j*(-117)
+18 + j*(-45)
+43 + j*(-53)
+4 + j*(-48)
+48 + j*(8)
+132 + j*(-81)
+28 + j*(-197)
+-75 + j*(-110)
+22 + j*(-79)
+-21 + j*(-257)
+-312 + j*(-221)
+-363 + j*(127)
+-65 + j*(267)
+102 + j*(74)
+8 + j*(-53)
+-57 + j*(-21)
+-49 + j*(-23)
+-98 + j*(-45)
+-168 + j*(1)
+-192 + j*(103)
+-134 + j*(218)
+10 + j*(260)
+124 + j*(185)
+151 + j*(85)
+132 + j*(1)
+42 + j*(-52)
+-50 + j*(34)
+49 + j*(156)
+209 + j*(53)
+132 + j*(-117)
+2 + j*(-72)
+53 + j*(-21)
+35 + j*(-124)
+-127 + j*(-79)
+-94 + j*(112)
+71 + j*(101)
+65 + j*(6)
+58 + j*(45)
+162 + j*(-21)
+55 + j*(-196)
+-175 + j*(-70)
+-47 + j*(199)
+252 + j*(92)
+190 + j*(-209)
+-69 + j*(-199)
+-71 + j*(-8)
+73 + j*(-34)
+11 + j*(-181)
+-168 + j*(-110)
+-112 + j*(105)
+133 + j*(71)
+139 + j*(-204)
+-138 + j*(-275)
+-276 + j*(-60)
+-179 + j*(93)
+-94 + j*(119)
+18 + j*(148)
+162 + j*(6)
+26 + j*(-228)
+-247 + j*(-132)
+-196 + j*(110)
+-56 + j*(52)
+-201 + j*(25)
+-186 + j*(303)
+185 + j*(322)
+255 + j*(-55)
+-76 + j*(-139)
+-141 + j*(135)
+88 + j*(190)
+140 + j*(19)
+35 + j*(-28)
+-6 + j*(30)
+34 + j*(95)
+163 + j*(86)
+219 + j*(-117)
+-15 + j*(-264)
+-230 + j*(-56)
+-86 + j*(169)
+83 + j*(84)
+21 + j*(7)
+28 + j*(96)
+162 + j*(54)
+146 + j*(-94)
+45 + j*(-119)
+13 + j*(-106)
+-49 + j*(-112)
+-103 + j*(-21)
+-24 + j*(58)
+58 + j*(6)
+44 + j*(-64)
+-5 + j*(-103)
+-108 + j*(-93)
+-155 + j*(63)
+35 + j*(171)
+190 + j*(-23)
+7 + j*(-206)
+-175 + j*(-45)
+-35 + j*(121)
+113 + j*(-3)
+18 + j*(-146)
+-119 + j*(-103)
+-148 + j*(11)
+-88 + j*(97)
+18 + j*(88)
+26 + j*(-2)
+-47 + j*(23)
+50 + j*(112)
+197 + j*(-47)
+23 + j*(-272)
+-256 + j*(-141)
+-197 + j*(119)
+-28 + j*(103)
+-75 + j*(49)
+-61 + j*(182)
+146 + j*(168)
+223 + j*(-352)
+-117 + j*(-362)
+-214 + j*(-116)
+-118 + j*(-18)
+-79 + j*(3)
+4 + j*(16)
+34 + j*(-110)
+-133 + j*(-130)
+-123 + j*(67)
+101 + j*(-2)
+-35 + j*(-277)
+-377 + j*(-114)
+-243 + j*(260)
+86 + j*(173)
+13 + j*(-74)
+-164 + j*(1)
+-120 + j*(128)
+-76 + j*(166)
+41 + j*(252)
+271 + j*(109)
+152 + j*(-218)
+-205 + j*(-132)
+-139 + j*(202)
+138 + j*(141)
+63 + j*(-48)
+-29 + j*(73)
+163 + j*(103)
+194 + j*(-156)
+-71 + j*(-252)
+-256 + j*(-65)
+-218 + j*(179)
+21 + j*(313)
+284 + j*(127)
+158 + j*(-184)
+-140 + j*(-66)
+32 + j*(200)
+288 + j*(-52)
+-25 + j*(-322)
+-303 + j*(11)
+8 + j*(266)
+199 + j*(1)
+-21 + j*(-95)
+-13 + j*(100)
+170 + j*(16)
+52 + j*(-146)
+-64 + j*(-15)
+80 + j*(44)
+100 + j*(-100)
+-12 + j*(-95)
+40 + j*(-29)
+87 + j*(-139)
+-32 + j*(-217)
+-127 + j*(-185)
+-219 + j*(-163)
+-351 + j*(-13)
+-260 + j*(244)
+8 + j*(251)
+52 + j*(61)
+-82 + j*(55)
+-55 + j*(198)
+103 + j*(207)
+172 + j*(102)
+163 + j*(34)
+175 + j*(-6)
+187 + j*(-92)
+112 + j*(-191)
+-13 + j*(-187)
+-48 + j*(-117)
+-37 + j*(-129)
+-129 + j*(-146)
+-194 + j*(-21)
+-95 + j*(64)
+-56 + j*(-2)
+-133 + j*(26)
+-59 + j*(139)
+74 + j*(41)
+-53 + j*(-100)
+-219 + j*(56)
+-78 + j*(266)
+144 + j*(188)
+136 + j*(12)
+25 + j*(2)
+35 + j*(95)
+173 + j*(95)
+249 + j*(-93)
+69 + j*(-274)
+-174 + j*(-158)
+-117 + j*(83)
+91 + j*(48)
+60 + j*(-139)
+-109 + j*(-133)
+-146 + j*(-28)
+-153 + j*(18)
+-174 + j*(133)
+-21 + j*(262)
+191 + j*(147)
+131 + j*(-84)
+-91 + j*(-60)
+-91 + j*(168)
+141 + j*(219)
+254 + j*(37)
+179 + j*(-83)
+151 + j*(-97)
+132 + j*(-204)
+-59 + j*(-262)
+-197 + j*(-70)
+-52 + j*(82)
+57 + j*(-21)
+-24 + j*(-64)
+4 + j*(2)
+58 + j*(-95)
+-100 + j*(-137)
+-112 + j*(71)
+148 + j*(45)
+110 + j*(-274)
+-224 + j*(-282)
+-287 + j*(-44)
+-231 + j*(-8)
+-341 + j*(89)
+-217 + j*(372)
+134 + j*(326)
+149 + j*(50)
+1 + j*(65)
+110 + j*(130)
+159 + j*(-41)
+-1 + j*(-98)
+-35 + j*(-6)
+-40 + j*(-34)
+-161 + j*(46)
+-49 + j*(272)
+239 + j*(190)
+215 + j*(-86)
+18 + j*(-94)
+22 + j*(13)
+71 + j*(-9)
+58 + j*(-19)
+90 + j*(-33)
+60 + j*(-100)
+-13 + j*(-57)
+71 + j*(-2)
+117 + j*(-132)
+-30 + j*(-194)
+-86 + j*(-75)
+-5 + j*(-81)
+-77 + j*(-177)
+-211 + j*(-114)
+-216 + j*(12)
+-179 + j*(95)
+-92 + j*(181)
+43 + j*(148)
+42 + j*(47)
+11 + j*(85)
+128 + j*(83)
+135 + j*(-89)
+-26 + j*(-108)
+-13 + j*(-4)
+34 + j*(-100)
+-165 + j*(-124)
+-202 + j*(153)
+97 + j*(221)
+173 + j*(-41)
+-33 + j*(-90)
+-23 + j*(67)
+114 + j*(-3)
+16 + j*(-141)
+-141 + j*(-59)
+-120 + j*(104)
+6 + j*(171)
+139 + j*(124)
+180 + j*(-7)
+117 + j*(-78)
+108 + j*(-89)
+84 + j*(-193)
+-108 + j*(-221)
+-190 + j*(-8)
+10 + j*(79)
+62 + j*(-123)
+-175 + j*(-160)
+-235 + j*(95)
+-3 + j*(199)
+134 + j*(30)
+48 + j*(-132)
+-129 + j*(-153)
+-287 + j*(-12)
+-277 + j*(249)
+-39 + j*(432)
+274 + j*(365)
+433 + j*(85)
+322 + j*(-204)
+59 + j*(-260)
+-57 + j*(-103)
+18 + j*(-27)
+33 + j*(-77)
+-15 + j*(-50)
+49 + j*(-8)
+103 + j*(-109)
+4 + j*(-202)
+-118 + j*(-167)
+-178 + j*(-77)
+-171 + j*(42)
+-45 + j*(113)
+62 + j*(-1)
+-47 + j*(-123)
+-185 + j*(-22)
+-116 + j*(124)
+4 + j*(99)
+1 + j*(15)
+-64 + j*(18)
+-69 + j*(95)
+28 + j*(132)
+93 + j*(33)
+-4 + j*(-34)
+-49 + j*(76)
+84 + j*(90)
+58 + j*(-60)
+-105 + j*(33)
+72 + j*(223)
+306 + j*(-32)
+3 + j*(-308)
+-298 + j*(17)
+28 + j*(320)
+315 + j*(13)
+51 + j*(-237)
+-146 + j*(-25)
+-1 + j*(113)
+62 + j*(49)
+73 + j*(97)
+251 + j*(71)
+310 + j*(-189)
+95 + j*(-368)
+-134 + j*(-315)
+-258 + j*(-168)
+-263 + j*(39)
+-74 + j*(165)
+98 + j*(18)
+-33 + j*(-171)
+-260 + j*(-57)
+-216 + j*(215)
+39 + j*(288)
+199 + j*(135)
+175 + j*(-11)
+128 + j*(-47)
+139 + j*(-87)
+107 + j*(-184)
+-12 + j*(-233)
+-125 + j*(-194)
+-191 + j*(-104)
+-168 + j*(8)
+-58 + j*(2)
+-112 + j*(-141)
+-364 + j*(-62)
+-354 + j*(296)
+-7 + j*(395)
+122 + j*(168)
+4 + j*(133)
+89 + j*(241)
+245 + j*(127)
+202 + j*(-16)
+177 + j*(-44)
+158 + j*(-179)
+-78 + j*(-233)
+-194 + j*(-3)
+-25 + j*(98)
+-21 + j*(-19)
+-141 + j*(86)
+23 + j*(247)
+190 + j*(107)
+105 + j*(16)
+142 + j*(83)
+241 + j*(-56)
+65 + j*(-168)
+5 + j*(20)
+246 + j*(1)
+198 + j*(-315)
+-134 + j*(-306)
+-176 + j*(-57)
+-74 + j*(-21)
+-92 + j*(25)
+76 + j*(118)
+253 + j*(-148)
+-59 + j*(-423)
+-412 + j*(-146)
+-233 + j*(209)
+33 + j*(124)
+-13 + j*(-18)
+-54 + j*(36)
+2 + j*(25)
+-38 + j*(-10)
+-30 + j*(65)
+95 + j*(10)
+16 + j*(-184)
+-251 + j*(-123)
+-256 + j*(179)
+20 + j*(262)
+134 + j*(60)
+3 + j*(-25)
+-24 + j*(76)
+87 + j*(51)
+25 + j*(-78)
+-124 + j*(8)
+-28 + j*(175)
+152 + j*(83)
+81 + j*(-86)
+-64 + j*(-41)
+-49 + j*(65)
+-4 + j*(88)
+44 + j*(122)
+156 + j*(86)
+158 + j*(-56)
+40 + j*(-72)
+57 + j*(4)
+123 + j*(-68)
+23 + j*(-143)
+-40 + j*(-57)
+34 + j*(-45)
+-11 + j*(-144)
+-154 + j*(-81)
+-125 + j*(83)
+10 + j*(102)
+62 + j*(28)
+48 + j*(-32)
+-8 + j*(-69)
+-83 + j*(-17)
+-49 + j*(91)
+76 + j*(95)
+133 + j*(-16)
+76 + j*(-117)
+-46 + j*(-124)
+-100 + j*(-6)
+15 + j*(78)
+121 + j*(-42)
+18 + j*(-172)
+-105 + j*(-120)
+-112 + j*(-68)
+-171 + j*(-49)
+-202 + j*(98)
+-40 + j*(182)
+48 + j*(47)
+-74 + j*(1)
+-91 + j*(130)
+13 + j*(153)
+28 + j*(134)
+112 + j*(191)
+283 + j*(66)
+190 + j*(-181)
+-50 + j*(-140)
+-25 + j*(47)
+116 + j*(8)
+77 + j*(-105)
+-1 + j*(-88)
+-8 + j*(-64)
+-26 + j*(-51)
+-6 + j*(-22)
+13 + j*(-75)
+-98 + j*(-91)
+-134 + j*(87)
+96 + j*(171)
+262 + j*(-78)
+49 + j*(-341)
+-283 + j*(-235)
+-309 + j*(95)
+-49 + j*(218)
+96 + j*(40)
+-30 + j*(-72)
+-94 + j*(37)
+9 + j*(51)
+-33 + j*(-47)
+-124 + j*(53)
+39 + j*(127)
+79 + j*(-116)
+-263 + j*(-139)
+-325 + j*(289)
+103 + j*(416)
+244 + j*(88)
+29 + j*(35)
+117 + j*(213)
+332 + j*(40)
+176 + j*(-206)
+-27 + j*(-109)
+34 + j*(4)
+69 + j*(-52)
+26 + j*(-38)
+86 + j*(-21)
+98 + j*(-133)
+-35 + j*(-187)
+-146 + j*(-99)
+-163 + j*(30)
+-75 + j*(153)
+102 + j*(144)
+151 + j*(-22)
+29 + j*(-74)
+21 + j*(30)
+142 + j*(8)
+147 + j*(-128)
+60 + j*(-193)
+-25 + j*(-213)
+-138 + j*(-165)
+-137 + j*(-36)
+-25 + j*(-57)
+-117 + j*(-185)
+-313 + j*(-41)
+-186 + j*(215)
+73 + j*(129)
+10 + j*(-91)
+-188 + j*(-33)
+-156 + j*(150)
+-1 + j*(170)
+66 + j*(65)
+9 + j*(-28)
+-105 + j*(-4)
+-117 + j*(129)
+7 + j*(177)
+62 + j*(92)
+2 + j*(70)
+-1 + j*(146)
+91 + j*(202)
+249 + j*(173)
+368 + j*(-40)
+200 + j*(-308)
+-124 + j*(-233)
+-95 + j*(58)
+148 + j*(-4)
+25 + j*(-247)
+-243 + j*(-95)
+-110 + j*(173)
+111 + j*(69)
+13 + j*(-80)
+-71 + j*(30)
+45 + j*(75)
+62 + j*(-25)
+-4 + j*(-7)
+66 + j*(32)
+112 + j*(-86)
+-21 + j*(-180)
+-173 + j*(-95)
+-192 + j*(79)
+-62 + j*(213)
+132 + j*(177)
+175 + j*(3)
+57 + j*(-47)
+61 + j*(55)
+217 + j*(21)
+240 + j*(-191)
+69 + j*(-334)
+-145 + j*(-303)
+-267 + j*(-139)
+-214 + j*(37)
+-87 + j*(57)
+-81 + j*(0)
+-100 + j*(49)
+-11 + j*(47)
+-57 + j*(-75)
+-234 + j*(18)
+-134 + j*(261)
+125 + j*(190)
+74 + j*(-13)
+-49 + j*(70)
+92 + j*(134)
+115 + j*(-39)
+-58 + j*(3)
+84 + j*(188)
+326 + j*(-57)
+28 + j*(-380)
+-365 + j*(-95)
+-148 + j*(321)
+235 + j*(210)
+224 + j*(-69)
+118 + j*(-110)
+112 + j*(-178)
+-54 + j*(-281)
+-257 + j*(-122)
+-157 + j*(101)
+25 + j*(32)
+-56 + j*(-122)
+-231 + j*(-43)
+-213 + j*(147)
+-79 + j*(205)
+-19 + j*(182)
+27 + j*(203)
+136 + j*(184)
+176 + j*(63)
+98 + j*(25)
+138 + j*(98)
+284 + j*(-20)
+152 + j*(-266)
+-157 + j*(-163)
+-75 + j*(167)
+272 + j*(98)
+243 + j*(-262)
+-79 + j*(-310)
+-180 + j*(-104)
+-121 + j*(-22)
+-129 + j*(17)
+-73 + j*(122)
+73 + j*(115)
+127 + j*(-4)
+89 + j*(-89)
+13 + j*(-136)
+-88 + j*(-99)
+-75 + j*(14)
+24 + j*(-11)
+-43 + j*(-105)
+-148 + j*(16)
+12 + j*(148)
+184 + j*(-37)
+13 + j*(-256)
+-235 + j*(-158)
+-253 + j*(63)
+-132 + j*(175)
+7 + j*(188)
+121 + j*(86)
+82 + j*(-61)
+-48 + j*(-65)
+-71 + j*(22)
+-37 + j*(45)
+-30 + j*(61)
+25 + j*(79)
+67 + j*(5)
+-13 + j*(-47)
+-65 + j*(34)
+18 + j*(83)
+67 + j*(-1)
+-18 + j*(-66)
+-122 + j*(-3)
+-121 + j*(146)
+42 + j*(250)
+243 + j*(139)
+220 + j*(-100)
+18 + j*(-141)
+-32 + j*(-6)
+63 + j*(11)
+41 + j*(-72)
+-39 + j*(-31)
+7 + j*(40)
+64 + j*(-4)
+33 + j*(-47)
+13 + j*(-38)
+-11 + j*(-57)
+-86 + j*(-13)
+-52 + j*(140)
+160 + j*(158)
+261 + j*(-52)
+122 + j*(-205)
+4 + j*(-161)
+17 + j*(-146)
+-57 + j*(-216)
+-218 + j*(-132)
+-185 + j*(71)
+6 + j*(81)
+26 + j*(-89)
+-151 + j*(-119)
+-225 + j*(56)
+-95 + j*(184)
+45 + j*(132)
+45 + j*(26)
+-18 + j*(23)
+0 + j*(76)
+54 + j*(44)
+15 + j*(1)
+-4 + j*(78)
+135 + j*(101)
+208 + j*(-83)
+43 + j*(-216)
+-100 + j*(-126)
+-80 + j*(-51)
+-107 + j*(-56)
+-152 + j*(42)
+-45 + j*(132)
+49 + j*(54)
+0 + j*(1)
+0 + j*(45)
+58 + j*(7)
+15 + j*(-72)
+-64 + j*(-62)
+-104 + j*(-23)
+-142 + j*(49)
+-80 + j*(156)
+31 + j*(118)
+-28 + j*(48)
+-75 + j*(192)
+141 + j*(274)
+272 + j*(69)
+136 + j*(-35)
+148 + j*(63)
+301 + j*(-52)
+177 + j*(-295)
+-89 + j*(-259)
+-163 + j*(-65)
+-95 + j*(74)
+64 + j*(137)
+232 + j*(-18)
+102 + j*(-238)
+-108 + j*(-122)
+47 + j*(31)
+162 + j*(-208)
+-146 + j*(-344)
+-315 + j*(-50)
+-107 + j*(96)
+-50 + j*(-24)
+-119 + j*(23)
+-1 + j*(54)
+-10 + j*(-113)
+-206 + j*(-80)
+-172 + j*(90)
+-112 + j*(31)
+-278 + j*(105)
+-152 + j*(428)
+272 + j*(356)
+274 + j*(-40)
+-8 + j*(-49)
+43 + j*(140)
+188 + j*(39)
+100 + j*(-66)
+71 + j*(-19)
+104 + j*(-89)
+-40 + j*(-136)
+-99 + j*(35)
+70 + j*(86)
+100 + j*(-71)
+-41 + j*(-81)
+-35 + j*(41)
+64 + j*(29)
+54 + j*(-48)
+4 + j*(-39)
+16 + j*(-15)
+30 + j*(-28)
+23 + j*(-38)
+37 + j*(-33)
+69 + j*(-82)
+5 + j*(-177)
+-146 + j*(-139)
+-141 + j*(26)
+6 + j*(3)
+-82 + j*(-157)
+-302 + j*(-16)
+-176 + j*(260)
+77 + j*(187)
+21 + j*(42)
+0 + j*(155)
+213 + j*(106)
+161 + j*(-171)
+-105 + j*(-142)
+-74 + j*(41)
+-6 + j*(-48)
+-200 + j*(-20)
+-127 + j*(281)
+233 + j*(215)
+174 + j*(-139)
+-139 + j*(-53)
+-16 + j*(238)
+275 + j*(110)
+204 + j*(-158)
+18 + j*(-156)
+-12 + j*(-95)
+-54 + j*(-97)
+-115 + j*(-15)
+-56 + j*(88)
+47 + j*(91)
+103 + j*(29)
+100 + j*(-44)
+52 + j*(-76)
+48 + j*(-64)
+62 + j*(-144)
+-107 + j*(-223)
+-295 + j*(-20)
+-124 + j*(269)
+211 + j*(180)
+210 + j*(-136)
+-30 + j*(-187)
+-75 + j*(-37)
+23 + j*(-43)
+-26 + j*(-152)
+-160 + j*(-112)
+-173 + j*(-1)
+-141 + j*(27)
+-179 + j*(72)
+-134 + j*(211)
+62 + j*(235)
+153 + j*(57)
+18 + j*(-49)
+-91 + j*(59)
+-9 + j*(190)
+154 + j*(190)
+287 + j*(50)
+264 + j*(-194)
+-6 + j*(-338)
+-285 + j*(-137)
+-204 + j*(201)
+122 + j*(242)
+264 + j*(-21)
+90 + j*(-225)
+-133 + j*(-137)
+-104 + j*(73)
+94 + j*(60)
+81 + j*(-141)
+-124 + j*(-130)
+-107 + j*(52)
+30 + j*(-14)
+-123 + j*(-132)
+-267 + j*(105)
+-4 + j*(286)
+173 + j*(42)
+-68 + j*(-75)
+-126 + j*(203)
+191 + j*(258)
+284 + j*(-37)
+79 + j*(-140)
+24 + j*(-43)
+53 + j*(-62)
+-16 + j*(-51)
+40 + j*(43)
+168 + j*(-70)
+23 + j*(-254)
+-206 + j*(-125)
+-115 + j*(107)
+86 + j*(30)
+-8 + j*(-153)
+-216 + j*(-48)
+-146 + j*(204)
+122 + j*(213)
+206 + j*(-9)
+70 + j*(-124)
+-12 + j*(-57)
+35 + j*(-30)
+35 + j*(-92)
+-35 + j*(-102)
+-54 + j*(-55)
+-30 + j*(-59)
+-64 + j*(-103)
+-161 + j*(-87)
+-221 + j*(37)
+-135 + j*(186)
+44 + j*(175)
+94 + j*(25)
+1 + j*(-35)
+-40 + j*(4)
+-54 + j*(4)
+-107 + j*(71)
+4 + j*(193)
+194 + j*(51)
+24 + j*(-204)
+-309 + j*(-17)
+-148 + j*(399)
+307 + j*(319)
+320 + j*(-84)
+30 + j*(-134)
+13 + j*(58)
+161 + j*(40)
+166 + j*(-69)
+151 + j*(-122)
+107 + j*(-256)
+-153 + j*(-310)
+-333 + j*(-22)
+-107 + j*(238)
+148 + j*(95)
+56 + j*(-95)
+-53 + j*(-16)
+44 + j*(20)
+18 + j*(-106)
+-148 + j*(-36)
+-59 + j*(171)
+180 + j*(93)
+134 + j*(-147)
+-69 + j*(-138)
+-74 + j*(8)
+19 + j*(6)
+6 + j*(-56)
+-35 + j*(-47)
+-35 + j*(-32)
+-45 + j*(-34)
+-56 + j*(-30)
+-88 + j*(-30)
+-137 + j*(29)
+-98 + j*(129)
+4 + j*(142)
+40 + j*(108)
+86 + j*(119)
+192 + j*(45)
+163 + j*(-137)
+-23 + j*(-178)
+-109 + j*(-47)
+-45 + j*(38)
+23 + j*(16)
+29 + j*(-38)
+-18 + j*(-78)
+-82 + j*(-54)
+-97 + j*(-8)
+-124 + j*(24)
+-136 + j*(148)
+54 + j*(250)
+238 + j*(50)
+54 + j*(-159)
+-132 + j*(24)
+81 + j*(172)
+197 + j*(-84)
+-91 + j*(-178)
+-169 + j*(130)
+138 + j*(212)
+238 + j*(-50)
+71 + j*(-148)
+27 + j*(-93)
+21 + j*(-141)
+-101 + j*(-151)
+-175 + j*(-35)
+-143 + j*(88)
+-20 + j*(175)
+168 + j*(91)
+126 + j*(-157)
+-150 + j*(-144)
+-145 + j*(139)
+122 + j*(133)
+107 + j*(-90)
+-35 + j*(-45)
+81 + j*(3)
+63 + j*(-230)
+-289 + j*(-218)
+-350 + j*(189)
+14 + j*(330)
+170 + j*(72)
+-1 + j*(-24)
+-21 + j*(124)
+160 + j*(117)
+177 + j*(-96)
+-41 + j*(-163)
+-151 + j*(40)
+27 + j*(177)
+166 + j*(32)
+45 + j*(-67)
+13 + j*(75)
+225 + j*(71)
+252 + j*(-197)
+13 + j*(-288)
+-76 + j*(-163)
+-52 + j*(-177)
+-203 + j*(-203)
+-318 + j*(5)
+-170 + j*(200)
+23 + j*(168)
+77 + j*(37)
+5 + j*(-57)
+-119 + j*(-8)
+-84 + j*(159)
+120 + j*(156)
+163 + j*(-39)
+38 + j*(-105)
+2 + j*(-85)
+-69 + j*(-130)
+-208 + j*(-8)
+-69 + j*(190)
+144 + j*(28)
+-67 + j*(-190)
+-315 + j*(65)
+-78 + j*(351)
+194 + j*(199)
+129 + j*(35)
+116 + j*(79)
+212 + j*(-13)
+105 + j*(-165)
+-42 + j*(-103)
+-18 + j*(-26)
+-33 + j*(-53)
+-98 + j*(36)
+28 + j*(151)
+187 + j*(27)
+95 + j*(-152)
+-76 + j*(-102)
+-53 + j*(45)
+81 + j*(30)
+79 + j*(-110)
+-73 + j*(-139)
+-142 + j*(-1)
+-56 + j*(91)
+11 + j*(70)
+44 + j*(74)
+137 + j*(27)
+115 + j*(-141)
+-91 + j*(-153)
+-125 + j*(53)
+66 + j*(93)
+107 + j*(-72)
+-11 + j*(-115)
+-41 + j*(-74)
+-77 + j*(-88)
+-153 + j*(-8)
+-74 + j*(104)
+13 + j*(44)
+-59 + j*(32)
+12 + j*(166)
+238 + j*(53)
+144 + j*(-252)
+-177 + j*(-214)
+-190 + j*(52)
+-13 + j*(71)
+-35 + j*(-33)
+-102 + j*(30)
+-28 + j*(89)
+14 + j*(33)
+-23 + j*(18)
+-9 + j*(43)
+12 + j*(16)
+-22 + j*(-2)
+-42 + j*(20)
+-49 + j*(36)
+-61 + j*(78)
+-13 + j*(137)
+71 + j*(127)
+106 + j*(69)
+105 + j*(23)
+86 + j*(-14)
+47 + j*(-19)
+42 + j*(12)
+81 + j*(4)
+81 + j*(-41)
+54 + j*(-64)
+29 + j*(-87)
+-44 + j*(-96)
+-117 + j*(-6)
+-57 + j*(128)
+97 + j*(144)
+198 + j*(35)
+192 + j*(-114)
+61 + j*(-221)
+-120 + j*(-144)
+-91 + j*(68)
+144 + j*(69)
+187 + j*(-185)
+-45 + j*(-290)
+-186 + j*(-134)
+-126 + j*(-23)
+-78 + j*(-33)
+-77 + j*(-47)
+-109 + j*(-83)
+-236 + j*(-37)
+-226 + j*(202)
+79 + j*(271)
+223 + j*(-45)
+-52 + j*(-234)
+-246 + j*(-39)
+-148 + j*(95)
+-148 + j*(66)
+-197 + j*(212)
+18 + j*(345)
+206 + j*(161)
+88 + j*(6)
+4 + j*(106)
+112 + j*(158)
+176 + j*(88)
+209 + j*(41)
+247 + j*(-77)
+134 + j*(-211)
+-4 + j*(-175)
+-25 + j*(-144)
+-153 + j*(-154)
+-265 + j*(98)
+23 + j*(327)
+317 + j*(71)
+131 + j*(-193)
+-20 + j*(-42)
+173 + j*(-32)
+96 + j*(-317)
+-264 + j*(-239)
+-225 + j*(116)
+62 + j*(96)
+35 + j*(-115)
+-110 + j*(-95)
+-129 + j*(-40)
+-211 + j*(5)
+-209 + j*(233)
+86 + j*(327)
+258 + j*(68)
+91 + j*(-89)
+32 + j*(23)
+170 + j*(-24)
+79 + j*(-250)
+-222 + j*(-204)
+-284 + j*(109)
+-35 + j*(264)
+156 + j*(127)
+106 + j*(-33)
+9 + j*(1)
+76 + j*(74)
+187 + j*(-17)
+138 + j*(-182)
+-18 + j*(-234)
+-148 + j*(-174)
+-220 + j*(-49)
+-185 + j*(90)
+-85 + j*(149)
+-6 + j*(161)
+112 + j*(158)
+230 + j*(0)
+107 + j*(-209)
+-117 + j*(-146)
+-82 + j*(18)
+-1 + j*(-53)
+-151 + j*(-81)
+-170 + j*(132)
+49 + j*(147)
+28 + j*(-42)
+-135 + j*(54)
+24 + j*(213)
+176 + j*(22)
+-32 + j*(-86)
+-86 + j*(156)
+201 + j*(181)
+238 + j*(-119)
+-22 + j*(-173)
+-73 + j*(19)
+60 + j*(59)
+112 + j*(-21)
+105 + j*(-103)
+6 + j*(-199)
+-177 + j*(-119)
+-129 + j*(101)
+83 + j*(54)
+-2 + j*(-140)
+-205 + j*(7)
+-2 + j*(243)
+291 + j*(10)
+77 + j*(-358)
+-356 + j*(-235)
+-397 + j*(187)
+-103 + j*(388)
+156 + j*(310)
+265 + j*(131)
+234 + j*(-39)
+114 + j*(-98)
+68 + j*(-42)
+121 + j*(-46)
+118 + j*(-134)
+43 + j*(-175)
+-6 + j*(-183)
+-94 + j*(-211)
+-239 + j*(-127)
+-238 + j*(78)
+-62 + j*(156)
+25 + j*(55)
+-22 + j*(17)
+-8 + j*(59)
+60 + j*(25)
+52 + j*(-66)
+-31 + j*(-122)
+-165 + j*(-97)
+-246 + j*(84)
+-81 + j*(274)
+169 + j*(173)
+129 + j*(-61)
+-41 + j*(-42)
+-1 + j*(53)
+28 + j*(-37)
+-127 + j*(-18)
+-95 + j*(196)
+140 + j*(185)
+142 + j*(-6)
+23 + j*(27)
+132 + j*(103)
+218 + j*(-57)
+79 + j*(-162)
+8 + j*(-87)
+34 + j*(-99)
+-49 + j*(-119)
+-70 + j*(-13)
+31 + j*(-25)
+-42 + j*(-132)
+-174 + j*(-13)
+-49 + j*(132)
+66 + j*(23)
+-40 + j*(-21)
+-6 + j*(108)
+163 + j*(21)
+55 + j*(-175)
+-128 + j*(-65)
+-13 + j*(71)
+65 + j*(-69)
+-99 + j*(-96)
+-74 + j*(76)
+100 + j*(-28)
+-100 + j*(-233)
+-386 + j*(34)
+-129 + j*(409)
+279 + j*(222)
+163 + j*(-144)
+-134 + j*(-53)
+-40 + j*(199)
+188 + j*(122)
+153 + j*(-63)
+43 + j*(-46)
+86 + j*(-2)
+121 + j*(-87)
+28 + j*(-152)
+-52 + j*(-89)
+-8 + j*(-25)
+50 + j*(-85)
+-23 + j*(-180)
+-165 + j*(-146)
+-204 + j*(-16)
+-154 + j*(54)
+-144 + j*(88)
+-98 + j*(173)
+43 + j*(182)
+98 + j*(55)
+8 + j*(6)
+-11 + j*(95)
+104 + j*(115)
+175 + j*(6)
+135 + j*(-130)
+-28 + j*(-204)
+-218 + j*(-63)
+-127 + j*(205)
+177 + j*(165)
+170 + j*(-130)
+-81 + j*(-122)
+-25 + j*(62)
+99 + j*(-93)
+-175 + j*(-198)
+-305 + j*(164)
+71 + j*(327)
+210 + j*(6)
+-46 + j*(-25)
+81 + j*(217)
+372 + j*(-47)
+49 + j*(-410)
+-353 + j*(-103)
+-105 + j*(274)
+185 + j*(89)
+45 + j*(-71)
+21 + j*(68)
+194 + j*(-9)
+76 + j*(-224)
+-145 + j*(-120)
+-81 + j*(67)
+43 + j*(45)
+63 + j*(8)
+141 + j*(-40)
+125 + j*(-245)
+-159 + j*(-333)
+-387 + j*(-76)
+-262 + j*(242)
+52 + j*(285)
+228 + j*(51)
+97 + j*(-194)
+-165 + j*(-156)
+-192 + j*(86)
+6 + j*(148)
+72 + j*(6)
+-21 + j*(-44)
+-42 + j*(8)
+-21 + j*(-8)
+-69 + j*(-26)
+-122 + j*(25)
+-125 + j*(115)
+-47 + j*(216)
+127 + j*(212)
+209 + j*(37)
+93 + j*(-69)
+43 + j*(0)
+126 + j*(-35)
+35 + j*(-187)
+-184 + j*(-109)
+-168 + j*(132)
+25 + j*(175)
+89 + j*(71)
+62 + j*(46)
+91 + j*(54)
+129 + j*(8)
+129 + j*(-59)
+84 + j*(-127)
+-25 + j*(-149)
+-112 + j*(-56)
+-74 + j*(61)
+32 + j*(75)
+75 + j*(9)
+45 + j*(-30)
+35 + j*(-6)
+99 + j*(-19)
+99 + j*(-148)
+-78 + j*(-198)
+-180 + j*(-15)
+-16 + j*(105)
+88 + j*(-45)
+-67 + j*(-121)
+-122 + j*(45)
+47 + j*(96)
+112 + j*(-54)
+18 + j*(-138)
+-59 + j*(-147)
+-173 + j*(-126)
+-249 + j*(50)
+-78 + j*(206)
+102 + j*(76)
+4 + j*(-79)
+-115 + j*(8)
+-25 + j*(96)
+45 + j*(4)
+-52 + j*(-67)
+-154 + j*(13)
+-117 + j*(154)
+38 + j*(181)
+104 + j*(40)
+-29 + j*(-26)
+-80 + j*(121)
+78 + j*(172)
+119 + j*(44)
+52 + j*(59)
+178 + j*(81)
+203 + j*(-158)
+-105 + j*(-211)
+-176 + j*(105)
+100 + j*(158)
+86 + j*(-57)
+-78 + j*(70)
+170 + j*(234)
+381 + j*(-73)
+115 + j*(-324)
+-103 + j*(-158)
+-21 + j*(-47)
+-13 + j*(-86)
+-24 + j*(-48)
+26 + j*(-95)
+-98 + j*(-156)
+-170 + j*(23)
+34 + j*(74)
+33 + j*(-156)
+-228 + j*(-105)
+-163 + j*(162)
+49 + j*(91)
+-55 + j*(-23)
+-78 + j*(143)
+136 + j*(117)
+88 + j*(-100)
+-74 + j*(-24)
+45 + j*(58)
+47 + j*(-107)
+-160 + j*(-49)
+-60 + j*(171)
+133 + j*(49)
+-1 + j*(-78)
+-38 + j*(78)
+146 + j*(24)
+27 + j*(-180)
+-169 + j*(-9)
+54 + j*(150)
+183 + j*(-133)
+-143 + j*(-261)
+-291 + j*(56)
+-34 + j*(204)
+76 + j*(14)
+-81 + j*(-49)
+-136 + j*(98)
+-8 + j*(189)
+109 + j*(116)
+85 + j*(4)
+-1 + j*(27)
+54 + j*(110)
+161 + j*(28)
+81 + j*(-88)
+-9 + j*(-13)
+81 + j*(32)
+89 + j*(-84)
+-42 + j*(-56)
+25 + j*(90)
+211 + j*(2)
+165 + j*(-228)
+-50 + j*(-291)
+-224 + j*(-180)
+-269 + j*(36)
+-84 + j*(199)
+123 + j*(67)
+13 + j*(-132)
+-170 + j*(-20)
+-52 + j*(141)
+76 + j*(28)
+-49 + j*(-59)
+-116 + j*(81)
+17 + j*(170)
+146 + j*(95)
+168 + j*(-48)
+49 + j*(-161)
+-111 + j*(-78)
+-35 + j*(81)
+108 + j*(-36)
+-85 + j*(-177)
+-255 + j*(91)
+52 + j*(313)
+323 + j*(22)
+112 + j*(-261)
+-116 + j*(-156)
+-99 + j*(-52)
+-137 + j*(-53)
+-193 + j*(76)
+-76 + j*(194)
+32 + j*(173)
+106 + j*(176)
+270 + j*(93)
+274 + j*(-181)
+8 + j*(-296)
+-151 + j*(-134)
+-101 + j*(-42)
+-129 + j*(-54)
+-191 + j*(64)
+-76 + j*(199)
+84 + j*(156)
+115 + j*(51)
+105 + j*(1)
+103 + j*(-62)
+23 + j*(-135)
+-111 + j*(-93)
+-134 + j*(71)
+18 + j*(165)
+168 + j*(69)
+170 + j*(-89)
+86 + j*(-190)
+-62 + j*(-257)
+-286 + j*(-156)
+-298 + j*(162)
+30 + j*(271)
+175 + j*(-34)
+-128 + j*(-179)
+-298 + j*(134)
+-25 + j*(361)
+221 + j*(213)
+233 + j*(49)
+245 + j*(-49)
+184 + j*(-243)
+-98 + j*(-312)
+-303 + j*(-71)
+-190 + j*(200)
+52 + j*(226)
+160 + j*(67)
+76 + j*(-42)
+1 + j*(37)
+141 + j*(112)
+286 + j*(-86)
+103 + j*(-325)
+-180 + j*(-226)
+-165 + j*(12)
+-15 + j*(30)
+-6 + j*(-50)
+-42 + j*(-57)
+-66 + j*(-71)
+-141 + j*(-52)
+-167 + j*(64)
+-81 + j*(138)
+-5 + j*(130)
+53 + j*(117)
+122 + j*(42)
+70 + j*(-81)
+-72 + j*(-55)
+-62 + j*(87)
+76 + j*(93)
+98 + j*(-37)
+-18 + j*(-68)
+-57 + j*(47)
+69 + j*(101)
+165 + j*(-36)
+36 + j*(-178)
+-132 + j*(-77)
+-51 + j*(88)
+105 + j*(7)
+21 + j*(-148)
+-135 + j*(-89)
+-132 + j*(34)
+-95 + j*(84)
+-34 + j*(168)
+147 + j*(148)
+190 + j*(-71)
+-7 + j*(-144)
+-42 + j*(10)
+92 + j*(-43)
+-45 + j*(-206)
+-257 + j*(-30)
+-90 + j*(206)
+115 + j*(66)
+-11 + j*(-71)
+-69 + j*(61)
+85 + j*(42)
+-3 + j*(-151)
+-255 + j*(-30)
+-164 + j*(272)
+136 + j*(253)
+180 + j*(23)
+35 + j*(-36)
+-21 + j*(70)
+77 + j*(161)
+246 + j*(105)
+296 + j*(-127)
+86 + j*(-293)
+-139 + j*(-175)
+-122 + j*(16)
+-23 + j*(62)
+29 + j*(76)
+148 + j*(69)
+228 + j*(-103)
+88 + j*(-265)
+-78 + j*(-213)
+-85 + j*(-136)
+-115 + j*(-165)
+-247 + j*(-107)
+-253 + j*(92)
+-76 + j*(185)
+58 + j*(76)
+3 + j*(-54)
+-125 + j*(-25)
+-125 + j*(115)
+2 + j*(161)
+76 + j*(91)
+89 + j*(49)
+140 + j*(-18)
+88 + j*(-181)
+-148 + j*(-204)
+-255 + j*(20)
+-112 + j*(158)
+-23 + j*(98)
+-56 + j*(100)
+-4 + j*(156)
+62 + j*(124)
+68 + j*(116)
+159 + j*(119)
+223 + j*(-42)
+63 + j*(-168)
+-75 + j*(-52)
+-2 + j*(51)
+45 + j*(11)
+22 + j*(23)
+86 + j*(39)
+112 + j*(-45)
+52 + j*(-62)
+90 + j*(-48)
+91 + j*(-175)
+-97 + j*(-210)
+-167 + j*(-32)
+-47 + j*(19)
+-75 + j*(-48)
+-134 + j*(64)
+28 + j*(141)
+114 + j*(-26)
+-23 + j*(-104)
+-72 + j*(-25)
+-67 + j*(-39)
+-186 + j*(16)
+-132 + j*(243)
+148 + j*(263)
+255 + j*(40)
+181 + j*(-93)
+116 + j*(-193)
+-99 + j*(-260)
+-295 + j*(-11)
+-73 + j*(253)
+186 + j*(70)
+24 + j*(-122)
+-80 + j*(49)
+122 + j*(68)
+71 + j*(-155)
+-151 + j*(-36)
+57 + j*(177)
+284 + j*(-136)
+-108 + j*(-418)
+-460 + j*(-14)
+-102 + j*(373)
+259 + j*(76)
+0 + j*(-238)
+-278 + j*(4)
+-77 + j*(258)
+132 + j*(125)
+50 + j*(5)
+30 + j*(89)
+156 + j*(59)
+136 + j*(-91)
+25 + j*(-89)
+60 + j*(-50)
+67 + j*(-173)
+-136 + j*(-235)
+-296 + j*(-33)
+-186 + j*(202)
+47 + j*(213)
+152 + j*(32)
+25 + j*(-130)
+-182 + j*(-38)
+-134 + j*(219)
+156 + j*(234)
+235 + j*(-38)
+19 + j*(-140)
+-61 + j*(23)
+84 + j*(67)
+126 + j*(-87)
+-25 + j*(-165)
+-162 + j*(-55)
+-124 + j*(133)
+90 + j*(179)
+211 + j*(-38)
+13 + j*(-212)
+-182 + j*(-48)
+-60 + j*(128)
+51 + j*(36)
+-46 + j*(10)
+-1 + j*(147)
+177 + j*(74)
+106 + j*(-110)
+-42 + j*(-34)
+55 + j*(71)
+138 + j*(-32)
+71 + j*(-79)
+117 + j*(-62)
+138 + j*(-248)
+-153 + j*(-356)
+-378 + j*(-59)
+-158 + j*(226)
+103 + j*(93)
+21 + j*(-108)
+-128 + j*(-50)
+-100 + j*(57)
+-52 + j*(62)
+-37 + j*(88)
+56 + j*(103)
+120 + j*(-14)
+18 + j*(-119)
+-86 + j*(-52)
+-49 + j*(19)
+-28 + j*(-16)
+-78 + j*(4)
+-28 + j*(66)
+40 + j*(-21)
+-94 + j*(-110)
+-235 + j*(46)
+-122 + j*(244)
+82 + j*(224)
+149 + j*(86)
+103 + j*(-18)
+2 + j*(-36)
+-35 + j*(56)
+57 + j*(84)
+52 + j*(-11)
+-54 + j*(59)
+101 + j*(197)
+290 + j*(-27)
+21 + j*(-250)
+-200 + j*(57)
+144 + j*(256)
+317 + j*(-111)
+-35 + j*(-231)
+-62 + j*(93)
+255 + j*(8)
+97 + j*(-315)
+-196 + j*(-134)
+-5 + j*(62)
+65 + j*(-169)
+-229 + j*(-138)
+-146 + j*(197)
+177 + j*(89)
+48 + j*(-173)
+-131 + j*(-8)
+79 + j*(94)
+136 + j*(-148)
+-89 + j*(-189)
+-98 + j*(-37)
+-33 + j*(-115)
+-235 + j*(-156)
+-340 + j*(135)
+-59 + j*(346)
+229 + j*(163)
+170 + j*(-139)
+-100 + j*(-177)
+-182 + j*(55)
+35 + j*(134)
+83 + j*(-104)
+-205 + j*(-132)
+-235 + j*(199)
+92 + j*(236)
+101 + j*(-49)
+-137 + j*(12)
+4 + j*(226)
+203 + j*(23)
+-34 + j*(-153)
+-190 + j*(95)
+35 + j*(227)
+117 + j*(71)
+25 + j*(83)
+146 + j*(158)
+243 + j*(-14)
+93 + j*(-117)
+33 + j*(-8)
+132 + j*(-5)
+119 + j*(-95)
+81 + j*(-100)
+89 + j*(-154)
+-29 + j*(-220)
+-136 + j*(-104)
+-52 + j*(-29)
+-68 + j*(-131)
+-256 + j*(-42)
+-174 + j*(246)
+167 + j*(237)
+245 + j*(-77)
+22 + j*(-215)
+-128 + j*(-107)
+-121 + j*(9)
+-64 + j*(64)
+8 + j*(53)
+4 + j*(-2)
+-37 + j*(31)
+57 + j*(78)
+134 + j*(-76)
+-64 + j*(-196)
+-221 + j*(20)
+-8 + j*(187)
+134 + j*(-31)
+-113 + j*(-128)
+-178 + j*(175)
+181 + j*(239)
+266 + j*(-146)
+-107 + j*(-251)
+-209 + j*(91)
+103 + j*(182)
+199 + j*(-104)
+-37 + j*(-228)
+-179 + j*(-75)
+-117 + j*(39)
+-67 + j*(19)
+-123 + j*(6)
+-182 + j*(136)
+-29 + j*(314)
+270 + j*(224)
+297 + j*(-118)
+5 + j*(-243)
+-147 + j*(-53)
+-59 + j*(62)
+-13 + j*(42)
+6 + j*(65)
+78 + j*(22)
+16 + j*(-84)
+-120 + j*(-11)
+-54 + j*(141)
+86 + j*(102)
+69 + j*(6)
+18 + j*(23)
+39 + j*(59)
+78 + j*(63)
+129 + j*(35)
+130 + j*(-42)
+67 + j*(-43)
+124 + j*(16)
+233 + j*(-110)
+101 + j*(-299)
+-107 + j*(-228)
+-93 + j*(-87)
+-44 + j*(-103)
+-73 + j*(-93)
+-12 + j*(-100)
+-74 + j*(-272)
+-402 + j*(-230)
+-477 + j*(182)
+-138 + j*(373)
+49 + j*(196)
+-4 + j*(135)
+72 + j*(177)
+160 + j*(41)
+48 + j*(-70)
+-42 + j*(-15)
+-48 + j*(32)
+-59 + j*(100)
+64 + j*(181)
+217 + j*(40)
+97 + j*(-146)
+-69 + j*(-56)
+16 + j*(49)
+51 + j*(-58)
+-100 + j*(-43)
+-62 + j*(161)
+190 + j*(142)
+240 + j*(-128)
+1 + j*(-267)
+-202 + j*(-106)
+-123 + j*(113)
+81 + j*(69)
+27 + j*(-138)
+-227 + j*(-65)
+-180 + j*(252)
+156 + j*(284)
+272 + j*(17)
+142 + j*(-124)
+55 + j*(-136)
+-46 + j*(-150)
+-151 + j*(-18)
+-26 + j*(148)
+173 + j*(47)
+125 + j*(-160)
+-49 + j*(-190)
+-146 + j*(-95)
+-146 + j*(23)
+-39 + j*(73)
+-4 + j*(-42)
+-192 + j*(-47)
+-214 + j*(250)
+153 + j*(349)
+335 + j*(-4)
+52 + j*(-206)
+-117 + j*(13)
+78 + j*(148)
+223 + j*(-25)
+107 + j*(-204)
+-91 + j*(-177)
+-137 + j*(24)
+80 + j*(119)
+240 + j*(-135)
+-16 + j*(-385)
+-337 + j*(-204)
+-276 + j*(81)
+-131 + j*(95)
+-144 + j*(98)
+-69 + j*(190)
+58 + j*(122)
+11 + j*(36)
+-13 + j*(97)
+72 + j*(85)
+51 + j*(5)
+15 + j*(36)
+71 + j*(20)
+8 + j*(-52)
+-58 + j*(57)
+110 + j*(100)
+132 + j*(-136)
+-168 + j*(-152)
+-199 + j*(187)
+130 + j*(242)
+191 + j*(-30)
+-13 + j*(-49)
+32 + j*(131)
+248 + j*(64)
+243 + j*(-201)
+-5 + j*(-322)
+-230 + j*(-169)
+-196 + j*(75)
+-16 + j*(98)
+-35 + j*(-2)
+-109 + j*(129)
+127 + j*(247)
+310 + j*(-20)
+88 + j*(-214)
+-17 + j*(-38)
+181 + j*(-79)
+35 + j*(-376)
+-369 + j*(-230)
+-305 + j*(204)
+51 + j*(236)
+142 + j*(31)
+117 + j*(-63)
+76 + j*(-205)
+-181 + j*(-262)
+-340 + j*(21)
+-110 + j*(234)
+94 + j*(80)
+-3 + j*(-83)
+-133 + j*(-50)
+-197 + j*(47)
+-180 + j*(219)
+45 + j*(315)
+223 + j*(128)
+105 + j*(-37)
+23 + j*(57)
+156 + j*(66)
+145 + j*(-112)
+-32 + j*(-117)
+-41 + j*(13)
+35 + j*(-1)
+-9 + j*(-37)
+-20 + j*(28)
+58 + j*(18)
+37 + j*(-65)
+-47 + j*(-47)
+-27 + j*(33)
+58 + j*(1)
+15 + j*(-119)
+-175 + j*(-94)
+-216 + j*(169)
+78 + j*(308)
+295 + j*(36)
+76 + j*(-201)
+-128 + j*(-14)
+61 + j*(145)
+202 + j*(-52)
+37 + j*(-194)
+-88 + j*(-111)
+-111 + j*(-56)
+-168 + j*(45)
+-43 + j*(217)
+190 + j*(112)
+100 + j*(-115)
+-81 + j*(7)
+115 + j*(171)
+320 + j*(-76)
+110 + j*(-345)
+-170 + j*(-251)
+-202 + j*(-48)
+-118 + j*(45)
+-31 + j*(53)
+4 + j*(-3)
+-32 + j*(0)
+56 + j*(38)
+139 + j*(-158)
+-148 + j*(-346)
+-462 + j*(-49)
+-251 + j*(342)
+106 + j*(250)
+93 + j*(13)
+-2 + j*(1)
+-17 + j*(-29)
+-165 + j*(-13)
+-170 + j*(245)
+145 + j*(297)
+227 + j*(16)
+27 + j*(-17)
+124 + j*(132)
+296 + j*(-95)
+11 + j*(-325)
+-241 + j*(-57)
+-6 + j*(150)
+126 + j*(-81)
+-124 + j*(-161)
+-195 + j*(89)
+9 + j*(161)
+58 + j*(30)
+-7 + j*(32)
+46 + j*(65)
+68 + j*(-27)
+-42 + j*(-48)
+-82 + j*(63)
+6 + j*(127)
+64 + j*(95)
+73 + j*(83)
+127 + j*(93)
+195 + j*(22)
+158 + j*(-81)
+71 + j*(-58)
+144 + j*(21)
+292 + j*(-108)
+192 + j*(-371)
+-107 + j*(-387)
+-221 + j*(-170)
+-129 + j*(-66)
+-102 + j*(-100)
+-140 + j*(-81)
+-131 + j*(-42)
+-135 + j*(-43)
+-150 + j*(-1)
+-105 + j*(19)
+-119 + j*(-37)
+-231 + j*(11)
+-203 + j*(185)
+-24 + j*(214)
+26 + j*(82)
+-66 + j*(65)
+-45 + j*(161)
+74 + j*(134)
+50 + j*(-1)
+-112 + j*(23)
+-123 + j*(243)
+134 + j*(355)
+374 + j*(153)
+311 + j*(-141)
+69 + j*(-212)
+-59 + j*(-82)
+-23 + j*(46)
+91 + j*(78)
+191 + j*(-21)
+141 + j*(-179)
+-24 + j*(-198)
+-78 + j*(-90)
+-41 + j*(-75)
+-111 + j*(-91)
+-164 + j*(45)
+-13 + j*(144)
+105 + j*(21)
+13 + j*(-90)
+-83 + j*(-31)
+-72 + j*(54)
+-16 + j*(114)
+120 + j*(117)
+209 + j*(-67)
+25 + j*(-232)
+-168 + j*(-74)
+-19 + j*(94)
+112 + j*(-90)
+-132 + j*(-218)
+-303 + j*(52)
+-74 + j*(267)
+127 + j*(127)
+59 + j*(10)
+42 + j*(67)
+127 + j*(27)
+88 + j*(-70)
+38 + j*(-35)
+120 + j*(-59)
+69 + j*(-244)
+-210 + j*(-252)
+-332 + j*(38)
+-124 + j*(254)
+103 + j*(177)
+129 + j*(16)
+62 + j*(-56)
+-5 + j*(-55)
+-28 + j*(-5)
+31 + j*(23)
+71 + j*(-66)
+-43 + j*(-142)
+-154 + j*(-28)
+-56 + j*(91)
+49 + j*(-14)
+-91 + j*(-120)
+-241 + j*(49)
+-97 + j*(265)
+147 + j*(204)
+175 + j*(4)
+71 + j*(-74)
+1 + j*(-69)
+-74 + j*(-44)
+-116 + j*(86)
+41 + j*(211)
+260 + j*(69)
+173 + j*(-223)
+-151 + j*(-216)
+-218 + j*(95)
+50 + j*(211)
+184 + j*(-8)
+11 + j*(-132)
+-96 + j*(4)
+8 + j*(103)
+95 + j*(48)
+112 + j*(-3)
+138 + j*(-74)
+71 + j*(-193)
+-90 + j*(-191)
+-160 + j*(-76)
+-156 + j*(2)
+-149 + j*(106)
+6 + j*(211)
+207 + j*(63)
+96 + j*(-185)
+-151 + j*(-116)
+-106 + j*(91)
+28 + j*(43)
+-65 + j*(-14)
+-70 + j*(153)
+167 + j*(157)
+202 + j*(-108)
+-39 + j*(-171)
+-103 + j*(11)
+18 + j*(47)
+8 + j*(-15)
+-13 + j*(47)
+106 + j*(54)
+124 + j*(-97)
+-13 + j*(-128)
+-19 + j*(-32)
+59 + j*(-93)
+-58 + j*(-210)
+-235 + j*(-93)
+-173 + j*(105)
+-12 + j*(91)
+-19 + j*(-16)
+-87 + j*(3)
+-59 + j*(40)
+-63 + j*(-13)
+-190 + j*(8)
+-238 + j*(218)
+-28 + j*(414)
+288 + j*(330)
+379 + j*(11)
+155 + j*(-177)
+-21 + j*(-29)
+142 + j*(110)
+308 + j*(-112)
+76 + j*(-364)
+-228 + j*(-204)
+-165 + j*(69)
+11 + j*(55)
+-9 + j*(-9)
+11 + j*(54)
+137 + j*(-18)
+57 + j*(-210)
+-174 + j*(-170)
+-202 + j*(40)
+-80 + j*(119)
+-4 + j*(99)
+57 + j*(72)
+91 + j*(-23)
+2 + j*(-104)
+-105 + j*(-46)
+-95 + j*(64)
+-4 + j*(102)
+67 + j*(42)
+27 + j*(-38)
+-49 + j*(8)
+37 + j*(84)
+137 + j*(-60)
+-59 + j*(-211)
+-276 + j*(-4)
+-111 + j*(245)
+100 + j*(150)
+39 + j*(45)
+44 + j*(131)
+165 + j*(78)
+103 + j*(-25)
+91 + j*(86)
+328 + j*(23)
+293 + j*(-351)
+-117 + j*(-438)
+-303 + j*(-141)
+-199 + j*(38)
+-134 + j*(95)
+3 + j*(163)
+148 + j*(17)
+15 + j*(-133)
+-74 + j*(6)
+112 + j*(-8)
+0 + j*(-288)
+-395 + j*(-139)
+-284 + j*(327)
+161 + j*(292)
+171 + j*(-38)
+-12 + j*(-35)
+43 + j*(32)
+42 + j*(-57)
+-28 + j*(-5)
+96 + j*(-1)
+39 + j*(-228)
+-286 + j*(-150)
+-209 + j*(217)
+135 + j*(122)
+-25 + j*(-186)
+-325 + j*(42)
+-75 + j*(346)
+185 + j*(126)
+-11 + j*(-35)
+-67 + j*(190)
+208 + j*(199)
+223 + j*(-86)
+-15 + j*(-120)
+-46 + j*(49)
+71 + j*(74)
+103 + j*(-5)
+66 + j*(-67)
+-37 + j*(-75)
+-94 + j*(66)
+62 + j*(173)
+192 + j*(35)
+88 + j*(-50)
+105 + j*(66)
+313 + j*(-35)
+223 + j*(-352)
+-117 + j*(-362)
+-214 + j*(-116)
+-118 + j*(-18)
+-79 + j*(3)
+4 + j*(16)
+34 + j*(-110)
+-133 + j*(-130)
+-123 + j*(67)
+101 + j*(-2)
+-35 + j*(-277)
+-377 + j*(-114)
+-243 + j*(260)
+86 + j*(173)
+13 + j*(-74)
+-164 + j*(1)
+-120 + j*(128)
+-76 + j*(166)
+41 + j*(252)
+271 + j*(109)
+152 + j*(-218)
+-205 + j*(-132)
+-139 + j*(202)
+138 + j*(141)
+63 + j*(-48)
+-29 + j*(73)
+163 + j*(103)
+194 + j*(-156)
+-71 + j*(-252)
+-256 + j*(-65)
+-218 + j*(179)
+21 + j*(313)
+284 + j*(127)
+158 + j*(-184)
+-140 + j*(-66)
+32 + j*(200)
+288 + j*(-52)
+-25 + j*(-322)
+-303 + j*(11)
+8 + j*(266)
+199 + j*(1)
+-21 + j*(-95)
+-13 + j*(100)
+170 + j*(16)
+52 + j*(-146)
+-64 + j*(-15)
+80 + j*(44)
+100 + j*(-100)
+-12 + j*(-95)
+40 + j*(-29)
+87 + j*(-139)
+-32 + j*(-217)
+-127 + j*(-185)
+-219 + j*(-163)
+-351 + j*(-13)
+-260 + j*(244)
+8 + j*(251)
+52 + j*(61)
+-82 + j*(55)
+-55 + j*(198)
+103 + j*(207)
+172 + j*(102)
+163 + j*(34)
+175 + j*(-6)
+187 + j*(-92)
+112 + j*(-191)
+-13 + j*(-187)
+-48 + j*(-117)
+-37 + j*(-129)
+-129 + j*(-146)
+-194 + j*(-21)
+-95 + j*(64)
+-56 + j*(-2)
+-133 + j*(26)
+-59 + j*(139)
+74 + j*(41)
+-53 + j*(-100)
+-219 + j*(56)
+-78 + j*(266)
+144 + j*(188)
+136 + j*(12)
+25 + j*(2)
+35 + j*(95)
+173 + j*(95)
+249 + j*(-93)
+69 + j*(-274)
+-174 + j*(-158)
+-117 + j*(83)
+91 + j*(48)
+60 + j*(-139)
+-109 + j*(-133)
+-146 + j*(-28)
+-153 + j*(18)
+-174 + j*(133)
+-21 + j*(262)
+191 + j*(147)
+131 + j*(-84)
+-91 + j*(-60)
+-91 + j*(168)
+141 + j*(219)
+254 + j*(37)
+179 + j*(-83)
+151 + j*(-97)
+132 + j*(-204)
+-59 + j*(-262)
+-197 + j*(-70)
+-52 + j*(82)
+57 + j*(-21)
+-24 + j*(-64)
+4 + j*(2)
+58 + j*(-95)
+-100 + j*(-137)
+-112 + j*(71)
+148 + j*(45)
+110 + j*(-274)
+-224 + j*(-282)
+-287 + j*(-44)
+-231 + j*(-8)
+-341 + j*(89)
+-217 + j*(372)
+134 + j*(326)
+149 + j*(50)
+1 + j*(65)
+110 + j*(130)
+159 + j*(-41)
+-1 + j*(-98)
+-35 + j*(-6)
+-40 + j*(-34)
+-161 + j*(46)
+-49 + j*(272)
+239 + j*(190)
+215 + j*(-86)
+18 + j*(-94)
+22 + j*(13)
+71 + j*(-9)
+58 + j*(-19)
+90 + j*(-33)
+60 + j*(-100)
+-13 + j*(-57)
+71 + j*(-2)
+117 + j*(-132)
+-30 + j*(-194)
+-86 + j*(-75)
+-5 + j*(-81)
+138 + j*(169)
+171 + j*(-16)
+31 + j*(-37)
+76 + j*(78)
+231 + j*(-36)
+105 + j*(-274)
+-192 + j*(-209)
+-205 + j*(77)
+11 + j*(123)
+16 + j*(-23)
+-105 + j*(62)
+64 + j*(218)
+275 + j*(9)
+74 + j*(-238)
+-168 + j*(-60)
+-8 + j*(139)
+133 + j*(-11)
+-16 + j*(-84)
+-25 + j*(78)
+161 + j*(52)
+138 + j*(-136)
+-6 + j*(-127)
+21 + j*(-45)
+83 + j*(-111)
+18 + j*(-208)
+-103 + j*(-223)
+-221 + j*(-151)
+-252 + j*(-1)
+-166 + j*(93)
+-98 + j*(93)
+-58 + j*(98)
+-4 + j*(57)
+-63 + j*(-6)
+-138 + j*(103)
+16 + j*(211)
+146 + j*(52)
+10 + j*(-53)
+-27 + j*(73)
+110 + j*(28)
+-1 + j*(-129)
+-175 + j*(21)
+-14 + j*(196)
+130 + j*(52)
+11 + j*(-21)
+27 + j*(103)
+193 + j*(16)
+107 + j*(-202)
+-131 + j*(-188)
+-225 + j*(0)
+-151 + j*(190)
+72 + j*(253)
+236 + j*(65)
+118 + j*(-120)
+0 + j*(-57)
+58 + j*(-48)
+-39 + j*(-142)
+-183 + j*(23)
+5 + j*(203)
+180 + j*(36)
+63 + j*(-68)
+97 + j*(18)
+214 + j*(-175)
+-72 + j*(-381)
+-351 + j*(-119)
+-185 + j*(129)
+-79 + j*(41)
+-179 + j*(95)
+-40 + j*(252)
+127 + j*(124)
+24 + j*(40)
+58 + j*(175)
+269 + j*(78)
+195 + j*(-171)
+1 + j*(-156)
+-3 + j*(-79)
+-44 + j*(-112)
+-129 + j*(-7)
+-21 + j*(110)
+84 + j*(32)
+48 + j*(-4)
+119 + j*(15)
+174 + j*(-157)
+-36 + j*(-284)
+-210 + j*(-117)
+-117 + j*(38)
+-27 + j*(-5)
+-57 + j*(-45)
+-81 + j*(-31)
+-107 + j*(-19)
+-129 + j*(36)
+-92 + j*(88)
+-56 + j*(98)
+-28 + j*(129)
+60 + j*(140)
+129 + j*(58)
+108 + j*(-37)
+47 + j*(-77)
+-11 + j*(-66)
+-13 + j*(-17)
+44 + j*(-52)
+-26 + j*(-168)
+-223 + j*(-115)
+-238 + j*(111)
+-64 + j*(192)
+21 + j*(105)
+-16 + j*(61)
+-45 + j*(96)
+-6 + j*(173)
+145 + j*(181)
+225 + j*(-13)
+28 + j*(-133)
+-81 + j*(72)
+163 + j*(156)
+250 + j*(-125)
+-13 + j*(-226)
+-88 + j*(-43)
+2 + j*(-64)
+-158 + j*(-110)
+-231 + j*(163)
+66 + j*(300)
+243 + j*(77)
+145 + j*(-66)
+91 + j*(-82)
+-3 + j*(-118)
+-97 + j*(46)
+150 + j*(188)
+357 + j*(-127)
+28 + j*(-403)
+-263 + j*(-116)
+-34 + j*(139)
+162 + j*(-49)
+13 + j*(-190)
+-71 + j*(-94)
+-10 + j*(-69)
+-17 + j*(-113)
+-30 + j*(-117)
+-39 + j*(-168)
+-137 + j*(-205)
+-234 + j*(-144)
+-278 + j*(-71)
+-324 + j*(36)
+-268 + j*(194)
+-107 + j*(233)
+-40 + j*(147)
+-77 + j*(115)
+-82 + j*(144)
+-68 + j*(184)
+1 + j*(250)
+151 + j*(223)
+182 + j*(59)
+47 + j*(4)
+1 + j*(134)
+144 + j*(217)
+321 + j*(108)
+336 + j*(-132)
+124 + j*(-289)
+-108 + j*(-170)
+-71 + j*(62)
+132 + j*(80)
+207 + j*(-77)
+137 + j*(-212)
+-21 + j*(-270)
+-189 + j*(-154)
+-143 + j*(55)
+40 + j*(48)
+29 + j*(-76)
+-23 + j*(-30)
+86 + j*(-61)
+-16 + j*(-259)
+-301 + j*(-136)
+-191 + j*(176)
+76 + j*(64)
+-82 + j*(-138)
+-248 + j*(69)
+-47 + j*(208)
+20 + j*(65)
+-73 + j*(123)
+99 + j*(208)
+180 + j*(-16)
+-52 + j*(-37)
+25 + j*(211)
+308 + j*(54)
+112 + j*(-242)
+-138 + j*(-21)
+132 + j*(167)
+282 + j*(-146)
+-18 + j*(-290)
+-132 + j*(-64)
+-1 + j*(-25)
+-52 + j*(-86)
+-66 + j*(31)
+93 + j*(6)
+41 + j*(-172)
+-129 + j*(-120)
+-83 + j*(-8)
+-58 + j*(-74)
+-164 + j*(-30)
+-86 + j*(102)
+34 + j*(-6)
+-129 + j*(-104)
+-228 + j*(110)
+-2 + j*(228)
+122 + j*(19)
+-69 + j*(-95)
+-194 + j*(75)
+-91 + j*(233)
+55 + j*(252)
+185 + j*(220)
+327 + j*(85)
+330 + j*(-186)
+59 + j*(-378)
+-275 + j*(-226)
+-273 + j*(152)
+69 + j*(266)
+235 + j*(-11)
+22 + j*(-172)
+-91 + j*(0)
+83 + j*(44)
+72 + j*(-172)
+-193 + j*(-160)
+-221 + j*(110)
+-21 + j*(165)
+-10 + j*(71)
+-45 + j*(179)
+176 + j*(250)
+351 + j*(4)
+187 + j*(-248)
+-58 + j*(-215)
+-134 + j*(-49)
+-70 + j*(90)
+96 + j*(116)
+197 + j*(-52)
+59 + j*(-202)
+-98 + j*(-122)
+-70 + j*(-14)
+-54 + j*(-15)
+-69 + j*(80)
+129 + j*(153)
+303 + j*(-96)
+85 + j*(-378)
+-241 + j*(-274)
+-278 + j*(-6)
+-146 + j*(123)
+7 + j*(137)
+139 + j*(-3)
+30 + j*(-230)
+-274 + j*(-177)
+-313 + j*(152)
+-42 + j*(278)
+115 + j*(126)
+76 + j*(6)
+21 + j*(-25)
+-47 + j*(-20)
+-79 + j*(77)
+37 + j*(151)
+155 + j*(52)
+115 + j*(-82)
+19 + j*(-114)
+-53 + j*(-88)
+-88 + j*(-23)
+-47 + j*(28)
+-21 + j*(-10)
+-91 + j*(-20)
+-108 + j*(88)
+8 + j*(125)
+48 + j*(22)
+-56 + j*(-13)
+-115 + j*(101)
+-33 + j*(222)
+136 + j*(245)
+288 + j*(110)
+260 + j*(-110)
+67 + j*(-175)
+-20 + j*(-52)
+64 + j*(-1)
+83 + j*(-84)
+-3 + j*(-98)
+-11 + j*(-27)
+53 + j*(-38)
+29 + j*(-122)
+-88 + j*(-127)
+-158 + j*(-10)
+-103 + j*(127)
+46 + j*(177)
+194 + j*(92)
+219 + j*(-91)
+73 + j*(-203)
+-47 + j*(-112)
+50 + j*(-37)
+113 + j*(-226)
+-173 + j*(-369)
+-459 + j*(-75)
+-267 + j*(309)
+103 + j*(266)
+158 + j*(7)
+39 + j*(-69)
+-4 + j*(-54)
+-42 + j*(-57)
+-64 + j*(-7)
+-15 + j*(-8)
+-68 + j*(-75)
+-190 + j*(26)
+-75 + j*(214)
+159 + j*(127)
+119 + j*(-120)
+-113 + j*(-125)
+-154 + j*(73)
+-1 + j*(133)
+53 + j*(23)
+-35 + j*(-5)
+-37 + j*(91)
+76 + j*(78)
+54 + j*(-48)
+-77 + j*(-11)
+-22 + j*(120)
+104 + j*(47)
+5 + j*(-65)
+-92 + j*(55)
+28 + j*(141)
+81 + j*(59)
+44 + j*(87)
+179 + j*(117)
+244 + j*(-84)
+56 + j*(-171)
+18 + j*(-42)
+110 + j*(-112)
+-64 + j*(-203)
+-151 + j*(35)
+129 + j*(78)
+115 + j*(-264)
+-286 + j*(-228)
+-276 + j*(174)
+35 + j*(175)
+-31 + j*(3)
+-115 + j*(204)
+204 + j*(310)
+392 + j*(-6)
+218 + j*(-228)
+87 + j*(-224)
+16 + j*(-268)
+-153 + j*(-245)
+-214 + j*(-83)
+-144 + j*(-13)
+-146 + j*(-17)
+-177 + j*(42)
+-155 + j*(139)
+-41 + j*(238)
+184 + j*(183)
+202 + j*(-103)
+-98 + j*(-148)
+-96 + j*(172)
+290 + j*(103)
+187 + j*(-378)
+-361 + j*(-303)
+-335 + j*(233)
+112 + j*(228)
+70 + j*(-117)
+-220 + j*(-16)
+-105 + j*(269)
+175 + j*(218)
+240 + j*(-1)
+139 + j*(-170)
+-76 + j*(-202)
+-206 + j*(-1)
+-41 + j*(163)
+97 + j*(21)
+-49 + j*(-71)
+-110 + j*(96)
+61 + j*(147)
+104 + j*(8)
+9 + j*(-8)
+31 + j*(57)
+87 + j*(23)
+74 + j*(-18)
+83 + j*(-41)
+50 + j*(-121)
+-93 + j*(-125)
+-170 + j*(37)
+-49 + j*(194)
+160 + j*(169)
+248 + j*(-33)
+101 + j*(-201)
+-77 + j*(-106)
+16 + j*(42)
+153 + j*(-100)
+-37 + j*(-273)
+-260 + j*(-90)
+-132 + j*(139)
+43 + j*(68)
+-6 + j*(-21)
+-18 + j*(41)
+70 + j*(1)
+-1 + j*(-109)
+-128 + j*(-21)
+-35 + j*(126)
+136 + j*(49)
+116 + j*(-148)
+-77 + j*(-223)
+-245 + j*(-94)
+-228 + j*(111)
+-66 + j*(186)
+25 + j*(107)
+-4 + j*(63)
+-1 + j*(93)
+39 + j*(82)
+38 + j*(65)
+63 + j*(76)
+94 + j*(30)
+45 + j*(6)
+70 + j*(89)
+226 + j*(30)
+187 + j*(-206)
+-70 + j*(-217)
+-106 + j*(1)
+54 + j*(12)
+25 + j*(-103)
+-43 + j*(-42)
+50 + j*(-44)
+-26 + j*(-195)
+-242 + j*(-65)
+-86 + j*(187)
+168 + j*(5)
+-59 + j*(-237)
+-286 + j*(36)
+18 + j*(249)
+221 + j*(-82)
+-111 + j*(-298)
+-361 + j*(-28)
+-236 + j*(218)
+-90 + j*(258)
+46 + j*(279)
+197 + j*(146)
+99 + j*(-45)
+-68 + j*(61)
+70 + j*(210)
+206 + j*(71)
+90 + j*(-3)
+121 + j*(132)
+343 + j*(42)
+306 + j*(-258)
+44 + j*(-334)
+-93 + j*(-221)
+-117 + j*(-137)
+-129 + j*(-74)
+-117 + j*(-31)
+-138 + j*(6)
+-113 + j*(123)
+61 + j*(161)
+150 + j*(2)
+51 + j*(-83)
+28 + j*(-44)
+50 + j*(-108)
+-72 + j*(-148)
+-126 + j*(-25)
+-35 + j*(-13)
+-116 + j*(-93)
+-243 + j*(79)
+-44 + j*(286)
+213 + j*(133)
+146 + j*(-103)
+-11 + j*(-98)
+-22 + j*(-30)
+-7 + j*(-33)
+-11 + j*(-42)
+-28 + j*(-73)
+-112 + j*(-69)
+-141 + j*(33)
+-66 + j*(71)
+-74 + j*(28)
+-130 + j*(108)
+-23 + j*(220)
+121 + j*(146)
+100 + j*(47)
+80 + j*(74)
+177 + j*(49)
+192 + j*(-122)
+4 + j*(-225)
+-177 + j*(-88)
+-115 + j*(122)
+74 + j*(116)
+81 + j*(-32)
+-33 + j*(-11)
+33 + j*(89)
+124 + j*(-4)
+15 + j*(-59)
+33 + j*(91)
+272 + j*(5)
+190 + j*(-344)
+-204 + j*(-337)
+-279 + j*(-7)
+-79 + j*(77)
+-61 + j*(-11)
+-98 + j*(45)
+-18 + j*(73)
+-5 + j*(12)
+-30 + j*(23)
+-7 + j*(-3)
+-117 + j*(-27)
+-175 + j*(190)
+113 + j*(332)
+339 + j*(58)
+153 + j*(-180)
+-6 + j*(-69)
+95 + j*(-9)
+112 + j*(-137)
+5 + j*(-180)
+-50 + j*(-175)
+-165 + j*(-189)
+-298 + j*(-45)
+-235 + j*(155)
+-98 + j*(201)
+-30 + j*(216)
+103 + j*(233)
+236 + j*(89)
+165 + j*(-84)
+43 + j*(-76)
+48 + j*(-39)
+39 + j*(-93)
+-65 + j*(-92)
+-103 + j*(33)
+16 + j*(115)
+131 + j*(11)
+40 + j*(-123)
+-109 + j*(-20)
+25 + j*(151)
+238 + j*(-4)
+93 + j*(-249)
+-129 + j*(-137)
+-25 + j*(4)
+26 + j*(-148)
+-188 + j*(-151)
+-175 + j*(78)
+18 + j*(22)
+-127 + j*(-142)
+-316 + j*(84)
+-95 + j*(322)
+147 + j*(190)
+126 + j*(31)
+100 + j*(-28)
+6 + j*(-132)
+-205 + j*(-31)
+-122 + j*(247)
+168 + j*(197)
+136 + j*(-45)
+-29 + j*(11)
+76 + j*(120)
+163 + j*(-8)
+53 + j*(-73)
+34 + j*(-1)
+80 + j*(-33)
+23 + j*(-58)
+38 + j*(-1)
+97 + j*(-74)
+-21 + j*(-153)
+-113 + j*(-23)
+-6 + j*(59)
+35 + j*(-18)
+-14 + j*(3)
+79 + j*(45)
+146 + j*(-105)
+-11 + j*(-223)
+-163 + j*(-120)
+-147 + j*(15)
+-73 + j*(63)
+-5 + j*(44)
+-18 + j*(-26)
+-122 + j*(21)
+-46 + j*(200)
+216 + j*(142)
+220 + j*(-159)
+-49 + j*(-223)
+-127 + j*(-42)
+-32 + j*(-11)
+-76 + j*(-63)
+-124 + j*(33)
+-28 + j*(82)
+-2 + j*(9)
+-49 + j*(31)
+21 + j*(60)
+26 + j*(-55)
+-136 + j*(-30)
+-95 + j*(194)
+192 + j*(163)
+202 + j*(-169)
+-139 + j*(-247)
+-292 + j*(45)
+-106 + j*(243)
+64 + j*(181)
+78 + j*(105)
+98 + j*(102)
+156 + j*(51)
+143 + j*(-47)
+60 + j*(-82)
+14 + j*(-37)
+42 + j*(-9)
+54 + j*(-51)
+-11 + j*(-55)
+-8 + j*(37)
+132 + j*(31)
+141 + j*(-167)
+-99 + j*(-227)
+-214 + j*(21)
+16 + j*(170)
+176 + j*(-35)
+1 + j*(-192)
+-143 + j*(-53)
+-38 + j*(50)
+16 + j*(-36)
+-76 + j*(-49)
+-75 + j*(47)
+4 + j*(50)
+15 + j*(9)
+35 + j*(7)
+62 + j*(-85)
+-89 + j*(-181)
+-284 + j*(-24)
+-200 + j*(250)
+75 + j*(296)
+235 + j*(119)
+209 + j*(-78)
+54 + j*(-180)
+-109 + j*(-104)
+-86 + j*(60)
+50 + j*(40)
+-7 + j*(-86)
+-163 + j*(18)
+-50 + j*(236)
+219 + j*(178)
+261 + j*(-81)
+93 + j*(-204)
+-46 + j*(-151)
+-62 + j*(-53)
+9 + j*(-37)
+-6 + j*(-150)
+-204 + j*(-142)
+-251 + j*(129)
+44 + j*(235)
+179 + j*(-49)
+-92 + j*(-185)
+-224 + j*(63)
+-23 + j*(180)
+44 + j*(37)
+-61 + j*(49)
+11 + j*(160)
+138 + j*(74)
+73 + j*(-49)
+-30 + j*(-4)
+-8 + j*(94)
+106 + j*(132)
+247 + j*(18)
+187 + j*(-228)
+-112 + j*(-264)
+-233 + j*(19)
+-22 + j*(182)
+129 + j*(60)
+98 + j*(-37)
+78 + j*(-68)
+28 + j*(-122)
+-53 + j*(-83)
+-20 + j*(-33)
+-34 + j*(-88)
+-128 + j*(-16)
+-5 + j*(105)
+121 + j*(-70)
+-107 + j*(-190)
+-213 + j*(73)
+61 + j*(124)
+12 + j*(-165)
+-330 + j*(-8)
+-106 + j*(413)
+366 + j*(186)
+166 + j*(-272)
+-235 + j*(-93)
+-61 + j*(252)
+247 + j*(101)
+165 + j*(-173)
+-52 + j*(-185)
+-144 + j*(-51)
+-87 + j*(78)
+44 + j*(53)
+-8 + j*(-77)
+-158 + j*(33)
+-1 + j*(223)
+214 + j*(47)
+35 + j*(-146)
+-105 + j*(49)
+132 + j*(135)
+194 + j*(-134)
+-62 + j*(-203)
+-132 + j*(-12)
+-42 + j*(33)
+-53 + j*(45)
+37 + j*(127)
+180 + j*(4)
+67 + j*(-156)
+-43 + j*(-66)
+58 + j*(-57)
+-21 + j*(-222)
+-253 + j*(-117)
+-170 + j*(121)
+4 + j*(33)
+-148 + j*(-78)
+-264 + j*(141)
+-60 + j*(298)
+76 + j*(199)
+69 + j*(198)
+254 + j*(226)
+409 + j*(-74)
+118 + j*(-368)
+-250 + j*(-156)
+-117 + j*(216)
+229 + j*(144)
+211 + j*(-153)
+4 + j*(-170)
+17 + j*(-78)
+25 + j*(-194)
+-210 + j*(-213)
+-315 + j*(76)
+-71 + j*(266)
+132 + j*(136)
+108 + j*(-1)
+71 + j*(-26)
+48 + j*(-62)
+-4 + j*(-49)
+31 + j*(-17)
+52 + j*(-103)
+-76 + j*(-139)
+-118 + j*(-13)
+-18 + j*(-8)
+-95 + j*(-107)
+-242 + j*(40)
+-76 + j*(244)
+146 + j*(102)
+25 + j*(-105)
+-175 + j*(8)
+-96 + j*(219)
+109 + j*(235)
+243 + j*(102)
+238 + j*(-103)
+35 + j*(-230)
+-175 + j*(-71)
+-66 + j*(175)
+197 + j*(110)
+174 + j*(-141)
+-46 + j*(-141)
+-14 + j*(55)
+214 + j*(-29)
+127 + j*(-362)
+-308 + j*(-368)
+-463 + j*(72)
+-127 + j*(339)
+137 + j*(142)
+37 + j*(-33)
+-33 + j*(45)
+71 + j*(40)
+31 + j*(-100)
+-148 + j*(-56)
+-133 + j*(151)
+80 + j*(188)
+175 + j*(-13)
+-8 + j*(-161)
+-218 + j*(16)
+-62 + j*(306)
+307 + j*(204)
+282 + j*(-192)
+-77 + j*(-222)
+-102 + j*(70)
+148 + j*(46)
+76 + j*(-195)
+-163 + j*(-113)
+-102 + j*(98)
+49 + j*(60)
+26 + j*(-11)
+32 + j*(3)
+41 + j*(-80)
+-122 + j*(-91)
+-158 + j*(142)
+111 + j*(235)
+263 + j*(-9)
+100 + j*(-180)
+-24 + j*(-112)
+-10 + j*(-76)
+-56 + j*(-92)
+-91 + j*(-4)
+8 + j*(40)
+39 + j*(-65)
+-73 + j*(-80)
+-68 + j*(33)
+44 + j*(-6)
+-33 + j*(-130)
+-175 + j*(-30)
+-64 + j*(118)
+66 + j*(-15)
+-110 + j*(-141)
+-264 + j*(64)
+-81 + j*(255)
+96 + j*(142)
+45 + j*(30)
+16 + j*(57)
+28 + j*(26)
+-52 + j*(40)
+-20 + j*(188)
+189 + j*(180)
+245 + j*(-30)
+107 + j*(-127)
+26 + j*(-82)
+10 + j*(-51)
+16 + j*(-8)
+87 + j*(-27)
+52 + j*(-146)
+-113 + j*(-113)
+-96 + j*(65)
+66 + j*(48)
+40 + j*(-81)
+-51 + j*(-44)
+-7 + j*(-4)
+-27 + j*(-67)
+-122 + j*(-4)
+-56 + j*(119)
+57 + j*(86)
+60 + j*(37)
+102 + j*(34)
+138 + j*(-71)
+28 + j*(-156)
+-66 + j*(-100)
+-81 + j*(-52)
+-119 + j*(24)
+-2 + j*(164)
+234 + j*(32)
+120 + j*(-280)
+-211 + j*(-208)
+-163 + j*(80)
+48 + j*(6)
+-82 + j*(-158)
+-237 + j*(8)
+-83 + j*(151)
+16 + j*(23)
+-105 + j*(-33)
+-162 + j*(88)
+-88 + j*(173)
+-7 + j*(180)
+49 + j*(146)
+41 + j*(116)
+52 + j*(172)
+192 + j*(187)
+280 + j*(25)
+190 + j*(-87)
+165 + j*(-76)
+192 + j*(-189)
+2 + j*(-319)
+-212 + j*(-167)
+-150 + j*(40)
+-28 + j*(29)
+-51 + j*(-14)
+-64 + j*(33)
+-37 + j*(63)
+-5 + j*(105)
+121 + j*(116)
+203 + j*(-59)
+33 + j*(-202)
+-124 + j*(-63)
+-6 + j*(66)
+93 + j*(-57)
+-46 + j*(-152)
+-161 + j*(-16)
+-57 + j*(126)
+104 + j*(80)
+132 + j*(-82)
+4 + j*(-183)
+-140 + j*(-127)
+-165 + j*(3)
+-103 + j*(65)
+-59 + j*(71)
+-27 + j*(72)
+-1 + j*(49)
+-18 + j*(29)
+-30 + j*(56)
+-1 + j*(76)
+23 + j*(69)
+44 + j*(73)
+88 + j*(52)
+102 + j*(-11)
+66 + j*(-52)
+34 + j*(-64)
+-6 + j*(-72)
+-51 + j*(-47)
+-64 + j*(-3)
+-70 + j*(43)
+-40 + j*(127)
+103 + j*(165)
+236 + j*(36)
+203 + j*(-141)
+91 + j*(-225)
+-43 + j*(-272)
+-245 + j*(-207)
+-314 + j*(58)
+-100 + j*(226)
+71 + j*(105)
+6 + j*(12)
+8 + j*(86)
+137 + j*(24)
+72 + j*(-169)
+-155 + j*(-161)
+-243 + j*(38)
+-152 + j*(206)
+35 + j*(274)
+239 + j*(147)
+209 + j*(-130)
+-77 + j*(-184)
+-187 + j*(78)
+30 + j*(220)
+177 + j*(68)
+86 + j*(-40)
+37 + j*(33)
+138 + j*(57)
+199 + j*(-63)
+119 + j*(-182)
+-6 + j*(-187)
+-65 + j*(-117)
+-58 + j*(-79)
+-84 + j*(-76)
+-130 + j*(1)
+-47 + j*(105)
+95 + j*(50)
+74 + j*(-98)
+-52 + j*(-102)
+-61 + j*(-11)
+1 + j*(-19)
+-22 + j*(-62)
+-42 + j*(-39)
+-13 + j*(-65)
+-95 + j*(-143)
+-254 + j*(-52)
+-218 + j*(170)
+-1 + j*(207)
+68 + j*(42)
+-62 + j*(-22)
+-127 + j*(99)
+-28 + j*(198)
+100 + j*(168)
+161 + j*(67)
+137 + j*(-53)
+23 + j*(-115)
+-88 + j*(-56)
+-102 + j*(47)
+-71 + j*(115)
+-13 + j*(189)
+136 + j*(218)
+274 + j*(76)
+213 + j*(-101)
+94 + j*(-103)
+122 + j*(-74)
+119 + j*(-194)
+-63 + j*(-236)
+-153 + j*(-74)
+-51 + j*(-9)
+-75 + j*(-94)
+-219 + j*(11)
+-104 + j*(242)
+171 + j*(182)
+173 + j*(-53)
+30 + j*(-60)
+84 + j*(1)
+123 + j*(-148)
+-86 + j*(-216)
+-199 + j*(-1)
+-18 + j*(121)
+79 + j*(-26)
+-52 + j*(-82)
+-74 + j*(56)
+83 + j*(62)
+101 + j*(-119)
+-90 + j*(-180)
+-211 + j*(-8)
+-95 + j*(165)
+104 + j*(121)
+125 + j*(-66)
+-21 + j*(-136)
+-109 + j*(-46)
+-74 + j*(21)
+-54 + j*(21)
+-50 + j*(49)
+8 + j*(59)
+33 + j*(-11)
+-33 + j*(-55)
+-105 + j*(-14)
+-122 + j*(79)
+-34 + j*(183)
+147 + j*(138)
+163 + j*(-91)
+-69 + j*(-154)
+-146 + j*(50)
+21 + j*(95)
+-13 + j*(-51)
+-182 + j*(74)
+-1 + j*(296)
+258 + j*(112)
+97 + j*(-134)
+-93 + j*(26)
+86 + j*(161)
+185 + j*(-30)
+3 + j*(-100)
+-35 + j*(62)
+97 + j*(78)
+108 + j*(9)
+132 + j*(20)
+209 + j*(-88)
+66 + j*(-243)
+-126 + j*(-114)
+-15 + j*(74)
+154 + j*(-27)
+83 + j*(-182)
+-23 + j*(-168)
+-54 + j*(-163)
+-157 + j*(-145)
+-198 + j*(7)
+-65 + j*(86)
+-8 + j*(4)
+-59 + j*(11)
+16 + j*(64)
+93 + j*(-59)
+-44 + j*(-173)
+-175 + j*(-67)
+-128 + j*(35)
+-103 + j*(34)
+-101 + j*(98)
+22 + j*(112)
+37 + j*(-44)
+-161 + j*(-40)
+-138 + j*(218)
+171 + j*(208)
+193 + j*(-130)
+-136 + j*(-187)
+-226 + j*(96)
+-24 + j*(198)
+43 + j*(97)
+25 + j*(105)
+112 + j*(83)
+74 + j*(-59)
+-106 + j*(-1)
+-40 + j*(228)
+238 + j*(198)
+291 + j*(-81)
+85 + j*(-223)
+-102 + j*(-134)
+-134 + j*(42)
+-7 + j*(164)
+153 + j*(119)
+189 + j*(-5)
+176 + j*(-74)
+160 + j*(-194)
+-38 + j*(-299)
+-253 + j*(-97)
+-90 + j*(166)
+163 + j*(25)
+18 + j*(-195)
+-168 + j*(-37)
+6 + j*(115)
+129 + j*(-74)
+-57 + j*(-192)
+-192 + j*(-52)
+-152 + j*(83)
+-61 + j*(173)
+138 + j*(174)
+239 + j*(-86)
+-32 + j*(-259)
+-235 + j*(6)
+30 + j*(211)
+244 + j*(-52)
+16 + j*(-287)
+-218 + j*(-146)
+-188 + j*(21)
+-148 + j*(50)
+-149 + j*(127)
+-40 + j*(220)
+122 + j*(177)
+188 + j*(19)
+91 + j*(-129)
+-91 + j*(-100)
+-105 + j*(88)
+85 + j*(121)
+137 + j*(-74)
+-48 + j*(-150)
+-143 + j*(8)
+-28 + j*(99)
+43 + j*(16)
+-33 + j*(-38)
+-91 + j*(52)
+11 + j*(128)
+108 + j*(16)
+-25 + j*(-107)
+-197 + j*(54)
+-35 + j*(287)
+231 + j*(175)
+180 + j*(-54)
+37 + j*(-19)
+104 + j*(53)
+146 + j*(-32)
+103 + j*(-37)
+197 + j*(-47)
+201 + j*(-274)
+-88 + j*(-373)
+-273 + j*(-151)
+-202 + j*(18)
+-151 + j*(68)
+-64 + j*(161)
+115 + j*(89)
+55 + j*(-106)
+-114 + j*(-28)
+2 + j*(107)
+102 + j*(-45)
+-75 + j*(-107)
+-86 + j*(72)
+73 + j*(25)
+-35 + j*(-103)
+-129 + j*(71)
+110 + j*(129)
+143 + j*(-177)
+-216 + j*(-223)
+-318 + j*(144)
+-21 + j*(317)
+190 + j*(157)
+169 + j*(-28)
+50 + j*(-92)
+-35 + j*(-16)
+55 + j*(55)
+124 + j*(-91)
+-76 + j*(-184)
+-195 + j*(43)
+23 + j*(168)
+127 + j*(-21)
+-24 + j*(-86)
+-48 + j*(16)
+-13 + j*(1)
+-77 + j*(50)
+61 + j*(185)
+277 + j*(-13)
+76 + j*(-301)
+-230 + j*(-147)
+-134 + j*(109)
+17 + j*(51)
+-36 + j*(18)
+34 + j*(83)
+119 + j*(-69)
+-88 + j*(-181)
+-231 + j*(35)
+-56 + j*(187)
+56 + j*(81)
+0 + j*(47)
+33 + j*(84)
+54 + j*(20)
+-30 + j*(49)
+67 + j*(183)
+291 + j*(59)
+209 + j*(-247)
+-123 + j*(-255)
+-218 + j*(47)
+18 + j*(204)
+210 + j*(45)
+127 + j*(-150)
+-28 + j*(-127)
+-19 + j*(-28)
+41 + j*(-64)
+-23 + j*(-112)
+-67 + j*(-49)
+-11 + j*(-40)
+-58 + j*(-117)
+-178 + j*(-32)
+-90 + j*(123)
+77 + j*(41)
+-18 + j*(-128)
+-199 + j*(-32)
+-130 + j*(159)
+25 + j*(129)
+2 + j*(50)
+-11 + j*(135)
+169 + j*(147)
+255 + j*(-99)
+20 + j*(-288)
+-238 + j*(-140)
+-201 + j*(104)
+-42 + j*(139)
+-18 + j*(82)
+-24 + j*(129)
+86 + j*(163)
+189 + j*(54)
+141 + j*(-90)
+16 + j*(-121)
+-60 + j*(-47)
+-37 + j*(35)
+34 + j*(42)
+54 + j*(-21)
+1 + j*(-56)
+-64 + j*(-23)
+-86 + j*(66)
+-4 + j*(176)
+185 + j*(168)
+293 + j*(-25)
+189 + j*(-211)
+37 + j*(-234)
+-41 + j*(-211)
+-153 + j*(-193)
+-257 + j*(-36)
+-156 + j*(163)
+59 + j*(153)
+124 + j*(-12)
+31 + j*(-100)
+-38 + j*(-74)
+-36 + j*(-50)
+-52 + j*(-71)
+-115 + j*(-49)
+-112 + j*(33)
+-35 + j*(22)
+-97 + j*(-69)
+-265 + j*(47)
+-158 + j*(327)
+183 + j*(303)
+255 + j*(-6)
+49 + j*(-117)
+-35 + j*(-29)
+-37 + j*(-11)
+-100 + j*(52)
+-19 + j*(184)
+144 + j*(127)
+116 + j*(0)
+74 + j*(40)
+171 + j*(14)
+134 + j*(-144)
+-31 + j*(-127)
+-19 + j*(-9)
+37 + j*(-53)
+-46 + j*(-69)
+-46 + j*(33)
+40 + j*(25)
+20 + j*(-9)
+61 + j*(40)
+169 + j*(-71)
+25 + j*(-241)
+-170 + j*(-106)
+-41 + j*(49)
+47 + j*(-108)
+-164 + j*(-161)
+-221 + j*(74)
+-23 + j*(134)
+0 + j*(1)
+-84 + j*(45)
+12 + j*(110)
+64 + j*(-10)
+-69 + j*(-43)
+-93 + j*(108)
+71 + j*(156)
+163 + j*(8)
+57 + j*(-125)
+-102 + j*(-61)
+-56 + j*(121)
+161 + j*(79)
+127 + j*(-186)
+-178 + j*(-166)
+-173 + j*(155)
+146 + j*(148)
+126 + j*(-161)
+-166 + j*(-127)
+-125 + j*(134)
+91 + j*(84)
+23 + j*(-89)
+-124 + j*(-6)
+-51 + j*(129)
+67 + j*(97)
+84 + j*(18)
+59 + j*(-33)
+6 + j*(-53)
+-37 + j*(-18)
+-30 + j*(18)
+-25 + j*(32)
+-8 + j*(62)
+33 + j*(58)
+24 + j*(46)
+67 + j*(115)
+241 + j*(51)
+215 + j*(-228)
+-107 + j*(-264)
+-177 + j*(41)
+102 + j*(90)
+109 + j*(-188)
+-174 + j*(-182)
+-178 + j*(73)
+10 + j*(71)
+-40 + j*(-48)
+-136 + j*(58)
+-13 + j*(171)
+109 + j*(90)
+91 + j*(7)
+77 + j*(-2)
+96 + j*(-32)
+83 + j*(-88)
+29 + j*(-134)
+-59 + j*(-119)
+-66 + j*(-29)
+28 + j*(-53)
+-49 + j*(-205)
+-292 + j*(-125)
+-271 + j*(165)
+-31 + j*(194)
+-34 + j*(57)
+-119 + j*(175)
+101 + j*(296)
+293 + j*(71)
+163 + j*(-140)
+30 + j*(-122)
+-22 + j*(-136)
+-182 + j*(-74)
+-144 + j*(190)
+173 + j*(177)
+170 + j*(-153)
+-148 + j*(-142)
+-109 + j*(144)
+128 + j*(57)
+-21 + j*(-135)
+-193 + j*(74)
+42 + j*(246)
+203 + j*(37)
+45 + j*(-69)
+21 + j*(54)
+144 + j*(16)
+93 + j*(-97)
+38 + j*(-51)
+118 + j*(-80)
+45 + j*(-235)
+-166 + j*(-204)
+-220 + j*(-24)
+-149 + j*(75)
+-78 + j*(117)
+16 + j*(105)
+23 + j*(11)
+-76 + j*(37)
+-7 + j*(185)
+194 + j*(125)
+190 + j*(-84)
+45 + j*(-119)
+28 + j*(-83)
+-14 + j*(-139)
+-162 + j*(-71)
+-115 + j*(148)
+133 + j*(147)
+187 + j*(-83)
+16 + j*(-179)
+-76 + j*(-82)
+-33 + j*(-36)
+-30 + j*(-78)
+-91 + j*(-79)
+-127 + j*(-24)
+-125 + j*(30)
+-112 + j*(84)
+-52 + j*(161)
+103 + j*(162)
+213 + j*(-22)
+71 + j*(-232)
+-186 + j*(-186)
+-230 + j*(35)
+-110 + j*(97)
+-126 + j*(50)
+-202 + j*(181)
+-38 + j*(369)
+234 + j*(290)
+279 + j*(59)
+192 + j*(-30)
+180 + j*(-76)
+80 + j*(-197)
+-156 + j*(-118)
+-127 + j*(197)
+230 + j*(240)
+357 + j*(-110)
+89 + j*(-301)
+-90 + j*(-158)
+-49 + j*(-65)
+-64 + j*(-64)
+-56 + j*(29)
+84 + j*(9)
+41 + j*(-170)
+-170 + j*(-97)
+-65 + j*(140)
+202 + j*(-10)
+26 + j*(-335)
+-357 + j*(-192)
+-310 + j*(196)
+-2 + j*(245)
+78 + j*(64)
+8 + j*(8)
+-12 + j*(19)
+-44 + j*(29)
+-33 + j*(104)
+85 + j*(107)
+105 + j*(-25)
+-24 + j*(-45)
+-27 + j*(93)
+144 + j*(96)
+188 + j*(-94)
+28 + j*(-198)
+-100 + j*(-114)
+-93 + j*(-23)
+-74 + j*(-4)
+-90 + j*(39)
+-28 + j*(117)
+111 + j*(85)
+137 + j*(-92)
+-47 + j*(-187)
+-205 + j*(-25)
+-78 + j*(178)
+155 + j*(92)
+112 + j*(-166)
+-160 + j*(-181)
+-235 + j*(68)
+-44 + j*(175)
+44 + j*(33)
+-103 + j*(-21)
+-174 + j*(165)
+8 + j*(320)
+242 + j*(232)
+292 + j*(9)
+166 + j*(-132)
+25 + j*(-111)
+-6 + j*(-17)
+49 + j*(25)
+98 + j*(0)
+110 + j*(-52)
+78 + j*(-95)
+43 + j*(-95)
+57 + j*(-105)
+17 + j*(-192)
+-161 + j*(-177)
+-211 + j*(55)
+24 + j*(159)
+147 + j*(-49)
+-27 + j*(-159)
+-86 + j*(-21)
+30 + j*(-39)
+-74 + j*(-160)
+-217 + j*(10)
+6 + j*(170)
+178 + j*(-110)
+-146 + j*(-326)
+-436 + j*(-13)
+-206 + j*(317)
+84 + j*(190)
+-2 + j*(-10)
+-135 + j*(107)
+26 + j*(238)
+175 + j*(51)
+-33 + j*(-112)
+-230 + j*(151)
+72 + j*(428)
+441 + j*(163)
+285 + j*(-211)
+31 + j*(-141)
+122 + j*(-71)
+59 + j*(-276)
+-257 + j*(-174)
+-159 + j*(170)
+137 + j*(47)
+-65 + j*(-188)
+-270 + j*(93)
+35 + j*(292)
+190 + j*(24)
+-17 + j*(-28)
+60 + j*(139)
+204 + j*(-42)
+-46 + j*(-151)
+-100 + j*(155)
+249 + j*(170)
+259 + j*(-165)
+19 + j*(-155)
+119 + j*(-50)
+136 + j*(-286)
+-193 + j*(-291)
+-197 + j*(45)
+93 + j*(-6)
+-42 + j*(-261)
+-276 + j*(-72)
+-58 + j*(115)
+63 + j*(-158)
+-290 + j*(-265)
+-474 + j*(115)
+-182 + j*(390)
+96 + j*(258)
+81 + j*(59)
+-41 + j*(51)
+-43 + j*(172)
+125 + j*(212)
+248 + j*(37)
+133 + j*(-148)
+-28 + j*(-124)
+-58 + j*(-66)
+-134 + j*(-73)
+-265 + j*(95)
+-115 + j*(383)
+272 + j*(359)
+402 + j*(-1)
+164 + j*(-211)
+-20 + j*(-98)
+35 + j*(7)
+76 + j*(-46)
+15 + j*(-50)
+42 + j*(10)
+103 + j*(-47)
+29 + j*(-105)
+1 + j*(-14)
+133 + j*(-28)
+109 + j*(-211)
+-85 + j*(-211)
+-73 + j*(-80)
+-12 + j*(-185)
+-257 + j*(-252)
+-415 + j*(74)
+-114 + j*(316)
+127 + j*(92)
+-46 + j*(-83)
+-161 + j*(90)
+21 + j*(185)
+119 + j*(18)
+-19 + j*(-86)
+-134 + j*(21)
+-71 + j*(149)
+52 + j*(132)
+54 + j*(53)
+23 + j*(91)
+148 + j*(122)
+232 + j*(-80)
+6 + j*(-236)
+-189 + j*(-35)
+-30 + j*(151)
+110 + j*(29)
+18 + j*(-44)
+18 + j*(25)
+71 + j*(-54)
+-92 + j*(-98)
+-150 + j*(140)
+132 + j*(248)
+313 + j*(-16)
+139 + j*(-256)
+-113 + j*(-218)
+-223 + j*(-1)
+-79 + j*(244)
+271 + j*(206)
+365 + j*(-177)
+55 + j*(-370)
+-127 + j*(-204)
+-74 + j*(-156)
+-203 + j*(-210)
+-339 + j*(19)
+-121 + j*(228)
+83 + j*(73)
+-7 + j*(-76)
+-74 + j*(-42)
+-105 + j*(-87)
+-296 + j*(-25)
+-277 + j*(303)
+100 + j*(375)
+226 + j*(42)
+-40 + j*(-61)
+-86 + j*(187)
+175 + j*(223)
+258 + j*(-19)
+107 + j*(-147)
+-11 + j*(-129)
+-97 + j*(-93)
+-180 + j*(18)
+-139 + j*(190)
+23 + j*(274)
+184 + j*(236)
+315 + j*(129)
+383 + j*(-73)
+267 + j*(-321)
+-45 + j*(-396)
+-294 + j*(-148)
+-168 + j*(194)
+203 + j*(185)
+301 + j*(-173)
+-1 + j*(-367)
+-240 + j*(-165)
+-136 + j*(38)
+1 + j*(-26)
+-81 + j*(-139)
+-235 + j*(-66)
+-253 + j*(145)
+-54 + j*(307)
+235 + j*(204)
+265 + j*(-140)
+-65 + j*(-286)
+-284 + j*(-6)
+-80 + j*(246)
+168 + j*(127)
+129 + j*(-69)
+18 + j*(-79)
+10 + j*(-55)
+-6 + j*(-84)
+-62 + j*(-88)
+-127 + j*(-64)
+-195 + j*(52)
+-80 + j*(241)
+212 + j*(180)
+235 + j*(-160)
+-88 + j*(-255)
+-211 + j*(1)
+-27 + j*(86)
+-21 + j*(-64)
+-187 + j*(-4)
+-112 + j*(192)
+86 + j*(136)
+46 + j*(-40)
+-119 + j*(-14)
+-132 + j*(142)
+-19 + j*(224)
+86 + j*(201)
+132 + j*(159)
+184 + j*(144)
+286 + j*(71)
+287 + j*(-121)
+101 + j*(-206)
+8 + j*(-66)
+159 + j*(-26)
+183 + j*(-241)
+-70 + j*(-322)
+-205 + j*(-115)
+-80 + j*(1)
+-47 + j*(-96)
+-193 + j*(-70)
+-182 + j*(145)
+61 + j*(205)
+191 + j*(-12)
+30 + j*(-181)
+-134 + j*(-75)
+-66 + j*(42)
+-21 + j*(-38)
+-177 + j*(-21)
+-162 + j*(250)
+190 + j*(324)
+389 + j*(-1)
+202 + j*(-268)
+-9 + j*(-250)
+-85 + j*(-190)
+-165 + j*(-132)
+-175 + j*(-1)
+-69 + j*(38)
+-55 + j*(-35)
+-124 + j*(-18)
+-110 + j*(44)
+-94 + j*(37)
+-130 + j*(83)
+-62 + j*(179)
+81 + j*(139)
+98 + j*(-9)
+-30 + j*(-78)
+-156 + j*(11)
+-132 + j*(190)
+69 + j*(250)
+196 + j*(72)
+58 + j*(-65)
+-54 + j*(53)
+72 + j*(150)
+165 + j*(21)
+50 + j*(-70)
+-45 + j*(34)
+35 + j*(168)
+235 + j*(170)
+391 + j*(-54)
+242 + j*(-366)
+-132 + j*(-349)
+-209 + j*(-13)
+61 + j*(66)
+103 + j*(-178)
+-140 + j*(-204)
+-170 + j*(10)
+-18 + j*(20)
+-69 + j*(-89)
+-191 + j*(18)
+-77 + j*(186)
+122 + j*(123)
+134 + j*(-72)
+-21 + j*(-153)
+-157 + j*(-62)
+-147 + j*(90)
+-30 + j*(162)
+78 + j*(128)
+128 + j*(52)
+129 + j*(-39)
+54 + j*(-112)
+-57 + j*(-70)
+-37 + j*(69)
+148 + j*(86)
+257 + j*(-141)
+59 + j*(-385)
+-279 + j*(-310)
+-349 + j*(4)
+-136 + j*(132)
+-54 + j*(-13)
+-226 + j*(-44)
+-296 + j*(187)
+-86 + j*(364)
+149 + j*(270)
+174 + j*(87)
+90 + j*(40)
+105 + j*(76)
+181 + j*(-5)
+86 + j*(-147)
+-91 + j*(-65)
+-9 + j*(110)
+159 + j*(-8)
+-11 + j*(-176)
+-190 + j*(42)
+68 + j*(233)
+261 + j*(-37)
+21 + j*(-206)
+-69 + j*(-16)
+96 + j*(-71)
+-120 + j*(-277)
+-433 + j*(43)
+-113 + j*(453)
+306 + j*(214)
+134 + j*(-105)
+-35 + j*(83)
+228 + j*(158)
+294 + j*(-152)
+21 + j*(-230)
+-8 + j*(-52)
+100 + j*(-127)
+-74 + j*(-223)
+-178 + j*(4)
+83 + j*(98)
+169 + j*(-205)
+-161 + j*(-320)
+-317 + j*(-17)
+-81 + j*(132)
+8 + j*(-56)
+-179 + j*(-90)
+-199 + j*(103)
+-43 + j*(113)
+-83 + j*(4)
+-197 + j*(112)
+-80 + j*(269)
+73 + j*(223)
+95 + j*(174)
+190 + j*(176)
+292 + j*(6)
+148 + j*(-172)
+-16 + j*(-81)
+67 + j*(17)
+118 + j*(-107)
+-34 + j*(-157)
+-94 + j*(-16)
+16 + j*(43)
+71 + j*(-37)
+34 + j*(-95)
+-16 + j*(-122)
+-96 + j*(-127)
+-170 + j*(-51)
+-168 + j*(58)
+-98 + j*(134)
+1 + j*(136)
+44 + j*(64)
+-2 + j*(47)
+29 + j*(110)
+141 + j*(53)
+81 + j*(-95)
+-76 + j*(-31)
+3 + j*(137)
+197 + j*(63)
+176 + j*(-136)
+30 + j*(-194)
+-62 + j*(-160)
+-128 + j*(-101)
+-132 + j*(-6)
+-75 + j*(22)
+-81 + j*(8)
+-88 + j*(57)
+-30 + j*(64)
+-62 + j*(31)
+-95 + j*(136)
+72 + j*(214)
+193 + j*(50)
+74 + j*(-64)
+23 + j*(25)
+122 + j*(24)
+123 + j*(-87)
+58 + j*(-127)
+1 + j*(-174)
+-169 + j*(-155)
+-218 + j*(85)
+28 + j*(179)
+113 + j*(-44)
+-93 + j*(-81)
+-86 + j*(119)
+101 + j*(91)
+65 + j*(-50)
+4 + j*(-4)
+80 + j*(-27)
+-8 + j*(-143)
+-153 + j*(-26)
+-38 + j*(117)
+76 + j*(17)
+-6 + j*(-52)
+-33 + j*(6)
+-18 + j*(-1)
+-59 + j*(51)
+66 + j*(141)
+221 + j*(-31)
+57 + j*(-251)
+-185 + j*(-149)
+-173 + j*(52)
+-64 + j*(115)
+47 + j*(105)
+112 + j*(-37)
+-73 + j*(-145)
+-216 + j*(90)
+59 + j*(261)
+247 + j*(-18)
+-3 + j*(-190)
+-117 + j*(4)
+4 + j*(30)
+-83 + j*(-12)
+-57 + j*(210)
+305 + j*(148)
+264 + j*(-318)
+-233 + j*(-344)
+-327 + j*(86)
+-46 + j*(213)
+59 + j*(112)
+123 + j*(61)
+132 + j*(-136)
+-174 + j*(-194)
+-283 + j*(185)
+114 + j*(347)
+311 + j*(16)
+122 + j*(-151)
+63 + j*(-121)
+-25 + j*(-228)
+-282 + j*(-91)
+-136 + j*(250)
+212 + j*(86)
+-5 + j*(-243)
+-327 + j*(39)
+-32 + j*(371)
+282 + j*(131)
+129 + j*(-94)
+45 + j*(4)
+151 + j*(-32)
+63 + j*(-173)
+-78 + j*(-105)
+-53 + j*(-16)
+-42 + j*(-6)
+-19 + j*(64)
+116 + j*(46)
+123 + j*(-122)
+-24 + j*(-168)
+-87 + j*(-91)
+-96 + j*(-54)
+-105 + j*(11)
+-15 + j*(45)
+6 + j*(-69)
+-151 + j*(-69)
+-148 + j*(140)
+89 + j*(154)
+129 + j*(-83)
+-83 + j*(-156)
+-197 + j*(5)
+-127 + j*(157)
+31 + j*(202)
+190 + j*(87)
+156 + j*(-146)
+-85 + j*(-204)
+-216 + j*(-30)
+-155 + j*(107)
+-95 + j*(154)
+-13 + j*(214)
+136 + j*(175)
+153 + j*(21)
+40 + j*(-1)
+65 + j*(89)
+175 + j*(22)
+105 + j*(-119)
+-43 + j*(-61)
+13 + j*(91)
+191 + j*(42)
+188 + j*(-163)
+1 + j*(-242)
+-140 + j*(-134)
+-145 + j*(11)
+-46 + j*(112)
+123 + j*(88)
+182 + j*(-113)
+-4 + j*(-250)
+-164 + j*(-119)
+-84 + j*(-23)
+-111 + j*(-127)
+-332 + j*(-11)
+-223 + j*(346)
+188 + j*(330)
+250 + j*(-14)
+39 + j*(-63)
+91 + j*(49)
+187 + j*(-119)
+-20 + j*(-245)
+-148 + j*(-88)
+-70 + j*(-34)
+-145 + j*(-76)
+-208 + j*(101)
+6 + j*(201)
+101 + j*(0)
+-80 + j*(-46)
+-74 + j*(122)
+69 + j*(79)
+-21 + j*(-8)
+-45 + j*(161)
+223 + j*(167)
+260 + j*(-165)
+-73 + j*(-249)
+-171 + j*(35)
+70 + j*(114)
+132 + j*(-117)
+-102 + j*(-209)
+-268 + j*(-11)
+-166 + j*(224)
+73 + j*(252)
+189 + j*(76)
+90 + j*(-40)
+28 + j*(37)
+148 + j*(68)
+208 + j*(-92)
+79 + j*(-209)
+-41 + j*(-173)
+-88 + j*(-124)
+-132 + j*(-63)
+-104 + j*(26)
+-31 + j*(5)
+-103 + j*(-40)
+-168 + j*(113)
+37 + j*(241)
+228 + j*(40)
+66 + j*(-176)
+-133 + j*(-46)
+-21 + j*(117)
+107 + j*(22)
+41 + j*(-64)
+28 + j*(-28)
+63 + j*(-115)
+-113 + j*(-202)
+-288 + j*(13)
+-102 + j*(262)
+165 + j*(146)
+112 + j*(-84)
+-59 + j*(-62)
+-39 + j*(65)
+69 + j*(44)
+68 + j*(-50)
+-1 + j*(-81)
+-45 + j*(-60)
+-72 + j*(-40)
+-107 + j*(0)
+-97 + j*(94)
+23 + j*(130)
+104 + j*(6)
+-19 + j*(-107)
+-163 + j*(2)
+-98 + j*(163)
+32 + j*(159)
+57 + j*(105)
+67 + j*(107)
+103 + j*(98)
+129 + j*(96)
+221 + j*(78)
+284 + j*(-74)
+160 + j*(-206)
+58 + j*(-151)
+107 + j*(-152)
+34 + j*(-272)
+-140 + j*(-206)
+-98 + j*(-59)
+-9 + j*(-129)
+-130 + j*(-213)
+-245 + j*(-123)
+-288 + j*(-35)
+-350 + j*(134)
+-155 + j*(395)
+218 + j*(272)
+158 + j*(-80)
+-105 + j*(11)
+93 + j*(211)
+281 + j*(-88)
+-50 + j*(-284)
+-209 + j*(13)
+38 + j*(69)
+-41 + j*(-163)
+-296 + j*(27)
+-74 + j*(295)
+156 + j*(88)
+-33 + j*(-39)
+-42 + j*(158)
+167 + j*(74)
+14 + j*(-136)
+-183 + j*(77)
+65 + j*(263)
+221 + j*(14)
+-19 + j*(-74)
+-25 + j*(204)
+338 + j*(187)
+400 + j*(-231)
+31 + j*(-421)
+-223 + j*(-202)
+-164 + j*(-1)
+-90 + j*(11)
+-108 + j*(50)
+-28 + j*(141)
+110 + j*(79)
+81 + j*(-49)
+1 + j*(-29)
+44 + j*(-4)
+22 + j*(-83)
+-86 + j*(-19)
+19 + j*(105)
+155 + j*(-39)
+-16 + j*(-174)
+-126 + j*(8)
+58 + j*(71)
+61 + j*(-107)
+-94 + j*(-41)
+53 + j*(81)
+152 + j*(-152)
+-134 + j*(-249)
+-212 + j*(27)
+13 + j*(31)
+-108 + j*(-165)
+-331 + j*(65)
+-63 + j*(331)
+197 + j*(100)
+23 + j*(-91)
+-70 + j*(56)
+72 + j*(66)
+44 + j*(-62)
+-47 + j*(-30)
+-16 + j*(-4)
+-71 + j*(-36)
+-115 + j*(84)
+42 + j*(141)
+95 + j*(-24)
+-60 + j*(-59)
+-73 + j*(71)
+12 + j*(56)
+-54 + j*(25)
+-49 + j*(161)
+138 + j*(169)
+171 + j*(-16)
+31 + j*(-37)
+76 + j*(78)
+231 + j*(-36)
+105 + j*(-274)
+-192 + j*(-209)
+-205 + j*(77)
+11 + j*(123)
+16 + j*(-23)
+-105 + j*(62)
+64 + j*(218)
+275 + j*(9)
+74 + j*(-238)
+-168 + j*(-60)
+-8 + j*(139)
+133 + j*(-11)
+-16 + j*(-84)
+-25 + j*(78)
+161 + j*(52)
+138 + j*(-136)
+-6 + j*(-127)
+21 + j*(-45)
+83 + j*(-111)
+18 + j*(-208)
+-103 + j*(-223)
+-221 + j*(-151)
+-252 + j*(-1)
+-166 + j*(93)
+-98 + j*(93)
+-58 + j*(98)
+-4 + j*(57)
+-63 + j*(-6)
+-138 + j*(103)
+16 + j*(211)
+146 + j*(52)
+10 + j*(-53)
+-27 + j*(73)
+110 + j*(28)
+-1 + j*(-129)
+-175 + j*(21)
+-14 + j*(196)
+130 + j*(52)
+11 + j*(-21)
+27 + j*(103)
+193 + j*(16)
+107 + j*(-202)
+-131 + j*(-188)
+-225 + j*(0)
+-151 + j*(190)
+72 + j*(253)
+236 + j*(65)
+118 + j*(-120)
+0 + j*(-57)
+58 + j*(-48)
+-39 + j*(-142)
+-183 + j*(23)
+5 + j*(203)
+180 + j*(36)
+63 + j*(-68)
+97 + j*(18)
+214 + j*(-175)
+-72 + j*(-381)
+-351 + j*(-119)
+-185 + j*(129)
+-79 + j*(41)
+-179 + j*(95)
+-40 + j*(252)
+127 + j*(124)
+24 + j*(40)
+58 + j*(175)
+269 + j*(78)
+195 + j*(-171)
+1 + j*(-156)
+-3 + j*(-79)
+-44 + j*(-112)
+-129 + j*(-7)
+-21 + j*(110)
+84 + j*(32)
+48 + j*(-4)
+119 + j*(15)
+174 + j*(-157)
+-36 + j*(-284)
+-210 + j*(-117)
+-117 + j*(38)
+-27 + j*(-5)
+-57 + j*(-45)
+-81 + j*(-31)
+-107 + j*(-19)
+-129 + j*(36)
+-92 + j*(88)
+-56 + j*(98)
+-28 + j*(129)
+60 + j*(140)
+129 + j*(58)
+108 + j*(-37)
+47 + j*(-77)
+-11 + j*(-66)
+-13 + j*(-17)
+44 + j*(-52)
+-26 + j*(-168)
+-223 + j*(-115)
+-238 + j*(111)
+-64 + j*(192)
+21 + j*(105)
+-16 + j*(61)
+-45 + j*(96)
+-6 + j*(173)
+145 + j*(181)
+225 + j*(-13)
+28 + j*(-133)
+-81 + j*(72)
+163 + j*(156)
+250 + j*(-125)
+-13 + j*(-226)
+-88 + j*(-43)
+2 + j*(-64)
+-158 + j*(-110)
+-231 + j*(163)
+66 + j*(300)
+243 + j*(77)
+145 + j*(-66)
+91 + j*(-82)
+-3 + j*(-118)
+-97 + j*(46)
+150 + j*(188)
+357 + j*(-127)
+28 + j*(-403)
+-263 + j*(-116)
+-34 + j*(139)
+162 + j*(-49)
+13 + j*(-190)
+-71 + j*(-94)
+-10 + j*(-69)
+-17 + j*(-113)
+-30 + j*(-117)
+-39 + j*(-168)
+-137 + j*(-205)
+-234 + j*(-144)
+-278 + j*(-71)
+-324 + j*(36)
+-268 + j*(194)
+-107 + j*(233)
+-40 + j*(147)
+144 + j*(100)
+114 + j*(-139)
+-59 + j*(-81)
+41 + j*(-2)
+23 + j*(-161)
+-189 + j*(-74)
+-52 + j*(148)
+144 + j*(-46)
+-123 + j*(-207)
+-264 + j*(122)
+91 + j*(254)
+206 + j*(-91)
+-107 + j*(-187)
+-196 + j*(83)
+6 + j*(176)
+105 + j*(62)
+81 + j*(-24)
+15 + j*(-57)
+-35 + j*(6)
+52 + j*(47)
+86 + j*(-85)
+-80 + j*(-120)
+-107 + j*(52)
+46 + j*(39)
+-36 + j*(-94)
+-171 + j*(52)
+12 + j*(190)
+124 + j*(6)
+-62 + j*(-54)
+-77 + j*(151)
+130 + j*(168)
+180 + j*(26)
+166 + j*(-25)
+178 + j*(-141)
+-4 + j*(-233)
+-127 + j*(-46)
+69 + j*(38)
+97 + j*(-207)
+-206 + j*(-209)
+-213 + j*(114)
+80 + j*(118)
+58 + j*(-122)
+-129 + j*(-64)
+-42 + j*(75)
+59 + j*(-29)
+-37 + j*(-95)
+-54 + j*(-34)
+-23 + j*(-101)
+-174 + j*(-157)
+-306 + j*(5)
+-240 + j*(180)
+-135 + j*(243)
+-26 + j*(291)
+132 + j*(257)
+208 + j*(124)
+208 + j*(8)
+157 + j*(-139)
+-93 + j*(-210)
+-298 + j*(95)
+19 + j*(426)
+450 + j*(151)
+264 + j*(-317)
+-165 + j*(-221)
+-127 + j*(117)
+110 + j*(104)
+114 + j*(-34)
+76 + j*(-50)
+64 + j*(-108)
+-61 + j*(-112)
+-74 + j*(44)
+88 + j*(50)
+76 + j*(-103)
+-59 + j*(-65)
+11 + j*(50)
+115 + j*(-42)
+33 + j*(-141)
+-35 + j*(-100)
+-25 + j*(-98)
+-86 + j*(-113)
+-129 + j*(-36)
+-80 + j*(10)
+-71 + j*(-4)
+-76 + j*(33)
+-16 + j*(42)
+-2 + j*(-22)
+-56 + j*(-44)
+-93 + j*(-27)
+-144 + j*(9)
+-151 + j*(122)
+-30 + j*(186)
+37 + j*(105)
+-25 + j*(115)
+68 + j*(235)
+293 + j*(144)
+298 + j*(-127)
+99 + j*(-245)
+-52 + j*(-191)
+-116 + j*(-89)
+-85 + j*(19)
+25 + j*(21)
+33 + j*(-80)
+-43 + j*(-100)
+-53 + j*(-90)
+-119 + j*(-156)
+-303 + j*(-93)
+-355 + j*(148)
+-214 + j*(329)
+-27 + j*(395)
+199 + j*(349)
+314 + j*(112)
+151 + j*(-49)
+52 + j*(86)
+244 + j*(121)
+284 + j*(-127)
+49 + j*(-185)
+27 + j*(2)
+211 + j*(-42)
+151 + j*(-265)
+-82 + j*(-264)
+-145 + j*(-88)
+-41 + j*(-4)
+49 + j*(-73)
+-9 + j*(-200)
+-190 + j*(-180)
+-232 + j*(2)
+-119 + j*(68)
+-112 + j*(33)
+-122 + j*(126)
+45 + j*(161)
+108 + j*(-21)
+-56 + j*(-84)
+-106 + j*(52)
+-6 + j*(88)
+16 + j*(47)
+35 + j*(50)
+67 + j*(-11)
+-2 + j*(-44)
+1 + j*(21)
+67 + j*(-56)
+-99 + j*(-135)
+-204 + j*(109)
+81 + j*(243)
+216 + j*(-44)
+-47 + j*(-130)
+-43 + j*(114)
+233 + j*(11)
+84 + j*(-315)
+-265 + j*(-170)
+-150 + j*(167)
+147 + j*(76)
+84 + j*(-208)
+-208 + j*(-217)
+-339 + j*(59)
+-137 + j*(312)
+177 + j*(216)
+168 + j*(-83)
+-66 + j*(-107)
+-75 + j*(45)
+-13 + j*(2)
+-144 + j*(21)
+-92 + j*(252)
+191 + j*(226)
+193 + j*(-28)
+28 + j*(-5)
+127 + j*(87)
+182 + j*(-74)
+2 + j*(-99)
+33 + j*(83)
+234 + j*(-5)
+139 + j*(-223)
+-50 + j*(-148)
+25 + j*(-31)
+87 + j*(-139)
+-49 + j*(-194)
+-114 + j*(-74)
+-28 + j*(-21)
+13 + j*(-83)
+-19 + j*(-139)
+-81 + j*(-182)
+-221 + j*(-189)
+-378 + j*(-21)
+-302 + j*(275)
+32 + j*(345)
+192 + j*(62)
+-36 + j*(-93)
+-155 + j*(137)
+107 + j*(244)
+225 + j*(-13)
+21 + j*(-123)
+-39 + j*(11)
+32 + j*(-8)
+-66 + j*(-26)
+-44 + j*(143)
+177 + j*(104)
+151 + j*(-119)
+-4 + j*(-110)
+28 + j*(-82)
+-83 + j*(-192)
+-298 + j*(13)
+-53 + j*(310)
+272 + j*(63)
+35 + j*(-238)
+-210 + j*(-17)
+-16 + j*(141)
+29 + j*(-34)
+-162 + j*(33)
+-40 + j*(267)
+216 + j*(182)
+217 + j*(-12)
+163 + j*(-77)
+107 + j*(-164)
+-49 + j*(-154)
+-57 + j*(-6)
+54 + j*(-30)
+-21 + j*(-124)
+-98 + j*(-25)
+-4 + j*(8)
+-48 + j*(-83)
+-159 + j*(32)
+-23 + j*(166)
+86 + j*(62)
+21 + j*(54)
+163 + j*(147)
+370 + j*(-109)
+130 + j*(-465)
+-307 + j*(-383)
+-434 + j*(-24)
+-293 + j*(241)
+-41 + j*(349)
+219 + j*(228)
+253 + j*(-38)
+90 + j*(-149)
+0 + j*(-105)
+-21 + j*(-91)
+-54 + j*(-76)
+-62 + j*(-71)
+-137 + j*(-81)
+-226 + j*(62)
+-79 + j*(230)
+105 + j*(127)
+32 + j*(-2)
+-16 + j*(91)
+112 + j*(83)
+72 + j*(-52)
+-34 + j*(34)
+112 + j*(119)
+197 + j*(-66)
+29 + j*(-139)
+23 + j*(-28)
+93 + j*(-136)
+-129 + j*(-206)
+-209 + j*(88)
+128 + j*(161)
+176 + j*(-214)
+-231 + j*(-250)
+-276 + j*(163)
+103 + j*(216)
+162 + j*(-110)
+-103 + j*(-170)
+-168 + j*(8)
+-94 + j*(54)
+-115 + j*(67)
+-83 + j*(164)
+49 + j*(171)
+99 + j*(70)
+49 + j*(5)
+-25 + j*(11)
+-71 + j*(113)
+41 + j*(254)
+279 + j*(206)
+356 + j*(-46)
+205 + j*(-207)
+76 + j*(-194)
+20 + j*(-175)
+-49 + j*(-140)
+-44 + j*(-54)
+33 + j*(-76)
+-28 + j*(-177)
+-183 + j*(-119)
+-182 + j*(59)
+-43 + j*(129)
+66 + j*(73)
+86 + j*(-34)
+5 + j*(-106)
+-82 + j*(-42)
+-15 + j*(33)
+47 + j*(-59)
+-76 + j*(-122)
+-139 + j*(6)
+-29 + j*(49)
+-35 + j*(-45)
+-131 + j*(8)
+-66 + j*(96)
+-30 + j*(40)
+-101 + j*(95)
+33 + j*(218)
+203 + j*(63)
+78 + j*(-99)
+5 + j*(-5)
+102 + j*(-70)
+-103 + j*(-209)
+-305 + j*(100)
+66 + j*(353)
+339 + j*(-42)
+-57 + j*(-307)
+-301 + j*(69)
+21 + j*(284)
+190 + j*(57)
+82 + j*(-44)
+60 + j*(-49)
+-45 + j*(-98)
+-144 + j*(104)
+140 + j*(253)
+336 + j*(-73)
+31 + j*(-284)
+-132 + j*(-40)
+67 + j*(16)
+7 + j*(-181)
+-216 + j*(-55)
+-95 + j*(177)
+87 + j*(103)
+58 + j*(34)
+124 + j*(73)
+238 + j*(-86)
+78 + j*(-296)
+-180 + j*(-224)
+-221 + j*(8)
+-57 + j*(126)
+105 + j*(9)
+-1 + j*(-199)
+-282 + j*(-111)
+-247 + j*(228)
+83 + j*(258)
+134 + j*(0)
+-55 + j*(-5)
+2 + j*(168)
+202 + j*(102)
+206 + j*(-102)
+62 + j*(-202)
+-98 + j*(-160)
+-134 + j*(5)
+27 + j*(59)
+62 + j*(-136)
+-194 + j*(-168)
+-259 + j*(117)
+-12 + j*(205)
+42 + j*(38)
+-71 + j*(74)
+40 + j*(184)
+169 + j*(58)
+74 + j*(-47)
+27 + j*(14)
+86 + j*(18)
+86 + j*(-35)
+77 + j*(-62)
+31 + j*(-113)
+-66 + j*(-48)
+53 + j*(76)
+242 + j*(-124)
+-1 + j*(-432)
+-417 + j*(-264)
+-421 + j*(142)
+-186 + j*(296)
+-6 + j*(315)
+218 + j*(226)
+247 + j*(-93)
+-90 + j*(-182)
+-182 + j*(164)
+179 + j*(245)
+259 + j*(-111)
+-62 + j*(-174)
+-81 + j*(103)
+185 + j*(71)
+134 + j*(-216)
+-175 + j*(-194)
+-214 + j*(105)
+35 + j*(205)
+169 + j*(27)
+64 + j*(-98)
+-13 + j*(-45)
+30 + j*(-47)
+-57 + j*(-122)
+-204 + j*(22)
+-45 + j*(244)
+211 + j*(115)
+117 + j*(-112)
+-33 + j*(-10)
+135 + j*(69)
+196 + j*(-180)
+-95 + j*(-271)
+-214 + j*(4)
+13 + j*(116)
+98 + j*(-71)
+-56 + j*(-140)
+-122 + j*(-34)
+-77 + j*(11)
+-88 + j*(7)
+-112 + j*(77)
+-31 + j*(173)
+130 + j*(153)
+206 + j*(-4)
+139 + j*(-139)
+52 + j*(-182)
+-37 + j*(-235)
+-233 + j*(-211)
+-333 + j*(33)
+-136 + j*(209)
+6 + j*(76)
+-130 + j*(20)
+-127 + j*(216)
+112 + j*(206)
+97 + j*(-23)
+-114 + j*(33)
+-18 + j*(248)
+208 + j*(163)
+162 + j*(-18)
+74 + j*(20)
+156 + j*(33)
+157 + j*(-88)
+54 + j*(-106)
+54 + j*(-64)
+59 + j*(-120)
+-37 + j*(-133)
+-66 + j*(-51)
+-35 + j*(-43)
+-90 + j*(-32)
+-62 + j*(88)
+112 + j*(53)
+64 + j*(-175)
+-239 + j*(-116)
+-204 + j*(276)
+263 + j*(312)
+400 + j*(-181)
+-59 + j*(-414)
+-345 + j*(-23)
+-17 + j*(279)
+287 + j*(-2)
+54 + j*(-317)
+-267 + j*(-153)
+-187 + j*(132)
+25 + j*(112)
+10 + j*(-30)
+-101 + j*(14)
+-50 + j*(140)
+96 + j*(128)
+144 + j*(-4)
+58 + j*(-91)
+-30 + j*(-45)
+-2 + j*(36)
+90 + j*(21)
+115 + j*(-74)
+66 + j*(-150)
+-4 + j*(-198)
+-127 + j*(-223)
+-272 + j*(-129)
+-288 + j*(60)
+-172 + j*(156)
+-106 + j*(139)
+-111 + j*(180)
+-2 + j*(269)
+180 + j*(195)
+193 + j*(-4)
+47 + j*(-75)
+-20 + j*(1)
+14 + j*(30)
+-6 + j*(3)
+-56 + j*(64)
+12 + j*(162)
+153 + j*(139)
+195 + j*(6)
+124 + j*(-74)
+64 + j*(-59)
+65 + j*(-44)
+59 + j*(-62)
+30 + j*(-60)
+30 + j*(-37)
+40 + j*(-38)
+44 + j*(-30)
+95 + j*(-29)
+142 + j*(-123)
+58 + j*(-236)
+-76 + j*(-217)
+-99 + j*(-147)
+-112 + j*(-163)
+-206 + j*(-144)
+-247 + j*(-40)
+-233 + j*(20)
+-268 + j*(112)
+-160 + j*(294)
+119 + j*(248)
+119 + j*(-46)
+-166 + j*(-35)
+-129 + j*(279)
+225 + j*(253)
+252 + j*(-98)
+-35 + j*(-184)
+-156 + j*(-9)
+-127 + j*(107)
+-74 + j*(223)
+131 + j*(286)
+298 + j*(88)
+164 + j*(-94)
+57 + j*(7)
+195 + j*(31)
+187 + j*(-161)
+-21 + j*(-151)
+23 + j*(42)
+228 + j*(-50)
+130 + j*(-291)
+-111 + j*(-240)
+-89 + j*(-58)
+41 + j*(-115)
+-55 + j*(-274)
+-294 + j*(-221)
+-366 + j*(43)
+-172 + j*(231)
+43 + j*(133)
+-14 + j*(-48)
+-181 + j*(25)
+-89 + j*(216)
+122 + j*(141)
+79 + j*(-52)
+-66 + j*(-21)
+-28 + j*(63)
+-8 + j*(-1)
+-116 + j*(37)
+-42 + j*(202)
+159 + j*(124)
+83 + j*(-76)
+-100 + j*(16)
+22 + j*(194)
+196 + j*(66)
+77 + j*(-83)
+-19 + j*(47)
+152 + j*(118)
+251 + j*(-88)
+80 + j*(-239)
+-86 + j*(-166)
+-109 + j*(-57)
+-93 + j*(1)
+-73 + j*(54)
+-21 + j*(100)
+72 + j*(111)
+172 + j*(20)
+124 + j*(-136)
+-50 + j*(-129)
+-43 + j*(38)
+132 + j*(0)
+69 + j*(-211)
+-181 + j*(-151)
+-145 + j*(109)
+105 + j*(105)
+136 + j*(-108)
+-2 + j*(-182)
+-82 + j*(-158)
+-173 + j*(-144)
+-274 + j*(-18)
+-214 + j*(171)
+-36 + j*(211)
+54 + j*(119)
+42 + j*(52)
+20 + j*(42)
+28 + j*(47)
+45 + j*(26)
+29 + j*(4)
+18 + j*(19)
+47 + j*(9)
+21 + j*(-30)
+-14 + j*(29)
+117 + j*(64)
+194 + j*(-156)
+-80 + j*(-331)
+-351 + j*(-86)
+-207 + j*(208)
+8 + j*(154)
+-31 + j*(71)
+-18 + j*(165)
+136 + j*(132)
+124 + j*(-31)
+2 + j*(-37)
+-8 + j*(30)
+4 + j*(45)
+24 + j*(95)
+135 + j*(85)
+139 + j*(-47)
+35 + j*(-35)
+120 + j*(34)
+194 + j*(-156)
+-86 + j*(-270)
+-250 + j*(62)
+107 + j*(274)
+376 + j*(-83)
+81 + j*(-404)
+-240 + j*(-239)
+-210 + j*(-13)
+-152 + j*(24)
+-155 + j*(121)
+13 + j*(231)
+222 + j*(92)
+180 + j*(-144)
+1 + j*(-199)
+-95 + j*(-138)
+-144 + j*(-87)
+-191 + j*(10)
+-120 + j*(147)
+57 + j*(143)
+117 + j*(-29)
+-23 + j*(-131)
+-144 + j*(-45)
+-124 + j*(57)
+-93 + j*(82)
+-83 + j*(140)
+27 + j*(192)
+135 + j*(89)
+48 + j*(-26)
+-49 + j*(83)
+102 + j*(208)
+302 + j*(53)
+222 + j*(-209)
+-25 + j*(-246)
+-151 + j*(-85)
+-100 + j*(69)
+42 + j*(111)
+156 + j*(-3)
+81 + j*(-167)
+-112 + j*(-141)
+-125 + j*(42)
+30 + j*(71)
+41 + j*(-50)
+-55 + j*(-14)
+54 + j*(79)
+187 + j*(-110)
+-51 + j*(-331)
+-372 + j*(-107)
+-217 + j*(260)
+122 + j*(160)
+20 + j*(-132)
+-268 + j*(17)
+-103 + j*(351)
+269 + j*(233)
+226 + j*(-110)
+-33 + j*(-105)
+-6 + j*(63)
+107 + j*(-15)
+-10 + j*(-103)
+-88 + j*(27)
+31 + j*(91)
+69 + j*(8)
+44 + j*(25)
+150 + j*(0)
+107 + j*(-216)
+-198 + j*(-200)
+-223 + j*(147)
+117 + j*(201)
+166 + j*(-112)
+-123 + j*(-139)
+-135 + j*(134)
+117 + j*(157)
+165 + j*(-52)
+25 + j*(-124)
+-57 + j*(-50)
+-33 + j*(39)
+78 + j*(47)
+110 + j*(-95)
+-59 + j*(-139)
+-91 + j*(61)
+158 + j*(62)
+148 + j*(-249)
+-190 + j*(-263)
+-224 + j*(35)
+-13 + j*(33)
+-105 + j*(-115)
+-235 + j*(47)
+-71 + j*(166)
+-21 + j*(40)
+-129 + j*(108)
+42 + j*(244)
+213 + j*(25)
+-16 + j*(-142)
+-153 + j*(88)
+67 + j*(202)
+175 + j*(26)
+91 + j*(-64)
+47 + j*(-93)
+-87 + j*(-119)
+-182 + j*(95)
+90 + j*(248)
+279 + j*(-56)
+-25 + j*(-264)
+-223 + j*(11)
+-1 + j*(165)
+72 + j*(1)
+-47 + j*(19)
+42 + j*(117)
+108 + j*(-4)
+-17 + j*(0)
+78 + j*(148)
+271 + j*(-11)
+112 + j*(-221)
+-30 + j*(-89)
+124 + j*(-91)
+-13 + j*(-344)
+-397 + j*(-146)
+-210 + j*(320)
+266 + j*(155)
+98 + j*(-298)
+-337 + j*(-121)
+-184 + j*(305)
+194 + j*(218)
+178 + j*(-49)
+65 + j*(-50)
+132 + j*(-78)
+56 + j*(-267)
+-237 + j*(-258)
+-377 + j*(42)
+-192 + j*(322)
+141 + j*(327)
+325 + j*(55)
+189 + j*(-217)
+-54 + j*(-221)
+-131 + j*(-95)
+-144 + j*(-40)
+-175 + j*(66)
+-47 + j*(191)
+121 + j*(77)
+18 + j*(-81)
+-108 + j*(42)
+54 + j*(137)
+127 + j*(-64)
+-112 + j*(-124)
+-172 + j*(144)
+100 + j*(218)
+187 + j*(-15)
+14 + j*(-90)
+-21 + j*(30)
+62 + j*(21)
+18 + j*(-42)
+-34 + j*(35)
+68 + j*(101)
+170 + j*(2)
+119 + j*(-130)
+6 + j*(-136)
+-16 + j*(-76)
+10 + j*(-100)
+-74 + j*(-148)
+-179 + j*(-42)
+-91 + j*(98)
+42 + j*(25)
+-37 + j*(-88)
+-147 + j*(-1)
+-86 + j*(103)
+-18 + j*(102)
+36 + j*(106)
+126 + j*(17)
+11 + j*(-145)
+-206 + j*(-6)
+-47 + j*(245)
+207 + j*(66)
+-15 + j*(-161)
+-214 + j*(128)
+122 + j*(326)
+318 + j*(7)
+70 + j*(-118)
+91 + j*(78)
+311 + j*(-99)
+57 + j*(-383)
+-241 + j*(-135)
+-14 + j*(94)
+115 + j*(-156)
+-186 + j*(-227)
+-252 + j*(89)
+21 + j*(159)
+73 + j*(-37)
+-58 + j*(-59)
+-62 + j*(23)
+-24 + j*(32)
+8 + j*(34)
+42 + j*(-37)
+-79 + j*(-105)
+-193 + j*(67)
+2 + j*(228)
+190 + j*(57)
+70 + j*(-106)
+-11 + j*(-27)
+69 + j*(-54)
+-45 + j*(-185)
+-231 + j*(-43)
+-115 + j*(156)
+37 + j*(57)
+-93 + j*(-25)
+-156 + j*(170)
+78 + j*(279)
+248 + j*(86)
+146 + j*(-98)
+6 + j*(-70)
+16 + j*(18)
+95 + j*(-5)
+75 + j*(-119)
+-78 + j*(-141)
+-161 + j*(25)
+-20 + j*(162)
+144 + j*(63)
+93 + j*(-98)
+-44 + j*(-76)
+-37 + j*(32)
+53 + j*(35)
+81 + j*(-43)
+35 + j*(-105)
+-49 + j*(-117)
+-122 + j*(-47)
+-89 + j*(52)
+-2 + j*(38)
+-39 + j*(-33)
+-122 + j*(45)
+-23 + j*(166)
+119 + j*(76)
+28 + j*(-49)
+-66 + j*(86)
+141 + j*(190)
+303 + j*(-67)
+58 + j*(-293)
+-188 + j*(-107)
+-60 + j*(103)
+87 + j*(5)
+-7 + j*(-75)
+-25 + j*(29)
+105 + j*(-1)
+59 + j*(-175)
+-141 + j*(-156)
+-177 + j*(27)
+-63 + j*(100)
+4 + j*(71)
+35 + j*(47)
+62 + j*(-2)
+26 + j*(-59)
+-28 + j*(-43)
+-9 + j*(-8)
+21 + j*(-62)
+-70 + j*(-139)
+-241 + j*(-59)
+-252 + j*(199)
+17 + j*(357)
+298 + j*(173)
+252 + j*(-141)
+3 + j*(-206)
+-95 + j*(-69)
+-40 + j*(-15)
+-54 + j*(-54)
+-133 + j*(-16)
+-143 + j*(107)
+-35 + j*(205)
+133 + j*(177)
+202 + j*(1)
+71 + j*(-123)
+-56 + j*(-41)
+13 + j*(59)
+94 + j*(-21)
+19 + j*(-98)
+-47 + j*(-52)
+-40 + j*(-37)
+-110 + j*(-35)
+-149 + j*(111)
+23 + j*(215)
+165 + j*(74)
+76 + j*(-56)
+-11 + j*(1)
+30 + j*(45)
+23 + j*(37)
+51 + j*(127)
+254 + j*(113)
+326 + j*(-168)
+64 + j*(-348)
+-156 + j*(-192)
+-112 + j*(-25)
+-44 + j*(-9)
+-15 + j*(15)
+85 + j*(-18)
+57 + j*(-182)
+-154 + j*(-184)
+-199 + j*(30)
+-31 + j*(102)
+40 + j*(6)
+31 + j*(-35)
+49 + j*(-125)
+-118 + j*(-252)
+-381 + j*(-74)
+-271 + j*(275)
+63 + j*(257)
+85 + j*(16)
+-61 + j*(23)
+-1 + j*(112)
+55 + j*(21)
+-43 + j*(4)
+-15 + j*(107)
+101 + j*(37)
+-3 + j*(-95)
+-155 + j*(18)
+-65 + j*(187)
+84 + j*(152)
+90 + j*(71)
+85 + j*(79)
+158 + j*(64)
+202 + j*(-56)
+105 + j*(-194)
+-98 + j*(-185)
+-185 + j*(19)
+-22 + j*(162)
+120 + j*(41)
+18 + j*(-66)
+-49 + j*(47)
+81 + j*(86)
+91 + j*(-52)
+-56 + j*(-18)
+25 + j*(170)
+280 + j*(81)
+242 + j*(-219)
+-45 + j*(-251)
+-104 + j*(-11)
+115 + j*(41)
+188 + j*(-203)
+-66 + j*(-356)
+-310 + j*(-163)
+-231 + j*(110)
+-1 + j*(123)
+53 + j*(-40)
+-52 + j*(-109)
+-141 + j*(-64)
+-173 + j*(28)
+-115 + j*(134)
+21 + j*(132)
+54 + j*(7)
+-55 + j*(-27)
+-80 + j*(75)
+13 + j*(101)
+42 + j*(37)
+21 + j*(30)
+62 + j*(24)
+64 + j*(-76)
+-80 + j*(-126)
+-209 + j*(16)
+-119 + j*(219)
+111 + j*(224)
+198 + j*(27)
+74 + j*(-86)
+3 + j*(-23)
+49 + j*(-32)
+-34 + j*(-107)
+-163 + j*(16)
+-45 + j*(180)
+108 + j*(92)
+33 + j*(-2)
+5 + j*(95)
+135 + j*(96)
+144 + j*(-18)
+107 + j*(-13)
+182 + j*(-74)
+67 + j*(-247)
+-175 + j*(-125)
+-54 + j*(132)
+190 + j*(-6)
+40 + j*(-233)
+-161 + j*(-98)
+-61 + j*(39)
+-20 + j*(-42)
+-102 + j*(4)
+-11 + j*(105)
+84 + j*(20)
+41 + j*(-22)
+104 + j*(-15)
+120 + j*(-202)
+-148 + j*(-276)
+-279 + j*(-10)
+-69 + j*(116)
+-6 + j*(-48)
+-163 + j*(-61)
+-185 + j*(83)
+-119 + j*(146)
+-56 + j*(219)
+141 + j*(226)
+251 + j*(-26)
+21 + j*(-221)
+-214 + j*(-74)
+-190 + j*(148)
+-60 + j*(253)
+116 + j*(282)
+306 + j*(153)
+316 + j*(-95)
+158 + j*(-246)
+-43 + j*(-279)
+-268 + j*(-133)
+-239 + j*(223)
+180 + j*(308)
+349 + j*(-122)
+-64 + j*(-347)
+-322 + j*(26)
+-8 + j*(297)
+247 + j*(64)
+94 + j*(-145)
+-49 + j*(-45)
+32 + j*(45)
+108 + j*(-38)
+32 + j*(-130)
+-74 + j*(-74)
+-28 + j*(23)
+49 + j*(-39)
+-59 + j*(-112)
+-149 + j*(50)
+41 + j*(172)
+185 + j*(-4)
+66 + j*(-120)
+44 + j*(-49)
+133 + j*(-151)
+-36 + j*(-321)
+-262 + j*(-193)
+-228 + j*(-13)
+-184 + j*(-14)
+-239 + j*(48)
+-181 + j*(162)
+-107 + j*(170)
+-72 + j*(226)
+110 + j*(231)
+163 + j*(-16)
+-125 + j*(-67)
+-160 + j*(276)
+224 + j*(334)
+330 + j*(-10)
+110 + j*(-105)
+117 + j*(-16)
+158 + j*(-151)
+-41 + j*(-218)
+-127 + j*(-69)
+-90 + j*(-40)
+-190 + j*(7)
+-132 + j*(233)
+139 + j*(206)
+105 + j*(-23)
+-70 + j*(91)
+141 + j*(276)
+378 + j*(51)
+246 + j*(-183)
+138 + j*(-158)
+154 + j*(-242)
+-54 + j*(-347)
+-252 + j*(-144)
+-119 + j*(59)
+10 + j*(-28)
+-83 + j*(-84)
+-122 + j*(31)
+-16 + j*(100)
+103 + j*(54)
+160 + j*(-99)
+23 + j*(-279)
+-250 + j*(-215)
+-277 + j*(72)
+-40 + j*(152)
+33 + j*(-25)
+-109 + j*(-80)
+-172 + j*(23)
+-148 + j*(94)
+-120 + j*(180)
+33 + j*(251)
+209 + j*(100)
+108 + j*(-134)
+-139 + j*(-85)
+-134 + j*(147)
+62 + j*(185)
+126 + j*(57)
+85 + j*(6)
+94 + j*(-25)
+28 + j*(-120)
+-146 + j*(-66)
+-144 + j*(151)
+54 + j*(213)
+146 + j*(105)
+148 + j*(69)
+239 + j*(5)
+206 + j*(-204)
+-40 + j*(-253)
+-141 + j*(-56)
+-26 + j*(25)
+-9 + j*(-23)
+-25 + j*(31)
+88 + j*(24)
+68 + j*(-133)
+-115 + j*(-102)
+-71 + j*(83)
+107 + j*(17)
+22 + j*(-158)
+-146 + j*(-75)
+-86 + j*(59)
+-18 + j*(10)
+-89 + j*(6)
+-71 + j*(113)
+38 + j*(118)
+62 + j*(61)
+79 + j*(71)
+175 + j*(26)
+182 + j*(-141)
+27 + j*(-250)
+-154 + j*(-200)
+-242 + j*(-35)
+-169 + j*(148)
+28 + j*(182)
+119 + j*(23)
+-4 + j*(-71)
+-80 + j*(55)
+78 + j*(136)
+201 + j*(-40)
+51 + j*(-215)
+-136 + j*(-129)
+-115 + j*(15)
+-48 + j*(14)
+-65 + j*(13)
+-32 + j*(52)
+6 + j*(-6)
+-92 + j*(-28)
+-108 + j*(125)
+95 + j*(154)
+145 + j*(-75)
+-81 + j*(-149)
+-168 + j*(36)
+-63 + j*(98)
+-88 + j*(78)
+-85 + j*(232)
+168 + j*(283)
+300 + j*(21)
+99 + j*(-140)
+-28 + j*(1)
+87 + j*(86)
+153 + j*(6)
+146 + j*(-33)
+196 + j*(-98)
+144 + j*(-267)
+-88 + j*(-317)
+-242 + j*(-145)
+-199 + j*(22)
+-127 + j*(65)
+-105 + j*(106)
+-24 + j*(184)
+145 + j*(170)
+253 + j*(-1)
+181 + j*(-197)
+1 + j*(-265)
+-160 + j*(-197)
+-226 + j*(-42)
+-148 + j*(98)
+-10 + j*(91)
+0 + j*(-11)
+-71 + j*(-3)
+-41 + j*(52)
+-11 + j*(0)
+-92 + j*(-5)
+-85 + j*(107)
+28 + j*(93)
+-16 + j*(7)
+-84 + j*(111)
+69 + j*(193)
+167 + j*(37)
+43 + j*(-35)
+47 + j*(66)
+161 + j*(-15)
+35 + j*(-163)
+-132 + j*(-27)
+-15 + j*(130)
+108 + j*(49)
+64 + j*(-9)
+86 + j*(22)
+136 + j*(-57)
+55 + j*(-124)
+25 + j*(-78)
+64 + j*(-126)
+-51 + j*(-210)
+-187 + j*(-104)
+-148 + j*(22)
+-120 + j*(35)
+-128 + j*(148)
+94 + j*(257)
+345 + j*(11)
+172 + j*(-356)
+-223 + j*(-314)
+-296 + j*(6)
+-100 + j*(103)
+-70 + j*(-10)
+-178 + j*(45)
+-81 + j*(194)
+84 + j*(86)
+-57 + j*(-71)
+-226 + j*(136)
+33 + j*(346)
+279 + j*(84)
+23 + j*(-144)
+-164 + j*(141)
+165 + j*(317)
+367 + j*(-18)
+89 + j*(-231)
+-88 + j*(-35)
+35 + j*(93)
+132 + j*(57)
+219 + j*(1)
+264 + j*(-218)
+-21 + j*(-406)
+-325 + j*(-150)
+-140 + j*(187)
+168 + j*(58)
+76 + j*(-210)
+-147 + j*(-161)
+-148 + j*(-8)
+-74 + j*(6)
+-89 + j*(-23)
+-144 + j*(18)
+-127 + j*(123)
+2 + j*(157)
+58 + j*(49)
+-41 + j*(27)
+-10 + j*(156)
+165 + j*(92)
+88 + j*(-93)
+-71 + j*(11)
+91 + j*(141)
+202 + j*(-65)
+-13 + j*(-148)
+-18 + j*(62)
+214 + j*(-37)
+35 + j*(-320)
+-281 + j*(-126)
+-102 + j*(167)
+122 + j*(-16)
+-92 + j*(-170)
+-205 + j*(63)
+10 + j*(156)
+71 + j*(-11)
+-37 + j*(-30)
+-14 + j*(35)
+26 + j*(-16)
+-26 + j*(-56)
+-78 + j*(-49)
+-167 + j*(5)
+-163 + j*(206)
+111 + j*(287)
+266 + j*(14)
+36 + j*(-153)
+-81 + j*(48)
+132 + j*(109)
+180 + j*(-126)
+-32 + j*(-206)
+-134 + j*(-86)
+-135 + j*(-16)
+-150 + j*(71)
+-54 + j*(168)
+60 + j*(118)
+49 + j*(54)
+72 + j*(72)
+124 + j*(-14)
+5 + j*(-96)
+-78 + j*(39)
+68 + j*(103)
+100 + j*(-56)
+-78 + j*(-47)
+-35 + j*(161)
+194 + j*(110)
+156 + j*(-115)
+-33 + j*(-79)
+11 + j*(81)
+156 + j*(53)
+188 + j*(-41)
+220 + j*(-119)
+189 + j*(-305)
+-71 + j*(-407)
+-284 + j*(-194)
+-153 + j*(18)
+1 + j*(-100)
+-168 + j*(-241)
+-371 + j*(-59)
+-262 + j*(197)
+-33 + j*(185)
+-1 + j*(25)
+-129 + j*(-14)
+-205 + j*(121)
+-92 + j*(288)
+154 + j*(258)
+230 + j*(4)
+18 + j*(-135)
+-125 + j*(29)
+9 + j*(150)
+98 + j*(33)
+-13 + j*(-10)
+-10 + j*(112)
+136 + j*(90)
+122 + j*(-68)
+-18 + j*(-75)
+-45 + j*(35)
+28 + j*(87)
+118 + j*(69)
+181 + j*(-52)
+69 + j*(-202)
+-136 + j*(-134)
+-113 + j*(66)
+42 + j*(57)
+8 + j*(-47)
+-66 + j*(23)
+25 + j*(87)
+83 + j*(7)
+42 + j*(-22)
+74 + j*(-25)
+54 + j*(-136)
+-122 + j*(-134)
+-162 + j*(60)
+3 + j*(125)
+60 + j*(15)
+-7 + j*(-12)
+-16 + j*(25)
+-18 + j*(44)
+15 + j*(123)
+188 + j*(107)
+230 + j*(-129)
+-8 + j*(-223)
+-100 + j*(-18)
+85 + j*(27)
+83 + j*(-168)
+-118 + j*(-143)
+-72 + j*(44)
+106 + j*(-39)
+4 + j*(-240)
+-216 + j*(-181)
+-240 + j*(-13)
+-204 + j*(47)
+-207 + j*(129)
+-109 + j*(250)
+64 + j*(228)
+132 + j*(100)
+86 + j*(10)
+14 + j*(3)
+-6 + j*(80)
+102 + j*(127)
+205 + j*(6)
+120 + j*(-132)
+23 + j*(-95)
+71 + j*(-92)
+2 + j*(-221)
+-213 + j*(-148)
+-161 + j*(94)
+59 + j*(23)
+-74 + j*(-202)
+-357 + j*(-33)
+-240 + j*(288)
+18 + j*(272)
+37 + j*(175)
+105 + j*(233)
+291 + j*(98)
+181 + j*(-177)
+-100 + j*(-116)
+-73 + j*(117)
+91 + j*(106)
+87 + j*(23)
+88 + j*(41)
+129 + j*(-18)
+35 + j*(-51)
+51 + j*(93)
+299 + j*(35)
+273 + j*(-335)
+-156 + j*(-414)
+-351 + j*(-25)
+-69 + j*(227)
+180 + j*(63)
+119 + j*(-141)
+-9 + j*(-163)
+-68 + j*(-130)
+-117 + j*(-95)
+-148 + j*(-23)
+-117 + j*(53)
+-54 + j*(87)
+18 + j*(79)
+74 + j*(8)
+27 + j*(-95)
+-106 + j*(-81)
+-122 + j*(64)
+18 + j*(103)
+67 + j*(-23)
+-38 + j*(-62)
+-52 + j*(15)
+-5 + j*(-18)
+-100 + j*(-43)
+-124 + j*(118)
+87 + j*(151)
+124 + j*(-83)
+-111 + j*(-116)
+-126 + j*(108)
+68 + j*(95)
+16 + j*(-65)
+-108 + j*(23)
+4 + j*(105)
+25 + j*(-23)
+-137 + j*(26)
+-43 + j*(242)
+209 + j*(152)
+157 + j*(-90)
+-29 + j*(-62)
+-1 + j*(57)
+65 + j*(22)
+33 + j*(-6)
+37 + j*(25)
+71 + j*(4)
+57 + j*(-27)
+45 + j*(-31)
+33 + j*(-45)
+14 + j*(-37)
+20 + j*(-40)
+-26 + j*(-62)
+-83 + j*(25)
+33 + j*(124)
+168 + j*(6)
+71 + j*(-131)
+-31 + j*(-49)
+61 + j*(-3)
+76 + j*(-119)
+-37 + j*(-129)
+-37 + j*(-59)
+-21 + j*(-105)
+-117 + j*(-103)
+-119 + j*(0)
+-52 + j*(-21)
+-143 + j*(-62)
+-216 + j*(88)
+-84 + j*(226)
+62 + j*(204)
+172 + j*(158)
+307 + j*(4)
+238 + j*(-293)
+-97 + j*(-386)
+-315 + j*(-170)
+-280 + j*(40)
+-205 + j*(124)
+-131 + j*(193)
+-19 + j*(206)
+49 + j*(155)
+71 + j*(120)
+98 + j*(83)
+88 + j*(44)
+91 + j*(46)
+132 + j*(-2)
+78 + j*(-77)
+6 + j*(-24)
+94 + j*(13)
+116 + j*(-141)
+-91 + j*(-177)
+-135 + j*(46)
+101 + j*(64)
+78 + j*(-226)
+-296 + j*(-205)
+-355 + j*(235)
+74 + j*(406)
+328 + j*(66)
+108 + j*(-200)
+-114 + j*(-77)
+-45 + j*(81)
+49 + j*(34)
+9 + j*(-13)
+-10 + j*(21)
+1 + j*(23)
+-32 + j*(61)
+52 + j*(161)
+234 + j*(83)
+208 + j*(-136)
+31 + j*(-148)
+47 + j*(-47)
+117 + j*(-138)
+-10 + j*(-226)
+-93 + j*(-142)
+-71 + j*(-156)
+-241 + j*(-191)
+-377 + j*(94)
+-81 + j*(344)
+216 + j*(110)
+48 + j*(-162)
+-172 + j*(-31)
+-73 + j*(142)
+57 + j*(87)
+47 + j*(13)
+22 + j*(-12)
+-25 + j*(-16)
+-24 + j*(68)
+117 + j*(53)
+107 + j*(-164)
+-175 + j*(-194)
+-265 + j*(111)
+1 + j*(253)
+161 + j*(64)
+62 + j*(-62)
+4 + j*(-42)
+-28 + j*(-76)
+-167 + j*(-33)
+-160 + j*(195)
+110 + j*(252)
+217 + j*(-8)
+-30 + j*(-126)
+-147 + j*(141)
+146 + j*(299)
+387 + j*(37)
+243 + j*(-246)
+35 + j*(-247)
+-33 + j*(-213)
+-173 + j*(-204)
+-295 + j*(11)
+-115 + j*(234)
+114 + j*(135)
+74 + j*(-23)
+9 + j*(18)
+79 + j*(5)
+8 + j*(-88)
+-105 + j*(53)
+108 + j*(214)
+368 + j*(-23)
+211 + j*(-374)
+-131 + j*(-378)
+-259 + j*(-180)
+-253 + j*(-60)
+-255 + j*(34)
+-210 + j*(148)
+-110 + j*(215)
+11 + j*(240)
+160 + j*(177)
+216 + j*(-8)
+86 + j*(-150)
+-68 + j*(-105)
+-78 + j*(-5)
+-49 + j*(3)
+-88 + j*(13)
+-98 + j*(117)
+33 + j*(196)
+191 + j*(102)
+180 + j*(-88)
+23 + j*(-161)
+-81 + j*(-76)
+-59 + j*(-5)
+-49 + j*(-9)
+-93 + j*(25)
+-62 + j*(125)
+76 + j*(147)
+159 + j*(25)
+98 + j*(-92)
+0 + j*(-98)
+-47 + j*(-64)
+-97 + j*(-25)
+-108 + j*(90)
+31 + j*(173)
+175 + j*(49)
+82 + j*(-114)
+-69 + j*(-41)
+-1 + j*(96)
+131 + j*(36)
+105 + j*(-78)
+41 + j*(-94)
+9 + j*(-105)
+-73 + j*(-95)
+-102 + j*(18)
+3 + j*(81)
+83 + j*(25)
+106 + j*(-34)
+129 + j*(-136)
+4 + j*(-281)
+-235 + j*(-223)
+-278 + j*(6)
+-155 + j*(91)
+-127 + j*(73)
+-122 + j*(136)
+-34 + j*(174)
+15 + j*(154)
+86 + j*(183)
+236 + j*(89)
+199 + j*(-133)
+11 + j*(-152)
+20 + j*(-77)
+4 + j*(-209)
+-286 + j*(-191)
+-341 + j*(189)
+17 + j*(314)
+130 + j*(55)
+-38 + j*(45)
+91 + j*(190)
+264 + j*(-47)
+-21 + j*(-260)
+-262 + j*(22)
+-18 + j*(275)
+221 + j*(108)
+154 + j*(-83)
+52 + j*(-103)
+-15 + j*(-94)
+-64 + j*(-11)
+44 + j*(52)
+108 + j*(-109)
+-117 + j*(-198)
+-267 + j*(60)
+-30 + j*(270)
+205 + j*(99)
+99 + j*(-131)
+-123 + j*(-71)
+-119 + j*(173)
+160 + j*(271)
+397 + j*(8)
+227 + j*(-342)
+-134 + j*(-293)
+-158 + j*(-21)
+2 + j*(-22)
+-86 + j*(-103)
+-139 + j*(74)
+104 + j*(113)
+129 + j*(-175)
+-195 + j*(-192)
+-213 + j*(151)
+124 + j*(177)
+165 + j*(-131)
+-93 + j*(-189)
+-161 + j*(-6)
+-66 + j*(54)
+-33 + j*(25)
+-26 + j*(12)
+-36 + j*(-13)
+-82 + j*(9)
+-55 + j*(66)
+-14 + j*(37)
+-62 + j*(30)
+-41 + j*(111)
+63 + j*(80)
+17 + j*(-19)
+-72 + j*(60)
+42 + j*(157)
+161 + j*(45)
+98 + j*(-74)
+28 + j*(-83)
+-31 + j*(-104)
+-149 + j*(-33)
+-94 + j*(147)
+101 + j*(103)
+35 + j*(-83)
+-158 + j*(25)
+-26 + j*(250)
+224 + j*(148)
+187 + j*(-78)
+29 + j*(-98)
+-18 + j*(-13)
+12 + j*(62)
+127 + j*(79)
+210 + j*(-69)
+71 + j*(-202)
+-48 + j*(-101)
+40 + j*(-66)
+-28 + j*(-208)
+-261 + j*(-81)
+-141 + j*(224)
+177 + j*(142)
+123 + j*(-127)
+-58 + j*(-62)
+45 + j*(30)
+76 + j*(-122)
+-115 + j*(-110)
+-59 + j*(100)
+177 + j*(4)
+77 + j*(-275)
+-228 + j*(-226)
+-267 + j*(42)
+-95 + j*(151)
+31 + j*(91)
+57 + j*(-20)
+-27 + j*(-105)
+-147 + j*(-56)
+-144 + j*(71)
+-50 + j*(106)
+-7 + j*(58)
+-29 + j*(24)
+-67 + j*(45)
+-49 + j*(118)
+65 + j*(116)
+86 + j*(-36)
+-112 + j*(-77)
+-193 + j*(165)
+64 + j*(317)
+276 + j*(114)
+177 + j*(-104)
+25 + j*(-93)
+-6 + j*(-34)
+-25 + j*(0)
+8 + j*(62)
+98 + j*(21)
+41 + j*(-95)
+-111 + j*(-27)
+-52 + j*(167)
+162 + j*(155)
+220 + j*(-29)
+118 + j*(-123)
+54 + j*(-117)
+21 + j*(-127)
+-53 + j*(-118)
+-95 + j*(-32)
+-35 + j*(44)
+45 + j*(13)
+33 + j*(-52)
+-14 + j*(-35)
+33 + j*(7)
+99 + j*(-81)
+2 + j*(-207)
+-172 + j*(-160)
+-208 + j*(-7)
+-146 + j*(72)
+-112 + j*(112)
+-35 + j*(176)
+103 + j*(151)
+158 + j*(18)
+99 + j*(-81)
+11 + j*(-106)
+-61 + j*(-59)
+-44 + j*(31)
+65 + j*(18)
+53 + j*(-113)
+-81 + j*(-117)
+-83 + j*(-16)
+-30 + j*(-77)
+-202 + j*(-127)
+-324 + j*(141)
+-44 + j*(362)
+228 + j*(146)
+90 + j*(-93)
+-62 + j*(8)
+55 + j*(76)
+70 + j*(-87)
+-134 + j*(-94)
+-181 + j*(119)
+-22 + j*(212)
+74 + j*(162)
+115 + j*(141)
+197 + j*(92)
+218 + j*(-27)
+170 + j*(-106)
+127 + j*(-173)
+2 + j*(-251)
+-190 + j*(-165)
+-203 + j*(62)
+-20 + j*(153)
+93 + j*(51)
+58 + j*(-40)
+6 + j*(-46)
+-22 + j*(-21)
+-3 + j*(30)
+86 + j*(17)
+95 + j*(-126)
+-79 + j*(-179)
+-173 + j*(-15)
+-42 + j*(74)
+-4 + j*(-47)
+-164 + j*(-27)
+-126 + j*(191)
+116 + j*(171)
+101 + j*(-45)
+-76 + j*(13)
+52 + j*(183)
+247 + j*(13)
+79 + j*(-192)
+-83 + j*(-44)
+78 + j*(41)
+103 + j*(-173)
+-161 + j*(-172)
+-162 + j*(106)
+95 + j*(105)
+82 + j*(-119)
+-99 + j*(-95)
+-67 + j*(33)
+-4 + j*(-14)
+-74 + j*(-21)
+-40 + j*(69)
+55 + j*(6)
+-31 + j*(-93)
+-138 + j*(-1)
+-71 + j*(106)
+7 + j*(80)
+4 + j*(54)
+16 + j*(66)
+38 + j*(67)
+89 + j*(71)
+165 + j*(-13)
+92 + j*(-161)
+-76 + j*(-122)
+-33 + j*(4)
+47 + j*(-105)
+-160 + j*(-189)
+-305 + j*(81)
+-49 + j*(291)
+180 + j*(107)
+85 + j*(-82)
+-24 + j*(-65)
+-71 + j*(-59)
+-182 + j*(24)
+-113 + j*(245)
+162 + j*(235)
+211 + j*(-2)
+82 + j*(-57)
+105 + j*(-40)
+57 + j*(-190)
+-214 + j*(-143)
+-218 + j*(195)
+119 + j*(257)
+211 + j*(-23)
+-3 + j*(-104)
+-58 + j*(68)
+81 + j*(122)
+161 + j*(34)
+153 + j*(-53)
+96 + j*(-107)
+34 + j*(-81)
+81 + j*(-36)
+146 + j*(-136)
+33 + j*(-271)
+-147 + j*(-221)
+-185 + j*(-76)
+-133 + j*(-6)
+-98 + j*(9)
+-80 + j*(22)
+-57 + j*(44)
+0 + j*(50)
+52 + j*(-19)
+-2 + j*(-106)
+-92 + j*(-95)
+-130 + j*(-57)
+-187 + j*(-7)
+-173 + j*(144)
+32 + j*(171)
+71 + j*(-71)
+-226 + j*(-107)
+-287 + j*(241)
+47 + j*(349)
+146 + j*(107)
+4 + j*(114)
+156 + j*(236)
+326 + j*(-4)
+98 + j*(-211)
+-76 + j*(-43)
+40 + j*(45)
+30 + j*(-45)
+-41 + j*(55)
+136 + j*(119)
+220 + j*(-103)
+8 + j*(-214)
+-111 + j*(-71)
+-53 + j*(21)
+-6 + j*(43)
+85 + j*(30)
+97 + j*(-129)
+-117 + j*(-163)
+-171 + j*(70)
+44 + j*(124)
+54 + j*(-39)
+-52 + j*(37)
+140 + j*(110)
+220 + j*(-192)
+-144 + j*(-316)
+-315 + j*(39)
+-25 + j*(219)
+111 + j*(18)
+-19 + j*(-42)
+4 + j*(44)
+74 + j*(-40)
+-48 + j*(-110)
+-127 + j*(16)
+-18 + j*(100)
+57 + j*(18)
+-7 + j*(-45)
+-74 + j*(11)
+-25 + j*(96)
+80 + j*(71)
+81 + j*(-37)
+-18 + j*(-50)
+-22 + j*(45)
+85 + j*(44)
+107 + j*(-78)
+-13 + j*(-150)
+-145 + j*(-63)
+-115 + j*(125)
+119 + j*(172)
+253 + j*(-79)
+37 + j*(-286)
+-185 + j*(-141)
+-96 + j*(16)
+-42 + j*(-79)
+-195 + j*(-61)
+-161 + j*(144)
+57 + j*(105)
+-1 + j*(-112)
+-246 + j*(-51)
+-245 + j*(218)
+-22 + j*(330)
+162 + j*(235)
+211 + j*(70)
+119 + j*(-49)
+3 + j*(-13)
+25 + j*(96)
+150 + j*(94)
+206 + j*(-46)
+86 + j*(-180)
+-112 + j*(-100)
+-64 + j*(151)
+252 + j*(136)
+301 + j*(-232)
+-54 + j*(-372)
+-244 + j*(-119)
+-134 + j*(26)
+-115 + j*(15)
+-107 + j*(129)
+71 + j*(166)
+145 + j*(18)
+98 + j*(-38)
+134 + j*(-103)
+-1 + j*(-272)
+-283 + j*(-120)
+-150 + j*(210)
+165 + j*(83)
+21 + j*(-183)
+-189 + j*(-12)
+-2 + j*(131)
+64 + j*(-58)
+-126 + j*(-49)
+-59 + j*(136)
+103 + j*(37)
+-17 + j*(-81)
+-87 + j*(56)
+59 + j*(99)
+103 + j*(-33)
+22 + j*(-93)
+-52 + j*(-93)
+-134 + j*(-23)
+-73 + j*(110)
+72 + j*(34)
+-58 + j*(-106)
+-211 + j*(92)
+29 + j*(271)
+210 + j*(41)
+16 + j*(-95)
+-42 + j*(75)
+119 + j*(57)
+55 + j*(-96)
+-86 + j*(-13)
+-23 + j*(100)
+32 + j*(108)
+118 + j*(181)
+371 + j*(95)
+402 + j*(-281)
+74 + j*(-475)
+-175 + j*(-357)
+-277 + j*(-229)
+-358 + j*(-48)
+-234 + j*(166)
+-27 + j*(107)
+-109 + j*(-28)
+-217 + j*(129)
+-30 + j*(271)
+136 + j*(125)
+71 + j*(-9)
+-1 + j*(-15)
+-70 + j*(-4)
+-133 + j*(132)
+42 + j*(294)
+303 + j*(142)
+223 + j*(-158)
+-55 + j*(-142)
+-59 + j*(102)
+181 + j*(112)
+231 + j*(-144)
+-11 + j*(-252)
+-147 + j*(-62)
+1 + j*(39)
+33 + j*(-119)
+-177 + j*(-115)
+-193 + j*(136)
+23 + j*(185)
+57 + j*(69)
+38 + j*(128)
+215 + j*(129)
+273 + j*(-96)
+122 + j*(-198)
+69 + j*(-190)
+-35 + j*(-276)
+-267 + j*(-134)
+-122 + j*(179)
+229 + j*(28)
+83 + j*(-345)
+-271 + j*(-250)
+-245 + j*(-14)
+-210 + j*(-30)
+-313 + j*(112)
+-86 + j*(327)
+173 + j*(93)
+-69 + j*(-135)
+-255 + j*(141)
+42 + j*(303)
+182 + j*(20)
+-82 + j*(-75)
+-145 + j*(193)
+121 + j*(270)
+237 + j*(54)
+108 + j*(-70)
+25 + j*(-13)
+55 + j*(12)
+28 + j*(-23)
+-34 + j*(63)
+120 + j*(189)
+352 + j*(4)
+215 + j*(-322)
+-115 + j*(-276)
+-127 + j*(-49)
+-33 + j*(-69)
+-134 + j*(-77)
+-108 + j*(78)
+27 + j*(11)
+-137 + j*(-69)
+-186 + j*(235)
+243 + j*(309)
+369 + j*(-182)
+-112 + j*(-344)
+-274 + j*(80)
+69 + j*(216)
+162 + j*(-28)
+27 + j*(-59)
+87 + j*(-18)
+86 + j*(-177)
+-136 + j*(-192)
+-197 + j*(26)
+-31 + j*(121)
+74 + j*(19)
+27 + j*(-87)
+-86 + j*(-85)
+-127 + j*(34)
+-18 + j*(105)
+66 + j*(24)
+24 + j*(-49)
+-16 + j*(-54)
+-59 + j*(-66)
+-125 + j*(-4)
+-54 + j*(88)
+26 + j*(-8)
+-124 + j*(-73)
+-205 + j*(136)
+11 + j*(251)
+134 + j*(88)
+36 + j*(11)
+19 + j*(73)
+58 + j*(71)
+84 + j*(89)
+207 + j*(41)
+176 + j*(-191)
+-116 + j*(-194)
+-131 + j*(103)
+144 + j*(100)
+114 + j*(-139)
+-59 + j*(-81)
+41 + j*(-2)
+23 + j*(-161)
+-189 + j*(-74)
+-52 + j*(148)
+144 + j*(-46)
+-123 + j*(-207)
+-264 + j*(122)
+91 + j*(254)
+206 + j*(-91)
+-107 + j*(-187)
+-196 + j*(83)
+6 + j*(176)
+105 + j*(62)
+81 + j*(-24)
+15 + j*(-57)
+-35 + j*(6)
+52 + j*(47)
+86 + j*(-85)
+-80 + j*(-120)
+-107 + j*(52)
+46 + j*(39)
+-36 + j*(-94)
+-171 + j*(52)
+12 + j*(190)
+124 + j*(6)
+-62 + j*(-54)
+-77 + j*(151)
+130 + j*(168)
+180 + j*(26)
+166 + j*(-25)
+178 + j*(-141)
+-4 + j*(-233)
+-127 + j*(-46)
+69 + j*(38)
+97 + j*(-207)
+-206 + j*(-209)
+-213 + j*(114)
+80 + j*(118)
+58 + j*(-122)
+-129 + j*(-64)
+-42 + j*(75)
+59 + j*(-29)
+-37 + j*(-95)
+-54 + j*(-34)
+-23 + j*(-101)
+-174 + j*(-157)
+-306 + j*(5)
+-240 + j*(180)
+-135 + j*(243)
+-26 + j*(291)
+132 + j*(257)
+208 + j*(124)
+208 + j*(8)
+157 + j*(-139)
+-93 + j*(-210)
+-298 + j*(95)
+19 + j*(426)
+450 + j*(151)
+264 + j*(-317)
+-165 + j*(-221)
+-127 + j*(117)
+110 + j*(104)
+114 + j*(-34)
+76 + j*(-50)
+64 + j*(-108)
+-61 + j*(-112)
+-74 + j*(44)
+88 + j*(50)
+76 + j*(-103)
+-59 + j*(-65)
+11 + j*(50)
+115 + j*(-42)
+33 + j*(-141)
+-35 + j*(-100)
+-25 + j*(-98)
+-86 + j*(-113)
+-129 + j*(-36)
+-80 + j*(10)
+-71 + j*(-4)
+-76 + j*(33)
+-16 + j*(42)
+-2 + j*(-22)
+-56 + j*(-44)
+-93 + j*(-27)
+-144 + j*(9)
+-151 + j*(122)
+-30 + j*(186)
+37 + j*(105)
+-25 + j*(115)
+68 + j*(235)
+293 + j*(144)
+298 + j*(-127)
+99 + j*(-245)
+-52 + j*(-191)
+-116 + j*(-89)
+-85 + j*(19)
+25 + j*(21)
+33 + j*(-80)
+-43 + j*(-100)
+-53 + j*(-90)
+-119 + j*(-156)
+-303 + j*(-93)
+-355 + j*(148)
+-214 + j*(329)
+-27 + j*(395)
+199 + j*(349)
+314 + j*(112)
+151 + j*(-49)
+52 + j*(86)
+244 + j*(121)
+284 + j*(-127)
+49 + j*(-185)
+27 + j*(2)
+211 + j*(-42)
+151 + j*(-265)
+-82 + j*(-264)
+-145 + j*(-88)
+-41 + j*(-4)
+49 + j*(-73)
+-9 + j*(-200)
+-190 + j*(-180)
+-232 + j*(2)
+-119 + j*(68)
+-112 + j*(33)
+-122 + j*(126)
+45 + j*(161)
+108 + j*(-21)
+-56 + j*(-84)
+-106 + j*(52)
+-6 + j*(88)
+16 + j*(47)
+35 + j*(50)
+67 + j*(-11)
+-2 + j*(-44)
+1 + j*(21)
+67 + j*(-56)
+-99 + j*(-135)
+-204 + j*(109)
+81 + j*(243)
+216 + j*(-44)
+-47 + j*(-130)
+64 + j*(-24)
+41 + j*(-137)
+-82 + j*(-142)
+-141 + j*(-64)
+-153 + j*(28)
+-67 + j*(131)
+93 + j*(62)
+26 + j*(-125)
+-173 + j*(-42)
+-63 + j*(158)
+138 + j*(8)
+-60 + j*(-206)
+-307 + j*(6)
+-136 + j*(267)
+69 + j*(159)
+-29 + j*(66)
+-37 + j*(230)
+202 + j*(243)
+265 + j*(5)
+98 + j*(-65)
+90 + j*(48)
+213 + j*(-6)
+160 + j*(-149)
+56 + j*(-121)
+119 + j*(-106)
+91 + j*(-280)
+-187 + j*(-302)
+-305 + j*(-4)
+-69 + j*(175)
+116 + j*(18)
+30 + j*(-141)
+-93 + j*(-135)
+-163 + j*(-81)
+-216 + j*(28)
+-139 + j*(171)
+18 + j*(165)
+49 + j*(78)
+57 + j*(83)
+155 + j*(21)
+103 + j*(-164)
+-122 + j*(-168)
+-175 + j*(40)
+-28 + j*(109)
+23 + j*(23)
+-23 + j*(6)
+-10 + j*(32)
+2 + j*(1)
+-35 + j*(-1)
+-23 + j*(35)
+13 + j*(-4)
+-66 + j*(-68)
+-210 + j*(28)
+-175 + j*(274)
+111 + j*(379)
+349 + j*(170)
+293 + j*(-82)
+161 + j*(-128)
+151 + j*(-157)
+40 + j*(-276)
+-187 + j*(-195)
+-172 + j*(47)
+14 + j*(54)
+-13 + j*(-79)
+-132 + j*(-13)
+-64 + j*(110)
+35 + j*(85)
+52 + j*(49)
+99 + j*(15)
+79 + j*(-91)
+-39 + j*(-89)
+-27 + j*(5)
+39 + j*(-52)
+-76 + j*(-105)
+-136 + j*(44)
+11 + j*(106)
+51 + j*(-4)
+-18 + j*(1)
+37 + j*(23)
+4 + j*(-74)
+-138 + j*(35)
+53 + j*(249)
+366 + j*(14)
+157 + j*(-379)
+-248 + j*(-250)
+-188 + j*(83)
+41 + j*(38)
+-22 + j*(-115)
+-141 + j*(-55)
+-129 + j*(31)
+-105 + j*(80)
+-28 + j*(122)
+49 + j*(49)
+-32 + j*(-14)
+-62 + j*(99)
+91 + j*(110)
+94 + j*(-57)
+-52 + j*(-32)
+41 + j*(77)
+134 + j*(-120)
+-168 + j*(-247)
+-377 + j*(124)
+-13 + j*(419)
+333 + j*(126)
+125 + j*(-203)
+-144 + j*(-54)
+-21 + j*(157)
+153 + j*(50)
+77 + j*(-89)
+-10 + j*(-42)
+33 + j*(-24)
+-8 + j*(-95)
+-121 + j*(-30)
+-54 + j*(96)
+50 + j*(21)
+-81 + j*(-54)
+-167 + j*(165)
+110 + j*(319)
+340 + j*(62)
+156 + j*(-168)
+14 + j*(-24)
+199 + j*(27)
+245 + j*(-236)
+-26 + j*(-341)
+-163 + j*(-165)
+-98 + j*(-92)
+-140 + j*(-118)
+-202 + j*(-4)
+-97 + j*(97)
+-11 + j*(29)
+-64 + j*(-8)
+-75 + j*(61)
+6 + j*(84)
+62 + j*(32)
+72 + j*(-46)
+13 + j*(-127)
+-112 + j*(-111)
+-132 + j*(13)
+-25 + j*(25)
+-56 + j*(-96)
+-250 + j*(-49)
+-264 + j*(226)
+14 + j*(361)
+247 + j*(173)
+189 + j*(-72)
+2 + j*(-122)
+-89 + j*(-29)
+-75 + j*(69)
+-3 + j*(126)
+95 + j*(119)
+141 + j*(39)
+118 + j*(-20)
+115 + j*(-37)
+116 + j*(-103)
+31 + j*(-166)
+-64 + j*(-118)
+-65 + j*(-54)
+-66 + j*(-45)
+-90 + j*(16)
+6 + j*(77)
+94 + j*(-42)
+-61 + j*(-146)
+-194 + j*(41)
+13 + j*(211)
+212 + j*(1)
+8 + j*(-216)
+-228 + j*(-27)
+-75 + j*(230)
+174 + j*(141)
+160 + j*(-45)
+83 + j*(-62)
+115 + j*(-94)
+39 + j*(-226)
+-177 + j*(-192)
+-229 + j*(41)
+-44 + j*(156)
+86 + j*(37)
+6 + j*(-76)
+-101 + j*(-11)
+-45 + j*(110)
+105 + j*(72)
+92 + j*(-110)
+-130 + j*(-128)
+-197 + j*(137)
+96 + j*(279)
+316 + j*(0)
+93 + j*(-269)
+-172 + j*(-113)
+-61 + j*(115)
+125 + j*(30)
+73 + j*(-115)
+4 + j*(-102)
+11 + j*(-150)
+-149 + j*(-238)
+-384 + j*(-59)
+-305 + j*(295)
+54 + j*(376)
+254 + j*(119)
+124 + j*(-99)
+-45 + j*(-50)
+-22 + j*(57)
+33 + j*(26)
+-25 + j*(24)
+21 + j*(144)
+226 + j*(79)
+194 + j*(-200)
+-114 + j*(-233)
+-198 + j*(49)
+19 + j*(156)
+126 + j*(13)
+56 + j*(-76)
+-11 + j*(-73)
+-66 + j*(-25)
+-28 + j*(86)
+134 + j*(58)
+122 + j*(-135)
+-61 + j*(-136)
+-48 + j*(8)
+57 + j*(-56)
+-45 + j*(-141)
+-107 + j*(-39)
+-30 + j*(-52)
+-159 + j*(-131)
+-292 + j*(89)
+-57 + j*(279)
+117 + j*(89)
+-38 + j*(10)
+1 + j*(186)
+231 + j*(69)
+86 + j*(-197)
+-174 + j*(-53)
+-38 + j*(173)
+136 + j*(46)
+21 + j*(-68)
+-37 + j*(43)
+69 + j*(60)
+68 + j*(-39)
+-21 + j*(-29)
+-25 + j*(62)
+76 + j*(116)
+218 + j*(29)
+185 + j*(-206)
+-100 + j*(-251)
+-214 + j*(39)
+54 + j*(186)
+209 + j*(-40)
+37 + j*(-188)
+-83 + j*(-73)
+-18 + j*(6)
+35 + j*(-20)
+56 + j*(-64)
+25 + j*(-142)
+-98 + j*(-144)
+-122 + j*(-19)
+-17 + j*(-11)
+-58 + j*(-113)
+-182 + j*(-39)
+-112 + j*(105)
+23 + j*(50)
+-20 + j*(-59)
+-103 + j*(-37)
+-104 + j*(3)
+-135 + j*(6)
+-189 + j*(83)
+-144 + j*(216)
+12 + j*(267)
+136 + j*(172)
+117 + j*(60)
+77 + j*(79)
+180 + j*(68)
+186 + j*(-144)
+-102 + j*(-214)
+-239 + j*(102)
+61 + j*(281)
+254 + j*(25)
+56 + j*(-141)
+-49 + j*(6)
+57 + j*(30)
+-7 + j*(-59)
+-101 + j*(93)
+103 + j*(225)
+279 + j*(25)
+134 + j*(-156)
+2 + j*(-59)
+90 + j*(11)
+130 + j*(-89)
+39 + j*(-122)
+33 + j*(-61)
+78 + j*(-105)
+-21 + j*(-170)
+-120 + j*(-28)
+64 + j*(127)
+313 + j*(-81)
+153 + j*(-427)
+-210 + j*(-384)
+-231 + j*(-131)
+-118 + j*(-202)
+-387 + j*(-298)
+-633 + j*(100)
+-279 + j*(514)
+172 + j*(310)
+67 + j*(-50)
+-197 + j*(56)
+-66 + j*(297)
+193 + j*(192)
+164 + j*(-54)
+-28 + j*(-98)
+-116 + j*(18)
+-81 + j*(117)
+-19 + j*(151)
+37 + j*(168)
+129 + j*(162)
+209 + j*(63)
+163 + j*(-70)
+45 + j*(-78)
+25 + j*(6)
+100 + j*(17)
+131 + j*(-62)
+88 + j*(-138)
+-5 + j*(-174)
+-111 + j*(-132)
+-146 + j*(-30)
+-123 + j*(44)
+-94 + j*(106)
+11 + j*(177)
+171 + j*(91)
+123 + j*(-115)
+-89 + j*(-86)
+-54 + j*(130)
+180 + j*(79)
+123 + j*(-181)
+-157 + j*(-134)
+-135 + j*(154)
+141 + j*(170)
+193 + j*(-69)
+15 + j*(-131)
+-30 + j*(-1)
+87 + j*(23)
+130 + j*(-98)
+33 + j*(-192)
+-98 + j*(-163)
+-141 + j*(-40)
+-41 + j*(35)
+35 + j*(-76)
+-122 + j*(-187)
+-322 + j*(-10)
+-206 + j*(290)
+116 + j*(298)
+231 + j*(49)
+106 + j*(-91)
+16 + j*(-54)
+35 + j*(-28)
+39 + j*(-62)
+7 + j*(-80)
+-8 + j*(-82)
+-33 + j*(-113)
+-124 + j*(-127)
+-225 + j*(-24)
+-181 + j*(148)
+-6 + j*(187)
+78 + j*(68)
+18 + j*(-5)
+-16 + j*(27)
+11 + j*(34)
+21 + j*(15)
+33 + j*(-19)
+-19 + j*(-102)
+-199 + j*(-66)
+-223 + j*(192)
+48 + j*(288)
+165 + j*(59)
+-33 + j*(-6)
+-26 + j*(218)
+255 + j*(191)
+272 + j*(-114)
+8 + j*(-186)
+-96 + j*(-7)
+-14 + j*(115)
+115 + j*(137)
+253 + j*(25)
+185 + j*(-202)
+-76 + j*(-175)
+-47 + j*(91)
+243 + j*(33)
+178 + j*(-313)
+-200 + j*(-301)
+-272 + j*(54)
+-1 + j*(194)
+169 + j*(40)
+136 + j*(-121)
+37 + j*(-179)
+-43 + j*(-160)
+-63 + j*(-138)
+-114 + j*(-163)
+-235 + j*(-103)
+-231 + j*(80)
+-65 + j*(129)
+-11 + j*(6)
+-116 + j*(-33)
+-173 + j*(54)
+-153 + j*(148)
+-80 + j*(243)
+95 + j*(272)
+233 + j*(119)
+171 + j*(-49)
+55 + j*(-51)
+62 + j*(1)
+98 + j*(-42)
+52 + j*(-112)
+-40 + j*(-102)
+-72 + j*(-16)
+1 + j*(43)
+81 + j*(-20)
+53 + j*(-125)
+-43 + j*(-179)
+-188 + j*(-168)
+-325 + j*(2)
+-218 + j*(263)
+74 + j*(243)
+76 + j*(-13)
+-163 + j*(36)
+-66 + j*(303)
+223 + j*(214)
+158 + j*(-27)
+11 + j*(62)
+166 + j*(144)
+234 + j*(-49)
+67 + j*(-89)
+112 + j*(40)
+257 + j*(-106)
+83 + j*(-316)
+-161 + j*(-204)
+-150 + j*(-12)
+-67 + j*(54)
+35 + j*(88)
+170 + j*(-28)
+55 + j*(-238)
+-200 + j*(-151)
+-151 + j*(99)
+42 + j*(74)
+9 + j*(-31)
+-1 + j*(45)
+143 + j*(-13)
+63 + j*(-231)
+-192 + j*(-179)
+-185 + j*(47)
+-30 + j*(47)
+-66 + j*(-51)
+-162 + j*(28)
+-84 + j*(158)
+79 + j*(127)
+111 + j*(-55)
+-77 + j*(-161)
+-276 + j*(13)
+-178 + j*(303)
+132 + j*(349)
+320 + j*(135)
+297 + j*(-108)
+119 + j*(-267)
+-125 + j*(-216)
+-168 + j*(18)
+16 + j*(81)
+48 + j*(-74)
+-92 + j*(-81)
+-94 + j*(18)
+-81 + j*(-3)
+-179 + j*(80)
+-57 + j*(281)
+202 + j*(188)
+150 + j*(-26)
+40 + j*(47)
+203 + j*(78)
+226 + j*(-163)
+0 + j*(-209)
+-13 + j*(-86)
+6 + j*(-194)
+-262 + j*(-181)
+-286 + j*(189)
+80 + j*(265)
+151 + j*(-21)
+-35 + j*(-16)
+78 + j*(108)
+181 + j*(-91)
+-48 + j*(-185)
+-113 + j*(24)
+58 + j*(37)
+21 + j*(-93)
+-57 + j*(-22)
+38 + j*(-23)
+-54 + j*(-161)
+-253 + j*(-11)
+-105 + j*(243)
+149 + j*(144)
+117 + j*(-54)
+15 + j*(-83)
+-57 + j*(-91)
+-180 + j*(6)
+-98 + j*(235)
+189 + j*(204)
+222 + j*(-64)
+36 + j*(-125)
+-2 + j*(-39)
+12 + j*(-47)
+-20 + j*(-14)
+54 + j*(13)
+81 + j*(-112)
+-78 + j*(-156)
+-151 + j*(-22)
+-98 + j*(49)
+-86 + j*(112)
+76 + j*(211)
+308 + j*(4)
+122 + j*(-337)
+-262 + j*(-223)
+-233 + j*(119)
+6 + j*(144)
+40 + j*(33)
+45 + j*(11)
+43 + j*(-90)
+-130 + j*(-105)
+-162 + j*(110)
+53 + j*(146)
+67 + j*(-40)
+-78 + j*(-10)
+-3 + j*(91)
+42 + j*(-25)
+-122 + j*(-4)
+-47 + j*(221)
+228 + j*(124)
+138 + j*(-163)
+-124 + j*(-83)
+-40 + j*(128)
+112 + j*(25)
+-30 + j*(-65)
+-81 + j*(145)
+210 + j*(213)
+359 + j*(-129)
+35 + j*(-382)
+-292 + j*(-139)
+-144 + j*(200)
+153 + j*(124)
+97 + j*(-101)
+-52 + j*(-10)
+112 + j*(100)
+239 + j*(-129)
+11 + j*(-296)
+-152 + j*(-137)
+-54 + j*(-61)
+-98 + j*(-168)
+-269 + j*(-66)
+-192 + j*(139)
+-30 + j*(98)
+-91 + j*(12)
+-161 + j*(124)
+-47 + j*(248)
+115 + j*(233)
+236 + j*(119)
+250 + j*(-72)
+95 + j*(-197)
+-52 + j*(-136)
+-57 + j*(-49)
+-47 + j*(-37)
+-54 + j*(-12)
+-31 + j*(-16)
+-93 + j*(-37)
+-151 + j*(93)
+11 + j*(206)
+153 + j*(60)
+35 + j*(-54)
+-14 + j*(54)
+110 + j*(35)
+32 + j*(-99)
+-103 + j*(47)
+114 + j*(197)
+316 + j*(-71)
+65 + j*(-332)
+-214 + j*(-156)
+-134 + j*(71)
+-4 + j*(54)
+1 + j*(30)
+66 + j*(43)
+121 + j*(-80)
+-9 + j*(-190)
+-156 + j*(-113)
+-150 + j*(11)
+-104 + j*(44)
+-106 + j*(69)
+-71 + j*(145)
+52 + j*(167)
+144 + j*(62)
+97 + j*(-61)
+-7 + j*(-66)
+-28 + j*(-11)
+-20 + j*(-7)
+-63 + j*(14)
+-44 + j*(110)
+88 + j*(124)
+147 + j*(-8)
+36 + j*(-94)
+-58 + j*(1)
+39 + j*(115)
+204 + j*(23)
+161 + j*(-202)
+-83 + j*(-239)
+-188 + j*(-33)
+-38 + j*(81)
+49 + j*(-44)
+-83 + j*(-132)
+-227 + j*(-7)
+-192 + j*(210)
+33 + j*(340)
+315 + j*(206)
+324 + j*(-126)
+49 + j*(-216)
+-6 + j*(-18)
+190 + j*(-70)
+64 + j*(-332)
+-242 + j*(-202)
+-119 + j*(66)
+68 + j*(-121)
+-240 + j*(-272)
+-431 + j*(117)
+-62 + j*(359)
+168 + j*(81)
+-14 + j*(-62)
+-42 + j*(56)
+35 + j*(-28)
+-143 + j*(-83)
+-199 + j*(154)
+36 + j*(207)
+38 + j*(9)
+-150 + j*(108)
+25 + j*(344)
+317 + j*(180)
+221 + j*(-98)
+23 + j*(-40)
+105 + j*(94)
+245 + j*(-13)
+183 + j*(-194)
+4 + j*(-231)
+-112 + j*(-112)
+-64 + j*(18)
+39 + j*(7)
+29 + j*(-66)
+-8 + j*(-44)
+40 + j*(-46)
+14 + j*(-140)
+-119 + j*(-122)
+-127 + j*(6)
+-47 + j*(11)
+-90 + j*(-26)
+-123 + j*(74)
+-8 + j*(132)
+60 + j*(39)
+-11 + j*(-6)
+-38 + j*(69)
+47 + j*(123)
+156 + j*(77)
+216 + j*(-64)
+124 + j*(-233)
+-90 + j*(-257)
+-214 + j*(-104)
+-177 + j*(40)
+-98 + j*(95)
+-26 + j*(106)
+40 + j*(76)
+68 + j*(6)
+35 + j*(-67)
+-59 + j*(-93)
+-153 + j*(0)
+-78 + j*(149)
+103 + j*(101)
+69 + j*(-101)
+-152 + j*(-82)
+-163 + j*(154)
+59 + j*(207)
+144 + j*(28)
+11 + j*(-62)
+-85 + j*(35)
+-25 + j*(155)
+107 + j*(158)
+172 + j*(62)
+152 + j*(-12)
+137 + j*(-38)
+126 + j*(-89)
+62 + j*(-109)
+65 + j*(-64)
+127 + j*(-144)
+-11 + j*(-286)
+-241 + j*(-156)
+-163 + j*(96)
+54 + j*(46)
+-8 + j*(-119)
+-135 + j*(-46)
+-76 + j*(45)
+-47 + j*(12)
+-54 + j*(60)
+71 + j*(45)
+36 + j*(-161)
+-245 + j*(-125)
+-243 + j*(197)
+57 + j*(221)
+52 + j*(-16)
+-157 + j*(70)
+-7 + j*(316)
+300 + j*(180)
+240 + j*(-146)
+-49 + j*(-164)
+-121 + j*(78)
+91 + j*(207)
+287 + j*(41)
+203 + j*(-204)
+-25 + j*(-200)
+-50 + j*(-33)
+74 + j*(-29)
+61 + j*(-146)
+-47 + j*(-156)
+-89 + j*(-97)
+-93 + j*(-52)
+-59 + j*(-19)
+-25 + j*(-72)
+-133 + j*(-123)
+-226 + j*(28)
+-69 + j*(151)
+38 + j*(-12)
+-158 + j*(-95)
+-256 + j*(132)
+-58 + j*(262)
+54 + j*(157)
+24 + j*(139)
+112 + j*(168)
+187 + j*(37)
+86 + j*(-59)
+16 + j*(0)
+59 + j*(20)
+46 + j*(-21)
+-2 + j*(8)
+18 + j*(72)
+103 + j*(110)
+242 + j*(49)
+283 + j*(-177)
+63 + j*(-349)
+-171 + j*(-238)
+-180 + j*(-73)
+-181 + j*(-31)
+-218 + j*(127)
+13 + j*(308)
+317 + j*(100)
+180 + j*(-249)
+-138 + j*(-177)
+-78 + j*(81)
+146 + j*(-2)
+57 + j*(-236)
+-176 + j*(-192)
+-194 + j*(-18)
+-125 + j*(-6)
+-196 + j*(-15)
+-239 + j*(140)
+-93 + j*(263)
+40 + j*(199)
+26 + j*(161)
+98 + j*(230)
+284 + j*(135)
+255 + j*(-117)
+28 + j*(-158)
+-29 + j*(-4)
+69 + j*(37)
+98 + j*(-4)
+141 + j*(-21)
+175 + j*(-158)
+-8 + j*(-275)
+-180 + j*(-100)
+-18 + j*(64)
+117 + j*(-118)
+-94 + j*(-255)
+-248 + j*(-61)
+-112 + j*(74)
+-43 + j*(-29)
+-158 + j*(-42)
+-182 + j*(93)
+-77 + j*(161)
+21 + j*(132)
+57 + j*(35)
+-44 + j*(-43)
+-165 + j*(81)
+-31 + j*(267)
+203 + j*(157)
+128 + j*(-79)
+-87 + j*(-9)
+-4 + j*(209)
+245 + j*(149)
+262 + j*(-107)
+58 + j*(-215)
+-103 + j*(-107)
+-89 + j*(53)
+44 + j*(110)
+147 + j*(25)
+136 + j*(-93)
+44 + j*(-163)
+-94 + j*(-143)
+-162 + j*(35)
+33 + j*(192)
+276 + j*(1)
+118 + j*(-319)
+-238 + j*(-221)
+-201 + j*(113)
+76 + j*(107)
+74 + j*(-97)
+-54 + j*(-91)
+-29 + j*(-59)
+-99 + j*(-143)
+-282 + j*(-12)
+-161 + j*(262)
+140 + j*(199)
+129 + j*(-60)
+-64 + j*(-62)
+-53 + j*(68)
+25 + j*(51)
+6 + j*(24)
+28 + j*(52)
+80 + j*(-8)
+14 + j*(-88)
+-90 + j*(-59)
+-140 + j*(35)
+-114 + j*(186)
+98 + j*(286)
+330 + j*(91)
+204 + j*(-202)
+-58 + j*(-122)
+52 + j*(80)
+236 + j*(-100)
+20 + j*(-310)
+-190 + j*(-115)
+-12 + j*(36)
+76 + j*(-176)
+-187 + j*(-270)
+-344 + j*(-37)
+-238 + j*(147)
+-126 + j*(180)
+-33 + j*(186)
+35 + j*(103)
+-52 + j*(49)
+-85 + j*(202)
+136 + j*(264)
+256 + j*(45)
+103 + j*(-90)
+21 + j*(-9)
+54 + j*(-2)
+-6 + j*(-4)
+35 + j*(121)
+237 + j*(49)
+168 + j*(-221)
+-132 + j*(-182)
+-128 + j*(100)
+96 + j*(123)
+135 + j*(-8)
+127 + j*(-30)
+165 + j*(-132)
+10 + j*(-247)
+-133 + j*(-87)
+42 + j*(19)
+100 + j*(-223)
+-222 + j*(-286)
+-333 + j*(62)
+-33 + j*(204)
+95 + j*(-21)
+-64 + j*(-117)
+-130 + j*(-28)
+-133 + j*(-2)
+-188 + j*(76)
+-101 + j*(226)
+95 + j*(206)
+155 + j*(47)
+94 + j*(-64)
+-34 + j*(-110)
+-178 + j*(15)
+-74 + j*(246)
+210 + j*(184)
+187 + j*(-86)
+-14 + j*(-54)
+100 + j*(81)
+223 + j*(-134)
+-47 + j*(-290)
+-216 + j*(-41)
+-10 + j*(69)
+-2 + j*(-136)
+-267 + j*(-77)
+-235 + j*(247)
+64 + j*(313)
+211 + j*(148)
+238 + j*(6)
+191 + j*(-171)
+-45 + j*(-252)
+-218 + j*(-37)
+-59 + j*(169)
+144 + j*(66)
+88 + j*(-122)
+-86 + j*(-115)
+-136 + j*(40)
+-5 + j*(144)
+148 + j*(40)
+75 + j*(-150)
+-138 + j*(-115)
+-154 + j*(91)
+-1 + j*(159)
+87 + j*(103)
+144 + j*(42)
+158 + j*(-103)
+-23 + j*(-199)
+-171 + j*(-38)
+-54 + j*(110)
+37 + j*(25)
+-58 + j*(23)
+9 + j*(170)
+218 + j*(90)
+172 + j*(-133)
+-3 + j*(-113)
+45 + j*(-8)
+119 + j*(-112)
+-10 + j*(-196)
+-89 + j*(-106)
+-42 + j*(-93)
+-127 + j*(-153)
+-262 + j*(-16)
+-144 + j*(182)
+47 + j*(115)
+-1 + j*(-23)
+-86 + j*(62)
+46 + j*(127)
+110 + j*(-31)
+-53 + j*(-82)
+-69 + j*(88)
+113 + j*(64)
+59 + j*(-134)
+-136 + j*(-60)
+-41 + j*(107)
+82 + j*(-21)
+-89 + j*(-90)
+-97 + j*(122)
+169 + j*(59)
+45 + j*(-286)
+-397 + j*(-161)
+-355 + j*(334)
+84 + j*(410)
+231 + j*(128)
+119 + j*(5)
+63 + j*(3)
+4 + j*(25)
+30 + j*(139)
+221 + j*(116)
+240 + j*(-124)
+23 + j*(-187)
+-40 + j*(-53)
+13 + j*(-55)
+-84 + j*(-57)
+-74 + j*(125)
+165 + j*(130)
+197 + j*(-127)
+-37 + j*(-181)
+-86 + j*(2)
+45 + j*(20)
+16 + j*(-74)
+-71 + j*(1)
+35 + j*(109)
+179 + j*(11)
+139 + j*(-147)
+26 + j*(-174)
+-8 + j*(-152)
+-52 + j*(-191)
+-188 + j*(-172)
+-266 + j*(3)
+-136 + j*(168)
+52 + j*(132)
+100 + j*(-23)
+17 + j*(-127)
+-110 + j*(-131)
+-202 + j*(-24)
+-151 + j*(117)
+-20 + j*(118)
+-13 + j*(30)
+-76 + j*(63)
+-2 + j*(139)
+105 + j*(52)
+33 + j*(-74)
+-95 + j*(-33)
+-92 + j*(82)
+-8 + j*(115)
+42 + j*(70)
+19 + j*(27)
+-23 + j*(67)
+59 + j*(145)
+216 + j*(42)
+144 + j*(-204)
+-153 + j*(-209)
+-245 + j*(70)
+-40 + j*(204)
+59 + j*(79)
+-44 + j*(63)
+1 + j*(219)
+226 + j*(186)
+257 + j*(-53)
+64 + j*(-124)
+5 + j*(14)
+122 + j*(37)
+124 + j*(-71)
+35 + j*(-55)
+83 + j*(21)
+177 + j*(-45)
+146 + j*(-151)
+92 + j*(-190)
+26 + j*(-250)
+-139 + j*(-231)
+-185 + j*(-25)
+24 + j*(56)
+122 + j*(-159)
+-81 + j*(-301)
+-264 + j*(-180)
+-276 + j*(-36)
+-257 + j*(64)
+-177 + j*(170)
+-37 + j*(166)
+-4 + j*(84)
+-8 + j*(76)
+38 + j*(30)
+-32 + j*(-66)
+-163 + j*(13)
+-101 + j*(153)
+1 + j*(117)
+-42 + j*(90)
+-12 + j*(180)
+119 + j*(151)
+118 + j*(46)
+96 + j*(48)
+146 + j*(-9)
+49 + j*(-115)
+-74 + j*(-1)
+65 + j*(105)
+148 + j*(-71)
+-60 + j*(-138)
+-116 + j*(88)
+109 + j*(135)
+158 + j*(-69)
+0 + j*(-125)
+-55 + j*(-34)
+-37 + j*(9)
+-11 + j*(54)
+79 + j*(37)
+63 + j*(-92)
+-106 + j*(-74)
+-110 + j*(134)
+105 + j*(196)
+244 + j*(34)
+192 + j*(-152)
+17 + j*(-219)
+-125 + j*(-83)
+-1 + j*(95)
+216 + j*(-44)
+77 + j*(-322)
+-231 + j*(-233)
+-198 + j*(36)
+-13 + j*(4)
+-98 + j*(-134)
+-258 + j*(-17)
+-184 + j*(182)
+8 + j*(197)
+91 + j*(61)
+1 + j*(-35)
+-86 + j*(46)
+16 + j*(127)
+89 + j*(-1)
+-80 + j*(-47)
+-95 + j*(187)
+206 + j*(194)
+231 + j*(-133)
+-62 + j*(-153)
+-21 + j*(76)
+164 + j*(-67)
+-66 + j*(-256)
+-270 + j*(-5)
+-62 + j*(169)
+6 + j*(22)
+-118 + j*(103)
+91 + j*(258)
+290 + j*(-17)
+15 + j*(-226)
+-156 + j*(23)
+66 + j*(129)
+97 + j*(-69)
+-72 + j*(-26)
+34 + j*(121)
+175 + j*(-28)
+25 + j*(-163)
+-91 + j*(-52)
+-42 + j*(16)
+-49 + j*(22)
+-19 + j*(124)
+164 + j*(124)
+243 + j*(-84)
+98 + j*(-250)
+-100 + j*(-234)
+-218 + j*(-77)
+-147 + j*(123)
+78 + j*(139)
+161 + j*(-71)
+4 + j*(-197)
+-129 + j*(-128)
+-143 + j*(-45)
+-141 + j*(2)
+-122 + j*(45)
+-107 + j*(54)
+-117 + j*(101)
+-40 + j*(161)
+40 + j*(84)
+-67 + j*(37)
+-97 + j*(231)
+188 + j*(313)
+370 + j*(17)
+158 + j*(-226)
+-66 + j*(-129)
+-54 + j*(23)
+35 + j*(68)
+139 + j*(27)
+158 + j*(-143)
+-45 + j*(-235)
+-185 + j*(-54)
+-51 + j*(61)
+-35 + j*(-49)
+-178 + j*(45)
+-4 + j*(259)
+267 + j*(54)
+59 + j*(-241)
+-228 + j*(-37)
+-34 + j*(224)
+180 + j*(54)
+35 + j*(-87)
+-25 + j*(50)
+119 + j*(49)
+84 + j*(-80)
+0 + j*(-6)
+139 + j*(39)
+206 + j*(-162)
+13 + j*(-283)
+-124 + j*(-184)
+-116 + j*(-117)
+-155 + j*(-119)
+-226 + j*(-56)
+-247 + j*(66)
+-173 + j*(209)
+42 + j*(250)
+177 + j*(32)
+-29 + j*(-141)
+-209 + j*(83)
+45 + j*(274)
+258 + j*(11)
+16 + j*(-204)
+-165 + j*(-1)
+-2 + j*(117)
+32 + j*(-23)
+-111 + j*(28)
+-8 + j*(192)
+165 + j*(91)
+99 + j*(-37)
+73 + j*(5)
+147 + j*(-90)
+-31 + j*(-238)
+-258 + j*(-49)
+-117 + j*(214)
+118 + j*(139)
+89 + j*(-19)
+11 + j*(0)
+40 + j*(21)
+35 + j*(-11)
+9 + j*(13)
+49 + j*(36)
+94 + j*(3)
+107 + j*(-69)
+24 + j*(-164)
+-161 + j*(-100)
+-141 + j*(158)
+157 + j*(201)
+267 + j*(-76)
+83 + j*(-209)
+10 + j*(-151)
+-16 + j*(-212)
+-202 + j*(-191)
+-211 + j*(35)
+-29 + j*(13)
+-168 + j*(-146)
+-388 + j*(119)
+-94 + j*(441)
+273 + j*(221)
+144 + j*(-82)
+-36 + j*(16)
+87 + j*(100)
+141 + j*(-43)
+18 + j*(-96)
+-24 + j*(-37)
+-25 + j*(-23)
+-53 + j*(13)
+-23 + j*(74)
+40 + j*(106)
+163 + j*(103)
+291 + j*(-91)
+100 + j*(-375)
+-272 + j*(-255)
+-221 + j*(100)
+53 + j*(44)
+-82 + j*(-169)
+-295 + j*(35)
+-92 + j*(264)
+97 + j*(131)
+34 + j*(59)
+103 + j*(104)
+171 + j*(-62)
+-25 + j*(-145)
+-67 + j*(46)
+138 + j*(-2)
+1 + j*(-266)
+-345 + j*(-102)
+-222 + j*(293)
+151 + j*(245)
+151 + j*(-49)
+-62 + j*(-60)
+-69 + j*(107)
+81 + j*(129)
+144 + j*(-4)
+32 + j*(-121)
+-141 + j*(-47)
+-134 + j*(176)
+87 + j*(270)
+281 + j*(137)
+303 + j*(-72)
+185 + j*(-235)
+-19 + j*(-260)
+-150 + j*(-108)
+-71 + j*(45)
+59 + j*(11)
+47 + j*(-105)
+-69 + j*(-129)
+-163 + j*(-31)
+-121 + j*(141)
+97 + j*(195)
+257 + j*(-18)
+95 + j*(-258)
+-180 + j*(-167)
+-146 + j*(113)
+137 + j*(120)
+197 + j*(-177)
+-105 + j*(-314)
+-317 + j*(-47)
+-110 + j*(209)
+154 + j*(55)
+45 + j*(-206)
+-199 + j*(-161)
+-227 + j*(14)
+-176 + j*(76)
+-161 + j*(139)
+-66 + j*(207)
+28 + j*(161)
+32 + j*(127)
+88 + j*(130)
+134 + j*(21)
+21 + j*(-32)
+13 + j*(87)
+168 + j*(25)
+63 + j*(-192)
+-204 + j*(-83)
+-122 + j*(182)
+84 + j*(126)
+18 + j*(18)
+-4 + j*(131)
+150 + j*(105)
+93 + j*(-37)
+-3 + j*(91)
+233 + j*(173)
+367 + j*(-139)
+78 + j*(-336)
+-112 + j*(-143)
+-4 + j*(-45)
+-9 + j*(-131)
+-103 + j*(-71)
+-32 + j*(-3)
+-30 + j*(-91)
+-170 + j*(-27)
+-76 + j*(189)
+197 + j*(115)
+184 + j*(-183)
+-89 + j*(-236)
+-194 + j*(-35)
+-69 + j*(81)
+33 + j*(7)
+-21 + j*(-98)
+-161 + j*(-71)
+-204 + j*(107)
+-37 + j*(241)
+161 + j*(144)
+149 + j*(-46)
+23 + j*(-83)
+-8 + j*(-36)
+-11 + j*(-44)
+-68 + j*(-16)
+-21 + j*(86)
+132 + j*(37)
+116 + j*(-173)
+-110 + j*(-238)
+-264 + j*(-83)
+-255 + j*(90)
+-177 + j*(215)
+-18 + j*(296)
+179 + j*(214)
+214 + j*(6)
+68 + j*(-100)
+-61 + j*(-35)
+-76 + j*(94)
+28 + j*(204)
+221 + j*(187)
+339 + j*(-5)
+269 + j*(-218)
+93 + j*(-317)
+-90 + j*(-290)
+-208 + j*(-153)
+-174 + j*(-4)
+-92 + j*(18)
+-100 + j*(8)
+-82 + j*(83)
+41 + j*(72)
+41 + j*(-76)
+-122 + j*(-94)
+-178 + j*(50)
+-107 + j*(134)
+-55 + j*(170)
+46 + j*(211)
+180 + j*(128)
+154 + j*(-30)
+33 + j*(-28)
+62 + j*(72)
+199 + j*(27)
+215 + j*(-164)
+37 + j*(-307)
+-204 + j*(-242)
+-288 + j*(-9)
+-171 + j*(158)
+-47 + j*(177)
+31 + j*(182)
+157 + j*(148)
+211 + j*(-5)
+117 + j*(-101)
+71 + j*(-81)
+66 + j*(-141)
+-81 + j*(-169)
+-163 + j*(18)
+25 + j*(127)
+137 + j*(-39)
+8 + j*(-131)
+-37 + j*(-42)
+28 + j*(-64)
+-48 + j*(-138)
+-127 + j*(-55)
+-64 + j*(-16)
+-105 + j*(-90)
+-244 + j*(19)
+-136 + j*(239)
+115 + j*(183)
+109 + j*(-37)
+-54 + j*(-30)
+-6 + j*(98)
+125 + j*(0)
+-4 + j*(-169)
+-224 + j*(-39)
+-127 + j*(221)
+142 + j*(183)
+163 + j*(-52)
+3 + j*(-110)
+-57 + j*(-47)
+-82 + j*(-33)
+-137 + j*(42)
+-74 + j*(148)
+19 + j*(119)
+-8 + j*(95)
+24 + j*(173)
+148 + j*(144)
+152 + j*(57)
+177 + j*(71)
+301 + j*(-57)
+147 + j*(-323)
+-212 + j*(-216)
+-170 + j*(158)
+158 + j*(166)
+208 + j*(-74)
+96 + j*(-134)
+68 + j*(-169)
+-72 + j*(-209)
+-172 + j*(-21)
+32 + j*(85)
+112 + j*(-146)
+-152 + j*(-204)
+-201 + j*(76)
+69 + j*(110)
+78 + j*(-144)
+-173 + j*(-148)
+-206 + j*(94)
+5 + j*(179)
+146 + j*(25)
+59 + j*(-169)
+-175 + j*(-153)
+-226 + j*(95)
+10 + j*(196)
+125 + j*(-16)
+-63 + j*(-127)
+-161 + j*(30)
+-50 + j*(101)
+-45 + j*(33)
+-116 + j*(107)
+6 + j*(240)
+213 + j*(154)
+223 + j*(-80)
+44 + j*(-195)
+-124 + j*(-118)
+-154 + j*(23)
+-95 + j*(109)
+-25 + j*(144)
+65 + j*(130)
+93 + j*(28)
+-23 + j*(3)
+-41 + j*(175)
+191 + j*(228)
+316 + j*(4)
+185 + j*(-139)
+129 + j*(-107)
+139 + j*(-197)
+-44 + j*(-263)
+-156 + j*(-78)
+-8 + j*(11)
+12 + j*(-128)
+-142 + j*(-95)
+-98 + j*(57)
+14 + j*(12)
+-44 + j*(-38)
+-41 + j*(38)
+37 + j*(-1)
+-17 + j*(-58)
+-8 + j*(2)
+69 + j*(-117)
+-173 + j*(-255)
+-416 + j*(61)
+-106 + j*(380)
+202 + j*(123)
+-37 + j*(-95)
+-159 + j*(194)
+202 + j*(280)
+305 + j*(-110)
+-48 + j*(-237)
+-175 + j*(40)
+17 + j*(151)
+99 + j*(49)
+89 + j*(11)
+108 + j*(-40)
+42 + j*(-106)
+-22 + j*(-56)
+32 + j*(-42)
+-19 + j*(-139)
+-181 + j*(-54)
+-98 + j*(169)
+161 + j*(101)
+119 + j*(-177)
+-168 + j*(-175)
+-224 + j*(81)
+-42 + j*(186)
+69 + j*(107)
+79 + j*(40)
+71 + j*(-13)
+8 + j*(-39)
+-18 + j*(30)
+74 + j*(40)
+71 + j*(-88)
+-93 + j*(-84)
+-103 + j*(117)
+117 + j*(165)
+234 + j*(-37)
+115 + j*(-219)
+-88 + j*(-229)
+-228 + j*(-66)
+-147 + j*(160)
+113 + j*(151)
+153 + j*(-106)
+-80 + j*(-168)
+-131 + j*(13)
+-11 + j*(6)
+-115 + j*(-80)
+-220 + j*(122)
+30 + j*(283)
+231 + j*(51)
+51 + j*(-148)
+-115 + j*(-27)
+-54 + j*(92)
+1 + j*(101)
+71 + j*(133)
+204 + j*(47)
+149 + j*(-150)
+-49 + j*(-141)
+-57 + j*(23)
+74 + j*(31)
+106 + j*(-79)
+54 + j*(-171)
+-86 + j*(-245)
+-306 + j*(-141)
+-325 + j*(156)
+-70 + j*(288)
+83 + j*(156)
+46 + j*(88)
+86 + j*(115)
+158 + j*(23)
+77 + j*(-86)
+-24 + j*(-36)
+1 + j*(38)
+54 + j*(31)
+68 + j*(4)
+74 + j*(-21)
+71 + j*(-45)
+72 + j*(-72)
+45 + j*(-136)
+-73 + j*(-156)
+-146 + j*(-31)
+-47 + j*(54)
+6 + j*(-28)
+-95 + j*(-40)
+-88 + j*(93)
+56 + j*(94)
+69 + j*(-23)
+12 + j*(-25)
+54 + j*(-30)
+16 + j*(-139)
+-152 + j*(-108)
+-157 + j*(76)
+-4 + j*(113)
+44 + j*(16)
+5 + j*(-21)
+-18 + j*(-37)
+-75 + j*(-35)
+-98 + j*(37)
+-44 + j*(64)
+-59 + j*(38)
+-85 + j*(127)
+62 + j*(199)
+191 + j*(50)
+99 + j*(-103)
+-20 + j*(-98)
+-95 + j*(-77)
+-221 + j*(28)
+-174 + j*(302)
+161 + j*(393)
+378 + j*(131)
+269 + j*(-100)
+143 + j*(-91)
+175 + j*(-71)
+202 + j*(-180)
+83 + j*(-320)
+-159 + j*(-292)
+-243 + j*(-25)
+6 + j*(103)
+125 + j*(-158)
+-182 + j*(-278)
+-330 + j*(53)
+-28 + j*(209)
+87 + j*(-44)
+-133 + j*(-98)
+-148 + j*(98)
+-8 + j*(100)
+-25 + j*(47)
+15 + j*(103)
+116 + j*(-4)
+-33 + j*(-134)
+-166 + j*(30)
+-9 + j*(145)
+65 + j*(6)
+-54 + j*(-18)
+-39 + j*(66)
+-13 + j*(16)
+-127 + j*(62)
+-58 + j*(260)
+182 + j*(251)
+255 + j*(86)
+262 + j*(12)
+310 + j*(-136)
+165 + j*(-339)
+-88 + j*(-323)
+-206 + j*(-184)
+-265 + j*(-32)
+-186 + j*(199)
+124 + j*(227)
+233 + j*(-72)
+2 + j*(-201)
+-70 + j*(-66)
+-18 + j*(-109)
+-199 + j*(-134)
+-247 + j*(142)
+52 + j*(219)
+122 + j*(-47)
+-98 + j*(-73)
+-71 + j*(100)
+48 + j*(25)
+-83 + j*(-39)
+-117 + j*(148)
+96 + j*(191)
+163 + j*(14)
+69 + j*(-51)
+52 + j*(-48)
+-1 + j*(-100)
+-112 + j*(-35)
+-72 + j*(105)
+53 + j*(110)
+95 + j*(47)
+127 + j*(4)
+151 + j*(-115)
+1 + j*(-254)
+-248 + j*(-164)
+-279 + j*(143)
+-1 + j*(298)
+228 + j*(104)
+124 + j*(-119)
+-37 + j*(-70)
+9 + j*(3)
+-1 + j*(-85)
+-151 + j*(-22)
+-82 + j*(185)
+129 + j*(152)
+133 + j*(8)
+112 + j*(22)
+209 + j*(-59)
+104 + j*(-248)
+-107 + j*(-182)
+-71 + j*(-43)
+-45 + j*(-108)
+-172 + j*(-52)
+-74 + j*(115)
+83 + j*(-25)
+-111 + j*(-149)
+-212 + j*(94)
+50 + j*(164)
+59 + j*(-96)
+-214 + j*(-33)
+-108 + j*(274)
+221 + j*(184)
+180 + j*(-109)
+-30 + j*(-104)
+-18 + j*(21)
+74 + j*(-22)
+15 + j*(-140)
+-161 + j*(-123)
+-222 + j*(91)
+-16 + j*(219)
+119 + j*(31)
+-93 + j*(-53)
+-136 + j*(249)
+267 + j*(321)
+422 + j*(-106)
+83 + j*(-326)
+-103 + j*(-133)
+-19 + j*(-66)
+-76 + j*(-122)
+-156 + j*(-10)
+-61 + j*(81)
+4 + j*(31)
+-7 + j*(6)
+-9 + j*(-18)
+-76 + j*(-28)
+-103 + j*(77)
+8 + j*(109)
+-6 + j*(26)
+-76 + j*(143)
+158 + j*(265)
+379 + j*(-24)
+124 + j*(-326)
+-173 + j*(-161)
+-82 + j*(57)
+29 + j*(-19)
+-76 + j*(-59)
+-96 + j*(74)
+27 + j*(110)
+71 + j*(33)
+47 + j*(18)
+88 + j*(33)
+153 + j*(-46)
+93 + j*(-183)
+-85 + j*(-192)
+-160 + j*(-37)
+-65 + j*(51)
+-23 + j*(8)
+-49 + j*(45)
+68 + j*(91)
+153 + j*(-83)
+-45 + j*(-222)
+-215 + j*(-39)
+-76 + j*(128)
+57 + j*(24)
+-31 + j*(-62)
+-94 + j*(17)
+-35 + j*(77)
+25 + j*(60)
+62 + j*(13)
+48 + j*(-77)
+-66 + j*(-117)
+-169 + j*(-25)
+-148 + j*(110)
+-46 + j*(175)
+66 + j*(153)
+118 + j*(61)
+73 + j*(-13)
+18 + j*(15)
+72 + j*(76)
+202 + j*(-4)
+170 + j*(-243)
+-148 + j*(-337)
+-383 + j*(-37)
+-180 + j*(274)
+90 + j*(170)
+14 + j*(19)
+-11 + j*(147)
+204 + j*(98)
+129 + j*(-184)
+-167 + j*(-109)
+-95 + j*(139)
+38 + j*(57)
+-108 + j*(78)
+52 + j*(354)
+470 + j*(147)
+305 + j*(-340)
+-129 + j*(-233)
+-25 + j*(78)
+165 + j*(-70)
+-12 + j*(-168)
+-20 + j*(11)
+165 + j*(-69)
+56 + j*(-277)
+-128 + j*(-223)
+-151 + j*(-162)
+-265 + j*(-139)
+-330 + j*(69)
+-180 + j*(206)
+-98 + j*(208)
+23 + j*(308)
+322 + j*(173)
+234 + j*(-235)
+-176 + j*(-170)
+-61 + j*(183)
+243 + j*(-21)
+-40 + j*(-298)
+-281 + j*(18)
+28 + j*(190)
+106 + j*(-104)
+-175 + j*(-97)
+-111 + j*(153)
+73 + j*(53)
+-63 + j*(-48)
+-102 + j*(122)
+65 + j*(134)
+61 + j*(25)
+47 + j*(66)
+148 + j*(-6)
+30 + j*(-163)
+-146 + j*(-35)
+-18 + j*(112)
+71 + j*(-20)
+-81 + j*(-45)
+-62 + j*(141)
+157 + j*(104)
+135 + j*(-134)
+-111 + j*(-157)
+-197 + j*(73)
+-11 + j*(230)
+194 + j*(111)
+134 + j*(-102)
+-62 + j*(-59)
+-3 + j*(141)
+239 + j*(83)
+249 + j*(-192)
+9 + j*(-319)
+-204 + j*(-199)
+-226 + j*(18)
+-57 + j*(117)
+35 + j*(-24)
+-144 + j*(-77)
+-189 + j*(177)
+117 + j*(246)
+204 + j*(-59)
+-71 + j*(-129)
+-109 + j*(110)
+74 + j*(128)
+74 + j*(46)
+125 + j*(105)
+293 + j*(-47)
+124 + j*(-316)
+-171 + j*(-190)
+-82 + j*(49)
+76 + j*(-41)
+-20 + j*(-145)
+-95 + j*(-79)
+-88 + j*(-45)
+-96 + j*(4)
+-4 + j*(19)
+-30 + j*(-130)
+-269 + j*(-49)
+-153 + j*(281)
+231 + j*(144)
+61 + j*(-247)
+-316 + j*(-23)
+-40 + j*(334)
+289 + j*(28)
+-18 + j*(-257)
+-237 + j*(28)
+10 + j*(163)
+55 + j*(-52)
+-143 + j*(-21)
+-86 + j*(154)
+36 + j*(115)
+16 + j*(90)
+100 + j*(114)
+154 + j*(-57)
+-74 + j*(-144)
+-199 + j*(110)
+39 + j*(281)
+238 + j*(115)
+183 + j*(-55)
+107 + j*(-86)
+57 + j*(-136)
+-100 + j*(-133)
+-185 + j*(79)
+18 + j*(264)
+272 + j*(126)
+228 + j*(-124)
+57 + j*(-138)
+52 + j*(-62)
+74 + j*(-105)
+11 + j*(-100)
+70 + j*(-62)
+100 + j*(-229)
+-173 + j*(-303)
+-309 + j*(14)
+-11 + j*(165)
+88 + j*(-107)
+-182 + j*(-122)
+-108 + j*(158)
+177 + j*(-9)
+-81 + j*(-312)
+-420 + j*(10)
+-87 + j*(375)
+267 + j*(65)
+-15 + j*(-252)
+-297 + j*(1)
+-99 + j*(247)
+85 + j*(129)
+24 + j*(45)
+37 + j*(105)
+133 + j*(47)
+86 + j*(-66)
+2 + j*(-36)
+59 + j*(-3)
+82 + j*(-129)
+-110 + j*(-208)
+-272 + j*(-12)
+-133 + j*(203)
+57 + j*(128)
+-1 + j*(5)
+-67 + j*(95)
+56 + j*(132)
+55 + j*(2)
+-104 + j*(74)
+21 + j*(325)
+397 + j*(245)
+479 + j*(-168)
+187 + j*(-424)
+-112 + j*(-354)
+-223 + j*(-171)
+-210 + j*(-34)
+-180 + j*(40)
+-151 + j*(127)
+-30 + j*(218)
+151 + j*(151)
+162 + j*(-45)
+-1 + j*(-98)
+-57 + j*(28)
+45 + j*(92)
+136 + j*(23)
+131 + j*(-99)
+6 + j*(-171)
+-126 + j*(-63)
+-30 + j*(97)
+153 + j*(-6)
+38 + j*(-223)
+-206 + j*(-115)
+-122 + j*(133)
+104 + j*(64)
+32 + j*(-139)
+-155 + j*(-63)
+-92 + j*(118)
+71 + j*(85)
+76 + j*(-45)
+3 + j*(-83)
+-49 + j*(-84)
+-129 + j*(-49)
+-145 + j*(93)
+30 + j*(165)
+148 + j*(-16)
+-26 + j*(-164)
+-193 + j*(-4)
+-58 + j*(157)
+66 + j*(52)
+-34 + j*(-5)
+-21 + j*(121)
+144 + j*(62)
+71 + j*(-129)
+-114 + j*(-54)
+-28 + j*(91)
+74 + j*(-21)
+-74 + j*(-101)
+-159 + j*(49)
+-75 + j*(139)
+-42 + j*(163)
+66 + j*(264)
+320 + j*(168)
+315 + j*(-167)
+11 + j*(-255)
+-103 + j*(-51)
+8 + j*(26)
+26 + j*(-25)
+5 + j*(4)
+61 + j*(14)
+71 + j*(-38)
+62 + j*(-42)
+102 + j*(-91)
+30 + j*(-209)
+-154 + j*(-167)
+-170 + j*(28)
+-4 + j*(84)
+75 + j*(-52)
+-42 + j*(-158)
+-196 + j*(-76)
+-167 + j*(122)
+52 + j*(160)
+147 + j*(-67)
+-71 + j*(-224)
+-288 + j*(-60)
+-233 + j*(160)
+-115 + j*(214)
+-53 + j*(279)
+156 + j*(344)
+403 + j*(129)
+305 + j*(-223)
+-13 + j*(-255)
+-86 + j*(-47)
+35 + j*(-33)
+-35 + j*(-149)
+-202 + j*(-40)
+-119 + j*(170)
+86 + j*(138)
+84 + j*(-18)
+-21 + j*(-8)
+10 + j*(69)
+79 + j*(35)
+62 + j*(-9)
+64 + j*(6)
+117 + j*(-38)
+78 + j*(-147)
+-62 + j*(-166)
+-147 + j*(-49)
+-96 + j*(75)
+23 + j*(88)
+79 + j*(8)
+55 + j*(-57)
+28 + j*(-82)
+-13 + j*(-128)
+-125 + j*(-137)
+-226 + j*(-23)
+-197 + j*(148)
+-41 + j*(251)
+158 + j*(197)
+228 + j*(-18)
+69 + j*(-161)
+-68 + j*(-64)
+13 + j*(20)
+49 + j*(-93)
+-93 + j*(-119)
+-125 + j*(1)
+-74 + j*(-6)
+-194 + j*(5)
+-200 + j*(272)
+164 + j*(381)
+399 + j*(35)
+170 + j*(-278)
+-124 + j*(-202)
+-181 + j*(1)
+-99 + j*(130)
+40 + j*(155)
+115 + j*(48)
+47 + j*(-8)
+49 + j*(64)
+170 + j*(11)
+112 + j*(-161)
+-74 + j*(-132)
+-78 + j*(27)
+31 + j*(60)
+92 + j*(13)
+125 + j*(-69)
+62 + j*(-180)
+-76 + j*(-174)
+-123 + j*(-94)
+-156 + j*(-50)
+-170 + j*(93)
+50 + j*(170)
+159 + j*(-115)
+-197 + j*(-238)
+-335 + j*(179)
+103 + j*(320)
+206 + j*(-99)
+-185 + j*(-123)
+-128 + j*(246)
+194 + j*(129)
+23 + j*(-105)
+-100 + j*(143)
+235 + j*(190)
+255 + j*(-187)
+-83 + j*(-195)
+-48 + j*(43)
+90 + j*(-62)
+-66 + j*(-126)
+-54 + j*(26)
+61 + j*(-91)
+-182 + j*(-188)
+-292 + j*(146)
+59 + j*(268)
+154 + j*(-42)
+-104 + j*(-69)
+-62 + j*(144)
+95 + j*(56)
+-24 + j*(-26)
+-31 + j*(132)
+156 + j*(95)
+112 + j*(-81)
+-4 + j*(-31)
+79 + j*(8)
+69 + j*(-118)
+-75 + j*(-99)
+-64 + j*(18)
+-15 + j*(8)
+-44 + j*(33)
+38 + j*(95)
+130 + j*(-11)
+35 + j*(-104)
+-21 + j*(-25)
+64 + j*(-24)
+41 + j*(-137)
+-82 + j*(-142)
+-141 + j*(-64)
+-153 + j*(28)
+-67 + j*(131)
+93 + j*(62)
+26 + j*(-125)
+-173 + j*(-42)
+-63 + j*(158)
+138 + j*(8)
+-60 + j*(-206)
+-307 + j*(6)
+-136 + j*(267)
+69 + j*(159)
+-29 + j*(66)
+-37 + j*(230)
+202 + j*(243)
+265 + j*(5)
+98 + j*(-65)
+90 + j*(48)
+213 + j*(-6)
+160 + j*(-149)
+56 + j*(-121)
+119 + j*(-106)
+91 + j*(-280)
+-187 + j*(-302)
+-305 + j*(-4)
+-69 + j*(175)
+116 + j*(18)
+30 + j*(-141)
+-93 + j*(-135)
+-163 + j*(-81)
+-216 + j*(28)
+-139 + j*(171)
+18 + j*(165)
+49 + j*(78)
+57 + j*(83)
+155 + j*(21)
+103 + j*(-164)
+-122 + j*(-168)
+-175 + j*(40)
+-28 + j*(109)
+23 + j*(23)
+-23 + j*(6)
+-10 + j*(32)
+2 + j*(1)
+-35 + j*(-1)
+-23 + j*(35)
+13 + j*(-4)
+-66 + j*(-68)
+-210 + j*(28)
+-175 + j*(274)
+111 + j*(379)
+349 + j*(170)
+293 + j*(-82)
+161 + j*(-128)
+151 + j*(-157)
+40 + j*(-276)
+-187 + j*(-195)
+-172 + j*(47)
+14 + j*(54)
+-13 + j*(-79)
+-132 + j*(-13)
+-64 + j*(110)
+35 + j*(85)
+52 + j*(49)
+99 + j*(15)
+79 + j*(-91)
+-39 + j*(-89)
+-27 + j*(5)
+39 + j*(-52)
+-76 + j*(-105)
+-136 + j*(44)
+11 + j*(106)
+51 + j*(-4)
+-18 + j*(1)
+37 + j*(23)
+4 + j*(-74)
+-138 + j*(35)
+53 + j*(249)
+366 + j*(14)
+157 + j*(-379)
+-248 + j*(-250)
+-188 + j*(83)
+41 + j*(38)
+-22 + j*(-115)
+-141 + j*(-55)
+-129 + j*(31)
+-105 + j*(80)
+-28 + j*(122)
+49 + j*(49)
+-32 + j*(-14)
+-62 + j*(99)
+91 + j*(110)
+94 + j*(-57)
+-52 + j*(-32)
+41 + j*(77)
+134 + j*(-120)
+-168 + j*(-247)
+-377 + j*(124)
+-13 + j*(419)
+333 + j*(126)
+125 + j*(-203)
+-144 + j*(-54)
+-21 + j*(157)
+153 + j*(50)
+77 + j*(-89)
+-10 + j*(-42)
+33 + j*(-24)
+-8 + j*(-95)
+-121 + j*(-30)
+-54 + j*(96)
+50 + j*(21)
+-81 + j*(-54)
+-167 + j*(165)
+110 + j*(319)
+340 + j*(62)
+156 + j*(-168)
+14 + j*(-24)
+199 + j*(27)
+245 + j*(-236)
+-26 + j*(-341)
+-163 + j*(-165)
+-98 + j*(-92)
+-140 + j*(-118)
+-202 + j*(-4)
+-97 + j*(97)
+-11 + j*(29)
+-64 + j*(-8)
+-75 + j*(61)
+6 + j*(84)
+62 + j*(32)
+72 + j*(-46)
+13 + j*(-127)
+-112 + j*(-111)
+-132 + j*(13)
+-25 + j*(25)
+-56 + j*(-96)
+-250 + j*(-49)
+-264 + j*(226)
+14 + j*(361)
+247 + j*(173)
+189 + j*(-72)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+0 + j*(0)
+];